Example #1
0
    def __init__(self):
        self.apiKey = tools.getSetting('tvdb.apikey')
        if self.apiKey == '':
            self.apiKey = "43VPI0R8323FB7TI"

        self.baseUrl = 'https://api.thetvdb.com/'
        self.jwToken = tools.getSetting('tvdb.jw')
        self.headers = {'Content-Type': 'application/json'}
        self.art = {}
        self.info = {}
        self.episode_summary = {}
        self.cast = []
        self.baseImageUrl = 'https://www.thetvdb.com/banners/'
        self.threads = []
        self.fanartart = {}

        self.tvshows_poster_limit = int(
            tools.getSetting('tvshows.poster_limit'))
        self.tvshows_fanart_limit = int(
            tools.getSetting('tvshows.fanart_limit'))
        self.tvshows_keyart_limit = int(
            tools.getSetting('tvshows.keyart_limit'))
        self.tvshows_characterart_limit = int(
            tools.getSetting('tvshows.characterart_limit'))
        self.tvshows_banner = tools.getSetting('tvshows.banner')
        self.season_poster = tools.getSetting('season.poster')
        self.season_banner = tools.getSetting('season.banner')
        self.season_landscape = tools.getSetting('season.landscape')
        self.season_fanart = tools.getSetting('season.fanart')
        self.episode_fanart = tools.getSetting('episode.fanart')

        self.tvshows_prefer_fanart = tools.getSetting(
            'tvshows.preferedsource') == '0'

        if tools.fanart_api_key == '':
            self.fanart_support = False
        else:
            self.fanart_support = True

        if self.jwToken is not '':
            self.headers['Authorization'] = 'Bearer %s' % self.jwToken
        else:
            self.newToken()
            self.headers['Authorization'] = 'Bearer %s' % self.jwToken
Example #2
0
 def __init__(self):
     self.agent_identifier = tools.addonName
     self.apikey = tools.getSetting('alldebrid.apikey')
Example #3
0
    def magnetToLink(self, torrent, args):
        try:
            if torrent['package'] == 'single':
                return self.singleMagnetToLink(torrent['magnet'])

            hash = str(
                re.findall(r'btih:(.*?)&', torrent['magnet'])[0].lower())
            hashCheck = self.checkHash(hash)
            torrent = self.addMagnet(torrent['magnet'])
            episodeStrings, seasonStrings = source_utils.torrentCacheStrings(
                args)
            key_list = []
            for storage_variant in hashCheck[hash]['rd']:
                file_inside = False
                key_list = []
                bad_storage = False

                for key, value in storage_variant.items():
                    filename = storage_variant[key]['filename']
                    if not any(
                            filename.endswith(extension) for extension in
                            source_utils.COMMON_VIDEO_EXTENSIONS):
                        bad_storage = True
                        continue
                    else:
                        key_list.append(key)
                        if any(
                                source_utils.cleanTitle(episodeString) in
                                source_utils.cleanTitle(filename)
                                for episodeString in episodeStrings):
                            file_inside = True

                if file_inside is False or bad_storage is True:
                    continue
                else:
                    break

            if len(key_list) == 0:
                self.deleteTorrent(torrent['id'])
                return None

            key_list = ','.join(key_list)

            self.torrentSelect(torrent['id'], key_list)

            link = self.torrentInfo(torrent['id'])

            file_index = None
            for idx, i in enumerate(
                [i for i in link['files'] if i['selected'] == 1]):
                if any(
                        source_utils.cleanTitle(episodeString) in
                        source_utils.cleanTitle(i['path'].split('/')[-1])
                        for episodeString in episodeStrings):
                    file_index = idx

            if file_index is None:
                self.deleteTorrent(torrent['id'])
                return None

            link = link['links'][file_index]
            link = self.unrestrict_link(link)

            if link.endswith('rar'):
                link = None

            if tools.getSetting('rd.autodelete') == 'true':
                self.deleteTorrent(torrent['id'])
            return link
        except:
            import traceback
            traceback.print_exc()
            self.deleteTorrent(torrent['id'])
            return None
Example #4
0
    def mixedEpisodeBuilder(self,
                            trakt_list,
                            sort=None,
                            hide_watched=False,
                            smartPlay=False,
                            hide_unaired=True,
                            prepend_date=False):

        self.threadList = []

        try:
            if len(trakt_list) == 0:
                tools.log('We received no titles to build a list', 'error')
                return

            self.itemList = TraktSyncDatabase().get_episode_list(trakt_list)

            self.itemList = [
                x for x in self.itemList if x is not None and 'info' in x
            ]
            self.itemList = [
                i for i in self.itemList
                if 'info' in i and i['info'].get('premiered', None) is not None
            ]
            if sort is None:
                self.itemList = sorted(
                    self.itemList,
                    key=lambda i: tools.datetime_workaround(
                        i['info']['premiered'], tools.trakt_gmt_format, False),
                    reverse=True)
            elif sort is not False:
                sort_list = []
                for trakt_id in sort['id_list']:
                    try:
                        if not sort['type']:
                            item = [
                                i for i in self.itemList
                                if i['ids']['trakt'] == trakt_id
                            ][0]
                        else:
                            item = [
                                i for i in self.itemList
                                if i[sort['type']]['ids']['trakt'] == trakt_id
                            ][0]
                        sort_list.append(item)
                    except IndexError:
                        continue
                    except:
                        import traceback
                        traceback.print_exc()
                self.itemList = sort_list

            item_list = []

            for item in self.itemList:
                if item is None:
                    continue

                if item['info'].get('title', '') == '':
                    continue

                if hide_watched and item['info']['playcount'] != 0:
                    continue

                cm = []

                try:
                    name = tools.display_string(item['info']['title'])

                    if not self.is_aired(
                            item['info']) and hide_unaired is True:
                        continue
                    elif not self.is_aired(item['info']):
                        name = tools.colorString(name, 'red')
                        name = tools.italic_string(name)
                        item['info']['title'] = name

                    item['info'] = tools.clean_air_dates(item['info'])

                    args = {'showInfo': {}, 'episodeInfo': {}}

                    if tools.getSetting('smartplay.playlistcreate'
                                        ) == 'true' and not smartPlay:
                        action = 'smartPlay'
                        playable = False
                    else:
                        playable = True
                        action = 'getSources'

                    args['showInfo'] = item['showInfo']
                    args['episodeInfo']['info'] = item['info']
                    args['episodeInfo']['art'] = item['art']
                    args['episodeInfo']['ids'] = item['ids']

                    if self.title_appends == 'true':
                        name = "%s: %sx%s %s" % (
                            tools.colorString(
                                args['showInfo']['info']['tvshowtitle']),
                            tools.display_string(
                                item['info']['season']).zfill(2),
                            tools.display_string(
                                item['info']['episode']).zfill(2),
                            tools.display_string(item['info']['title']))
                    if prepend_date:
                        release_day = tools.datetime_workaround(
                            item['info']['aired'])
                        release_day = release_day.strftime('%d %b')
                        name = '[%s] %s' % (release_day, name)

                    args = tools.quote(json.dumps(args, sort_keys=True))

                    cm.append((tools.lang(
                        32069
                    ), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)'
                               % (sysaddon,
                                  tools.quote(json.dumps(str(
                                      item['showInfo']))))))

                    cm.append((tools.lang(
                        32066
                    ), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)'
                               % (sysaddon, args)))

                    cm.append((tools.lang(
                        33022
                    ), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)'
                               % (sysaddon, args)))

                    if tools.getSetting('trakt.auth') != '':
                        cm.append((
                            'Trakt Manager',
                            'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                            (sysaddon,
                             tools.quote(json.dumps(str(
                                 item['trakt_object']))))))

                    if tools.context_addon():
                        cm = []

                    if tools.getSetting(
                            'premiumize.enabled'
                    ) == 'true' and tools.getSetting('premiumize.pin') != '':
                        cm.append((tools.lang(
                            32068
                        ), 'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)'
                                   % (sysaddon, args)))

                    item['info']['title'] = item['info'][
                        'originaltitle'] = name

                    item_list.append(
                        tools.addDirectoryItem(name,
                                               action,
                                               item['info'],
                                               item['art'],
                                               isFolder=False,
                                               isPlayable=playable,
                                               actionArgs=args,
                                               bulk_add=True,
                                               set_ids=item['ids'],
                                               cm=cm))

                except:
                    import traceback
                    traceback.print_exc()
                    continue

            if smartPlay is True:
                return item_list
            else:
                tools.addMenuItems(syshandle, item_list, len(item_list))

        except:
            import traceback
            traceback.print_exc()
Example #5
0
    def resolve(self, sources, args, pack_select=False):

        try:

            stream_link = None
            loop_count = 0
            # Begin resolving links

            for i in sources:
                debrid_provider = i.get('debrid_provider',
                                        'None').replace('_', ' ')
                loop_count += 1
                try:
                    if self.is_canceled():
                        self.close()
                        return

                    if 'size' in i:
                        self.setProperty('source_size',
                                         tools.source_size_display(i['size']))

                    self.setProperty('release_title',
                                     tools.display_string(i['release_title']))
                    self.setProperty('debrid_provider', debrid_provider)
                    self.setProperty('source_provider', i['provider'])
                    self.setProperty('source_resolution', i['quality'])
                    self.setProperty('source_info', " ".join(i['info']))
                    self.setProperty('source_type', i['type'])

                    if i['type'] == 'torrent':
                        stream_link = self.resolve_source(
                            self.resolvers[i['debrid_provider']], i, args,
                            pack_select)
                        if stream_link is None:
                            tools.log('Failed to resolve for torrent %s' %
                                      i['release_title'])
                            continue
                        else:
                            self.return_data = stream_link
                            self.close()
                            return

                    elif i['type'] == 'hoster' or i['type'] == 'cloud':

                        if i['url'] is None:
                            continue

                        if i['type'] == 'cloud' and i[
                                'debrid_provider'] == 'premiumize':
                            selected_file = Premiumize.Premiumize(
                            ).item_details(i['url'])
                            if tools.getSetting(
                                    'premiumize.transcoded') == 'true':
                                url = selected_file['stream_link']
                            else:
                                url = selected_file['link']
                            self.return_data = url
                            self.close()
                            return

                        if 'provider_imports' in i:
                            provider = i['provider_imports']
                            providerModule = __import__(
                                '%s.%s' % (provider[0], provider[1]),
                                fromlist=[''])
                            providerModule = providerModule.source()

                            try:
                                i['url'] = providerModule.resolve(i['url'])
                            except:
                                import traceback
                                traceback.print_exc()
                                pass

                        if 'debrid_provider' in i:
                            stream_link = self.resolve_source(
                                self.resolvers[i['debrid_provider']], i, args,
                                pack_select)
                            if stream_link is None:
                                continue
                            else:
                                try:
                                    requests.head(stream_link, timeout=1)
                                except requests.exceptions.RequestException:
                                    tools.log(
                                        'Head Request failed link likely dead, skipping'
                                    )
                                    continue

                        elif i['url'].startswith('http'):
                            try:
                                ext = i['url'].split('?')[0]
                                ext = ext.split('&')[0]
                                ext = ext.split('|')[0]
                                ext = ext.rsplit('.')[-1]
                                ext = ext.replace('/', '').lower()
                                if ext == 'rar': raise Exception()

                                try:
                                    headers = i['url'].rsplit('|', 1)[1]
                                except:
                                    headers = ''

                                headers = tools.quote_plus(headers).replace(
                                    '%3D', '=') if ' ' in headers else headers
                                headers = dict(tools.parse_qsl(headers))

                                live_check = requests.head(i['url'],
                                                           headers=headers,
                                                           timeout=10)

                                if not live_check.status_code == 200:
                                    tools.log(
                                        'Head Request failed link likely dead, skipping'
                                    )
                                    continue

                                stream_link = i['url']
                            except:
                                import traceback
                                traceback.print_exc()
                                stream_link = None

                        elif tools.file_exists(i['url']):
                            stream_link = i['url']

                        if stream_link is None:
                            continue
                        else:
                            if stream_link.endswith('.rar'):
                                continue
                            self.return_data = stream_link
                            self.close()
                            return
                    continue

                except:
                    import traceback
                    traceback.print_exc()
                    continue

            self.close()
            return
        except:
            import traceback
            traceback.print_exc()
            self.close()
            return
