Example #1
0
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
Example #2
0
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
Example #3
0
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))
Example #4
0
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))
Example #5
0
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)
Example #6
0
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)