def _collectEpisodesByID(series, episode_list): """ Function that collects per episode ID all files that match this episode. This function uses _collectEpisodeFiles to auto match the season strings, and further processes all unknown episodes to do fuzzy matching on title and file name parts """ ep_to_file = dict() sfiles = _collectEpisodeFiles(series_list.get_series_path(series)) bad_series_words = set([s.lower() for s in series.name.split()]) ablookup = list() if "_" in sfiles: # pre process and make lookup mediaext_set = set(_media_extensions) for abitem in sfiles["_"]: orgfile_set = set([s.lower() for s in m0.findall(abitem.filename)]) orgfile_set = orgfile_set - mediaext_set - bad_words - bad_series_words ablookup.append((EpisodeFileFuzzyMatch(abitem), orgfile_set)) for episode in episode_list: seasonstr = episode.season.upper() if len(seasonstr) > 2: if seasonstr in sfiles: ep_to_file[episode.id] = [efile for efile in sfiles[seasonstr]] if appcfg.options[appcfg.CFG_FUZZY_MATCH]: # now check episode title with any sets title_set = set([s.lower() for s in m0.findall(episode.title)]) if len(title_set) > 0: for fuzzy_info, file_set in ablookup: if len(file_set) > 0: score = 1 - len(title_set - file_set) / float( len(title_set)) if score >= DIFF_THRESHOLD: if (fuzzy_info.candidate_id == -1) or score > fuzzy_info.diff_score: fuzzy_info.candidate_id = episode.id fuzzy_info.diff_score = score # now let's feed the episode info from the ablookup into the lookup list of # episodes. This will also group all permanently abandoned files in the # category -1. abandoned = list() for fuzzy_info, dummy in ablookup: epid = fuzzy_info.candidate_id epfile = fuzzy_info.epfile if epid != -1: if epid in ep_to_file: ep_to_file[epid].append(epfile) else: ep_to_file[epid] = [epfile] else: abandoned.append(epfile) ep_to_file[-1] = abandoned return ep_to_file
def _collectEpisodesByID(series, episode_list): """ Function that collects per episode ID all files that match this episode. This function uses _collectEpisodeFiles to auto match the season strings, and further processes all unknown episodes to do fuzzy matching on title and file name parts """ ep_to_file = dict() sfiles = _collectEpisodeFiles(series_list.get_series_path(series)) bad_series_words = set([s.lower() for s in series.name.split()]) ablookup = list() if "_" in sfiles: # pre process and make lookup mediaext_set = set(_media_extensions) for abitem in sfiles["_"]: orgfile_set = set([ s.lower() for s in m0.findall(abitem.filename) ]) orgfile_set = orgfile_set - mediaext_set - bad_words - bad_series_words ablookup.append( (EpisodeFileFuzzyMatch(abitem), orgfile_set) ) for episode in episode_list: seasonstr = episode.season.upper() if len(seasonstr) > 2: if seasonstr in sfiles: ep_to_file[episode.id] = [efile for efile in sfiles[seasonstr]] if appcfg.options[appcfg.CFG_FUZZY_MATCH]: # now check episode title with any sets title_set = set([ s.lower() for s in m0.findall(episode.title) ]) if len(title_set) > 0: for fuzzy_info, file_set in ablookup: if len(file_set) > 0: score = 1 - len(title_set - file_set) / float(len(title_set)) if score >= DIFF_THRESHOLD: if (fuzzy_info.candidate_id == -1) or score > fuzzy_info.diff_score: fuzzy_info.candidate_id = episode.id fuzzy_info.diff_score = score # now let's feed the episode info from the ablookup into the lookup list of # episodes. This will also group all permanently abandoned files in the # category -1. abandoned = list() for fuzzy_info, dummy in ablookup: epid = fuzzy_info.candidate_id epfile = fuzzy_info.epfile if epid != -1: if epid in ep_to_file: ep_to_file[epid].append(epfile) else: ep_to_file[epid] = [ epfile ] else: abandoned.append(epfile) ep_to_file[-1] = abandoned return ep_to_file
def update_mediafiles(series): """ This function scans all available files on disk for a specific series, and compares that with the files in the database. If changes are foundm updates are performed or files are removed from the database """ # get all relevant stored files dbfiles = db.store.find(episodefile.EpisodeFile, episodefile.EpisodeFile.series_id == series.id) dbfiles = [dbfile for dbfile in dbfiles] # decouple from the query result # get all files from disk diskfiles = _get_mediafiles(series_list.get_series_path(series))
def update_statuses(sel=None): # every serie with a folder assigned will be scanned, all # episodes that match a file, and have the status downloaded, # downloading, to download candidates = [ series_list.EP_TO_DOWNLOAD, series_list.EP_DOWNLOADING, series_list.EP_DOWNLOADED ] updatecount = 0 epcount = 0 if sel is None: serieslist = db.store.find(series_list.Series) serieslist = [series for series in serieslist] # decouple resultset else: serieslist = [sel] for series in serieslist: if series.folder != '': sfiles = db_conv_xml._collectEpisodeFiles( series_list.get_series_path(series)) episodes = db.store.find( series_list.Episode, series_list.Episode.series_id == series.id) episodes = [episode for episode in episodes] for episode in episodes: if (episode.status in candidates) and (episode.season in sfiles): episode.status = series_list.EP_READY episode.changed = 0 db.store.commit() if sel is not None: episode_updated(episode) updatecount += 1 epcount += 1 if sel is None: set_view(series_filter.VIEW_SERIES) return (updatecount, epcount)
def update_statuses(sel = None): # every serie with a folder assigned will be scanned, all # episodes that match a file, and have the status downloaded, # downloading, to download candidates = [ series_list.EP_TO_DOWNLOAD, series_list.EP_DOWNLOADING, series_list.EP_DOWNLOADED] updatecount = 0 epcount = 0 if sel is None: serieslist = db.store.find(series_list.Series) serieslist = [series for series in serieslist] # decouple resultset else: serieslist = [ sel ] for series in serieslist: if series.folder != '': sfiles = db_conv_xml._collectEpisodeFiles(series_list.get_series_path(series)) episodes = db.store.find(series_list.Episode, series_list.Episode.series_id == series.id) episodes = [episode for episode in episodes] for episode in episodes: if (episode.status in candidates) and (episode.season in sfiles): episode.status = series_list.EP_READY episode.changed = 0 db.store.commit() if sel is not None: episode_updated(episode) updatecount += 1 epcount += 1 if sel is None: set_view(series_filter.VIEW_SERIES) return (updatecount, epcount)