Example #6
0
    def sync_activities(self, silent=False):
        sync_errors = False

        update_time = str(datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S'))

        tools.log('STARTING SYNC')

        self._refresh_activites()

        if not silent and \
                str(self.activites['all_activities']) == self.base_date and \
                tools.getSetting('trakt.auth') != '':
            tools.showDialog.notification(tools.addonName, tools.lang(40133))

            # Give the people time to read the damn notification
            tools.kodi.sleep(500)
        try:

            if str(self.activites['all_activities']) == self.base_date:
                self.silent = False

            if not self.silent:
                self.progress_dialog = tools.bgProgressDialog()
                self.progress_dialog.create(tools.addonName + 'Sync',
                                            'Seren: Trakt Sync')

            ############################################################################################################
            # CHECK FOR META REFRESH
            ############################################################################################################

            # Meta removal should only run every 12 hours, otherwise we repeatedly dump information every run

            try:
                if self.activites['shows_meta_update'] == self.base_date:
                    self._update_activity_record('shows_meta_update',
                                                 update_time)
                else:
                    local_date = trakt_sync._parse_local_date_format(
                        self.activites['shows_meta_update'])
                    local_date = local_date + timedelta(hours=2)
                    now = trakt_sync._utc_now_as_trakt_string()
                    local_date = trakt_sync._strf_local_date(local_date)
                    if trakt_sync._requires_update(now, local_date):
                        self._remove_old_meta_items('shows')
                        self._update_activity_record('shows_meta_update',
                                                     update_time)
            except:
                sync_errors = True
                import traceback
                traceback.print_exc()
                pass

            try:
                if self.activites['movies_meta_update'] == self.base_date:
                    self._update_activity_record('movies_meta_update',
                                                 update_time)
                else:
                    local_date = trakt_sync._parse_local_date_format(
                        self.activites['movies_meta_update'])
                    local_date = local_date + timedelta(hours=2)
                    now = trakt_sync._utc_now_as_trakt_string()
                    local_date = trakt_sync._strf_local_date(local_date)
                    if trakt_sync._requires_update(now, local_date):
                        self._remove_old_meta_items('movies')
                        self._update_activity_record('movies_meta_update',
                                                     update_time)
            except:
                sync_errors = True
                import traceback
                traceback.print_exc()
                pass

            if tools.getSetting('trakt.auth') == '':
                if self.progress_dialog is not None:
                    self.progress_dialog.close()
                    self.progress_dialog = None
                self._update_activity_record('all_activities', update_time)
                return

            trakt_activities = Trakt.TraktAPI().json_response(
                'sync/last_activities')

            if trakt_activities is None:
                tools.log('Unable to connect to Trakt', 'error')
                if self.progress_dialog is not None:
                    self.progress_dialog.close()
                    self.progress_dialog = None
                return True

            if trakt_sync._requires_update(trakt_activities['all'],
                                           self.activites['all_activities']):

                ########################################################################################################
                # SYNC HIDDEN ITEMS
                ########################################################################################################
                try:
                    if not self.silent:
                        self.progress_dialog.update(0, 'Syncing Hidden Items')
                    if trakt_sync._requires_update(trakt_activities['movies']['hidden_at'],
                                                   self.activites['hidden_sync']) and \
                            trakt_sync._requires_update(trakt_activities['shows']['hidden_at'],
                                                        self.activites['hidden_sync']):
                        self._sync_hidden()

                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass
                ########################################################################################################
                # SYNC WATCHED ITEMS
                ########################################################################################################
                sync_triggered = False

                try:
                    if trakt_sync._requires_update(
                            trakt_activities['episodes']['watched_at'],
                            self.activites['shows_watched']):
                        sync_triggered = True
                        self._sync_watched_episodes()
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass
                try:
                    if trakt_sync._requires_update(
                            trakt_activities['movies']['watched_at'],
                            self.activites['movies_watched']):
                        sync_triggered = True
                        self._sync_watched_movies()
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass
                try:
                    if sync_triggered:
                        if not self.silent:
                            self.progress_dialog.update(
                                0, 'Syncing Unwatched items')
                        self._sync_unwatched()
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass

                ########################################################################################################
                # SYNC COLLECTION
                ########################################################################################################

                sync_triggered = False

                try:
                    if trakt_sync._requires_update(
                            trakt_activities['episodes']['collected_at'],
                            self.activites['shows_collected']):
                        self._sync_collection_shows()
                        sync_triggered = True
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass

                try:
                    if trakt_sync._requires_update(
                            trakt_activities['movies']['collected_at'],
                            self.activites['movies_collected']):
                        self._sync_collection_movies()
                        sync_triggered = True
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass

                try:
                    if sync_triggered:
                        if not self.silent:
                            self.progress_dialog.update(
                                0, 'Syncing Uncollected items')
                        self._sync_uncollected()
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass

                ########################################################################################################
                # SYNC BOOKMARK
                ########################################################################################################

                sync_triggered = False

                try:
                    if trakt_sync._requires_update(
                            trakt_activities['episodes']['paused_at'],
                            self.activites['episodes_bookmarked']):
                        cursor = self._get_cursor()
                        cursor.execute('DELETE FROM bookmark WHERE 1=1')
                        cursor.connection.commit()
                        cursor.close()
                        self._sync_bookmarks('episodes')
                        sync_triggered = True
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass

                try:
                    if trakt_sync._requires_update(
                            trakt_activities['movies']['paused_at'],
                            self.activites['movies_bookmarked']):
                        self._sync_bookmarks('movies')
                        sync_triggered = True
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass

                try:
                    if sync_triggered:
                        if not self.silent:
                            self.progress_dialog.update(
                                100, 'Syncing bookmarked items')
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass

                ########################################################################################################
                # SYNC LISTS
                ########################################################################################################

                lists_to_update = []

                try:
                    trakt_api = Trakt.TraktAPI()
                    lists = trakt_api.json_response('users/me/lists',
                                                    limit=True,
                                                    limitOverride=500)
                    lists.extend([
                        i['list'] for i in trakt_api.json_response(
                            'users/likes/lists', limit=True, limitOverride=500)
                    ])
                    for item in lists:
                        if not trakt_sync._requires_update(
                                item['updated_at'],
                                self.activites['lists_sync']):
                            continue
                        lists_to_update.append(item)

                    self._sync_lists(lists_to_update)
                except:
                    sync_errors = True
                    import traceback
                    traceback.print_exc()
                    pass

                self._update_activity_record('all_activities', update_time)

            if self.progress_dialog is not None:
                self.progress_dialog.close()
                self.progress_dialog = None
        except:
            try:
                if self.progress_dialog is not None:
                    self.progress_dialog.close()
                    self.progress_dialog = None
            except:
                pass
            import traceback
            traceback.print_exc()
            pass

        return sync_errors
Example #7
0
    def seasonListBuilder(self, show_id, smartPlay=False):

        self.itemList = TraktSyncDatabase().get_season_list(show_id)

        self.itemList = [
            x for x in self.itemList if x is not None and 'info' in x
        ]

        self.itemList = sorted(self.itemList,
                               key=lambda k: k['info']['season'])

        if len(self.itemList) == 0:
            tools.log('We received no titles to build a list', 'error')
            return

        hide_specials = False

        if tools.getSetting('general.hideSpecials') == 'true':
            hide_specials = True

        item_list = []

        for item in self.itemList:

            try:
                if hide_specials and int(item['info']['season']) == 0:
                    continue

                args = {'showInfo': {}, 'seasonInfo': {}}

                action = 'seasonEpisodes'
                args['showInfo'] = item['showInfo']
                args['seasonInfo']['info'] = item['info']
                args['seasonInfo']['art'] = item['art']
                args['seasonInfo']['ids'] = item['ids']
                item['trakt_object']['show_id'] = item['showInfo']['ids'][
                    'trakt']
                name = item['info']['season_title']

                if not self.is_aired(
                        item['info']) or 'aired' not in item['info']:
                    if tools.getSetting('general.hideUnAired') == 'true':
                        continue
                    name = tools.colorString(name, 'red')
                    name = tools.italic_string(name)
                    item['info']['title'] = name

                item['info'] = tools.clean_air_dates(item['info'])

                args = tools.quote(json.dumps(args, sort_keys=True))
            except:
                import traceback
                traceback.print_exc()
                continue

            if smartPlay is True:
                return args

            cm = []
            if tools.getSetting('trakt.auth') != '':
                cm.append((
                    'Trakt Manager',
                    'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                    (sysaddon, tools.quote(json.dumps(item['trakt_object'])))))

            if tools.context_addon():
                cm = []

            item_list.append(
                tools.addDirectoryItem(name,
                                       action,
                                       item['info'],
                                       item['art'],
                                       cm=cm,
                                       isFolder=True,
                                       isPlayable=False,
                                       actionArgs=args,
                                       set_ids=item['ids'],
                                       bulk_add=True))

        tools.addMenuItems(syshandle, item_list, len(item_list))
    def showListBuilder(self, traktList, forceResume=False, info_only=False):

        self.threadList = []
        try:
            if len(traktList) == 0: return
        except:
            return

        if 'show' in traktList[0]:
            buildList = [i['show'] for i in traktList]
            traktList = buildList

        for item in traktList:

            if tools.getSetting('general.metalocation') == '1':
                self.threadList.append(
                    Thread(target=self.tvdbShowListWorker, args=(item, )))
            else:
                self.threadList.append(
                    Thread(target=self.tmdbShowListWorker, args=(item, )))

        self.runThreads()
        self.itemList = tools.sort_list_items(self.itemList, traktList)
        if tools.getSetting('trakt.auth') != '':
            traktWatched = trakt.json_response(
                'sync/watched/shows?extended=full')

            for listItem in self.itemList:
                try:
                    for show in traktWatched:
                        if show['show']['ids']['trakt'] == listItem['ids'][
                                'trakt']:
                            listItem['info']['playcount'] = 1
                            episodes = 0
                            for season in show['seasons']:
                                episodes += len(season['episodes'])
                            if episodes < show['show']['aired_episodes']:
                                listItem['info']['playcount'] = 0
                            break
                except:
                    pass

        for item in self.itemList:
            if item is None: continue
            try:
                args = {}
                cm = []
                action = ''

                # Add Arguments to pass with items
                args['ids'] = item['ids']
                args['info'] = item['info']
                args['art'] = item['art']
                name = item['info']['tvshowtitle']
                args = tools.quote(json.dumps(args, sort_keys=True))

                if info_only == True:
                    return args

                if 'setCast' in item:
                    set_cast = item['setCast']
                else:
                    set_cast = None

                if tools.getSetting('smartplay.clickresume'
                                    ) == 'true' or forceResume is True:
                    action = 'smartPlay'
                else:
                    action = 'showSeasons'

                # Context Menu Items

                cm.append(
                    (tools.lang(32070).encode('utf-8'),
                     'XBMC.RunPlugin(%s?action=shufflePlay&actionArgs=%s)' %
                     (sysaddon, args)))

                cm.append(
                    (tools.lang(32020).encode('utf-8'),
                     'Container.Update(%s?action=showsRelated&actionArgs=%s)' %
                     (sysaddon, item['ids']['trakt'])))

                cm.append((tools.lang(32069).encode(
                    'utf-8'
                ), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)'
                           % (sysaddon, args)))

                if tools.getSetting('trakt.auth') != '':
                    cm.append(
                        ('Trakt Manager',
                         'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                         (sysaddon,
                          tools.quote(json.dumps(item['trakt_object'])))))

                if tools.context_addon():
                    cm = []

                try:
                    if tools.kodiVersion > 17:
                        item['info'].pop('seasonCount')
                        item['info'].pop('episodeCount')
                        item['info'].pop('showaliases')
                except:
                    pass

            except:
                import traceback
                traceback.print_exc()
                continue

            tools.addDirectoryItem(name,
                                   action,
                                   item['info'],
                                   item['art'],
                                   all_fanart=None,
                                   cm=cm,
                                   isFolder=True,
                                   isPlayable=False,
                                   actionArgs=args,
                                   set_cast=set_cast,
                                   set_ids=item['ids'])
Example #9
0
    def getSources(self, args):
        try:
            # Extract arguments from url
            self.args = json.loads(tools.unquote(args))

            tools.log('Starting Scraping', 'debug')

            if 'showInfo' in self.args:
                background = self.args['showInfo']['art'].get('fanart', '')
                self.trakt_id = self.args['showInfo']['ids']['trakt']
            else:
                self.trakt_id = self.args['ids']['trakt']
                background = self.args['art'].get('fanart')

            self.setText(tools.lang(32081).encode('utf-8'))
            self.setBackground(background)

            try:
                self.getLocalTorrentResults()
            except:
                pass

            self.updateProgress()

            if not self.prem_terminate():
                self.setText(tools.lang(32082).encode('utf-8'))
                self.initProviders()
                # Load threads for all sources
                for i in self.torrentProviders:
                    self.torrent_threads.append(
                        threading.Thread(target=self.getTorrent,
                                         args=(self.args, i)))
                for i in self.hosterProviders:
                    self.hoster_threads.append(
                        threading.Thread(target=self.getHosters,
                                         args=(self.args, i)))

                # Shuffle and start scraping threads
                random.shuffle(self.torrent_threads)
                random.shuffle(self.hoster_threads)
                for i in self.torrent_threads:
                    i.start()
                time.sleep(2)
                for i in self.hoster_threads:
                    i.start()

                self.setText(tools.lang(32083).encode('utf-8'))

                # Keep alive for gui display and threading
                timeout = int(tools.getSetting('general.timeout'))
                tools.log('Entering Keep Alive', 'info')
                runtime = 0

                while self.progress < 100:

                    tools.log('Remainin Providers %s' %
                              self.remainingProviders)
                    if self.prem_terminate() is True or len(
                            self.remainingProviders) == 0:
                        if runtime > 5:
                            break

                    if self.canceled:
                        break

                    self.updateProgress()
                    # tools.progressDialog.update(progressPercent, line1, line2, line3)
                    try:
                        self.setProgress()
                        self.setText("4K: %s | 1080: %s | 720: %s | SD: %s" % (
                            tools.colorString(self.torrents_qual_len[0] +
                                              self.hosters_qual_len[0]),
                            tools.colorString(self.torrents_qual_len[1] +
                                              self.hosters_qual_len[1]),
                            tools.colorString(self.torrents_qual_len[2] +
                                              self.hosters_qual_len[2]),
                            tools.colorString(self.torrents_qual_len[3] +
                                              self.hosters_qual_len[3]),
                        ))
                        self.setText2(
                            "Torrents: %s | Cached: %s | Hosters: %s" %
                            (tools.colorString(len(self.allTorrents)),
                             tools.colorString(len(self.torrentCacheSources)),
                             tools.colorString(len(self.hosterSources))))
                        self.setText3(
                            "Remaining Sources: %s" %
                            tools.colorString(len(self.remainingProviders)))

                    except:
                        import traceback
                        traceback.print_exc()

                    # Update Progress
                    time.sleep(1)
                    runtime += 1
                    self.progress = int(100 -
                                        float(1 - (runtime / float(timeout))) *
                                        100)

                tools.log('Exited Keep Alive', 'info')

            self.debridHosterDuplicates()

            ##### DUPLICATE REMOVAL #####
            # Remove Duplicate Torrent Sources
            post_dup = []
            check_list = []
            for i in self.torrentCacheSources:
                if not [i['hash'].lower(), i['debrid_provider']] in check_list:
                    post_dup.append(i)
                    check_list.append(
                        [i['hash'].lower(), i['debrid_provider']])
                else:
                    self.duplicates_amount += 1
            self.torrentCacheSources = post_dup

            # Remove Duplicate Hoster Sources
            post_dup = []
            check_list = []
            debrid_hosts = copy.deepcopy(self.hosterSources)
            debrid_hosts = [i for i in debrid_hosts if 'debrid_provider' in i]
            non_debrid = copy.deepcopy(self.hosterSources)
            non_debrid = [i for i in non_debrid if 'debrid_provider' not in i]

            for i in debrid_hosts:
                if not [str(i['url']).lower(), i['debrid_provider']
                        ] in check_list:
                    post_dup.append(i)
                    check_list.append(
                        [str(i['url']).lower(), i['debrid_provider']])
                else:
                    self.duplicates_amount += 1

            check_list = []

            for i in non_debrid:
                if not str(i['url']).lower() in check_list:
                    post_dup.append(i)
                    check_list.append(str(i['url']).lower())
                else:
                    self.duplicates_amount += 1

            self.hosterSources = post_dup

            if not self.silent:
                if self.duplicates_amount > 0:
                    try:
                        tools.showDialog.notification(
                            tools.addonName,
                            '%s ' % str(self.duplicates_amount +
                                        tools.lang(32084).encode('utf-8')),
                            sound=False)
                    except:
                        pass

            self.build_cache_assist(self.args)

            # Returns empty list if no sources are found, otherwise sort sources
            if len(self.torrentCacheSources) + len(self.hosterSources) == 0:
                try:
                    tools.playList.clear()
                    tools.closeOkDialog()
                except:
                    pass
                if self.silent:
                    tools.showDialog.notification(
                        tools.addonName,
                        tools.lang(32085).encode('utf-8'))

                self.return_data = ([], self.args)
                self.close()
                return

            sorted = self.sortSources(self.torrentCacheSources,
                                      self.hosterSources)
            self.return_data = [sorted, self.args]
            self.close()
            return

        except:
            self.close()
            import traceback
            traceback.print_exc()
    def episodeListBuilder(self,
                           traktList,
                           showInfo,
                           smartPlay=False,
                           info_only=False,
                           hide_unaired=False):

        self.threadList = []
        try:
            play_list = []

            if len(traktList) == 0: return

            for item in traktList:

                # if tools.getSetting('general.metalocation') == '1':
                if 1 == 1:
                    self.threadList.append(
                        Thread(target=self.tvdbEpisodeWorker,
                               args=(item, showInfo)))
                else:
                    self.threadList.append(
                        Thread(target=self.tmdbEpisodeWorker,
                               args=(item, showInfo)))

            self.runThreads()
            if smartPlay is False and tools.getSetting('trakt.auth') != '':
                try:
                    traktWatched = trakt.json_response(
                        'shows/%s/progress/watched' %
                        showInfo['showInfo']['ids']['trakt'])
                except:
                    pass
            self.itemList = [x for x in self.itemList if x is not None]
            try:
                self.itemList = sorted(self.itemList,
                                       key=lambda k: k['info']['episode'])
            except:
                pass
            if info_only == True:
                return
            for item in self.itemList:
                if hide_unaired:
                    try:
                        currentDate = datetime.datetime.today().date()
                        airdate = item['info']['premiered']
                        if airdate == '':
                            continue
                        airdate = tools.datetime_workaround(airdate)
                        if airdate > currentDate:
                            continue
                    except:
                        import traceback
                        traceback.print_exc()
                        pass
                cm = []
                action = ''
                if item is None: continue
                if smartPlay is False and tools.getSetting('trakt.auth') != '':
                    item['info']['playcount'] = 0
                    try:
                        for season in traktWatched['seasons']:
                            if season['number'] == item['info']['season']:
                                for episode in season['episodes']:
                                    if episode['number'] == item['info'][
                                            'episode'] and episode[
                                                'completed'] == True:
                                        item['info']['playcount'] = 1
                    except:
                        pass

                try:
                    args = {'showInfo': {}, 'episodeInfo': {}}

                    if tools.getSetting('smartplay.playlistcreate'
                                        ) == 'true' and smartPlay is False:
                        action = 'smartPlay'
                        playable = False
                    else:
                        playable = True
                        action = 'getSources'
                    args['showInfo'] = showInfo['showInfo']
                    args['episodeInfo']['info'] = item['info']
                    args['episodeInfo']['art'] = item['art']
                    args['episodeInfo']['ids'] = item['ids']
                    name = item['info']['title']

                    args = tools.quote(json.dumps(args, sort_keys=True))

                except:
                    import traceback
                    traceback.print_exc()
                    continue

                cm.append((tools.lang(32066).encode(
                    'utf-8'
                ), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)'
                           % (sysaddon, args)))

                if tools.getSetting('trakt.auth') != '':
                    cm.append(
                        ('Trakt Manager',
                         'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                         (sysaddon,
                          tools.quote(json.dumps(item['trakt_object'])))))

                if tools.context_addon():
                    cm = []

                if tools.getSetting(
                        'premiumize.enabled'
                ) == 'true' and tools.getSetting('premiumize.pin') != '':
                    cm.append(
                        (tools.lang(32068).encode('utf-8'),
                         'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)' %
                         (sysaddon, args)))

                if smartPlay is False:
                    tools.addDirectoryItem(name,
                                           action,
                                           item['info'],
                                           item['art'],
                                           cm=cm,
                                           isFolder=False,
                                           isPlayable=playable,
                                           actionArgs=args,
                                           set_ids=item['ids'])
                else:
                    play_list.append(
                        tools.addDirectoryItem(name,
                                               action,
                                               item['info'],
                                               item['art'],
                                               isFolder=False,
                                               isPlayable=playable,
                                               actionArgs=args,
                                               smart_play=True,
                                               set_ids=item['ids']))

            if smartPlay is True:
                return play_list

        except:
            import traceback
            traceback.print_exc()
    def directToEpisodeBuilder(self, traktList, title_appends=None, sort=None):

        self.threadList = []
        traktWatched = trakt.json_response('sync/watched/shows')

        try:
            if len(traktList) == 0: return

            for item in traktList:
                # if tools.getSetting('general.metalocation') == '1':
                if 1 == 1:
                    self.threadList.append(
                        Thread(target=self.tvdbEpisodeWorker,
                               args=(item['episode'], item['show'])))
                else:
                    self.threadList.append(
                        Thread(target=self.tmdbEpisodeWorker,
                               args=(item[0], item[1])))

            self.runThreads()
            self.itemList = [i for i in self.itemList if i is not None]

            if sort is not None:
                sorted_list = []
                for sort_id in sort['id_list']:
                    for menu_item in self.itemList:
                        if menu_item[sort['type']]['ids']['trakt'] == sort_id:
                            sorted_list.append(menu_item)
                self.itemList = sorted_list
            else:
                self.itemList = sorted(self.itemList,
                                       key=lambda i: tools.datetime_workaround(
                                           i['info']['premiered']),
                                       reverse=True)

            for item in self.itemList:
                if item is None:
                    continue
                try:
                    currentDate = datetime.datetime.today().date()
                    airdate = item['info']['premiered']
                    if airdate == '':
                        continue
                    airdate = tools.datetime_workaround(airdate)
                    if airdate > currentDate:
                        continue
                except:
                    import traceback
                    traceback.print_exc()
                    pass

                if item['info'].get('title', '') == '':
                    continue
                cm = []
                action = ''

                if tools.getSetting('trakt.auth') != '':
                    try:
                        item['info']['playcount'] = 0
                        for show in traktWatched:
                            if str(show['show']['ids']['trakt']) == str(
                                    item['showInfo']['ids']['trakt']):
                                for season in show['seasons']:
                                    if str(season['number']) == str(
                                            item['info']['season']):
                                        for episode in season['episodes']:
                                            if str(episode['number']) == str(
                                                    item['info']['episode']):
                                                if episode['plays'] > 0:
                                                    item['info'][
                                                        'playcount'] = 1
                    except:
                        pass

                try:
                    args = {'showInfo': {}, 'episodeInfo': {}}

                    if tools.getSetting('smartplay.playlistcreate') == 'true':
                        action = 'smartPlay'
                        playable = False
                    else:
                        playable = True
                        action = 'getSources'

                    args['showInfo'] = item['showInfo']
                    args['episodeInfo']['info'] = item['info']
                    args['episodeInfo']['art'] = item['art']
                    args['episodeInfo']['ids'] = item['ids']
                    name = "%s: %sx%s %s" % (
                        tools.colorString(
                            args['showInfo']['info']['tvshowtitle']),
                        str(item['info']['season']).zfill(2),
                        str(item['info']['episode']).zfill(2),
                        item['info']['title'].encode('utf-8'))

                    if title_appends is not None:
                        name = '%s - %s' % (
                            name, title_appends[item['ids']['trakt']])

                    item['info']['title'] = item['info'][
                        'originaltitle'] = name

                    args = tools.quote(json.dumps(args, sort_keys=True))

                    cm.append((tools.lang(32069).encode(
                        'utf-8'
                    ), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)'
                               % (sysaddon,
                                  tools.quote(json.dumps(item['showInfo'])))))

                    cm.append((tools.lang(32066).encode(
                        'utf-8'
                    ), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)'
                               % (sysaddon, args)))

                    cm.append((tools.lang(33022).encode(
                        'utf-8'
                    ), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)'
                               % (sysaddon, args)))

                    if tools.getSetting('trakt.auth') != '':
                        cm.append((
                            'Trakt Manager',
                            'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                            (sysaddon,
                             tools.quote(json.dumps(item['trakt_object'])))))

                    if tools.context_addon():
                        cm = []

                    if tools.getSetting(
                            'premiumize.enabled'
                    ) == 'true' and tools.getSetting('premiumize.pin') != '':
                        cm.append((tools.lang(32068).encode(
                            'utf-8'
                        ), 'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)'
                                   % (sysaddon, args)))

                except:
                    import traceback
                    traceback.print_exc()
                    continue

                tools.addDirectoryItem(name,
                                       action,
                                       item['info'],
                                       item['art'],
                                       cm=cm,
                                       isFolder=False,
                                       isPlayable=playable,
                                       actionArgs=args,
                                       set_ids=item['ids'])
        except:
            import traceback
            traceback.print_exc()
    def seasonListBuilder(self, traktList, showInfo, smartPlay=False):
        self.threadList = []

        showInfo['info']['no_seasons'] = len(traktList)

        for item in traktList:

            # if tools.getSetting('general.metalocation') == '1':
            if 1 == 1:
                self.threadList.append(
                    Thread(target=self.tvdbSeasonListWorker,
                           args=(item, showInfo)))
            else:
                self.threadList.append(
                    Thread(target=self.tmdbSeasonListWorker,
                           args=(item, showInfo)))

        self.runThreads()

        if smartPlay is False and tools.getSetting('trakt.auth') != '':
            try:
                traktWatched = trakt.json_response(
                    'shows/%s/progress/watched' % showInfo['ids']['trakt'])

            except:
                pass

        self.itemList = [x for x in self.itemList if x is not None]

        self.itemList = sorted(self.itemList,
                               key=lambda k: k['info']['sortseason'])

        for item in self.itemList:
            cm = []
            action = ''

            if item is None: continue

            if smartPlay is False and tools.getSetting('trakt.auth') != '':
                try:
                    for season in traktWatched['seasons']:
                        if int(item['info']['season']) == int(
                                season['number']):
                            if season['completed'] == season['aired']:
                                item['info']['playcount'] = 1
                except:
                    import traceback
                    traceback.print_exc()
                    pass
            try:
                args = {'showInfo': {}, 'seasonInfo': {}}

                action = 'seasonEpisodes'
                args['showInfo'] = showInfo
                args['seasonInfo']['info'] = item['info']
                args['seasonInfo']['art'] = item['art']
                args['seasonInfo']['ids'] = item['ids']
                name = item['info']['season_title']
                args = tools.quote(json.dumps(args, sort_keys=True))
            except:
                import traceback
                traceback.print_exc()
                continue

            if smartPlay is True:
                return args

            if tools.getSetting('trakt.auth') != '':
                cm.append((
                    'Trakt Manager',
                    'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                    (sysaddon, tools.quote(json.dumps(item['trakt_object'])))))

            if tools.context_addon():
                cm = []
            try:
                if tools.kodiVersion > 17:
                    item['info'].pop('no_seasons')
                    item['info'].pop('season_title')
                    item['info'].pop('overview')
                    item['info'].pop('seasonCount')
                    item['info'].pop('episodeCount')
                    item['info'].pop('showaliases')
            except:
                pass
            tools.addDirectoryItem(name,
                                   action,
                                   item['info'],
                                   item['art'],
                                   cm=cm,
                                   isFolder=True,
                                   isPlayable=False,
                                   actionArgs=args,
                                   set_ids=item['ids'])
Example #13
0
def dispatch(params):
    from resources.lib.common import tools
    from resources.lib.modules import database

    tools.SETTINGS_CACHE = {}

    try:

        url = params.get('url')

        action = params.get('action')

        page = params.get('page')

        actionArgs = params.get('actionArgs')

        pack_select = params.get('packSelect')

        source_select = params.get('source_select')

        seren_reload = True if params.get('seren_reload') == 'true' else False

        resume = params.get('resume')

        forceresumeoff = True if params.get(
            'forceresumeoff') == 'true' else False

        forceresumeon = True if params.get(
            'forceresumeon') == 'true' else False

        smartPlay = True if params.get('smartPlay') == 'true' else False

    except:

        print('Welcome to console mode')
        print('Command Help:')
        print('   - Menu Number: opens the relevant menu page')
        print('   - shell: opens a interactive python shell within Seren')
        print('   - action xxx: run a custom Seren URL argument')

        url = ''

        action = None

        page = ''

        actionArgs = ''

        pack_select = ''

        source_select = ''

        seren_reload = ''

        resume = None

        forceresumeoff = True if params.get(
            'forceresumeoff') == 'true' else False

        forceresumeon = True if params.get(
            'forceresumeon') == 'true' else False

        smartPlay = True if params.get('smartPlay') == 'true' else False

    tools.log('Seren, Running Path - Action: %s, actionArgs: %s' %
              (action, actionArgs))

    if action is None:
        from resources.lib.gui import homeMenu

        homeMenu.Menus().home()

########Begin Soul TV Modifications

########Begin Soul TV Modifications

    if action == 'soulmovieHome':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().discoverSoul()

    if action == 'soultvshowHome':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().discoverSoul()

    if action == 'moviesLatest':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesLatest()

    if action == 'moviesLatestGary':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesLatest()

    if action == 'moviesLatest4k':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesLatest4k()

    if action == 'moviesRTBestofyear':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesRTBestofyear()

    if action == 'moviesLatestReddit':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesLatestReddit()

    if action == 'moviesNetflix':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesNetflix()

    if action == 'moviesPixelHunter':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesPixelHunter()

    if action == 'moviesNeverseen':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesNeverseen()

    if action == 'moviesDisneyP':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesDisneyP()

    if action == 'moviesAppleP':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesAppleP()

    if action == 'showsGary':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsGary()

    if action == 'showsNetflix':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsNetflix()

    if action == 'showsPixelHunter':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsPixelHunter()

    if action == 'showsAmazon':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsAmazon()

    if action == 'showsHulu':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsHulu()

    if action == 'showsAppleP':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsAppleP()

    if action == 'showsDisneyP':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsDisneyP()

    if action == 'soulSpotlight':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().soulSpotlight()

    if action == 'showssoulSpotlight':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showssoulSpotlight()

    if action == 'moviessoulSpotlight':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviessoulSpotlight()

    if action == 'showssoulCurated':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showssoulCurated()

    if action == 'moviessoulCurated':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviessoulCurated()

########End Soul TV Modifications

    if action == 'smartPlay':
        from resources.lib.modules import smartPlay
        # if 'resume' not in actionArgs:
        #     actionArgs = json.loads(actionArgs)
        #     actionArgs['resume'] = sys.argv[3].split(':')[-1]
        #     actionArgs = tools.quote(json.dumps(actionArgs, sort_keys=True))
        smartPlay.SmartPlay(actionArgs).fill_playlist()

    if action == 'playbackResume':
        from resources.lib.modules import smartPlay
        smart = smartPlay.SmartPlay(actionArgs)
        smart.workaround()

    if action == 'moviesHome':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().discoverMovies()

    if action == 'moviesPopular':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesPopular(page)

    if action == 'moviesTrending':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesTrending(page)

    if action == 'moviesPlayed':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesPlayed(page)

    if action == 'moviesWatched':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesWatched(page)

    if action == 'moviesCollected':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesCollected(page)

    if action == 'moviesAnticipated':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesAnticipated(page)

    if action == 'moviesBoxOffice':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesBoxOffice()

    if action == 'moviesUpdated':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesUpdated(page)

    if action == 'moviesRecommended':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesRecommended()

    if action == 'moviesSearch':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesSearch(actionArgs)

    if action == 'moviesSearchResults':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesSearchResults(actionArgs)

    if action == 'moviesSearchHistory':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesSearchHistory()

    if action == 'myMovies':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().myMovies()

    if action == 'moviesMyCollection':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().myMovieCollection()

    if action == 'moviesMyWatchlist':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().myMovieWatchlist()

    if action == 'moviesRelated':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().moviesRelated(actionArgs)

    if action == 'colorPicker':
        tools.colorPicker()

    if action == 'authTrakt':
        from resources.lib.indexers import trakt

        trakt.TraktAPI().auth()

    if action == 'revokeTrakt':
        from resources.lib.indexers import trakt

        trakt.TraktAPI().revokeAuth()

    if action == 'getSources':

        try:

            item_information = tools.get_item_information(actionArgs)
            #
            # This tomfoolery here is the new workaround for Seren to skip the building playlist window

            if tools.getSetting(
                    'smartplay.playlistcreate') == 'true' or smartPlay:

                if tools.playList.size() > 0:
                    playlist_uris = [
                        tools.playList[i].getPath()
                        for i in range(tools.playList.size())
                    ]
                else:
                    playlist_uris = []

                if ('showInfo' in item_information and tools.playList.size() == 0) \
                        or not any(sys.argv[2] in i for i in playlist_uris):

                    try:
                        name = item_information['info']['title']
                        item = tools.addDirectoryItem(
                            name,
                            'getSources',
                            item_information['info'],
                            item_information['art'],
                            item_information['cast'],
                            isFolder=False,
                            isPlayable=True,
                            actionArgs=actionArgs,
                            bulk_add=True,
                            set_ids=item_information['ids'])
                        tools.cancelPlayback()
                        tools.playList.add(url=sys.argv[0] + sys.argv[2],
                                           listitem=item[1])
                        tools.player().play(tools.playList)
                        return
                    except:
                        import traceback
                        traceback.print_exc()
                        return

            bookmark_style = tools.getSetting('general.bookmarkstyle')

            if tools.playList.size(
            ) == 1 and resume is not None and bookmark_style != '2' and not forceresumeoff:

                if bookmark_style == '0' and not forceresumeon:
                    import datetime
                    selection = tools.showDialog.contextmenu([
                        '{} {}'.format(
                            tools.lang(32092),
                            datetime.timedelta(seconds=int(resume))),
                        tools.lang(40350)
                    ])
                    if selection == -1:
                        tools.cancelPlayback()
                        sys.exit()
                    elif selection != 0:
                        resume = None
            else:
                resume = None

            # Assume if we couldn't get information using the normal method, that it's the legacy method
            if item_information is None:
                item_information = actionArgs

            if not tools.premium_check():
                tools.showDialog.ok(tools.addonName, tools.lang(40146),
                                    tools.lang(40147))
                return None

            if tools.playList.getposition() == 0 and tools.getSetting(
                    'general.scrapedisplay') == '0':
                display_background = True
            else:
                display_background = False

            from resources.lib.modules.skin_manager import SkinManager

            if display_background:
                from resources.lib.gui.windows.persistent_background import PersistentBackground
                background = PersistentBackground(
                    *SkinManager().confirm_skin_path(
                        'persistent_background.xml'),
                    actionArgs=actionArgs)
                background.setText(tools.lang(32045))
                background.show()

            from resources.lib.modules import getSources

            uncached_sources, source_results, args = database.get(
                getSources.getSourcesHelper,
                1,
                actionArgs,
                seren_reload=seren_reload,
                seren_sources=True)
            if len(source_results) <= 0:
                tools.showDialog.notification(tools.addonName,
                                              tools.lang(32047),
                                              time=5000)
                return

            if 'showInfo' in item_information:
                source_select_style = 'Episodes'
            else:
                source_select_style = 'Movie'

            if tools.getSetting(
                    'general.playstyle%s' %
                    source_select_style) == '1' or source_select == 'true':

                try:
                    background.setText(tools.lang(40135))
                except:
                    pass

                from resources.lib.modules import sourceSelect

                stream_link = sourceSelect.sourceSelect(
                    uncached_sources, source_results, actionArgs)

                if stream_link is None:
                    tools.showDialog.notification(tools.addonName,
                                                  tools.lang(32047),
                                                  time=5000)
                    raise Exception
                if not stream_link:
                    # user has backed out of source select, don't show no playable sources notification
                    raise Exception
            else:
                try:
                    background.setText(tools.lang(32046))
                except:
                    pass

                from resources.lib.modules import resolver

                resolver_window = resolver.Resolver(
                    *SkinManager().confirm_skin_path('resolver.xml'),
                    actionArgs=actionArgs)

                stream_link = database.get(resolver_window.doModal,
                                           1,
                                           source_results,
                                           args,
                                           pack_select,
                                           seren_reload=seren_reload)
                del resolver_window

                if stream_link is None:
                    tools.closeBusyDialog()
                    tools.showDialog.notification(tools.addonName,
                                                  tools.lang(32047),
                                                  time=5000)
                    raise Exception

            tools.showBusyDialog()
            try:
                background.close()
            except:
                pass
            try:
                del background
            except:
                pass

            from resources.lib.modules import player

            # if 'resume' not in actionArgs:
            #     actionArgs = json.loads(actionArgs)
            #     actionArgs['resume'] = sys.argv[3].split(':')[-1]
            #     actionArgs = json.dumps(actionArgs, sort_keys=True)

            player.serenPlayer().play_source(stream_link,
                                             actionArgs,
                                             resume_time=resume,
                                             params=params)

        except:
            import traceback
            traceback.print_exc()
            # Perform cleanup and make sure all open windows close and playlist is cleared
            try:
                tools.closeBusyDialog()
            except:
                pass
            try:
                background.close()
            except:
                pass
            try:
                del background
            except:
                pass
            try:
                resolver_window.close()
            except:
                pass
            try:
                del resolver_window
            except:
                pass
            try:
                tools.playList.clear()
            except:
                pass
            try:
                tools.closeOkDialog()
            except:
                pass
            try:
                tools.cancelPlayback()
            except:
                pass

    if action == 'preScrape':

        from resources.lib.modules.skin_manager import SkinManager

        try:
            item_information = tools.get_item_information(actionArgs)

            if 'showInfo' in item_information:
                source_select_style = 'Episodes'
            else:
                source_select_style = 'Movie'

            from resources.lib.modules import getSources

            uncached_sources, source_results, args = database.get(
                getSources.getSourcesHelper,
                1,
                actionArgs,
                seren_reload=seren_reload,
                seren_sources=True)

            if tools.getSetting('general.playstyle%s' %
                                source_select_style) == '0':
                from resources.lib.modules import resolver

                resolver_window = resolver.Resolver(
                    *SkinManager().confirm_skin_path('resolver.xml'),
                    actionArgs=actionArgs)
                database.get(resolver_window.doModal,
                             1,
                             source_results,
                             args,
                             pack_select,
                             seren_reload=seren_reload)

            tools.setSetting(id='general.tempSilent', value='false')
        except:
            tools.setSetting(id='general.tempSilent', value='false')
            import traceback

            traceback.print_exc()
            pass

        tools.log('Pre-scraping completed')

    if action == 'authRealDebrid':
        from resources.lib.debrid import real_debrid

        real_debrid.RealDebrid().auth()

    if action == 'showsHome':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().discoverShows()

    if action == 'myShows':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().myShows()

    if action == 'showsMyCollection':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().myShowCollection()

    if action == 'showsMyWatchlist':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().myShowWatchlist()

    if action == 'showsMyProgress':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().myProgress()

    if action == 'showsMyRecentEpisodes':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().myRecentEpisodes()

    if action == 'showsPopular':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsPopular(page)

    if action == 'showsRecommended':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsRecommended()

    if action == 'showsTrending':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsTrending(page)

    if action == 'showsPlayed':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsPlayed(page)

    if action == 'showsWatched':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsWatched(page)

    if action == 'showsCollected':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsCollected(page)

    if action == 'showsAnticipated':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsAnticipated(page)

    if action == 'showsUpdated':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsUpdated(page)

    if action == 'showsSearch':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsSearch(actionArgs)

    if action == 'showsSearchResults':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsSearchResults(actionArgs)

    if action == 'showsSearchHistory':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showSearchHistory()

    if action == 'showSeasons':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showSeasons(actionArgs)

    if action == 'seasonEpisodes':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().seasonEpisodes(actionArgs)

    if action == 'showsRelated':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsRelated(actionArgs)

    if action == 'showYears':
        from resources.lib.gui import tvshowMenus
        tvshowMenus.Menus().showYears(actionArgs, page)

    if action == 'searchMenu':
        from resources.lib.gui import homeMenu

        homeMenu.Menus().searchMenu()

    if action == 'toolsMenu':
        from resources.lib.gui import homeMenu

        homeMenu.Menus().toolsMenu()

    if action == 'clearCache':
        from resources.lib.common import tools

        tools.clearCache()

    if action == 'traktManager':
        from resources.lib.indexers import trakt

        trakt.TraktAPI().traktManager(actionArgs)

    if action == 'onDeckShows':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().onDeckShows()

    if action == 'onDeckMovies':
        from resources.lib.gui.movieMenus import Menus

        Menus().onDeckMovies()

    if action == 'cacheAssist':
        from resources.lib.modules import cacheAssist

        cacheAssist.CacheAssit(actionArgs)

    if action == 'tvGenres':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showGenres()

    if action == 'showGenresGet':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showGenreList(actionArgs, page)

    if action == 'movieGenres':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().movieGenres()

    if action == 'movieGenresGet':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().movieGenresList(actionArgs, page)

    if action == 'filePicker':
        from resources.lib.modules import smartPlay

        smartPlay.SmartPlay(actionArgs).torrent_file_picker()

    if action == 'shufflePlay':
        from resources.lib.modules import smartPlay

        try:
            smart = smartPlay.SmartPlay(actionArgs).shufflePlay()
        except:
            import traceback
            traceback.print_exc()
            pass

    if action == 'resetSilent':
        tools.setSetting('general.tempSilent', 'false')
        tools.showDialog.notification('{}: {}'.format(tools.addonName,
                                                      tools.lang(40296)),
                                      tools.lang(32048),
                                      time=5000)

    if action == 'clearTorrentCache':
        from resources.lib.modules import database

        database.torrent_cache_clear()

    if action == 'openSettings':
        tools.execute('Addon.OpenSettings(%s)' % tools.addonInfo('id'))

    if action == 'myTraktLists':
        from resources.lib.indexers import trakt

        trakt.TraktAPI().myTraktLists(actionArgs)

    if action == 'traktList':
        from resources.lib.indexers import trakt

        trakt.TraktAPI().getListItems(actionArgs, page)

    if action == 'nonActiveAssistClear':
        from resources.lib.gui import debridServices

        debridServices.Menus().assist_non_active_clear()

    if action == 'debridServices':
        from resources.lib.gui import debridServices

        debridServices.Menus().home()

    if action == 'cacheAssistStatus':
        from resources.lib.gui import debridServices

        debridServices.Menus().get_assist_torrents()

    if action == 'premiumizeTransfers':
        from resources.lib.gui import debridServices

        debridServices.Menus().list_premiumize_transfers()

    if action == 'showsNextUp':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().myNextUp()

    if action == 'runMaintenance':
        from resources.lib.common import maintenance

        maintenance.run_maintenance()

    if action == 'providerTools':
        from resources.lib.gui import homeMenu

        homeMenu.Menus().providerMenu()

    if action == 'adjustProviders':
        tools.log('adjustProviders endpoint has been deprecated')
        return
        # from resources.lib.modules import customProviders
        #
        # customProviders.providers().adjust_providers(actionArgs)

    if action == 'adjustPackage':
        tools.log('adjustPackage endpoint has been deprecated')
        return
        # DEPRECATED
        # from resources.lib.modules import customProviders
        #
        # customProviders.providers().adjust_providers(actionArgs, package_disable=True)

    if action == 'installProviders':
        from resources.lib.modules import customProviders

        customProviders.providers().install_package(actionArgs)

    if action == 'uninstallProviders':
        from resources.lib.modules import customProviders

        customProviders.providers().uninstall_package()

    if action == 'showsNew':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().newShows()

    if action == 'realdebridTransfers':
        from resources.lib.gui import debridServices

        debridServices.Menus().list_RD_transfers()

    if action == 'cleanInstall':
        from resources.lib.common import maintenance

        maintenance.wipe_install()

    if action == 'buildPlaylistWorkaround':
        from resources.lib.modules import smartPlay
        smartPlay.SmartPlay(actionArgs).resume_playback()

    if action == 'premiumizeCleanup':
        from resources.lib.common import maintenance

        maintenance.premiumize_transfer_cleanup()

    if action == 'test2':
        pass

    if action == 'manualProviderUpdate':
        from resources.lib.modules import customProviders

        customProviders.providers().manual_update()

    if action == 'clearSearchHistory':
        from resources.lib.modules import database

        database.clearSearchHistory()

    if action == 'externalProviderInstall':
        from resources.lib.modules import customProviders

        confirmation = tools.showDialog.yesno(tools.addonName,
                                              tools.lang(40117))
        if confirmation == 0:
            sys.exit()

        customProviders.providers().install_package(1, url=url)

    if action == 'externalProviderUninstall':
        from resources.lib.modules import customProviders

        confirmation = tools.showDialog.yesno(tools.addonName,
                                              tools.lang(40119) % url)
        if confirmation == 0:
            sys.exit()

        customProviders.providers().uninstall_package(package=url,
                                                      silent=False)

    if action == 'showsNetworks':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsNetworks()

    if action == 'showsNetworkShows':
        from resources.lib.gui import tvshowMenus

        tvshowMenus.Menus().showsNetworkShows(actionArgs, page)

    if action == 'movieYears':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().movieYears()

    if action == 'movieYearsMovies':
        from resources.lib.gui import movieMenus

        movieMenus.Menus().movieYearsMovies(actionArgs, page)

    if action == 'syncTraktActivities':
        from resources.lib.modules.trakt_sync.activities import TraktSyncDatabase
        TraktSyncDatabase().sync_activities()

    if action == 'traktSyncTools':
        from resources.lib.gui import homeMenu
        homeMenu.Menus().traktSyncTools()

    if action == 'flushTraktActivities':
        from resources.lib.modules import trakt_sync
        trakt_sync.TraktSyncDatabase().flush_activities()

    if action == 'flushTraktDBMeta':
        from resources.lib.modules import trakt_sync
        trakt_sync.TraktSyncDatabase().clear_all_meta()

    if action == 'myFiles':
        from resources.lib.gui import myFiles
        myFiles.Menus().home()

    if action == 'myFilesFolder':
        from resources.lib.gui import myFiles
        myFiles.Menus().myFilesFolder(actionArgs)

    if action == 'myFilesPlay':
        from resources.lib.gui import myFiles
        myFiles.Menus().myFilesPlay(actionArgs)

    if action == 'forceTraktSync':
        from resources.lib.modules import trakt_sync
        from resources.lib.modules.trakt_sync.activities import TraktSyncDatabase
        trakt_sync.TraktSyncDatabase().flush_activities()
        TraktSyncDatabase().sync_activities()

    if action == 'rebuildTraktDatabase':
        from resources.lib.modules.trakt_sync import TraktSyncDatabase
        TraktSyncDatabase().re_build_database()

    if action == 'myUpcomingEpisodes':
        from resources.lib.gui import tvshowMenus
        tvshowMenus.Menus().myUpcomingEpisodes()

    if action == 'myWatchedEpisodes':
        from resources.lib.gui import tvshowMenus
        tvshowMenus.Menus().myWatchedEpisodes(page)

    if action == 'myWatchedMovies':
        from resources.lib.gui import movieMenus
        movieMenus.Menus().myWatchedMovies(page)

    if action == 'showsByActor':
        from resources.lib.gui import tvshowMenus
        tvshowMenus.Menus().showsByActor(actionArgs)

    if action == 'movieByActor':
        from resources.lib.gui import movieMenus
        movieMenus.Menus().moviesByActor(actionArgs)

    if action == 'playFromRandomPoint':
        from resources.lib.modules import smartPlay
        smartPlay.SmartPlay(actionArgs).play_from_random_point()

    if action == 'refreshProviders':
        from resources.lib.modules.customProviders import providers
        providers().update_known_providers()

    if action == 'installSkin':
        from resources.lib.modules.skin_manager import SkinManager
        SkinManager().install_skin()

    if action == 'uninstallSkin':
        from resources.lib.modules.skin_manager import SkinManager
        SkinManager().uninstall_skin()

    if action == 'switchSkin':
        from resources.lib.modules.skin_manager import SkinManager
        SkinManager().switch_skin()

    if action == 'manageProviders':
        tools.showBusyDialog()
        from resources.lib.gui.windows.custom_providers import CustomProviders
        from resources.lib.modules.skin_manager import SkinManager
        CustomProviders(*SkinManager().confirm_skin_path(
            'custom_providers.xml')).doModal()

    if action == 'flatEpisodes':
        from resources.lib.gui.tvshowMenus import Menus
        Menus().flat_episode_list(actionArgs)

    if action == 'runPlayerDialogs':
        from resources.lib.modules.player import PlayerDialogs
        try:
            PlayerDialogs().display_dialog()
        except:
            import traceback
            traceback.print_exc()

    if action == 'authAllDebrid':
        from resources.lib.debrid.all_debrid import AllDebrid
        AllDebrid().auth()

    if action == 'checkSkinUpdates':
        from resources.lib.modules.skin_manager import SkinManager
        SkinManager().check_for_updates()

    if action == 'authPremiumize':
        from resources.lib.debrid.premiumize import Premiumize
        Premiumize().auth()
Example #14
0
 def get(self, url, **params):
     if not tools.getSetting('alldebrid.enabled') == 'true':
         return
     params.update({'agent': self.agent_identifier})
     return self.session.get(tools.urljoin(self.base_url, url),
                             params=params)
Example #15
0
 def __init__(self):
     self.itemList = []
     self.threadList = []
     self.viewType = tools.getSetting('movie.view')
Example #16
0
    def build_cache_assist(self, args):
        if tools.getSetting('general.autocache') == 'false':
            return
        if len(self.allTorrents) == 0:
            return
        if len(self.torrentCacheSources) > 0:
            return

        build_list = []

        if tools.getSetting('general.cacheAssistMode') == "0":
            quality_list = ['1080p', '720p', 'SD']

            for quality in quality_list:
                if len(build_list) > 0: break
                if len([
                        i for i in self.torrentCacheSources
                        if i['quality'] == quality
                ]) == 0:
                    quality_filter = [
                        i for i in self.allTorrents if i['quality'] == quality
                    ]
                    if len(quality_filter) > 0:
                        packtype_filter = [
                            i for i in quality_filter if i['package'] == 'show'
                            or i['package'] == 'season'
                        ]
                        sorted_list = sorted(packtype_filter,
                                             key=lambda k: k['seeds'],
                                             reverse=True)
                        if len(sorted_list) > 0:
                            build_list.append(sorted_list[0])
                            break
                        else:
                            package_type_list = [
                                i for i in quality_filter
                                if i['package'] == 'single'
                            ]
                            sorted_list = sorted(package_type_list,
                                                 key=lambda k: k['seeds'],
                                                 reverse=True)
                            if sorted_list > 0:
                                build_list.append(sorted_list[0])
        else:
            if self.silent is True:
                return
            yesno = tools.showDialog.yesno(
                '%s - Cache Assist' % tools.addonName,
                tools.lang(32086).encode('utf-8'))
            if yesno == 0:
                return
            display_list = [
                '%sS | %s | %s | %s' %
                (i['seeds'], tools.color_quality(
                    i['quality']), tools.source_size_display(
                        i['size']), tools.colorString(i['release_title']))
                for i in self.allTorrents
            ]
            selection = tools.showDialog.select(
                '%s - ' % tools.addonName + tools.lang(32087).encode('utf-8'),
                display_list)
            if selection == -1:
                return
            build_list.append(self.allTorrents[selection])

        if len(build_list) > 0:
            actionArgs = {'torrent_list': build_list, 'args': args}
            actionArgs = tools.quote(json.dumps(actionArgs))
            tools.execute('RunPlugin(%s?action=cacheAssist&actionArgs=%s)' %
                          (sysaddon, actionArgs))

        return
Example #17
0
 def __init__(self):
     self.agent_identifier = tools.addonName
     self.token = tools.getSetting('alldebrid.token')
     self.base_url = 'https://api.alldebrid.com/'
Example #18
0
    def sortSources(self, torrent_list, hoster_list):
        sort_method = int(tools.getSetting('general.sortsources'))

        sortedList = []
        resolutions = self.resolutionList()

        resolutions.reverse()

        if tools.getSetting('general.sizesort') == 'true':
            torrent_list = sorted(torrent_list,
                                  key=lambda k: k['size'],
                                  reverse=True)
        else:
            random.shuffle(torrent_list)

        if tools.getSetting('general.disable3d') == 'true':
            torrent_list = [i for i in torrent_list if '3D' not in i['info']]
            hoster_list = [i for i in hoster_list if '3D' not in i['info']]

        if tools.getSetting('general.disablelowQuality') == 'true':
            torrent_list = [i for i in torrent_list if 'CAM' not in i['info']]
            hoster_list = [i for i in hoster_list if 'CAM' not in i['info']]

        if tools.getSetting('general.enablesizelimit') == 'true':
            size_limit = int(tools.getSetting('general.sizelimit')) * 1024
            torrent_list = [
                i for i in torrent_list if i.get('size', 0) < size_limit
            ]

        if tools.getSetting('general.265sort') == 'true':
            torrent_list = [i for i in torrent_list if 'x265' in i['info']] + \
                           [i for i in torrent_list if 'x265' not in i['info']]

            hoster_list = [i for i in hoster_list if 'x265' in i['info']] + \
                          [i for i in hoster_list if 'x265' not in i['info']]

        if tools.getSetting('general.lowQualitysort') == 'true':
            torrent_list = [i for i in torrent_list if 'CAM' not in i['info']] + \
                           [i for i in torrent_list if 'CAM' in i['info']]

            hoster_list = [i for i in hoster_list if 'CAM' not in i['info']] + \
                          [i for i in hoster_list if 'CAM' in i['info']]

        random.shuffle(hoster_list)

        debrid_priorities = self.debrid_priority()

        for resolution in resolutions:
            if sort_method == 0 or sort_method == 2:
                for debrid in debrid_priorities:
                    for torrent in torrent_list:
                        if debrid['slug'] == torrent['debrid_provider']:
                            if torrent['quality'] == resolution:
                                sortedList.append(torrent)

            if sort_method == 1 or sort_method == 2:
                for debrid in debrid_priorities:
                    for file in hoster_list:
                        if 'debrid_provider' in file:
                            if file['debrid_provider'] == debrid['slug']:
                                if file['quality'] == resolution:
                                    sortedList.append(file)

                for file in hoster_list:
                    if 'debrid_provider' not in file:
                        if file['quality'] == resolution:
                            sortedList.append(file)

        if sort_method == 1:
            for resolution in resolutions:
                for debrid in debrid_priorities:
                    for torrent in torrent_list:
                        if torrent['debrid_provider'] == debrid['slug']:
                            if torrent['quality'] == resolution:
                                sortedList.append(torrent)

        if sort_method == 0:
            for resolution in resolutions:
                for debrid in debrid_priorities:
                    for file in hoster_list:
                        if 'debrid_provider' in file:
                            if file['debrid_provider'] == debrid['slug']:
                                if file['quality'] == resolution:
                                    sortedList.append(file)

                for file in hoster_list:
                    try:
                        if 'debrid_provider' not in file and file[
                                'direct'] is True:
                            if file['quality'] == resolution:
                                sortedList.append(file)
                    except:
                        continue

        if tools.getSetting('general.disable265') == 'true':
            sortedList = [i for i in sortedList if 'x265' not in i['info']]

        return sortedList
Example #19
0
 def __init__(self):
     self.itemList = []
     self.threadList = []
     self.direct_episode_threads = []
     self.title_appends = tools.getSetting('general.appendtitles')
     self.task_queue = Queue(40)
Example #20
0
    def resolve_magnet(self, magnet, args, torrent, pack_select=False):
        try:
            if torrent['package'] == 'single' or 'showInfo' not in args:
                return self._single_magnet_resolve(torrent)

            hash = torrent['hash']

            hashCheck = self.checkHash(hash)
            cached_torrent = self.addMagnet(torrent['magnet'])

            for storage_variant in hashCheck[hash]['rd']:

                valid_storage = self.is_streamable_storage_type(
                    storage_variant)

                if not valid_storage:
                    tools.log(
                        'Storage Variant of file is not valid, RD will not provide a playable link',
                        'error')
                    continue

                file_check = source_utils.get_best_match(
                    'filename', storage_variant.values(), args)

                if not file_check:
                    tools.log('Failed to find the file within the pack at RD',
                              'error')
                    continue

                key_list = storage_variant.keys()

                if len(key_list) == 0:
                    tools.log(
                        'Received no keys from storage varaint (RD), skipping',
                        'error')
                    self.deleteTorrent(cached_torrent['id'])
                    return None

                key_list = ','.join(key_list)

                self.torrentSelect(cached_torrent['id'], key_list)

                link = self.torrentInfo(cached_torrent['id'])

                selected_files = [(idx, i) for idx, i in enumerate(
                    [i for i in link['files'] if i['selected'] == 1])]

                best_match = source_utils.get_best_match(
                    'path', [i[1] for i in selected_files], args)

                if not best_match:
                    tools.log('Failed to find the file within the pack at RD',
                              'error')
                    continue

                file_index = [
                    i[0] for i in selected_files
                    if i[1]['path'] == best_match['path']
                ][0]

                link = link['links'][file_index]
                link = self.resolve_hoster(link)

                if link.endswith('rar'):
                    link = None

                if tools.getSetting('rd.autodelete') == 'true':
                    self.deleteTorrent(cached_torrent['id'])

                return link
        except:
            import traceback
            traceback.print_exc()
            self.deleteTorrent(cached_torrent['id'])
            return None
Example #21
0
    def episodeListBuilder(self,
                           show_id,
                           season_number,
                           smartPlay=False,
                           hide_unaired=False):

        try:
            item_list = []

            self.itemList = TraktSyncDatabase().get_season_episodes(
                show_id, season_number)
            self.itemList = [
                x for x in self.itemList if x is not None and 'info' in x
            ]

            if len(self.itemList) == 0:
                tools.log('We received no titles to build a list', 'error')
                return

            try:
                self.itemList = sorted(self.itemList,
                                       key=lambda k: k['info']['episode'])
            except:
                pass

            for item in self.itemList:

                cm = []

                try:
                    args = {'showInfo': {}, 'episodeInfo': {}}

                    if tools.getSetting('smartplay.playlistcreate'
                                        ) == 'true' and smartPlay is False:
                        action = 'smartPlay'
                        playable = False
                    else:
                        playable = True
                        action = 'getSources'

                    args['showInfo'] = item['showInfo']
                    args['episodeInfo']['info'] = item['info']
                    args['episodeInfo']['art'] = item['art']
                    args['episodeInfo']['ids'] = item['ids']
                    name = item['info']['title']

                    if not self.is_aired(item['info']):
                        if tools.getSetting('general.hideUnAired'
                                            ) == 'true' or hide_unaired:
                            continue
                        else:
                            name = tools.colorString(name, 'red')
                            name = tools.italic_string(name)
                            item['info']['title'] = name

                    item['info'] = tools.clean_air_dates(item['info'])

                    args = tools.quote(json.dumps(args, sort_keys=True))

                except:
                    import traceback
                    traceback.print_exc()
                    continue

                cm.append((tools.lang(
                    33022
                ), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)'
                           % (sysaddon, args)))

                cm.append((tools.lang(
                    32066
                ), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)'
                           % (sysaddon, args)))

                if tools.getSetting('trakt.auth') != '':
                    cm.append(
                        ('Trakt Manager',
                         'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                         (sysaddon,
                          tools.quote(json.dumps(item['trakt_object'])))))

                if tools.context_addon():
                    cm = []

                if tools.getSetting(
                        'premiumize.enabled'
                ) == 'true' and tools.getSetting('premiumize.pin') != '':
                    cm.append(
                        (tools.lang(32068),
                         'XBMC.RunPlugin(%s?action=filePicker&actionArgs=%s)' %
                         (sysaddon, args)))

                item_list.append(
                    tools.addDirectoryItem(name,
                                           action,
                                           item['info'],
                                           item['art'],
                                           isFolder=False,
                                           isPlayable=playable,
                                           actionArgs=args,
                                           bulk_add=True,
                                           set_ids=item['ids'],
                                           cm=cm))

            if smartPlay is True:
                return item_list
            else:
                tools.addMenuItems(syshandle, item_list, len(item_list))

        except:
            import traceback
            traceback.print_exc()
