def auth(self):
        pin_url = '{}/pin/get?agent={}'.format(self.base_url, self.agent_identifier)
        resp = requests.get(pin_url).json()

        expiry = pin_ttl = int(resp['expired_in'])
        auth_complete = False
        tools.copy2clip(resp['pin'])

        tools.progressDialog.create('{} - {}'.format(tools.addonName, 'AllDebrid Auth'))
        tools.progressDialog.update(100, tools.lang(32024).format(tools.colorString(resp['base_url'])),
                                    tools.lang(32025).format(tools.colorString(
                                        resp['pin'])),
                                    'This code has been copied to your clipboard')

        # Seems the All Debrid servers need some time do something with the pin before polling
        # Polling to early will cause an invalid pin error
        time.sleep(5)

        while not auth_complete and not expiry <= 0 and not tools.progressDialog.iscanceled():

            auth_complete, expiry = self.poll_auth(resp['check_url'])
            progress_percent = 100 - int((float(pin_ttl - expiry) / pin_ttl) * 100)
            tools.progressDialog.update(progress_percent)
            time.sleep(1)

        try:tools.progressDialog.close()
        except:pass

        self.store_user_info()

        if auth_complete:
            tools.showDialog.ok(tools.addonName, 'AllDebrid {}'.format(tools.lang(32026)))
        else:
            return
    def auth(self):
        user_code = ''
        url = 'https://api.trakt.tv/oauth/device/code'
        postData = {'client_id': self.ClientID}
        response = requests.post(url, data=postData)
        response = json.loads(response.text)
        try:
            user_code = response['user_code']
            device = response['device_code']
            interval = int(response['interval'])
            expiry = int(response['expires_in'])
        except:
            tools.showDialog.ok(tools.addonName,
                                tools.lang(32032).encode('utf-8'))
            return

        currentTime = 0
        tools.copy2clip(user_code)
        tools.progressDialog.create(
            tools.addonName + ': ' + tools.lang(32031).encode('utf-8'),
            tools.lang(32024).encode('utf-8') +
            tools.colorString('https://trakt.tv/activate \n') +
            tools.lang(32025).encode('utf-8') + tools.colorString(user_code) +
            "\n" + tools.lang(32071).encode('utf-8'))
        tools.progressDialog.update(100)
        while currentTime < (expiry - interval):
            if tools.progressDialog.iscanceled():
                tools.progressDialog.close()
                return
            progressPercent = int(100 - ((float(currentTime) / expiry) * 100))
            tools.progressDialog.update(progressPercent)
            sleep(interval)
            postData = {
                'code': device,
                'client_id': self.ClientID,
                'client_secret': self.ClientSecret
            }
            url = 'https://api.trakt.tv/oauth/device/token'
            response = requests.post(url, data=postData)

            if '200' in str(response):
                response = json.loads(response.text)
                tools.setSetting('trakt.auth', response['access_token'])
                tools.setSetting('trakt.refresh', response['refresh_token'])
                self.headers[
                    'Authorization'] = 'Bearer %s' % response['access_token']
                username = self.get_username()
                tools.setSetting('trakt.username', username)
                tools.progressDialog.close()
                tools.showDialog.ok(tools.addonName,
                                    'Sucessfully authenticated with Trakt')
                break
            if '400' in str(response):
                pass
            else:
                tools.showDialog.ok(tools.addonName,
                                    tools.lang(32032).encode('utf-8'))
                tools.progressDialog.close()
                tools.showDialog.ok(tools.addonName,
                                    tools.lang(32033).encode('utf-8'))
Example #3
0
    def auth(self):
        data = {'client_id': self.client_id, 'response_type': 'device_code'}
        token = requests.post('https://www.premiumize.me/token',
                              data=data).json()
        expiry = token['expires_in']
        token_ttl = token['expires_in']
        poll_again = True
        success = False
        tools.copy2clip(token['user_code'])
        tools.progressDialog.create(tools.addonName,
                                    line1=tools.lang(32024).format(
                                        tools.colorString(
                                            token['verification_uri'])),
                                    line2=tools.lang(32025).format(
                                        tools.colorString(token['user_code'])))
        tools.progressDialog.update(0)

        while poll_again and not token_ttl <= 0 and not tools.progressDialog.iscanceled(
        ):
            poll_again, success = self.poll_token(token['device_code'])
            progress_percent = 100 - int((float(
                (expiry - token_ttl) / expiry) * 100))
            tools.progressDialog.update(progress_percent)
            time.sleep(token['interval'])
            token_ttl -= int(token['interval'])

        tools.progressDialog.close()

        if success:
            tools.showDialog.ok(tools.addonName, tools.lang(32026))
