def main(): """Test code that processes a series of directories to generate DvdInfo instances""" from oreillycookbook.files import all_folders import argparse from pprint import pprint parser = argparse.ArgumentParser( description='Process a series of folders, reading the DVD information, display it to stdout') parser.add_argument('root_dir', nargs=1) args = parser.parse_args() formatter = logging.Formatter( '%(asctime)s - %(levelname)5s - %(module)s:%(lineno)03d[%(funcName)s()] - %(message)s') # create file handler and set level to debug fh = logging.FileHandler(filename='hbscan.log') fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) logger.addHandler(fh) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) logger.addHandler(ch) # set overall logging detail here logger.setLevel(logging.DEBUG) folders = all_folders(args.root_dir[0], single_level=True) for movie_dir in folders: cmd_out = ScanDvd(movie_dir) dvd = ParseHBOutput(cmd_out) pprint(dvd)
def ProcessFolder(self, folder): """ Process the given folder for DVD content. If the folder does not contain DVD content, recurse into subfolders. """ folder = os.path.abspath(folder) logger.info("Searching folder: %s", folder) if os.path.exists(os.path.join(folder, "VIDEO_TS")) or os.path.exists(os.path.join(folder, "VIDEO_TS.IFO")): # Process this folder basename = os.path.basename(folder) match = re.search("(.+?)_?[sS](\d+)_?[dD](\d+)", basename) if match: series = match.group(1) series = series.replace("_", " ") series = series.strip() season = int(match.group(2)) disc = int(match.group(3)) logger.info('series = "%s", season = %d, disc = %d', series, season, disc) if ( self.previous_season and season != self.previous_season or self.previous_series and series != self.previous_series ): # Restart the episode numbering self.eps_start_num = 1 self.extras_start_num = 1 raw = ScanDvd(folder) self.curr_dvd = ParseHBOutput(raw) self.curr_dvd.folder = folder self.curr_dvd.series = series self.curr_dvd.season = season if self.remove_dup_titles: self.RemoveDuplicateTitles() self.RemoveShortTitles() if self.remove_virtual_titles: self.RemoveVirtualTitles() # Report summary of durations kept/rejected active_durations = [x.duration for x in self.curr_dvd.titles if x.enabled] active_duration_total = sum(active_durations) inactive_durations = [x.duration for x in self.curr_dvd.titles if not x.enabled] inactive_duration_total = sum(inactive_durations) logger.info( "*** %d active titles with total playtime of %s " "(%d inactive titles with playtime of %s) ***", len(active_durations), GetInHMS(active_duration_total), len(inactive_durations), GetInHMS(inactive_duration_total), ) self.FindEpisodesAndExtras() self.EnableAudioAndSubtitleTracks() self.dvds.append(self.curr_dvd) logger.debug(pformat(self.curr_dvd)) self.previous_season = season self.previous_series = series else: raise DvdNameError("Unable to parse folder name '{}'".format(folder)) else: for sub_folder in sorted(all_folders(folder, single_level=True)): self.ProcessFolder(sub_folder)