Example #22
0
 def trakt_integration(self):
     if tools.getSetting('trakt.auth') == '':
         return False
     else:
         if tools.getSetting('trakt.scrobbling') == 'true':
             return True
Example #23
0
    def showListBuilder(self, trakt_list, forceResume=False, info_only=False):

        try:
            if len(trakt_list) == 0:
                tools.log('We received no titles to build a list', 'error')
                return
        except:
            import traceback
            traceback.print_exc()
            return

        if 'show' in trakt_list[0]:
            trakt_list = [i['show'] for i in trakt_list]

        show_ids = [i['ids']['trakt'] for i in trakt_list]

        self.itemList = TraktSyncDatabase().get_show_list(show_ids)
        self.itemList = [
            x for x in self.itemList if x is not None and 'info' in x
        ]
        self.itemList = tools.sort_list_items(self.itemList, trakt_list)

        item_list = []

        for item in self.itemList:
            try:
                args = {}
                cm = []

                # Add Arguments to pass with items
                args['ids'] = item['ids']
                args['info'] = item['info']
                args['art'] = item['art']

                name = tools.display_string(item['info']['tvshowtitle'])

                args = tools.quote(json.dumps(args, sort_keys=True))

                if info_only == True:
                    return args

                if not self.is_aired(item['info']):
                    if tools.getSetting('general.hideUnAired') == 'true':
                        continue
                    name = tools.colorString(name, 'red')
                    name = tools.italic_string(name)

                item['info'] = tools.clean_air_dates(item['info'])

                if 'setCast' in item:
                    set_cast = item['setCast']
                else:
                    set_cast = False

                if tools.getSetting('smartplay.clickresume'
                                    ) == 'true' or forceResume is True:
                    action = 'smartPlay'
                else:
                    action = 'showSeasons'

                # Context Menu Items

                cm.append(
                    (tools.lang(32070),
                     'XBMC.PlayMedia(%s?action=shufflePlay&actionArgs=%s)' %
                     (sysaddon, args)))

                cm.append(
                    (tools.lang(32020),
                     'Container.Update(%s?action=showsRelated&actionArgs=%s)' %
                     (sysaddon, item['ids']['trakt'])))

                cm.append((tools.lang(
                    32069
                ), 'XBMC.Container.Update(%s?action=showSeasons&actionArgs=%s)'
                           % (sysaddon, args)))

                if tools.getSetting('trakt.auth') != '':
                    cm.append(
                        ('Trakt Manager',
                         'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                         (sysaddon,
                          tools.quote(json.dumps(item['trakt_object'])))))

                cm.append((tools.lang(
                    40153
                ), 'XBMC.PlayMedia(%s?aciton=playFromRandomPoint&actionArgs=%s'
                           % (sysaddon, args)))

                if tools.context_addon():
                    cm = []

            except:
                import traceback
                traceback.print_exc()
                continue

            item_list.append(
                tools.addDirectoryItem(name,
                                       action,
                                       item['info'],
                                       item['art'],
                                       cm=cm,
                                       isFolder=True,
                                       isPlayable=False,
                                       actionArgs=args,
                                       bulk_add=True,
                                       set_cast=set_cast,
                                       set_ids=item['ids']))

        tools.addMenuItems(syshandle, item_list, len(item_list))