Example #4
0
    def auth(self):
        self.ClientSecret = ''
        self.ClientID = 'X245A4XAIBGVM'
        url = ("client_id=%s&new_credentials=yes" % self.ClientID)
        url = self.OauthUrl + self.DeviceCodeUrl % url
        response = json.loads(requests.get(url).text)
        tools.copy2clip(response['user_code'])
        tools.progressDialog.create(tools.lang(32023))
        tools.progressDialog.update(-1, tools.lang(32024).format(tools.colorString(
            'https://real-debrid.com/device')),
                                    tools.lang(32025).format(tools.colorString(
                                        response['user_code'])),
                                    'This code has been copied to your clipboard')
        self.OauthTimeout = int(response['expires_in'])
        self.OauthTimeStep = int(response['interval'])
        self.DeviceCode = response['device_code']

        while self.ClientSecret == '':
            self.auth_loop()

        self.token_request()

        user_information = self.get_url('user')
        if user_information['type'] != 'premium':
            tools.showDialog.ok(tools.addonName, tools.lang(40156))
Example #5
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 = trakt_database.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:
                # Add Arguments to pass with items
                args = {'trakt_id': item['ids']['trakt'], 'item_type': 'show'}
                args = tools.quote(json.dumps(args, sort_keys=True))

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

                if info_only:
                    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'])
                item['info']['title'] = item['info']['tvshowtitle']
                
                if tools.getSetting('smartplay.clickresume') == 'true' or forceResume is True:
                    action = 'playbackResume'
                else:
                    if tools.getSetting('general.flatten.episodes') == 'true':
                        action = 'flatEpisodes'
                    else:
                        action = 'showSeasons'

            except:
                import traceback
                traceback.print_exc()
                continue

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

        tools.addMenuItems(syshandle, item_list, len(item_list))
Example #6
0
    def adjust_providers(self, status, package_disable=False):
        if status == 'disabled':
            action = 'enabled'
        if status == 'enabled':
            action = 'disabled'
        if len(self.known_providers) == 0:
            self.known_providers = database.get_providers()
        packages = list(set([provider['package'] for provider in self.known_providers]))
        selection = tools.showDialog.select("%s: %s Providers" %
                                            (tools.addonName, action[:-1].title()), packages)

        if selection == -1:
            return

        providers = [i for i in self.known_providers if i['package'] == packages[selection] and i['status'] == status]

        if package_disable is False:
            display_list = ["%s - %s" % (tools.colorString(i['provider_name'].upper()), i['provider_type'].title())
                            for i in providers if i['status'] == status]

            selection = tools.showDialog.multiselect("%s: %s Providers" %
                                                     (tools.addonName, action[:-1].title()), display_list)

            if selection is None:
                return

            for i in selection:
                provider = providers[i]
                database.add_provider(provider['provider_name'], provider['package'], action, self.language,
                                   provider['provider_type'])

        elif package_disable is True:
            for i in providers:
                database.add_provider(i['provider_name'], i['package'], action, self.language, i['provider_type'])
Example #7
0
    def adjust_providers(self, status, package_disable=False):

        if status == 'disabled':
            action = 'enabled'
        if status == 'enabled':
            action = 'disabled'
        if len(self.known_providers) == 0:
            self.known_providers = database.get_providers()

        known_packages = [i for i in self.known_packages]

        package_display = list(
            set([
                '%s - %s' % (pack['pack_name'], pack['version'])
                for pack in known_packages
            ]))

        if len(known_packages) == 0:
            tools.showDialog.ok(tools.addonName, tools.lang(32074))
            return

        selection = tools.showDialog.select(
            "%s: %s Providers" % (tools.addonName, action[:-1].title()),
            package_display)

        if selection == -1:
            return

        providers = [
            i for i in self.known_providers
            if i['package'] == known_packages[selection]['pack_name']
            and i['status'] == status and i['country'] == self.language
        ]

        if package_disable is False:
            display_list = [
                "%s - %s" % (tools.colorString(
                    i['provider_name'].upper()), i['provider_type'].title())
                for i in providers if i['status'] == status
            ]

            selection = tools.showDialog.multiselect(
                "%s: %s Providers" % (tools.addonName, action[:-1].title()),
                display_list)

            if selection is None:
                return

            for i in selection:
                provider = providers[i]
                database.adjust_provider_status(provider['provider_name'],
                                                provider['package'], action)

        elif package_disable is True:
            for i in providers:
                database.adjust_provider_status(i['provider_name'],
                                                i['package'], action)