Example #24
0
    def next_info(self):
        current_info = self.args
        current_episode = {}
        current_episode["episodeid"] = current_info['episodeInfo']['ids'][
            'trakt']
        current_episode["tvshowid"] = current_info['showInfo']['info'][
            'imdbnumber']
        current_episode["title"] = current_info['episodeInfo']['info']['title']
        current_episode["art"] = {}
        current_episode["art"]["tvshow.poster"] = current_info['episodeInfo'][
            'art']['poster']
        current_episode["art"]["thumb"] = current_info['episodeInfo']['art'][
            'thumb']
        current_episode["art"]["tvshow.fanart"] = current_info['episodeInfo'][
            'art']['fanart']
        current_episode["art"]["tvshow.landscape"] = current_info[
            'episodeInfo']['art']['fanart']
        current_episode["art"]["tvshow.clearart"] = ''
        current_episode["art"]["tvshow.clearlogo"] = ''
        current_episode["plot"] = current_info['episodeInfo']['info']['plot']
        current_episode["showtitle"] = current_info['showInfo']['info'][
            'tvshowtitle']
        current_episode["playcount"] = 0
        current_episode["season"] = current_info['episodeInfo']['info'][
            'season']
        current_episode["episode"] = current_info['episodeInfo']['info'][
            'episode']
        current_episode["rating"] = current_info['episodeInfo']['info'][
            'rating']
        current_episode["firstaired"] = current_info['episodeInfo']['info'][
            'premiered']

        current_position = tools.playList.getposition()
        url = tools.playList[current_position + 1].getPath()
        params = dict(tools.parse_qsl(url.replace('?', '')))
        next_info = json.loads(params.get('actionArgs'))

        next_episode = {}
        next_episode["episodeid"] = next_info['episodeInfo']['ids']['trakt']
        next_episode["tvshowid"] = next_info['showInfo']['info']['imdbnumber']
        next_episode["title"] = next_info['episodeInfo']['info']['title']
        next_episode["art"] = {}
        next_episode["art"]["tvshow.poster"] = next_info['episodeInfo']['art'][
            'poster']
        next_episode["art"]["thumb"] = next_info['episodeInfo']['art']['thumb']
        next_episode["art"]["tvshow.fanart"] = next_info['episodeInfo']['art'][
            'fanart']
        next_episode["art"]["tvshow.landscape"] = next_info['episodeInfo'][
            'art']['fanart']
        next_episode["art"]["tvshow.clearart"] = ''
        next_episode["art"]["tvshow.clearlogo"] = ''
        next_episode["plot"] = next_info['episodeInfo']['info']['plot']
        next_episode["showtitle"] = next_info['showInfo']['info'][
            'tvshowtitle']
        next_episode["playcount"] = 0
        next_episode["season"] = next_info['episodeInfo']['info']['season']
        next_episode["episode"] = next_info['episodeInfo']['info']['episode']
        next_episode["rating"] = next_info['episodeInfo']['info']['rating']
        next_episode["firstaired"] = next_info['episodeInfo']['info'][
            'premiered']

        play_info = {}
        play_info["item_id"] = current_info['episodeInfo']['ids']['trakt']

        next_info = {
            "current_episode": current_episode,
            "next_episode": next_episode,
            "play_info": play_info,
            "notification_time": int(tools.getSetting('smartplay.upnexttime'))
        }

        return next_info
Example #25
0
    def resolve(self, sources, args, pack_select=False):
        try:
            if 'showInfo' in args:
                background = args['showInfo']['art']['fanart']
            else:
                background = args['fanart']

            self.setText("Begining Link Resolver")
            self.setBackground(background)
            stream_link = None
            loop_count = 0
            # Begin resolving links
            tools.log('Attempting to Resolve file link', 'info')
            for i in sources:
                debrid_provider = i.get('debrid_provider', '')
                loop_count += 1
                try:
                    if self.is_canceled():
                        self.close()
                        return
                    if 'size' in i:
                        i['info'].append(tools.source_size_display(i['size']))
                    loop_count_string = "(" + str(loop_count) + " of " + str(
                        len(sources)) + ")"
                    line1 = tools.lang(32036) + "%s - %s" % (tools.colorString(
                        i['release_title']), loop_count_string)
                    line2 = tools.lang(32037) + "%s | Source: %s" % (
                        tools.colorString(debrid_provider.upper()),
                        tools.colorString(i['source']))
                    line3 = tools.lang(32038) + '%s | Info: %s' % (
                        tools.colorString(i['quality']),
                        tools.colorString(" ".join(i['info'])))

                    self.setText(line1)
                    self.setText2(line2)
                    self.setText3(line3)

                    if i['type'] == 'torrent':
                        if i['debrid_provider'] == 'premiumize':
                            stream_link = self.premiumizeResolve(
                                i, args, pack_select)
                        elif i['debrid_provider'] == 'real_debrid':
                            stream_link = self.realdebridResolve(i, args)

                        if stream_link is None:
                            tools.log('Failed to resolve for torrent %s' %
                                      i['release_title'])
                            continue
                        else:
                            self.return_data = stream_link
                            self.close()
                            return

                    elif i['type'] == 'hoster':
                        # Quick fallback to speed up resolving while direct and free hosters are not supported
                        if 'debrid_provider' not in i:
                            continue
                        provider = i['provider_imports']
                        providerModule = __import__('%s.%s' %
                                                    (provider[0], provider[1]),
                                                    fromlist=[''])
                        providerModule = providerModule.source()

                        try:
                            i['url'] = providerModule.resolve(i['url'])
                        except:
                            import traceback
                            traceback.print_exc()
                            pass

                        if i['url'] is None:
                            continue

                        if 'debrid_provider' in i:
                            if i['debrid_provider'] == 'premiumize' and tools.getSetting(
                                    'premiumize.enabled') == 'true':
                                stream_link = self.premiumizeResolve(i, args)
                                if stream_link is None:
                                    continue

                            if i['debrid_provider'] == 'real_debrid':
                                stream_link = self.realdebridResolve(i, args)
                                if stream_link is None:
                                    continue

                        else:
                            # Currently not supporting free hosters at this point in time
                            # ResolveURL and Direct link testing needs to be tested first
                            continue
                            try:
                                try:
                                    headers = i['url'].rsplit('|', 1)[1]
                                except:
                                    headers = ''

                                headers = tools.quote_plus(headers).replace(
                                    '%3D', '=') if ' ' in headers else headers
                                headers = dict(tools.parse_qsl(headers))

                                live_check = requests.head(i['url'],
                                                           headers=headers)

                                if not live_check.status_code == 200:
                                    continue

                                stream_link = i['url']
                            except:
                                stream_link = None

                        if stream_link is None:
                            continue
                        else:
                            self.return_data = stream_link
                            self.close()
                            return
                    continue

                except:
                    import traceback
                    traceback.print_exc()
                    continue

            self.close()
            return
        except:
            import traceback
            traceback.print_exc()
            self.close()
            return