Example #8
0
def build_display_title(source):
    if 'debrid_provider' in source:
        debrid_provider = tools.colorString(tools.shortened_debrid(source.get('debrid_provider', '')))
        if debrid_provider != '':
            debrid_provider = " " + debrid_provider + " |"
        else:
            tools.log('No Debrid Provider')
    else:
        debrid_provider = ''
    quality = tools.color_quality(source['quality'])
    release_title = tools.colorString(source['release_title'])
    info = source['info']
    if len(info) > 0:
        info = ' '.join(info)
        info = '| ' + info
    else:
        info = ''

    title = ''

    if source['type'] == 'torrent':
        size = tools.colorString(tools.source_size_display(source['size']))
        title = "%s |%s %s | %s %s\n%s" % (
            quality,
            debrid_provider,
            source['source'].upper(),
            size,
            info,
            release_title
        )
    if source['type'] == 'hoster':
        title = "%s |%s %s | %s %s\n%s" % (
            quality,
            debrid_provider,
            source['provider'].upper(),
            source['source'],
            info,
            release_title,
        )

    if tools.getSetting('general.sourceselectlines') == 'false':
        title = title.replace('\n', ' | ')

    return title
Example #9
0
    def seasonListBuilder(self, show_id, smartPlay=False):

        self.itemList = trakt_database.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: int(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

                action = 'seasonEpisodes'
                args = {'trakt_id': item['showInfo']['ids']['trakt'],
                        'season': item['info']['season'],
                        'item_type': 'season'}

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

                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'])

            except:
                import traceback
                traceback.print_exc()
                continue

            if smartPlay is True:
                return args

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

        tools.addMenuItems(syshandle, item_list, len(item_list))
Example #10
0
    def list_premiumize_transfers(self):

        from resources.lib.debrid import premiumize
        transfer_list = premiumize.PremiumizeFunctions().list_transfers()
        if len(transfer_list['transfers']) == 0 or 'transfers' not in transfer_list:
            tools.closeDirectory(self.view_type)
            return
        for i in transfer_list['transfers']:
            title = '%s - %s%% : %s' % \
                    (tools.colorString(i['status'].title()), str(i['progress'] * 100), i['name'][:50] + "...")
            tools.addDirectoryItem(title, '', None, None, isPlayable=False, isFolder=False, isAction=True)
        tools.closeDirectory(self.view_type)
Example #11
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 = trakt_database.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:

                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 = {'trakt_id': item['ids']['trakt'], 'item_type': 'movie'}
                args = tools.quote(json.dumps(args, sort_keys=True))

            except:
                import traceback
                traceback.print_exc()
                continue

            if item is None:
                continue

            if 'trakt' in item['ids']:
                try:
                    bookmark = bookmark_sync.get_bookmark(item['ids']['trakt'])
                    item['info']['resumetime'] = bookmark['timeInSeconds'] if bookmark is not None else 0
                    item['info']['totaltime'] = item['info']['duration']
                except:
                    pass

            item['info']['title'] = item['info']['originaltitle'] = name
            list_items.append(tools.addDirectoryItem(name, 'getSources', item['info'], item['art'], item['cast'],
                                                     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))
 def auth(self):
     self.ClientSecret = ''
     self.ClientID = 'X245A4XAIBGVM'
     url = ("client_id=%s&new_credentials=yes" % self.ClientID)
     url = self.OauthUrl + self.DeviceCodeUrl % url
     response = json.loads(requests.get(url).text)
     tools.copy2clip(response['user_code'])
     tools.progressDialog.create(tools.lang(32023).encode('utf-8'))
     tools.progressDialog.update(
         -1,
         tools.lang(32024).encode('utf-8') +
         ' %s' % tools.colorString('https://real-debrid.com/device'),
         tools.lang(32025).encode('utf-8') +
         ' %s' % tools.colorString(response['user_code']),
         'This code has been copied to your clipboard')
     self.OauthTimeout = int(response['expires_in'])
     self.OauthTimeStep = int(response['interval'])
     self.DeviceCode = response['device_code']
     while self.ClientSecret == '':
         self.auth_loop()
     self.token_request()
Example #13
0
    def list_RD_transfers(self):

        from resources.lib.debrid import real_debrid
        transfer_list = real_debrid.RealDebrid().list_torrents()
        if len(transfer_list) == 0:
            tools.closeDirectory(self.view_type)
            return
        for i in transfer_list:
            title = '%s - %s%% : %s' % \
                    (tools.colorString(i['status'].title()), str(i['progress']), i['filename'][:50] + "...")
            tools.addDirectoryItem(title, '', None, None, isPlayable=False, isFolder=False, isAction=True)
        tools.closeDirectory(self.view_type)
Example #14
0
    def get_assist_torrents(self):
        tools.addDirectoryItem('Clear Non Active...', 'nonActiveAssistClear', None, None)
        torrent_list = database.get_assist_torrents()
        if torrent_list is not None:

            for i in torrent_list:
                debrid = tools.shortened_debrid(i['provider'])
                title = tools.colorString('%s - %s - %s%% : %s' % (debrid, i['status'].title(),
                                                                 i['progress'], i['release_title']))
                tools.addDirectoryItem(title, '', None, None)

        tools.closeDirectory('addons')
Example #15
0
    def user_select(self, folder_details, transfer_id):
        display_list = [tools.colorString(i['name']) for i in folder_details]
        selection = tools.showDialog.select(tools.addonName + ": Torrent File Picker", display_list)
        if selection == -1:
            return None
        selection = folder_details[selection]
        if selection['type'] != 'folder':
            streamlink = selection['link']
        else:
            folder_details = self.list_folder(selection['id'])
            streamlink = self.user_select(folder_details, transfer_id)

        return streamlink
Example #16
0
    def auth(self):
        resp = self.get_json('pin/get')
        expiry = pin_ttl = int(resp['expires_in'])
        auth_complete = False
        tools.copy2clip(resp['pin'])
        tools.progressDialog.create(
            tools.addonName + ': AllDebrid Auth',
            line1=tools.getLangString(32024).format(
                tools.colorString(resp['base_url'])),
            line2=tools.getLangString(32025).format(
                tools.colorString(resp['pin'])),
            line3='This code has been copied to your clipboard')

        # Seems the All Debrid servers need some time do something with the pin before polling
        # Polling to early will cause an invalid pin error
        tools.kodi.sleep(5 * 1000)
        tools.progressDialog.update(100)
        while not auth_complete and not expiry <= 0 and not tools.progressDialog.iscanceled(
        ):
            auth_complete, expiry = self.poll_auth(check=resp['check'],
                                                   pin=resp['pin'])
            progress_percent = 100 - int(
                (float(pin_ttl - expiry) / pin_ttl) * 100)
            tools.progressDialog.update(progress_percent)
            tools.kodi.sleep(1 * 1000)
        try:
            tools.progressDialog.close()
        except:
            pass

        self.store_user_info()

        if auth_complete:
            tools.showDialog.ok(
                tools.addonName,
                'AllDebrid {}'.format(tools.getLangString(32026)))
        else:
            return
Example #17
0
def wipe_install():
    confirm = tools.showDialog.yesno(tools.addonName, tools.lang(33021).encode('utf-8'))
    if confirm == 0:
        return

    confirm = tools.showDialog.yesno(tools.addonName, tools.lang(32049).encode('utf-8') +
                                     '%s' % tools.colorString(tools.lang(32050).encode('utf-8')))
    if confirm == 0:
        return

    import shutil, os
    if os.path.exists(tools.dataPath):
        shutil.rmtree(tools.dataPath)
    os.mkdir(tools.dataPath)
Example #18
0
    def update_properties(self):

        # Set Resolution count properties
        self.setProperty(
            '4k_sources',
            str(self.torrents_qual_len[0] + self.hosters_qual_len[0]))
        self.setProperty(
            '1080p_sources',
            str(self.torrents_qual_len[1] + self.hosters_qual_len[1]))
        self.setProperty(
            '720p_sources',
            str(self.torrents_qual_len[2] + self.hosters_qual_len[2]))
        self.setProperty(
            'SD_sources',
            str(self.torrents_qual_len[3] + self.hosters_qual_len[3]))

        # Set total source type counts
        # self.setProperty('total_torrents', str(len([i for i in self.allTorrents])))

        self.setProperty('total_torrents',
                         str(len([i for i in self.allTorrents])))
        self.setProperty('cached_torrents',
                         str(len([i for i in self.torrentCacheSources])))
        self.setProperty('hosters_sources',
                         str(len([i for i in self.hosterSources])))
        self.setProperty('cloud_sources',
                         str(len([i for i in self.cloud_files])))

        # Set remaining providers string
        self.setProperty("remaining_providers_count",
                         str((len(self.remainingProviders))))

        try:
            self.remaining_providers_list = self.getControl(2000)
            self.remaining_providers_list.reset()
            self.remaining_providers_list.addItems(self.remainingProviders)
            self.setProperty(
                "remaining_providers_list",
                tools.colorString(' | ').join(
                    [i.upper() for i in self.remainingProviders]))
        except:
            pass
Example #19
0
def wipe_install():

    confirm = tools.showDialog.yesno(
        tools.addonName, 'This will completely wipe your addon settings.\n'
        'Are you completely sure you want to do this?')
    if confirm == 0:
        return

    confirm = tools.showDialog.yesno(
        tools.addonName,
        'Please be aware this will completely wipe the following:\n'
        'Cached Data, Settings, Installed Providers\n'
        '%s' % tools.colorString('ARE YOU SURE?'))
    if confirm == 0:
        return

    import shutil, os
    if os.path.exists(tools.dataPath):
        shutil.rmtree(tools.dataPath)
    os.mkdir(tools.dataPath)
    def update_properties(self):

        # Set Resolution count properties
        self.setProperty('4k_sources', str(self.torrents_qual_len[0] + self.hosters_qual_len[0]))
        self.setProperty('1080p_sources', str(self.torrents_qual_len[1] + self.hosters_qual_len[1]))
        self.setProperty('720p_sources', str(self.torrents_qual_len[2] + self.hosters_qual_len[2]))
        self.setProperty('SD_sources', str(self.torrents_qual_len[3] + self.hosters_qual_len[3]))

        # Set total source type counts
        # self.setProperty('total_torrents', str(len([i for i in self.allTorrents])))

        self.setProperty('total_torrents', str(len([i for i in self.allTorrents])))
        self.setProperty('cached_torrents', str(len([i for i in self.torrentCacheSources])))
        self.setProperty('hosters_sources', str(len([i for i in self.hosterSources])))
        self.setProperty('cloud_sources', str(len([i for i in self.cloud_files])))

        # Set remaining providers string
        self.setProperty("remaining_providers_count", str((len(self.remainingProviders))))
        self.setProperty("remaining_providers_list", ' | '.join([tools.colorString(i.upper())
                                                                for i in self.remainingProviders]))
Example #21
0
    def updateProgress(self):

        list1 = [
            len([i for i in self.torrentCacheSources if i['quality'] == '4K']),
            len([
                i for i in self.torrentCacheSources if i['quality'] == '1080p'
            ]),
            len([
                i for i in self.torrentCacheSources if i['quality'] == '720p'
            ]),
            len([i for i in self.torrentCacheSources if i['quality'] == 'SD']),
        ]

        self.torrents_qual_len = list1

        list2 = [
            len([i for i in self.hosterSources if i['quality'] == '4K']),
            len([i for i in self.hosterSources if i['quality'] == '1080p']),
            len([i for i in self.hosterSources if i['quality'] == '720p']),
            len([i for i in self.hosterSources if i['quality'] == 'SD']),
        ]
        self.hosters_qual_len = list2

        string1 = 'Torrents - 4K: %s | 1080: %s | 720: %s | SD: %s' % (
            self.colorNumber(list1[0]), self.colorNumber(list1[1]),
            self.colorNumber(list1[2]), self.colorNumber(list1[3]))

        string2 = 'Hosters - 4k: %s | 1080: %s | 720: %s | SD: %s' % (
            self.colorNumber(list2[0]), self.colorNumber(list2[1]),
            self.colorNumber(list2[2]), self.colorNumber(list2[3]))

        string4 = 'Free Hosters - 4k: 0 | 1080: 0 | 720: 0 | SD: 0'
        providerString = ''
        for i in self.remainingProviders:
            providerString += ', ' + tools.colorString(str(i))
        string3 = 'Remaining Providers - %s' % providerString[2:]

        return [string1, string2, string3, string4]
    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()
Example #23
0
    def directToEpisodeBuilder(self, trakt_list, sort=None):

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

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

            for item in trakt_list:
                # 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 = item['info']['title']

                    if self.title_appends == 'true':
                        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'))

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

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

                    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()
Example #24
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: 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 #25
0
    def  mixedEpisodeBuilder(self, trakt_list, sort=None, hide_watched=False, smartPlay=False, hide_unaired=True,
                            prepend_date=False):
        try:
            if len(trakt_list) == 0:
                tools.log('We received no titles to build a list', 'error')
                return

            self.itemList = trakt_database.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]
            self.itemList = [i for i in self.itemList if 'info' in i and i['info'].get('premiered', '') is not '']
            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

                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 = {'trakt_id': item['showInfo']['ids']['trakt'],
                            'season': item['info']['season'],
                            'episode': item['info']['episode'],
                            'item_type': 'episode'}

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

                    if self.title_appends == 'true':
                        name = "%s: %sx%s %s" % (tools.colorString(item['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'])
                        if release_day:
                            release_day = release_day.strftime('%d %b')
                            name = '[%s] %s' % (release_day, name)

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

                    if 'trakt' in item['ids']:
                        try:
                            bookmark = bookmark_sync.get_bookmark(item['ids']['trakt'])
                            item['info']['resumetime'] = bookmark['timeInSeconds'] if bookmark is not None else 0
                            item['info']['totaltime'] = item['info']['duration']
                        except:
                            pass

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

                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 #26
0
    def episodeListBuilder(self, show_id, season_number=None, smartPlay=False, hide_unaired=False):
        try:
            item_list = []
            if season_number is not None:
                self.itemList = trakt_database.get_season_episodes(show_id, season_number)
            else:
                self.itemList = trakt_database.get_flat_episode_list(show_id)
                if tools.getSetting('general.hideSpecials') == 'true':
                    self.itemList = [i for i in self.itemList if i['info']['season'] != 0]

            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

            if season_number is not None:
                # Building a list of a season, sort by episode
                try:
                    self.itemList = sorted(self.itemList, key=lambda k: k['info']['episode'])
                except:
                    pass
            else:
                # Building a flat list of episodes, sort by season, then episode
                try:
                    self.itemList = sorted(self.itemList, key=lambda k: (k['info']['season'], k['info']['episode']))
                except:
                    pass

            for item in self.itemList:

                try:

                    args = {'trakt_id': item['showInfo']['ids']['trakt'],
                            'season': item['info']['season'],
                            'episode': item['info']['episode'],
                            'item_type': 'episode'}

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

                    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'])
                    item['info']['studio'] = item['showInfo']['info']['studio']

                    if 'trakt' in item['ids']:
                        try:
                            item['info']['resumetime'] = bookmark_sync.get_bookmark(item['ids']['trakt'])[
                                'timeInSeconds']
                            item['info']['totaltime'] = item['info']['duration']
                        except:
                            pass

                except:
                    import traceback
                    traceback.print_exc()
                    continue
                
                item_list.append(tools.addDirectoryItem(name,
                                                        'getSources',
                                                        item['info'],
                                                        item['art'],
                                                        item['cast'],
                                                        isFolder=False,
                                                        isPlayable=True,
                                                        actionArgs=args,
                                                        bulk_add=True,
                                                        set_ids=item['ids']))

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

        except:
            import traceback
            traceback.print_exc()
Example #27
0
    def showListBuilder(self, trakt_list, forceResume=False, info_only=False):

        try:
            if len(trakt_list) == 0:
                return
        except:
            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))