Example #26
0
    def commonListBuilder(self, trakt_list, info_return=False):

        if len(trakt_list) == 0:
            return
        if 'movie' in trakt_list[0]:
            trakt_list = [i['movie'] for i in trakt_list]

        self.itemList = TraktSyncDatabase().get_movie_list(trakt_list)

        self.itemList = [
            x for x in self.itemList if x is not None and 'info' in x
        ]
        self.itemList = tools.sort_list_items(self.itemList, trakt_list)

        list_items = []

        for item in self.itemList:
            try:

                # Add Arguments to pass with item
                args = {}
                args['title'] = item['info']['title']
                args['year'] = item['info']['year']
                args['ids'] = item['ids']
                args['fanart'] = item['art']['fanart']
                args['info'] = item['info']
                args['art'] = item['art']
                args['imdb'] = item['info']['imdbnumber']
                args['tagline'] = item['info']['tagline']
                args['plot'] = item['info']['plot']
                args['rating'] = item['info']['rating']
                args['duration'] = item['info']['duration']

                name = tools.display_string(item['info']['title'])

                if not self.is_aired(item['info']):
                    if tools.getSetting('general.hideUnAired') == 'true':
                        continue
                    name = tools.colorString(name, 'red')
                    name = tools.italic_string(name)

                args = tools.quote(json.dumps(args))

                # Begin Building Context Menu Items
                cm = []
                cm.append((
                    tools.lang(32020),
                    'Container.Update(%s?action=moviesRelated&actionArgs=%s)' %
                    (sysaddon, item['ids']['trakt'])))
                cm.append((tools.lang(
                    32066
                ), 'PlayMedia(%s?action=getSources&source_select=true&actionArgs=%s)'
                           % (sysaddon, args)))
                cm.append((tools.lang(
                    33022
                ), 'PlayMedia(%s?action=getSources&seren_reload=true&actionArgs=%s)'
                           % (sysaddon, args)))

                if tools.getSetting('trakt.auth') != '':
                    cm.append(
                        ('Trakt Manager',
                         'RunPlugin(%s?action=traktManager&actionArgs=%s)' %
                         (sysaddon,
                          tools.quote(json.dumps(item['trakt_object'])))))

                if tools.context_addon():
                    cm = []

            except:
                import traceback
                traceback.print_exc()
                continue

            if item is None:
                continue

            item['info']['title'] = item['info']['originaltitle'] = name

            list_items.append(
                tools.addDirectoryItem(name,
                                       'getSources',
                                       item['info'],
                                       item['art'],
                                       cm=cm,
                                       isFolder=False,
                                       isPlayable=True,
                                       actionArgs=args,
                                       set_ids=item['ids'],
                                       bulk_add=True))

        if info_return:
            return list_items

        tools.addMenuItems(syshandle, list_items, len(list_items))