Ejemplo n.º 1
0
 def onPlayBackError(self):
     Bookmarks().reset(self.current_time, self.media_length, self.name,
                       self.year)
     log_utils.error()
     sys.exit(1)
     xbmc.log('onPlayBackError callback', 2)
Ejemplo n.º 2
0
	def get_seasonEpisodes_meta(self, tmdb, season): # builds episodes meta from "/season/?" request
		if not tmdb and not season: return None
		try:
			if not tmdb: return None
			result = self.get_season_request(tmdb, season)
			if '404:NOT FOUND' in result: return result
			if not result: return
			meta = {}
		except:
			from resources.lib.modules import log_utils
			log_utils.error()
			return None
		try:
			meta['premiered'] = str(result.get('air_date', '')) if result.get('air_date') else '' # Kodi season level Information gui seems no longer available in 19 unless you use "mediatype = tvshow" for seasons
			episodes = []
			unaired_count = 0
			for episode in result['episodes']:
				episode_meta = {}
				episode_meta['mediatype'] = 'episode'
				episode_meta['premiered'] = str(episode.get('air_date', '')) if episode.get('air_date') else '' # this is season premiered, not series premiered.
				if not episode_meta['premiered']: # access to "status" not available at this level
					unaired_count += 1
					pass
				elif int(re.sub(r'[^0-9]', '', str(episode_meta['premiered']))) > int(re.sub(r'[^0-9]', '', str(self.today_date))):
					unaired_count += 1
				# try: meta['year'] = meta['premiered'][:4] # DO NOT USE, this will make the year = season premiered but scrapers want series premiered for year.
				# except: meta['year'] = ''
				episode_meta['episode'] = episode['episode_number']
				crew = episode.get('crew')
				try: episode_meta['director'] = ', '.join([d['name'] for d in [x for x in crew if x['job'] == 'Director']])
				except: episode_meta['director'] = ''
				try: episode_meta['writer'] = ', '.join([w['name'] for w in [y for y in crew if y['job'] == 'Writer']]) # movies also contains "screenplay", "author", "novel". See if any apply for shows
				except: episode_meta['writer'] = ''
				episode_meta['tmdb_epID'] = episode['id']
				episode_meta['title'] = episode['name']
				episode_meta['plot'] = episode.get('overview', '') if episode.get('overview') else ''
				episode_meta['code'] = episode['production_code']
				episode_meta['season'] = episode['season_number']
				episode_meta['thumb'] = '%s%s' % (still_path, episode['still_path']) if episode.get('still_path') else ''
				episode_meta['rating'] = episode['vote_average']
				episode_meta['votes'] = episode['vote_count']
				episodes.append(episode_meta)
			meta['season_isAiring'] = 'true' if unaired_count > 0 else 'false' # I think this should be in episodes module where it has access to "showSeasons" meta for "status"
			meta['seasoncount'] = len(result.get('episodes')) #seasoncount = number of episodes for given season
			# meta['tvseasontitle'] = result['name'] # seasontitle ?
			meta['plot'] = result.get('overview', '') if result.get('overview') else '' # Kodi season level Information seems no longer available in 19
			meta['tmdb'] = tmdb
			meta['poster'] = '%s%s' % (poster_path, result['poster_path']) if result.get('poster_path') else ''
			meta['season_poster'] = meta['poster']
			meta['season'] = result.get('season_number')
			meta['castandart'] = []
			for person in result['credits']['cast']:
				try: meta['castandart'].append({'name': person['name'], 'role': person['character'], 'thumbnail': ('%s%s' % (profile_path, person['profile_path']) if person.get('profile_path') else '')})
				except: pass
				if len(meta['castandart']) == 150: break
			# meta['banner'] = '' # not available from TMDb
			meta['episodes'] = episodes
		except:
			from resources.lib.modules import log_utils
			log_utils.error()
		return meta
Ejemplo n.º 3
0
	def trakt_list(self, url, user):
		list = []
		try:
			q = dict(parse_qsl(urlsplit(url).query))
			q.update({'extended': 'full'})
			q = (urlencode(q)).replace('%2C', ',')
			u = url.replace('?' + urlparse(url).query, '') + '?' + q
			if '/related' in u: u = u + '&limit=20'
			result = trakt.getTraktAsJson(u)
			if not result: return list
			items = []
			for i in result:
				try:
					movie = i['movie']
					movie['added'] = i.get('listed_at') # for watchlist----confimed it's in response
					movie['paused_at'] = i.get('paused_at', '') # for history
					try: movie['progress'] = max(0, min(1, i['progress'] / 100.0))
					except: movie['progress'] = ''
					try: movie['lastplayed'] = i.get('watched_at', '')
					except: movie['lastplayed'] = ''
					items.append(movie)
				except: pass
			if len(items) == 0: items = result
		except:
			log_utils.error()
			return
		try:
			q = dict(parse_qsl(urlsplit(url).query))
			if int(q['limit']) != len(items): raise Exception()
			q.update({'page': str(int(q['page']) + 1)})
			q = (urlencode(q)).replace('%2C', ',')
			next = url.replace('?' + urlparse(url).query, '') + '?' + q
		except: next = ''

		def items_list(item):
			try:
				values = item
				values['next'] = next 
				values['title'] = py_tools.ensure_str(item.get('title'))
				values['originaltitle'] = values['title']
				try: values['premiered'] = item.get('released', '')[:10]
				except: values['premiered'] = ''
				values['year'] = str(item.get('year', '')) if item.get('year') else ''
				if not values['year']:
					try: values['year'] = str(values['premiered'][:4])
					except: values['year'] = ''
				ids = item.get('ids', {})
				values['imdb'] = str(ids.get('imdb', '')) if ids.get('imdb') else ''
				values['tmdb'] = str(ids.get('tmdb', '')) if ids.get('tmdb') else ''
				values['tvdb'] = ''
				# values['studio'] = item.get('network', '') # do not set, some skins show studio icons in place of thumb and looks like dog shit
				values['genre'] = []
				for x in item['genres']: values['genre'].append(x.title())
				if not values['genre']: values['genre'] = 'NA'
				values['duration'] = int(item.get('runtime') * 60) if item.get('runtime') else ''
				values['rating'] = item.get('rating')
				values['votes'] = item['votes']
				values['mpaa'] = item.get('certification', '')
				values['plot'] = py_tools.ensure_str(item.get('overview'))
				values['poster'] = ''
				values['fanart'] = ''
				try: values['trailer'] = control.trailer % item['trailer'].split('v=')[1]
				except: values['trailer'] = ''
				for k in ('released', 'ids', 'genres', 'runtime', 'certification', 'overview', 'comment_count', 'network'): values.pop(k, None) # pop() keys that are not needed anymore
				list.append(values)
			except:
				log_utils.error()
		threads = []
		for item in items: threads.append(workers.Thread(items_list, item))
		[i.start() for i in threads]
		[i.join() for i in threads]
		return list
Ejemplo n.º 4
0
	def tmdb_list(self, url):
		try:
			result = get_request(url % API_key)
			if '404:NOT FOUND' in result: return result
			items = result['results']
		except: return
		self.list = [] ; sortList = []
		try:
			page = int(result['page'])
			total = int(result['total_pages'])
			if page >= total: raise Exception()
			if 'page=' not in url: raise Exception()
			next = '%s&page=%s' % (url.split('&page=', 1)[0], page+1)
		except: next = ''
		for item in items:
			try:
				values = {}
				values['next'] = next 
				values['tmdb'] = str(item.get('id', '')) if item.get('id') else ''
				sortList.append(values['tmdb'])
				values['imdb'] = ''
				values['tvdb'] = ''
				values['metacache'] = False
				self.list.append(values)
			except:
				from resources.lib.modules import log_utils
				log_utils.error()

		def items_list(i):
			if self.list[i]['metacache']: return
			try:
				values = {}
				tmdb = self.list[i].get('tmdb', '')
				movie_meta = cache.get(self.get_movie_meta, 96, tmdb)
				values.update(movie_meta)
				imdb = values['imdb']
				if self.enable_fanarttv:
					extended_art = fanarttv_cache.get(fanarttv.get_movie_art, 168, imdb, tmdb)
					if extended_art: values.update(extended_art)
				values = dict((k,v) for k, v in iter(values.items()) if v is not None and v != '') # remove empty keys so .update() doesn't over-write good meta with empty values.
				self.list[i].update(values)
				meta = {'imdb': imdb, 'tmdb': tmdb, 'tvdb': '', 'lang': self.lang, 'user': self.user, 'item': values}
				self.meta.append(meta)
			except:
				from resources.lib.modules import log_utils
				log_utils.error()

		self.list = metacache.fetch(self.list, self.lang, self.user)
		threads = []
		for i in range(0, len(self.list)):
			threads.append(Thread(target=items_list, args=(i,)))
		[i.start() for i in threads]
		[i.join() for i in threads]
		if self.meta:
			self.meta = [i for i in self.meta if i.get('tmdb')]
			metacache.insert(self.meta)
		sorted_list = []
		self.list = [i for i in self.list if i.get('tmdb')]
		for i in sortList:
			sorted_list += [item for item in self.list if item['tmdb'] == i] # resort to match TMDb list because threading will lose order.
		return sorted_list
Ejemplo n.º 5
0
	def tmdb_collections_list(self, url):
		if not url: return
		try:
			result = get_request(url)
			if '404:NOT FOUND' in result: return result
			if '/collection/' in url: items = result['parts']
			elif '/3/' in url: items = result['items']
			else: items = result['results']
		except: return
		self.list = []
		try:
			page = int(result['page'])
			total = int(result['total_pages'])
			if page >= total: raise Exception()
			if 'page=' not in url: raise Exception()
			next = '%s&page=%s' % (url.split('&page=', 1)[0], page+1)
		except: next = ''
		for item in items:
			try:
				values = {}
				values['next'] = next 
				media_type = item.get('media_type', '')
				if media_type == 'movie': continue
				values['tmdb'] = str(item.get('id', '')) if item.get('id') else ''
				values['metacache'] = False 
				self.list.append(values)
			except:
				from resources.lib.modules import log_utils
				log_utils.error()

		def items_list(i):
			if self.list[i]['metacache']: return
			try:
				values = {}
				tmdb = self.list[i].get('tmdb', '')
				showSeasons_meta = cache.get(self.get_showSeasons_meta, 96, tmdb)
				values.update(showSeasons_meta)
				imdb = values['imdb']
				tvdb = values['tvdb']
				if self.enable_fanarttv:
					extended_art = fanarttv_cache.get(fanarttv.get_tvshow_art, 168, tvdb)
					if extended_art: values.update(extended_art)
				values = dict((k,v) for k, v in iter(values.items()) if v is not None and v != '') # remove empty keys so .update() doesn't over-write good meta with empty values.
				self.list[i].update(values)
				meta = {'imdb': imdb, 'tmdb': tmdb, 'tvdb': tvdb, 'lang': self.lang, 'user': self.user, 'item': values}
				self.meta.append(meta)
			except:
				from resources.lib.modules import log_utils
				log_utils.error()

		self.list = metacache.fetch(self.list, self.lang, self.user)
		threads = []
		for i in range(0, len(self.list)):
			threads.append(Thread(target=items_list, args=(i,)))
		[i.start() for i in threads]
		[i.join() for i in threads]
		if self.meta:
			self.meta = [i for i in self.meta if i.get('tmdb')]
			metacache.insert(self.meta)
		self.list = [i for i in self.list if i.get('tmdb')]
		return self.list
Ejemplo n.º 6
0
    def browse_user_cloud(self, folder):
        sysaddon, syshandle = argv[0], int(argv[1])
        extensions = supported_video_extensions()
        torrent_folder = jsloads(folder)
        links = torrent_folder['links']
        # links = [i for i in links if i['filename'].lower().endswith(tuple(extensions))]
        status_code = torrent_folder['statusCode']
        file_str, downloadMenu, deleteMenu = getLS(40047).upper(), getLS(
            40048), getLS(40050)
        for count, item in enumerate(links, 1):
            try:
                cm = []
                url_link = item['link']
                name = string_tools.strip_non_ascii_and_unprintable(
                    item['filename'])
                if name.lower().endswith(invalid_extensions): continue

                if not name.lower().endswith(tuple(extensions)):
                    files = item['files']
                    entry = files[0].get('e')
                    name = entry[0].get('n') if isinstance(
                        entry, list) else entry.get('n')

                    def entry_loop(entry):
                        entry = entry.get('e')
                        name = entry[0].get('n') if isinstance(
                            entry, list) else entry.get('n')
                        if not name.lower().endswith(tuple(extensions)):
                            return entry_loop(entry)
                        else:
                            return string_tools.strip_non_ascii_and_unprintable(
                                name)

                    if not name.lower().endswith(tuple(extensions)):
                        name = entry_loop(entry)
                size = item['size']
                display_size = float(int(size)) / 1073741824
                label = '%02d | [B]%s[/B] | %.2f GB | [I]%s [/I]' % (
                    count, file_str, display_size, name)
                if status_code == 4:
                    url = '%s?action=play_URL&url=%s&caller=alldebrid&type=unrestrict' % (
                        sysaddon, url_link)
                else:
                    url = ''
                cm.append((
                    downloadMenu,
                    'RunPlugin(%s?action=download&name=%s&image=%s&url=%s&caller=alldebrid)'
                    % (sysaddon, quote_plus(name), quote_plus(ad_icon),
                       url_link)))
                item = control.item(label=label, offscreen=True)
                item.addContextMenuItems(cm)
                item.setArt({
                    'icon': ad_icon,
                    'poster': ad_icon,
                    'thumb': ad_icon,
                    'fanart': addonFanart,
                    'banner': ad_icon
                })
                item.setInfo(type='video', infoLabels='')
                control.addItem(handle=syshandle,
                                url=url,
                                listitem=item,
                                isFolder=False)
            except:
                log_utils.error()
        control.content(syshandle, 'files')
        control.directory(syshandle, cacheToDisc=True)
Ejemplo n.º 7
0
def download(name, image, url):
    # log_utils.log('name = %s' % str(name), log_utils.LOGDEBUG)
    try:
        if url is None:
            control.hide()
            return
        try:
            headers = dict(parse_qsl(url.rsplit('|', 1)[1]))
        except:
            headers = dict('')

        url = url.split('|')[0]

        try:
            content = re.search(
                r'(.+?)(?:|\.| - |-|\s)(?:S|s|\s|\.)(\d{1,2})(?!\d)(?:-{0,1})(?:E{0,1}|e{0,1})[0-2]{1}[0-9]{1}(?!\w)',
                name.replace('\'', '')).groups()
            # log_utils.log('content = %s' % str(content), log_utils.LOGDEBUG)
        except:
            content = ()

        transname = name.translate(None, '\/:*?"<>|').strip('.')
        ext_list = ['.mp4', '.mkv', '.flv', '.avi', '.mpg']
        for i in ext_list:
            transname = transname.rstrip(i)

        levels = ['../../../..', '../../..', '../..', '..']
        if len(content) == 0:
            dest = control.setting('movie.download.path')
            dest = control.transPath(dest)
            for level in levels:
                try:
                    control.makeFile(os.path.abspath(os.path.join(dest,
                                                                  level)))
                except:
                    pass
            control.makeFile(dest)

            try:
                movie_info = re.search(
                    r'(.+?)(?:\.{0,1}-{0,1}\.{0,1}|\s*)(?:\({0,1})((?:19|20)(?:[0-9]{2}))',
                    name.replace('\'', '')).groups()
                # log_utils.log('movie_info = %s' % str(movie_info), log_utils.LOGDEBUG)
            except:
                movie_info = ()

            if len(movie_info) != 0:
                movietitle = titlecase(
                    re.sub('[^A-Za-z0-9\s]+', ' ', movie_info[0]))
                dest = os.path.join(dest, movietitle + '_' + movie_info[1])
            else:
                dest = os.path.join(dest, transname)
            # log_utils.log('dest = %s' % str(dest), log_utils.LOGDEBUG)

            control.makeFile(dest)
        else:
            dest = control.setting('tv.download.path')
            dest = control.transPath(dest)
            for level in levels:
                try:
                    control.makeFile(os.path.abspath(os.path.join(dest,
                                                                  level)))
                except:
                    pass
            control.makeFile(dest)
            transtvshowtitle = content[0].translate(
                None, '\/:*?"<>|').strip('.').replace('.', ' ')
            if not transtvshowtitle[0].isupper():
                transtvshowtitle = transtvshowtitle.capitalize()
            dest = os.path.join(dest, transtvshowtitle)
            control.makeFile(dest)
            dest = os.path.join(dest, 'Season %01d' % int(content[1]))
            control.makeFile(dest)
        ext = os.path.splitext(urlparse(url).path)[1][1:]
        if not ext in ['mp4', 'mkv', 'flv', 'avi', 'mpg']:
            ext = 'mp4'
        dest = os.path.join(dest, transname + '.' + ext)
        doDownload(url, dest, name, image, headers)
    except:
        log_utils.error()
        pass
Ejemplo n.º 8
0
def syncMyAccounts(silent=False):
    try:
        all_acct = myaccounts.getAll()
        trakt_acct = all_acct.get('trakt')
        if getSetting('trakt.token') != trakt_acct.get('token'):
            setSetting('trakt.isauthed', 'true')
            setSetting('trakt.token', trakt_acct.get('token'))
            setSetting('trakt.username', trakt_acct.get('username'))
            setSetting('trakt.refresh', trakt_acct.get('refresh'))
            setSetting('trakt.expires', trakt_acct.get('expires'))

        ad_acct = all_acct.get('alldebrid')
        if getSetting('alldebrid.username') != ad_acct.get('username'):
            setSetting('alldebrid.token', ad_acct.get('token'))
            setSetting('alldebrid.username', ad_acct.get('username'))

        pm_acct = all_acct.get('premiumize')
        if getSetting('premiumize.username') != pm_acct.get('username'):
            setSetting('premiumize.token', pm_acct.get('token'))
            setSetting('premiumize.username', pm_acct.get('username'))

        rd_acct = all_acct.get(
            'realdebrid'
        )  # token refresh 1hr expiry, Venom handles this internally
        if getSetting('realdebrid.username') != rd_acct.get('username'):
            setSetting('realdebrid.token', rd_acct.get('token'))
            setSetting('realdebrid.username', rd_acct.get('username'))
            setSetting('realdebrid.client_id', rd_acct.get('client_id'))
            setSetting('realdebrid.refresh', rd_acct.get('refresh'))
            setSetting('realdebrid.secret', rd_acct.get('secret'))

        fanart_acct = all_acct.get('fanart_tv')
        if getSetting('fanart.tv.api.key') != fanart_acct.get('api_key'):
            setSetting('fanart.tv.api.key', fanart_acct.get('api_key'))

        tmdb_acct = all_acct.get('tmdb')
        if getSetting('tmdb.api.key') != tmdb_acct.get('api_key'):
            setSetting('tmdb.api.key', tmdb_acct.get('api_key'))
        if getSetting('tmdb.username') != tmdb_acct.get('username'):
            setSetting('tmdb.username', tmdb_acct.get('username'))
        if getSetting('tmdb.password') != tmdb_acct.get('password'):
            setSetting('tmdb.password', tmdb_acct.get('password'))
        if getSetting('tmdb.session_id') != tmdb_acct.get('session_id'):
            setSetting('tmdb.session_id', tmdb_acct.get('session_id'))

        tvdb_acct = all_acct.get('tvdb')
        if getSetting('tvdb.api.key') != tvdb_acct.get('api_key'):
            setSetting('tvdb.api.key', tvdb_acct.get('api_key'))

        imdb_acct = all_acct.get('imdb')
        if getSetting('imdb.user') != imdb_acct.get('user'):
            setSetting('imdb.user', imdb_acct.get('user'))

        fu_acct = all_acct.get('furk')
        if getSetting('furk.username') != fu_acct.get('username'):
            setSetting('furk.username', fu_acct.get('username'))
            setSetting('furk.password', fu_acct.get('password'))
        if fu_acct.get('api_key', None):
            if getSetting('furk.api') != fu_acct.get('api_key'):
                setSetting('furk.api', fu_acct.get('api_key'))
        if not silent: notification(message=32114)
    except:
        from resources.lib.modules import log_utils
        log_utils.error()
Ejemplo n.º 9
0
def fetch_bookmarks(imdb,
                    tmdb='',
                    tvdb='',
                    season=None,
                    episode=None,
                    ret_all=None,
                    ret_type='movies'):
    progress = '0'
    try:
        dbcon = get_connection()
        dbcur = get_connection_cursor(dbcon)
        ck_table = dbcur.execute(
            '''SELECT * FROM sqlite_master WHERE type='table' AND name='bookmarks';'''
        ).fetchone()
        if not ck_table:
            dbcur.execute(
                '''CREATE TABLE IF NOT EXISTS bookmarks (tvshowtitle TEXT, title TEXT, imdb TEXT, tmdb TEXT, tvdb TEXT, season TEXT, episode TEXT, genre TEXT, mpaa TEXT, 
									studio TEXT, duration TEXT, percent_played TEXT, paused_at TEXT, UNIQUE(imdb, tmdb, tvdb, season, episode));'''
            )
            dbcur.connection.commit()
            return progress
        if ret_all:
            if ret_type == 'movies':
                match = dbcur.execute(
                    '''SELECT * FROM bookmarks WHERE (tvshowtitle='')'''
                ).fetchall()
                progress = [{
                    'title': i[1],
                    'imdb': i[2],
                    'tmdb': i[3],
                    'duration': int(i[10]),
                    'progress': i[11],
                    'paused_at': i[12]
                } for i in match]
            else:
                match = dbcur.execute(
                    '''SELECT * FROM bookmarks WHERE NOT (tvshowtitle='')'''
                ).fetchall()
                progress = [{
                    'tvshowtitle': i[0],
                    'title': i[1],
                    'imdb': i[2],
                    'tmdb': i[3],
                    'tvdb': i[4],
                    'season': int(i[5]),
                    'episode': int(i[6]),
                    'genre': i[7],
                    'mpaa': i[8],
                    'studio': i[9],
                    'duration': int(i[10]),
                    'progress': i[11],
                    'paused_at': i[12]
                } for i in match]
        else:
            if not episode:
                try:  # Lookup both IMDb and TMDb first for more accurate movie match.
                    match = dbcur.execute(
                        '''SELECT * FROM bookmarks WHERE (imdb=? AND tmdb=? AND NOT imdb='' AND NOT tmdb='')''',
                        (imdb, tmdb)).fetchone()
                    progress = match[11]
                except:
                    try:
                        match = dbcur.execute(
                            '''SELECT * FROM bookmarks WHERE (imdb=? AND NOT imdb='')''',
                            (imdb, )).fetchone()
                        progress = match[11]
                    except:
                        pass
            else:
                try:  # Lookup both IMDb and TVDb first for more accurate episode match.
                    match = dbcur.execute(
                        '''SELECT * FROM bookmarks WHERE (imdb=? AND tvdb=? AND season=? AND episode=? AND NOT imdb='' AND NOT tvdb='')''',
                        (imdb, tvdb, season, episode)).fetchone()
                    progress = match[11]
                except:
                    try:
                        match = dbcur.execute(
                            '''SELECT * FROM bookmarks WHERE (tvdb=? AND season=? AND episode=? AND NOT tvdb='')''',
                            (tvdb, season, episode)).fetchone()
                        progress = match[11]
                    except:
                        pass
    except:
        from resources.lib.modules import log_utils
        log_utils.error()
    finally:
        dbcur.close()
        dbcon.close()
    return progress
Ejemplo n.º 10
0
	def user_transfers_to_listItem(self):
		try:
			sysaddon = sys.argv[0]
			syshandle = int(sys.argv[1])
			extensions = supported_video_extensions()
			transfer_files = self.user_transfers()
			if not transfer_files:
				control.notification(message='Request Failure-Empty Content')
				return
		except:
			log_utils.error()
			return
		folder_str, file_str, downloadMenu, renameMenu, deleteMenu, clearFinishedMenu = control.lang(40046).upper(),\
			control.lang(40047).upper(), control.lang(40048), control.lang(40049), control.lang(40050), control.lang(40051)
		for count, item in enumerate(transfer_files, 1):
			try:
				cm = []
				type = 'folder' if item['file_id'] is None else 'file'
				name = control.strip_non_ascii_and_unprintable(item['name'])
				status = item['status']
				progress = item['progress']
				if status == 'finished':
					progress = 100
				else:
					try: progress = re.findall(r'(?:\d{0,1}\.{0,1})(\d+)', str(progress))[0][:2]
					except: progress = 'UNKNOWN'
				if type == 'folder':
					isFolder = True if status == 'finished' else False
					status_str = '[COLOR %s]%s[/COLOR]' % (control.getColor(control.setting('highlight.color')), status.capitalize())
					label = '%02d | [B]%s[/B] - %s | [B]%s[/B] | [I]%s [/I]' % (count, status_str, str(progress) + '%', folder_str, name)
					url = '%s?action=pm_MyFiles&id=%s&name=%s' % (sysaddon, item['folder_id'], quote_plus(name))

					# Till PM addresses issue with item also being removed from public acess if item not accessed for 60 days this option is disabled.
					# cm.append((clearFinishedMenu, 'RunPlugin(%s?action=pm_ClearFinishedTransfers)' % sysaddon))
				else:
					isFolder = False
					details = self.item_details(item['file_id'])
					if not details:
						control.notification(message='Request Failure-Empty Content')
						return
					url_link = details['link']
					if url_link.startswith('/'):
						url_link = 'https' + url_link
					size = details['size']
					display_size = float(int(size))/1073741824
					label = '%02d | %s%% | [B]%s[/B] | %.2f GB | [I]%s [/I]' % (count, str(progress), file_str, display_size, name)
					url = '%s?action=playURL&url=%s' % (sysaddon, url_link)
					cm.append((downloadMenu, 'RunPlugin(%s?action=download&name=%s&image=%s&url=%s&caller=premiumize)' %
								(sysaddon, quote_plus(name), quote_plus(pm_icon), url_link)))

				cm.append((deleteMenu % 'Transfer', 'RunPlugin(%s?action=pm_DeleteTransfer&id=%s&name=%s)' %
							(sysaddon, item['id'], quote_plus(name))))
				item = control.item(label=label)
				item.addContextMenuItems(cm)
				item.setArt({'icon': pm_icon, 'poster': pm_icon, 'thumb': pm_icon, 'fanart': addonFanart, 'banner': pm_icon})
				item.setInfo(type='video', infoLabels='')
				video_streaminfo = {'codec': 'h264'}
				item.addStreamInfo('video', video_streaminfo)
				control.addItem(handle=syshandle, url=url, listitem=item, isFolder=isFolder)
			except:
				log_utils.error()
				pass
		control.content(syshandle, 'files')
		control.directory(syshandle, cacheToDisc=True)
Ejemplo n.º 11
0
	def delete(self, type, folder_id=None, folder_name=None):
		try:
			if type == 'folder': url = folder_delete_url
			else: url = item_delete_url
			if not control.yesnoDialog(control.lang(40050) % folder_name, '', ''): return
			data = {'id': folder_id}
			response = self._post(url, data=data)
			if not response: return
			if 'status' in response:
				if response.get('status') == 'success':
					control.refresh()
		except:
			log_utils.error()
			pass


# # from resolveURL
	# def get_all_hosters(self):
		# try:
			# response = self._get(list_services_path_url)
			# if not response:
				# return None
			# aliases = response.get('aliases', {})
			# patterns = response.get('regexpatterns', {})

			# tldlist = []
			# for tlds in aliases.values():
				# for tld in tlds:
					# tldlist.append(tld)
			# if self.get_setting('torrents') == 'true':
				# tldlist.extend([u'torrent', u'magnet'])
			# regex_list = []
			# for regexes in patterns.values():
				# for regex in regexes:
					# try:
						# regex_list.append(re.compile(regex))
					# except:
						# log_utils.log('Throwing out bad Premiumize regex: %s' % regex, __name__, log_utils.LOGDEBUG)
			# log_utils.log('Premiumize.me patterns: %s regex: (%d) hosts: %s' % (patterns, len(regex_list), tldlist), __name__, log_utils.LOGDEBUG)
			# return tldlist, regex_list
		# except Exception as e:
			# log_utils.log('Error getting Premiumize hosts: %s' % e, __name__, log_utils.LOGDEBUG)
		# return [], []


# # from resolveURL
	# def valid_url(self, url, host):
		# if url and self.get_setting('torrents') == 'true':
			# url_lc = url.lower()
			# if url_lc.endswith('.torrent') or url_lc.startswith('magnet:'):
				# return True
		# if not self.patterns or not self.hosts:
			# self.hosts, self.patterns = self.get_all_hosters()
		# if url:
			# if not url.endswith('/'):
				# url += '/'
			# for pattern in self.patterns:
				# if pattern.findall(url):
					# return True
		# elif host:
			# if host.startswith('www.'):
				# host = host.replace('www.', '')
			# if any(host in item for item in self.hosts):
				# return True
		# return False
Ejemplo n.º 12
0
	def create_transfer(self, src,  folder_id=0):
		try:
			data = {'src': src, 'folder_id': folder_id}
			return self._post(transfer_create_url, data)
		except:
			log_utils.error()
Ejemplo n.º 13
0
	def add_uncached_torrent(self, magnet_url, pack=False):
		def _transfer_info(transfer_id):
			info = self.list_transfer()
			if 'status' in info and info['status'] == 'success':
				for item in info['transfers']:
					if item['id'] == transfer_id:
						return item
			return {}
		def _return_failed(message=control.lang(33586)):
			try: control.progressDialog.close()
			except: pass
			self.delete_transfer(transfer_id)
			control.hide()
			control.sleep(500)
			control.okDialog(title=control.lang(40018), message=message)
			return False
		control.busy()
		extensions = supported_video_extensions()
		transfer_id = self.create_transfer(magnet_url)
		if not transfer_id:
			control.hide()
			return
		if not transfer_id['status'] == 'success':
			return _return_failed()
		transfer_id = transfer_id['id']
		transfer_info = _transfer_info(transfer_id)
		if not transfer_info:
			return _return_failed()
		if pack:
			control.hide()
			control.okDialog(title='default', message=control.lang(40017) % control.lang(40057))
			return True
		interval = 5
		line1 = '%s...' % (control.lang(40017) % control.lang(40057))
		line2 = transfer_info['name']
		line3 = transfer_info['message']
		control.progressDialog.create(control.lang(40018), line1, line2, line3)
		while not transfer_info['status'] == 'seeding':
			control.sleep(1000 * interval)
			transfer_info = _transfer_info(transfer_id)
			line3 = transfer_info['message']
			control.progressDialog.update(int(float(transfer_info['progress']) * 100), line3=line3)
			if control.monitor.abortRequested():
				return sys.exit()
			try:
				if control.progressDialog.iscanceled():
					if control.yesnoDialog('Delete PM download also?', 'No will continue the download', 'but close dialog'):
						return _return_failed(control.lang(40014))
					else:
						control.progressDialog.close()
						control.hide()
						return False
			except:
				pass
			if transfer_info.get('status') == 'stalled':
				return _return_failed()
		control.sleep(1000 * interval)
		try:
			control.progressDialog.close()
		except:
			log_utils.error()
			pass
		control.hide()
		return True
Ejemplo n.º 14
0
    def get(self, name, imdb, season, episode):
        import gzip, StringIO, codecs
        import xmlrpclib, re, base64

        try:
            langDict = {
                'Afrikaans': 'afr',
                'Albanian': 'alb',
                'Arabic': 'ara',
                'Armenian': 'arm',
                'Basque': 'baq',
                'Bengali': 'ben',
                'Bosnian': 'bos',
                'Breton': 'bre',
                'Bulgarian': 'bul',
                'Burmese': 'bur',
                'Catalan': 'cat',
                'Chinese': 'chi',
                'Croatian': 'hrv',
                'Czech': 'cze',
                'Danish': 'dan',
                'Dutch': 'dut',
                'English': 'eng',
                'Esperanto': 'epo',
                'Estonian': 'est',
                'Finnish': 'fin',
                'French': 'fre',
                'Galician': 'glg',
                'Georgian': 'geo',
                'German': 'ger',
                'Greek': 'ell',
                'Hebrew': 'heb',
                'Hindi': 'hin',
                'Hungarian': 'hun',
                'Icelandic': 'ice',
                'Indonesian': 'ind',
                'Italian': 'ita',
                'Japanese': 'jpn',
                'Kazakh': 'kaz',
                'Khmer': 'khm',
                'Korean': 'kor',
                'Latvian': 'lav',
                'Lithuanian': 'lit',
                'Luxembourgish': 'ltz',
                'Macedonian': 'mac',
                'Malay': 'may',
                'Malayalam': 'mal',
                'Manipuri': 'mni',
                'Mongolian': 'mon',
                'Montenegrin': 'mne',
                'Norwegian': 'nor',
                'Occitan': 'oci',
                'Persian': 'per',
                'Polish': 'pol',
                'Portuguese': 'por,pob',
                'Portuguese(Brazil)': 'pob,por',
                'Romanian': 'rum',
                'Russian': 'rus',
                'Serbian': 'scc',
                'Sinhalese': 'sin',
                'Slovak': 'slo',
                'Slovenian': 'slv',
                'Spanish': 'spa',
                'Swahili': 'swa',
                'Swedish': 'swe',
                'Syriac': 'syr',
                'Tagalog': 'tgl',
                'Tamil': 'tam',
                'Telugu': 'tel',
                'Thai': 'tha',
                'Turkish': 'tur',
                'Ukrainian': 'ukr',
                'Urdu': 'urd'
            }
            codePageDict = {
                'ara': 'cp1256',
                'ar': 'cp1256',
                'ell': 'cp1253',
                'el': 'cp1253',
                'heb': 'cp1255',
                'he': 'cp1255',
                'tur': 'cp1254',
                'tr': 'cp1254',
                'rus': 'cp1251',
                'ru': 'cp1251'
            }
            quality = [
                'bluray', 'hdrip', 'brrip', 'bdrip', 'dvdrip', 'webrip', 'hdtv'
            ]
            langs = []
            try:
                try:
                    langs = langDict[control.setting(
                        'subtitles.lang.1')].split(',')
                except:
                    langs.append(langDict[control.setting('subtitles.lang.1')])
            except:
                pass

            try:
                try:
                    langs = langs + langDict[control.setting(
                        'subtitles.lang.2')].split(',')
                except:
                    langs.append(langDict[control.setting('subtitles.lang.2')])
            except:
                pass

            try:
                subLang = xbmc.Player().getSubtitles()
            except:
                subLang = ''

            if subLang == langs[0]:
                raise Exception()

            server = xmlrpclib.Server('https://api.opensubtitles.org/xml-rpc',
                                      verbose=0)
            token = server.LogIn('', '', 'en', 'XBMC_Subtitles_v1')
            token = token['token']
            sublanguageid = ','.join(langs)
            imdbid = re.sub('[^0-9]', '', imdb)

            if not (season is None or episode is None):
                result = server.SearchSubtitles(token, [{
                    'sublanguageid': sublanguageid,
                    'imdbid': imdbid,
                    'season': season,
                    'episode': episode
                }])['data']
                fmt = ['hdtv']
            else:
                result = server.SearchSubtitles(token, [{
                    'sublanguageid': sublanguageid,
                    'imdbid': imdbid
                }])['data']
                try:
                    vidPath = xbmc.Player().getPlayingFile()
                except:
                    vidPath = ''
                fmt = re.split('\.|\(|\)|\[|\]|\s|\-', vidPath)
                fmt = [i.lower() for i in fmt]
                fmt = [i for i in fmt if i in quality]

            filter = []
            result = [i for i in result if i['SubSumCD'] == '1']

            for lang in langs:
                filter += [
                    i for i in result if i['SubLanguageID'] == lang and any(
                        x in i['MovieReleaseName'].lower() for x in fmt)
                ]
                filter += [
                    i for i in result if i['SubLanguageID'] == lang and any(
                        x in i['MovieReleaseName'].lower() for x in quality)
                ]
                filter += [i for i in result if i['SubLanguageID'] == lang]

            try:
                lang = xbmc.convertLanguage(filter[0]['SubLanguageID'],
                                            xbmc.ISO_639_1)
            except:
                lang = filter[0]['SubLanguageID']

            content = [
                filter[0]['IDSubtitleFile'],
            ]
            content = server.DownloadSubtitles(token, content)
            content = base64.b64decode(content['data'][0]['data'])
            content = gzip.GzipFile(fileobj=StringIO.StringIO(content)).read()

            subtitle = xbmc.translatePath('special://temp/')
            subtitle = control.joinPath(subtitle,
                                        'TemporarySubs.%s.srt' % lang)

            codepage = codePageDict.get(lang, '')
            if codepage and control.setting('subtitles.utf') == 'true':
                try:
                    content_encoded = codecs.decode(content, codepage)
                    content = codecs.encode(content_encoded, 'utf-8')
                except:
                    pass

            file = control.openFile(subtitle, 'w')
            file.write(str(content))
            file.close()
            xbmc.sleep(1000)
            xbmc.Player().setSubtitles(subtitle)
        except:
            log_utils.error()
            pass
Ejemplo n.º 15
0
def manager(name, imdb=None, tvdb=None, season=None, episode=None, refresh=True):
	lists = []
	try:
		if season is not None:
			season = int(season)
		if episode is not None:
			episode = int(episode)
		if tvdb is not None:
			media_type = 'Show'
		else:
			media_type = 'Movie'

		items = [(control.lang(33651), 'watch')]
		items += [(control.lang(33652), 'unwatch')]
		items += [(control.lang(33653), 'rate')]
		items += [(control.lang(33654), 'unrate')]
		items += [(control.lang(40075) % media_type, 'hideItem')]
		items += [(control.lang(33575), '/sync/collection')]
		items += [(control.lang(33576), '/sync/collection/remove')]
		if season or episode is not None:
			items += [(control.lang(33573), '/sync/watchlist')]
			items += [(control.lang(33574), '/sync/watchlist/remove')]
		items += [(control.lang(33577), '/sync/watchlist')]
		items += [(control.lang(33578), '/sync/watchlist/remove')]
		items += [(control.lang(33579), '/users/me/lists/%s/items')]

		result = getTraktAsJson('/users/me/lists')
		lists = [(i['name'], i['ids']['slug']) for i in result]
		lists = [lists[i//2] for i in range(len(lists)*2)]

		for i in range(0, len(lists), 2):
			lists[i] = ((control.lang(33580) % lists[i][0]).encode('utf-8'), '/users/me/lists/%s/items' % lists[i][1])

		for i in range(1, len(lists), 2):
			lists[i] = ((control.lang(33581) % lists[i][0]).encode('utf-8'), '/users/me/lists/%s/items/remove' % lists[i][1])
		items += lists

		control.hide()
		select = control.selectDialog([i[0] for i in items], heading = control.addonInfo('name') + ' - ' + control.lang(32515))

		if select == -1:
			return
		if select >= 0:
			# if select == 0:
			if items[select][0] == control.lang(33651):
				control.busy()
				watch(name, imdb = imdb, tvdb = tvdb, season = season, episode = episode, refresh = refresh)
				control.hide()
			# elif select == 1:
			elif items[select][0] == control.lang(33652):
				control.busy()
				unwatch(name, imdb = imdb, tvdb = tvdb, season = season, episode = episode, refresh = refresh)
				control.hide()
			# elif select == 2:
			elif items[select][0] == control.lang(33653):
				control.busy()
				rate(imdb = imdb, tvdb = tvdb, season = season, episode = episode)
				control.hide()
			# elif select == 3:
			elif items[select][0] == control.lang(33654):
				control.busy()
				unrate(imdb = imdb, tvdb = tvdb, season = season, episode = episode)
				control.hide()
			# elif select == 4:
			elif items[select][0] == control.lang(40075) % media_type:
				control.busy()
				hideItem(name = name, imdb = imdb, tvdb = tvdb, season = season, episode = episode)
				control.hide()

			else:
				if tvdb is None:
					post = {"movies": [{"ids": {"imdb": imdb}}]}
				else:
					if episode is not None:
						if items[select][0] == control.lang(33573) or items[select][0] == control.lang(33574):
							post = {"shows": [{"ids": {"tvdb": tvdb}}]}
						else:
							post = {"shows": [{"ids": {"tvdb": tvdb}, "seasons": [{"number": season, "episodes": [{"number": episode}]}]}]}
							name = name + ' - ' + '%sx%02d' % (season, episode)
					elif season is not None:
						if items[select][0] == control.lang(33573) or items[select][0] == control.lang(33574):
							post = {"shows": [{"ids": {"tvdb": tvdb}}]}
						else:
							post = {"shows": [{"ids": {"tvdb": tvdb}, "seasons": [{"number": season}]}]}
							name = name + ' - ' + 'Season %s' % season
					else:
						post = {"shows": [{"ids": {"tvdb": tvdb}}]}

				# if select == 8:
				if items[select][0] == control.lang(33579):
					slug = listAdd(successNotification = True)
					if slug is not None:
						getTrakt(items[select][1] % slug, post = post)[0]
				else:
					getTrakt(items[select][1], post = post)[0]

				control.hide()
				# message = 33583 if (select % 2) == 0 else 33582
				message = 33583 if 'remove' in items[select][1] else 33582

				if refresh:
					control.refresh()
				control.trigger_widget_refresh()
				if control.setting('trakt.general.notifications') == 'true':
					control.notification(title=name, message=message, icon='default', sound=(control.setting('notification.sound') == 'true'))
	except:
		log_utils.error()
		control.hide()
Ejemplo n.º 16
0
        def items_list(i):
            # if i['metacache']:
            # return
            try:
                tvmaze = i
                url = self.tvmaze_info_link % i
                item = requests.get(url, timeout=10).json()

                content = item.get('type', '0').lower()

                try:
                    title = (item.get('name')).encode('utf-8')
                except:
                    title = item.get('name')

                premiered = item.get('premiered', '0')

                year = str(item.get('premiered', '0'))
                if year is not None and year != 'None' and year != '0':
                    year = re.search(r"(\d{4})", year).group(1)
                else:
                    year = '0'

                imdb = item.get('externals').get('imdb', '0')
                if imdb == '' or imdb is None or imdb == 'None':
                    imdb = '0'

                tvdb = str(item.get('externals').get('thetvdb', '0'))
                if tvdb == '' or tvdb is None or tvdb == 'None':
                    tvdb = '0'

                # TVMaze does not have tmdb_id in api
                tmdb = '0'

                studio = item.get('network', {}) or item.get('webChannel', {})
                studio = studio.get('name', '0')

                genre = []
                for i in item['genres']:
                    genre.append(i.title())
                if genre == []: genre = 'NA'

                duration = str(item.get('runtime', '0'))

                rating = str(item.get('rating').get('average', '0'))

                plot = item.get('summary', '0')
                if plot:
                    plot = re.sub('<.+?>|</.+?>|\n', '', plot)

                status = item.get('status', '0')

                castandart = []
                for person in item['_embedded']['cast']:
                    try:
                        try:
                            castandart.append({
                                'name':
                                person['person']['name'].encode('utf-8'),
                                'role':
                                person['character']['name'].encode('utf-8'),
                                'thumbnail':
                                (person['person']['image']['original']
                                 if person['person']['image']['original']
                                 is not None else '0')
                            })
                        except:
                            castandart.append({
                                'name':
                                person['person']['name'],
                                'role':
                                person['character']['name'],
                                'thumbnail':
                                (person['person']['image']['medium']
                                 if person['person']['image']['medium']
                                 is not None else '0')
                            })
                    except:
                        castandart = []
                        pass
                    if len(castandart) == 150: break

                image = item.get('image')
                poster = image.get('original',
                                   '0') if image is not None else '0'
                fanart = '0'
                banner = '0'
                mpaa = '0'
                votes = '0'
                airday = '0'
                airtime = '0'

                # self.list = metacache.fetch(self.list, self.lang, self.user)
                # if self.list['metacache'] is True:
                # raise Exception()

                if (imdb == '0' or tmdb == '0') and tvdb != '0':
                    from resources.lib.modules import trakt
                    trakt_ids = trakt.IdLookup('tvdb', tvdb, 'show')
                    if trakt_ids:
                        if imdb == '0':
                            imdb = str(trakt_ids.get('imdb', '0'))
                            if imdb == '' or imdb is None or imdb == 'None':
                                imdb = '0'
                        if tmdb == '0':
                            tmdb = str(trakt_ids.get('tmdb', '0'))
                            if tmdb == '' or tmdb is None or tmdb == 'None':
                                tmdb = '0'

###--Check TVDb by IMDB_ID for missing ID's
                if tvdb == '0' and imdb != '0':
                    try:
                        url = self.tvdb_by_imdb % imdb
                        result = requests.get(url).content
                        result = re.sub(r'[^\x00-\x7F]+', '', result)
                        result = client.replaceHTMLCodes(result)
                        result = client.parseDOM(result, 'Series')
                        result = [(client.parseDOM(x, 'SeriesName'),
                                   client.parseDOM(x, 'FirstAired'),
                                   client.parseDOM(x, 'seriesid'),
                                   client.parseDOM(x, 'AliasNames'))
                                  for x in result]
                        years = [
                            str(year),
                            str(int(year) + 1),
                            str(int(year) - 1)
                        ]
                        item = [(x[0], x[1], x[2], x[3]) for x in result
                                if cleantitle.get(title) == cleantitle.get(
                                    str(x[0][0])) and any(y in str(x[1][0])
                                                          for y in years)]
                        if item == []:
                            item = [(x[0], x[1], x[2], x[3]) for x in result
                                    if cleantitle.get(title) == cleantitle.get(
                                        str(x[3][0]))]
                        if item == []:
                            item = [(x[0], x[1], x[2], x[3]) for x in result
                                    if cleantitle.get(title) == cleantitle.get(
                                        str(x[0][0]))]
                        if item == []:
                            raise Exception()
                        tvdb = item[0][2]
                        tvdb = tvdb[0] or '0'
                    except:
                        log_utils.error()
                        pass

###--Check TVDb by seriesname
                if tvdb == '0' or imdb == '0':
                    try:
                        url = self.tvdb_by_query % (quote_plus(title))
                        result = requests.get(url).content
                        result = re.sub(r'[^\x00-\x7F]+', '', result)
                        result = client.replaceHTMLCodes(result)
                        result = client.parseDOM(result, 'Series')
                        result = [(client.parseDOM(x, 'SeriesName'),
                                   client.parseDOM(x, 'FirstAired'),
                                   client.parseDOM(x, 'seriesid'),
                                   client.parseDOM(x, 'IMDB_ID'),
                                   client.parseDOM(x, 'AliasNames'))
                                  for x in result]
                        years = [
                            str(year),
                            str(int(year) + 1),
                            str(int(year) - 1)
                        ]
                        item = [(x[0], x[1], x[2], x[3], x[4]) for x in result
                                if cleantitle.get(title) == cleantitle.get(
                                    str(x[0][0])) and any(y in str(x[1][0])
                                                          for y in years)]
                        if item == []:
                            item = [(x[0], x[1], x[2], x[3], x[4])
                                    for x in result
                                    if cleantitle.get(title) == cleantitle.get(
                                        str(x[4][0]))]
                        if item == []:
                            item = [(x[0], x[1], x[2], x[3], x[4])
                                    for x in result
                                    if cleantitle.get(title) == cleantitle.get(
                                        str(x[0][0]))]
                        if item == []:
                            raise Exception()
                        if tvdb == '0':
                            tvdb = item[0][2]
                            tvdb = tvdb[0] or '0'
                        if imdb == '0':
                            imdb = item[0][3]
                            imdb = imdb[0] or '0'
                    except:
                        log_utils.error()
                        pass
#################################

                if tvdb == '0':
                    raise Exception()

                try:
                    url = self.tvdb_info_link % (tvdb, self.lang)
                    item3 = requests.get(url).content
                except:
                    item3 = None

                if item3:
                    if poster == '0':
                        poster = client.parseDOM(item3, 'poster')[0]
                        poster = '%s%s' % (self.tvdb_image,
                                           poster) if poster else '0'

                    fanart = client.parseDOM(item3, 'fanart')[0]
                    fanart = '%s%s' % (self.tvdb_image,
                                       fanart) if fanart else '0'

                    banner = client.parseDOM(item3, 'banner')[0]
                    banner = '%s%s' % (self.tvdb_image,
                                       banner) if banner else '0'

                    mpaa = client.parseDOM(item3, 'ContentRating')[0] or '0'

                    if duration == '0':
                        duration = client.parseDOM(item3, 'Runtime')[0] or '0'

                    if rating == '0':
                        rating = client.parseDOM(item3, 'Rating')[0] or '0'

                    votes = client.parseDOM(item3, 'RatingCount')[0] or '0'

                    if status == '0':
                        status = client.parseDOM(item3, 'Status')[0] or '0'

                    if year == '0':
                        year = client.parseDOM(item3, 'FirstAired')[0] or '0'
                        if year != '0':
                            year = re.compile('(\d{4})').findall(
                                year)[0] or '0'

                    if not plot:
                        plot = client.parseDOM(item3, 'Overview')[0] or '0'
                        plot = client.replaceHTMLCodes(plot)
                        try:
                            plot = plot.encode('utf-8')
                        except:
                            pass

                    airday = client.parseDOM(item3, 'Airs_DayOfWeek')[0] or '0'
                    # log_utils.log('airday = %s' % str(airday), __name__, log_utils.LOGDEBUG)
                    airtime = client.parseDOM(item3, 'Airs_Time')[0] or '0'

                item = {}
                item = {
                    'content': content,
                    'title': title,
                    'originaltitle': title,
                    'year': year,
                    'premiered': premiered,
                    'studio': studio,
                    'genre': genre,
                    'duration': duration,
                    'rating': rating,
                    'votes': votes,
                    'mpaa': mpaa,
                    'castandart': castandart,
                    'plot': plot,
                    'tagline': '0',
                    'status': status,
                    'imdb': imdb,
                    'tvdb': tvdb,
                    'tmdb': tmdb,
                    'tvmaze': tvmaze,
                    'airday': airday,
                    'airtime': airtime,
                    'poster': poster,
                    'poster2': '0',
                    'banner': banner,
                    'banner2': '0',
                    'fanart': fanart,
                    'fanart2': '0',
                    'clearlogo': '0',
                    'clearart': '0',
                    'landscape': fanart,
                    'metacache': False,
                    'next': next
                }

                meta = {}
                meta = {
                    'tmdb': tmdb,
                    'imdb': imdb,
                    'tvdb': tvdb,
                    'lang': self.lang,
                    'user': self.user,
                    'item': item
                }

                if self.disable_fanarttv != 'true':
                    from resources.lib.indexers import fanarttv
                    extended_art = cache.get(fanarttv.get_tvshow_art, 168,
                                             tvdb)
                    if extended_art:
                        item.update(extended_art)
                        meta.update(item)

                if (self.disable_fanarttv == 'true' and
                    (poster == '0' or fanart == '0')) or (
                        self.disable_fanarttv != 'true' and
                        ((poster == '0' and item.get('poster2') == '0') or
                         (fanart == '0' and item.get('fanart2') == '0'))):
                    from resources.lib.indexers.tmdb import TVshows
                    tmdb_art = TVshows().get_art(tmdb)
                    # log_utils.log('tmdb_art = %s' % tmdb_art, __name__, log_utils.LOGDEBUG)
                    if tmdb_art:
                        item.update(tmdb_art)
                        if item.get('landscape', '0') == '0':
                            landscape = item.get('fanart3', '0')
                            item.update({'landscape': landscape})
                        meta.update(item)

                item = dict((k, v) for k, v in item.iteritems() if v != '0')
                self.list.append(item)

                if 'next' in meta.get('item'):
                    del meta['item']['next']

                self.meta.append(meta)
                metacache.insert(self.meta)
            except:
                log_utils.error()
                pass
Ejemplo n.º 17
0
 def user_transfers_to_listItem(self):
     sysaddon, syshandle = argv[0], int(argv[1])
     transfer_files = self.user_cloud()['magnets']
     if not transfer_files:
         if self.server_notifications:
             control.notification(message='Request Failure-Empty Content',
                                  icon=ad_icon)
         log_utils.log('AllDebrid: Request Failure-Empty Content', __name__,
                       log_utils.LOGDEBUG)
         return
     folder_str, deleteMenu, restartMenu = getLS(40046).upper(), getLS(
         40050), getLS(40008)
     for count, item in enumerate(transfer_files, 1):
         try:
             status_code = item['statusCode']
             if status_code in (0, 1, 2, 3):
                 active = True
                 downloaded = item['downloaded']
                 size = item['size']
                 try:
                     percent = str(round(float(downloaded) / size * 100, 1))
                 except:
                     percent = '0'
             else:
                 active = False
             folder_name = string_tools.strip_non_ascii_and_unprintable(
                 item['filename'])
             id = item['id']
             status_str = '[COLOR %s]%s[/COLOR]' % (
                 control.getHighlightColor(), item['status'].capitalize())
             if active:
                 label = '%02d | [B]%s[/B] - %s | [B]%s[/B]' % (
                     count, status_str, str(percent) + '%', folder_name)
             else:
                 label = '%02d | [B]%s[/B] | [B]%s[/B] | [I]%s [/I]' % (
                     count, status_str, folder_str, folder_name)
             if status_code == 4:
                 url = '%s?action=ad_BrowseUserCloud&source=%s' % (
                     sysaddon, quote_plus(jsdumps(item)))
                 isFolder = True
             else:
                 url = ''
                 isFolder = False
             cm = []
             cm.append(
                 (deleteMenu % 'Transfer',
                  'RunPlugin(%s?action=ad_DeleteTransfer&id=%s&name=%s)' %
                  (sysaddon, id, folder_name)))
             if status_code in (6, 7, 9, 10):
                 cm.append((
                     restartMenu,
                     'RunPlugin(%s?action=ad_RestartTransfer&id=%s&name=%s)'
                     % (sysaddon, id, folder_name)))
             item = control.item(label=label, offscreen=True)
             item.addContextMenuItems(cm)
             item.setArt({
                 'icon': ad_icon,
                 'poster': ad_icon,
                 'thumb': ad_icon,
                 'fanart': addonFanart,
                 'banner': ad_icon
             })
             item.setInfo(type='video', infoLabels='')
             control.addItem(handle=syshandle,
                             url=url,
                             listitem=item,
                             isFolder=isFolder)
         except:
             log_utils.error()
     control.content(syshandle, 'files')
     control.directory(syshandle, cacheToDisc=True)
Ejemplo n.º 18
0
def insert(meta):
	try:
		if not control.existsPath(control.dataPath):
			control.makeFile(control.dataPath)
		dbcon = database.connect(control.metacacheFile)
		dbcur = dbcon.cursor()
		dbcur.execute("CREATE TABLE IF NOT EXISTS meta (""imdb TEXT, ""tmdb TEXT, ""tvdb TEXT, ""lang TEXT, ""user TEXT, ""item TEXT, ""time TEXT, ""UNIQUE(imdb, tmdb, tvdb, lang, user)"");")
		t = int(time.time())
		for m in meta:
			if "user" not in m:
				m["user"] = ''
			if "lang" not in m:
				m["lang"] = 'en'
			i = repr(m['item'])
			try:
				dbcur.execute("INSERT OR REPLACE INTO meta Values (?, ?, ?, ?, ?, ?, ?)", (m.get('imdb', '0'), m.get('tmdb', '0'), m.get('tvdb', '0'), m['lang'], m['user'], i, t))
			except:
				pass
		dbcur.connection.commit()
	except:
		log_utils.error()
		pass
	try:
		dbcon.close()
	except:
		pass
	return


# def local(items, link, poster, fanart):
	# try:
		# # dbcon = database.connect(control.metaFile())
		# dbcon = database.connect(control.metacacheFile)
		# dbcur = dbcon.cursor()
		# args = [i['imdb'] for i in items]
		# dbcur.execute('SELECT * FROM mv WHERE imdb IN (%s)' % ', '.join(list(map(lambda arg:  "'%s'" % arg, args))))
		# data = dbcur.fetchall()
	# except:
		# return items
	# for i in range(0, len(items)):
		# try:
			# item = items[i]
			# match = [x for x in data if x[1] == item['imdb']][0]
			# try:
				# if poster in item and item[poster] != '0':
					# raise Exception()
				# if match[2] == '0':
					# raise Exception()
				# items[i].update({poster: link % ('300', '/%s.jpg' % match[2])})
			# except:
				# pass
			# try:
				# if fanart in item and item[fanart] != '0':
					# raise Exception()
				# if match[3] == '0':
					# raise Exception()
				# items[i].update({fanart: link % ('1280', '/%s.jpg' % match[3])})
			# except:
				# pass
		# except:
			# pass
	# dbcon.close()
	# return items
Ejemplo n.º 19
0
    def resolve_magnet(self, magnet_url, info_hash, season, episode, ep_title):
        from resources.lib.modules.source_utils import seas_ep_filter, extras_filter
        try:
            file_url = None
            media_id = None
            failed_reason = 'Unknown'
            correct_files = []
            append = correct_files.append
            extensions = supported_video_extensions()
            extras_filtering_list = extras_filter()
            transfer_id = self.create_transfer(magnet_url)
            transfer_info = self.list_transfer(transfer_id)
            # log_utils.log('transfer_info=%s' % str(transfer_info))

            # valid_results = [i for i in transfer_info.get('links') if any(i.get('filename').lower().endswith(x) for x in extensions) and not i.get('link', '') == ''] #.m2ts file extension is not in "filename" so this fails
            valid_results = [
                i for i in transfer_info.get('links') if not any(
                    i.get('filename').lower().endswith(x)
                    for x in invalid_extensions)
                and not i.get('link', '') == ''
            ]

            if len(valid_results) == 0:
                failed_reason = 'No valid video extension found'
                raise Exception()

            if season:
                for item in valid_results:
                    if '.m2ts' in str(item.get('files')):
                        log_utils.log(
                            'AllDebrid: Can not resolve .m2ts season disk episode',
                            level=log_utils.LOGDEBUG)
                        failed_reason = '.m2ts season disk incapable of determining episode'
                        continue
                    if seas_ep_filter(season, episode, item['filename']):
                        append(item)
                    if len(correct_files) == 0:
                        failed_reason = 'no matching episode found'
                        continue
                    episode_title = re.sub(r'[^A-Za-z0-9-]+', '.',
                                           ep_title.replace('\'', '')).lower()
                    for i in correct_files:
                        compare_link = seas_ep_filter(season,
                                                      episode,
                                                      i['filename'],
                                                      split=True)
                        compare_link = re.sub(episode_title, '', compare_link)
                        if not any(x in compare_link
                                   for x in extras_filtering_list):
                            media_id = i['link']
                            break
            else:
                media_id = max(valid_results,
                               key=lambda x: x.get('size')).get('link', None)
            if not self.store_to_cloud: self.delete_transfer(transfer_id)
            if not media_id:
                log_utils.log(
                    'AllDebrid: FAILED TO RESOLVE MAGNET %s : (%s)' %
                    (magnet_url, failed_reason), __name__,
                    log_utils.LOGWARNING)
                return None
            file_url = self.unrestrict_link(media_id)
            if not file_url:
                log_utils.log(
                    'AllDebrid: FAILED TO UNRESTRICT MAGNET %s : ' %
                    magnet_url, __name__, log_utils.LOGWARNING)
            return file_url
        except:
            if failed_reason != 'Unknown':
                log_utils.log('AllDebrid: Error RESOLVE MAGNET %s : (%s)' %
                              (magnet_url, failed_reason))
            else:
                log_utils.error('AllDebrid: Error RESOLVE MAGNET %s : ' %
                                magnet_url)
            if transfer_id: self.delete_transfer(transfer_id)
            return None
Ejemplo n.º 20
0
def getMovieAliases(id):
	try:
		return cache.get(getTraktAsJson, 48, '/movies/%s/aliases' % id)
	except:
		log_utils.error()
		return []
Ejemplo n.º 21
0
					else:
						continue
				if url_dl == '':
					continue
				if int(i['files_num_video_player']) !> 1:
					if int(i['ss_num']) > 0:
						thumb = i['ss_urls'][0]
					else:
						thumb = ''
					self.addDirectoryItem(name , url_dl, thumb, '', False)
				else:
					pass
			self.endDirectory()
			return ''
		except:
			log_utils.error()
			pass

	def search(self):
		from resources.lib.menus import navigator
		navigator.Navigator().addDirectoryItem('New Search', 'furkSearchNew', 'search.png', 'search.png')

		try:
			from sqlite3 import dbapi2 as database
		except:
			from pysqlite2 import dbapi2 as database

		dbcon = database.connect(control.searchFile)
		dbcur = dbcon.cursor()

		try:
Ejemplo n.º 22
0
def getTVShowAliases(id):
	try:
		return cache.get(getTraktAsJson, 48, '/shows/%s/aliases' % id)
	except:
		log_utils.error()
		return []
Ejemplo n.º 23
0
	def get_movie_meta(self, tmdb, imdb=None):
		if not tmdb and not imdb: return
		try:
			result = self.get_movie_request(tmdb, imdb)
			if '404:NOT FOUND' in result: return result
			if not result: return
			meta = {}
		except:
			from resources.lib.modules import log_utils
			log_utils.error()
			return None
		try:
			meta['mediatype'] = 'movie'
# adult
			meta['fanart'] = '%s%s' % (fanart_path, result['backdrop_path']) if result.get('backdrop_path') else ''
# belongs_to_collection
# budget
			meta['genre'] = ' / '.join([x['name'] for x in result.get('genres', {})]) or 'NA'
# homepage
			meta['tmdb'] = str(result.get('id', '')) if result.get('id') else ''
			meta['imdb'] = str(result.get('imdb_id', '')) if result.get('imdb_id') else ''
			meta['imdbnumber'] = meta['imdb']
			meta['original_language'] = result.get('original_language', '')
			meta['originaltitle'] = result.get('original_title', '')
			meta['plot'] = result.get('overview', '') if result.get('overview') else ''
			# meta['?'] = result.get('popularity', '')
			meta['poster'] = '%s%s' % (poster_path, result['poster_path']) if result.get('poster_path') else ''
			# try: meta['studio'] = result.get('production_companies', {})[0]['name'] # Silvo seems to use "studio" icons in place of "thumb" for movies in list view
			# except: meta['studio'] = ''
			try: meta['country_codes'] = [i['iso_3166_1'] for i in result['production_countries']]
			except: meta['country_codes'] = ''
			meta['premiered'] = str(result.get('release_date', '')) if result.get('release_date') else ''
			try: meta['year'] = meta['premiered'][:4]
			except: meta['year'] = ''
# revenue
			meta['duration'] = int(result.get('runtime') * 60) if result.get('runtime') else ''
			meta['spoken_languages'] = result.get('spoken_languages')
			meta['status'] = result['status']
			# meta['tagline'] = result.get('tagline', '')
			meta['title'] = result.get('title')
			meta['rating'] = str(result.get('vote_average', ''))
			meta['votes'] = result.get('vote_count', '')
			crew = result.get('credits', {}).get('crew')
			try: meta['director'] = ', '.join([d['name'] for d in [x for x in crew if x['job'] == 'Director']])
			except: meta['director'] = ''
			try: meta['writer'] = ', '.join([w['name'] for w in [y for y in crew if y['job'] in ('Writer', 'Screenplay', 'Author', 'Novel')]])
			except: meta['writer'] = ''
			meta['castandart'] = []
			for person in result['credits']['cast']:
				try: meta['castandart'].append({'name': person['name'], 'role': person['character'], 'thumbnail': ('%s%s' % (profile_path, person['profile_path']) if person.get('profile_path') else '')})
				except: pass
				if len(meta['castandart']) == 150: break
			try:
				meta['mpaa'] = ''
				rel_info = [x for x in result['release_dates']['results'] if x['iso_3166_1'] == 'US'][0]
				for cert in rel_info.get('release_dates', {}): # loop thru all keys
					if cert['certification']:
						if cert['note']: continue # limited release adds region note here, use official full release that will be null
						meta['mpaa'] = cert['certification']
						meta['premiered'] = cert['release_date'].split('T')[0] or meta['premiered'] # use US premiered date
						break
			except: meta['mpaa'] = ''
			try:
				trailer = [x for x in result['videos']['results'] if x['site'] == 'YouTube' and x['type'] in ('Trailer', 'Teaser')][0]['key']
				meta['trailer'] = control_trailer % trailer
			except: meta['trailer'] = ''
			# make aliases match what trakt returns in sources module for title checking scrape results
			try: meta['aliases'] = [{'title': x['title'], 'country': x['iso_3166_1'].lower()} for x in result.get('alternative_titles', {}).get('titles') if x.get('iso_3166_1').lower() in ('us', 'uk', 'gb')]
			except: meta['aliases'] = []
		except:
			from resources.lib.modules import log_utils
			log_utils.error()
		return meta
Ejemplo n.º 24
0
def scrobbleMovie(imdb, watched_percent):
	try:
		if not imdb.startswith('tt'): imdb = 'tt' + imdb
		return getTrakt('/scrobble/pause', {"movie": {"ids": {"imdb": imdb}}, "progress": watched_percent})
	except:
		log_utils.error()
Ejemplo n.º 25
0
	def get_showSeasons_meta(self, tmdb): # builds seasons meta from show level request
		if not tmdb: return None
		try:
			result = self.get_show_request(tmdb)
			if '404:NOT FOUND' in result: return result
			if not result: return
			meta = {}
		except:
			from resources.lib.modules import log_utils
			log_utils.error()
			return None
		try:
			meta['mediatype'] = 'tvshow'
			meta['fanart'] = '%s%s' % (fanart_path, result['backdrop_path']) if result.get('backdrop_path') else ''
			try: meta['duration'] = min(result['episode_run_time']) * 60
			except: meta['duration'] = ''
			meta['premiered'] = str(result.get('first_air_date', '')) if result.get('first_air_date') else ''
			try: meta['year'] = meta['premiered'][:4]
			except: meta['year'] = ''
			meta['genre'] = ' / '.join([x['name'] for x in result.get('genres', {})]) or 'NA'
			meta['tmdb'] = tmdb
			meta['in_production'] = result.get('in_production') # do not use for "season_isAiring", this is show wide and "season_isAiring" is season specific for season pack scraping.
			meta['last_air_date'] = result.get('last_air_date', '')
			meta['last_episode_to_air'] = result.get('last_episode_to_air', '')
			meta['tvshowtitle'] = result.get('name')
			# meta['next_episode_to_air'] = results.get('next_episode_to_air', '')
			try: meta['studio'] = result.get('networks', {})[0].get('name')
			except: meta['studio'] = ''
			meta['total_episodes'] = result.get('number_of_episodes') # counts aired eps
			meta['total_seasons'] = result.get('number_of_seasons')
			try: meta['origin_country'] = result.get('origin_country')[0]
			except: meta['origin_country'] = ''
			meta['original_language'] = result.get('original_language')
			meta['originaltitle'] = result.get('original_name')
			meta['plot'] = result.get('overview', '') if result.get('overview') else ''
			# meta['?'] = result.get('popularity', '')
			meta['poster'] = '%s%s' % (poster_path, result['poster_path']) if result.get('poster_path') else ''
			meta['tvshow_poster'] = meta['poster'] # check that this new dict key is used throughout
			try: meta['country_codes'] = [i['iso_3166_1'] for i in result['production_countries']]
			except: meta['country_codes'] = ''
			meta['seasons'] = result.get('seasons')
			meta['status'] = result.get('status')
			# meta['counts'] = self.seasonCountParse(meta['seasons']) # check on performance hit
			meta['counts'] = dict(sorted({(str(i['season_number']), i['episode_count']) for i in meta['seasons']}, key=lambda k: int(k[0])))
			if meta['status'].lower in ('ended', 'canceled'):
				meta['total_aired_episodes'] = result.get('number_of_episodes')
			else:
				meta['total_aired_episodes'] = self.airedEpisodesParse(meta['seasons'], meta['last_episode_to_air'])
				# meta['total_aired_episodes'] = sum([i['episode_count'] for i in meta['seasons'] if i['season_number'] < meta['last_episode_to_air']['season_number'] and i['season_number'] != 0]) + meta['last_episode_to_air']['episode_number']
			meta['spoken_languages'] = result.get('spoken_languages')
			meta['tagline'] = result.get('tagline', '')
			meta['type'] = result.get('type')
			meta['rating'] = result.get('vote_average', '')
			meta['votes'] = result.get('vote_count', '')
			crew = result.get('credits', {}).get('crew')
			try: meta['director'] = ', '.join([d['name'] for d in [x for x in crew if x['job'] == 'Director']])
			except: meta['director'] = ''
			try: meta['writer'] = ', '.join([w['name'] for w in [y for y in crew if y['job'] == 'Writer']]) # movies also contains "screenplay", "author", "novel". See if any apply for shows
			except: meta['writer'] = ''
			meta['castandart'] = []
			for person in result['credits']['cast']:
				try: meta['castandart'].append({'name': person['name'], 'role': person['character'], 'thumbnail': ('%s%s' % (profile_path, person['profile_path']) if person.get('profile_path') else '')})
				except: pass
				if len(meta['castandart']) == 150: break
			try: meta['mpaa'] = [x['rating'] for x in result['content_ratings']['results'] if x['iso_3166_1'] == 'US'][0]
			except: 
				try: meta['mpaa'] = result['content_ratings'][0]['rating']
				except: meta['mpaa'] = ''
			ids = result.get('external_ids', {})
			meta['imdb'] = str(ids.get('imdb_id', '')) if ids.get('imdb_id') else ''
			meta['imdbnumber'] = meta['imdb']
			meta['tvdb'] = str(ids.get('tvdb_id', '')) if ids.get('tvdb_id') else ''
			# make aliases match what trakt returns in sources module for title checking scrape results
			try: meta['aliases'] = [{'title': x['title'], 'country': x['iso_3166_1'].lower()} for x in result.get('alternative_titles', {}).get('results') if x.get('iso_3166_1').lower() in ('us', 'uk', 'gb')]
			except: meta['aliases'] = []
			try:
				meta['trailer'] = [x for x in result['videos']['results'] if x['site'] == 'YouTube' and x['type'] in ('Trailer', 'Teaser')][0]['key']
				meta['trailer'] = control_trailer % meta['trailer']
			except: meta['trailer'] = ''
			# meta['banner'] = '' # not available from TMDb
		except:
			from resources.lib.modules import log_utils
			log_utils.error()
		return meta
Ejemplo n.º 26
0
def scrobbleEpisode(tvdb, season, episode, watched_percent):
	try:
		season, episode = int('%01d' % int(season)), int('%01d' % int(episode))
		return getTrakt('/scrobble/pause', {"show": {"ids": {"tvdb": tvdb}}, "episode": {"season": season, "number": episode}, "progress": watched_percent})
	except:
		log_utils.error()
Ejemplo n.º 27
0
def syncMyAccounts(silent=False):
    try:
        all_acct = myaccounts.getAll()
        trakt_acct = all_acct.get('trakt')
        if getSetting('trakt.token') != trakt_acct.get('token'):
            trakt_username = trakt_acct.get('username')
            setSetting('trakt.username', trakt_username)
            if trakt_username != '': setSetting('trakt.isauthed', 'true')
            else: setSetting('trakt.isauthed', '')
            setSetting('trakt.expires', trakt_acct.get('expires'))
            setSetting('trakt.token', trakt_acct.get('token'))
            setSetting('trakt.refresh', trakt_acct.get('refresh'))

        ad_acct = all_acct.get('alldebrid')
        if getSetting('alldebrid.username') != ad_acct.get('username'):
            setSetting('alldebrid.token', ad_acct.get('token'))
            # if getSetting('alldebrid.token') == '': setSetting('alldebrid.enable', 'false')
            setSetting('alldebrid.username', ad_acct.get('username'))

        pm_acct = all_acct.get('premiumize')
        if getSetting('premiumize.username') != pm_acct.get('username'):
            setSetting('premiumize.token', pm_acct.get('token'))
            # if getSetting('premiumize.token') == '': setSetting('premiumize.enable', 'false')
            setSetting('premiumize.username', pm_acct.get('username'))

        rd_acct = all_acct.get(
            'realdebrid'
        )  # token refresh 1hr expiry, Venom handles this internally
        if getSetting('realdebrid.username') != rd_acct.get('username'):
            setSetting('realdebrid.token', rd_acct.get('token'))
            # if getSetting('realdebrid.token') == '': setSetting('realdebrid.enable', 'false')
            setSetting('realdebrid.username', rd_acct.get('username'))
            setSetting('realdebrid.client_id', rd_acct.get('client_id'))
            setSetting('realdebrid.refresh', rd_acct.get('refresh'))
            setSetting('realdebrid.secret', rd_acct.get('secret'))

        fp_acct = all_acct.get('filepursuit')
        if getSetting('filepursuit.api') != fp_acct.get('api_key'):
            setSetting('filepursuit.api', fp_acct.get('api_key'))

        fu_acct = all_acct.get('furk')
        if getSetting('furk.username') != fu_acct.get('username'):
            setSetting('furk.username', fu_acct.get('username'))
            setSetting('furk.password', fu_acct.get('password'))
        if getSetting('furk.api') != fu_acct.get('api_key'):
            setSetting('furk.api', fu_acct.get('api_key'))

        en_acct = all_acct.get('easyNews')
        if getSetting('easynews.username') != en_acct.get('username'):
            setSetting('easynews.username', en_acct.get('username'))
            setSetting('easynews.password', en_acct.get('password'))

        gdrive_acct = all_acct.get('gdrive')
        if getSetting('gdrive.url') != gdrive_acct.get('url'):
            setSetting('gdrive.url', gdrive_acct.get('url'))

        or_acct = all_acct.get('ororo')
        if getSetting('ororo.username') != or_acct.get('email'):
            setSetting('ororo.username', or_acct.get('email'))
            setSetting('ororo.password', or_acct.get('password'))

        fanart_acct = all_acct.get('fanart_tv')
        if getSetting('fanart_tv.api_key') != fanart_acct.get('api_key'):
            setSetting('fanart_tv.api_key', fanart_acct.get('api_key'))

        tmdb_acct = all_acct.get('tmdb')
        if getSetting('tmdb.api.key') != tmdb_acct.get('api_key'):
            setSetting('tmdb.api.key', tmdb_acct.get('api_key'))
        if getSetting('tmdb.username') != tmdb_acct.get('username'):
            setSetting('tmdb.username', tmdb_acct.get('username'))
        if getSetting('tmdb.password') != tmdb_acct.get('password'):
            setSetting('tmdb.password', tmdb_acct.get('password'))
        if getSetting('tmdb.session_id') != tmdb_acct.get('session_id'):
            setSetting('tmdb.session_id', tmdb_acct.get('session_id'))

        # tvdb_acct = all_acct.get('tvdb') # no longer used in Venom
        # if getSetting('tvdb.api.key') != tvdb_acct.get('api_key'):
        # setSetting('tvdb.api.key', tvdb_acct.get('api_key'))

        imdb_acct = all_acct.get('imdb')
        if getSetting('imdb.user') != imdb_acct.get('user'):
            setSetting('imdb.user', imdb_acct.get('user'))

        if not silent: notification(message=32114)
    except:
        from resources.lib.modules import log_utils
        log_utils.error()
Ejemplo n.º 28
0
def getTrakt(url, post=None, cache=True, check=False, timestamp=None, extended=False, direct=False, authentication=None):
# def getTrakt(url, post = None, cache = True, check = True, timestamp = None, extended = False, direct = False, authentication = None):
	try:
		if not url.startswith(BASE_URL):
			url = urljoin(BASE_URL, url)

		if authentication:
			valid = True
			token = authentication['token']
			refresh = authentication['refresh']
		else:
			valid = getTraktCredentialsInfo() is True
			token = control.setting('trakt.token')
			refresh = control.setting('trakt.refresh')

		headers = {'Content-Type': 'application/json', 'trakt-api-key': V2_API_KEY, 'trakt-api-version': '2'}

		if post is not None:
			post = json.dumps(post)

		if direct or not valid:
			result = client.request(url, post = post, headers = headers)
			return result

		headers['Authorization'] = 'Bearer %s' % token

		result = client.request(url, post = post, headers = headers, output = 'extended', error = True)
		if result and not (result[1] == '401' or result[1] == '405'):
			if check:
				_cacheCheck()
			if extended:
				return result[0], result[2]
			else:
				return result[0]

		try:
			code = str(result[1])
		except:
			code = ''

		if code.startswith('5') or (result and isinstance(result, basestring) and '<html' in result) or not result:
			return _error(url = url, post = post, timestamp = timestamp, message = 33676)

		oauth = urljoin(BASE_URL, '/oauth/token')
		opost = {'client_id': V2_API_KEY, 'client_secret': CLIENT_SECRET, 'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob', 'grant_type': 'refresh_token', 'refresh_token': refresh}

		result = client.request(oauth, post = json.dumps(opost), headers = headers, error = True)
		# log_utils.log('result = %s' % result, __name__, log_utils.LOGDEBUG)
		try:
			code = str(result[1])
		except:
			code = ''

		if code.startswith('5') or not result or (result and isinstance(result, basestring) and '<html' in result):
			return _error(url = url, post = post, timestamp = timestamp, message = 33676)
		elif result and code in ['404']:
			return _error(url = url, post = post, timestamp = timestamp, message = 33786)
		elif result and code in ['401', '405']:
			return _error(url = url, post = post, timestamp = timestamp, message = 33677)

		result = json.loads(result)

		token, refresh = result['access_token'], result['refresh_token']
		control.setSetting('trakt.token', token)
		control.setSetting('trakt.refresh', refresh)

		headers['Authorization'] = 'Bearer %s' % token

		result = client.request(url, post = post, headers = headers, output = 'extended')
		if check:
			_cacheCheck()

		if extended:
			return result[0], result[2]
		else: return result[0]
	except:
		log_utils.error()
	return None
Ejemplo n.º 29
0
	def movieDirectory(self, items, unfinished=False, next=True):
		if not items: # with reuselanguageinvoker on an empty directory must be loaded, do not use sys.exit()
			control.hide() ; control.notification(title=32001, message=33049)
		from resources.lib.modules.player import Bookmarks
		sysaddon, syshandle = argv[0], int(argv[1])
		disable_player_art = control.setting('disable.player.art') == 'true'
		hosts_mode = control.setting('hosts.mode') 
		is_widget = 'plugin' not in control.infoLabel('Container.PluginName')
		settingFanart = control.setting('fanart') == 'true'
		addonPoster, addonFanart, addonBanner = control.addonPoster(), control.addonFanart(), control.addonBanner()
		indicators = playcount.getMovieIndicators(refresh=True)
		isPlayable = 'false'
		if 'plugin' not in control.infoLabel('Container.PluginName'): isPlayable = 'true'
		elif hosts_mode != '1': isPlayable = 'true'
		if hosts_mode == '2': playbackMenu = control.lang(32063)
		else: playbackMenu = control.lang(32064)
		if trakt.getTraktIndicatorsInfo():
			watchedMenu, unwatchedMenu = control.lang(32068), control.lang(32069)
		else:
			watchedMenu, unwatchedMenu = control.lang(32066), control.lang(32067)
		playlistManagerMenu, queueMenu = control.lang(35522), control.lang(32065)
		traktManagerMenu, addToLibrary = control.lang(32070), control.lang(32551)
		nextMenu, clearSourcesMenu = control.lang(32053), control.lang(32611)
		for i in items:
			try:
				imdb, tmdb, title, year = i.get('imdb', ''), i.get('tmdb', ''), i['title'], i.get('year', '')
				trailer, runtime = i.get('trailer'), i.get('duration')
				label = '%s (%s)' % (title, year)
				try: labelProgress = label + '[COLOR %s]  [%s][/COLOR]' % (self.highlight_color, str(round(float(i['progress'] * 100), 1)) + '%')
				except: labelProgress = label
				try:
					if int(re.sub(r'[^0-9]', '', str(i['premiered']))) > int(re.sub(r'[^0-9]', '', str(self.today_date))):
						labelProgress = '[COLOR %s][I]%s[/I][/COLOR]' % (self.unairedcolor, labelProgress)
				except: pass
				if i.get('traktHistory') is True:
					try:
						air_time = tools.Time.convert(stringTime=i.get('lastplayed', ''), zoneFrom='utc', zoneTo='local', formatInput='%Y-%m-%dT%H:%M:%S.000Z', formatOutput='%b %d %Y %I:%M %p')
						if air_time[12] == '0': air_time = air_time[:12] + '' + air_time[13:]
						labelProgress = labelProgress + '[COLOR %s]  [%s][/COLOR]' % (self.highlight_color, air_time)
					except: pass
				sysname, systitle = quote_plus(label), quote_plus(title)
				meta = dict((k, v) for k, v in control.iteritems(i) if v is not None and v != '')
				meta.update({'code': imdb, 'imdbnumber': imdb, 'mediatype': 'movie', 'tag': [imdb, tmdb]})
				try: meta.update({'genre': cleangenre.lang(meta['genre'], self.lang)})
				except: pass
				poster = meta.get('poster3') or meta.get('poster2') or meta.get('poster') or addonPoster
				fanart = ''
				if settingFanart: fanart = meta.get('fanart3') or meta.get('fanart2') or meta.get('fanart') or addonFanart
				landscape = meta.get('landscape') or fanart
				thumb = meta.get('thumb') or poster or landscape
				icon = meta.get('icon') or poster
				banner = meta.get('banner3') or meta.get('banner2') or meta.get('banner') or addonBanner
				art = {}
				if disable_player_art and hosts_mode == '2': # setResolvedUrl uses the selected ListItem so pop keys out here if user wants no player art
					for k in ('clearart', 'clearlogo', 'discart'): meta.pop(k, None)
				art.update({'icon': icon, 'thumb': thumb, 'banner': banner, 'poster': poster, 'fanart': fanart, 'landscape': landscape, 'clearlogo': meta.get('clearlogo', ''),
								'clearart': meta.get('clearart', ''), 'discart': meta.get('discart', ''), 'keyart': meta.get('keyart', '')})
				for k in ('poster2', 'poster3', 'fanart2', 'fanart3', 'banner2', 'banner3', 'trailer'): meta.pop(k, None)
				meta.update({'poster': poster, 'fanart': fanart, 'banner': banner})
####-Context Menu and Overlays-####
				cm = []
				if self.traktCredentials:
					cm.append((traktManagerMenu, 'RunPlugin(%s?action=tools_traktManager&name=%s&imdb=%s)' % (sysaddon, sysname, imdb)))
				try:
					overlay = int(playcount.getMovieOverlay(indicators, imdb))
					watched = (overlay == 5)
					if watched:
						cm.append((unwatchedMenu, 'RunPlugin(%s?action=playcount_Movie&name=%s&imdb=%s&query=4)' % (sysaddon, sysname, imdb)))
						meta.update({'playcount': 1, 'overlay': 5})
						# lastplayed = trakt.watchedMoviesTime(imdb)
						# meta.update({'lastplayed': lastplayed})
					else:
						cm.append((watchedMenu, 'RunPlugin(%s?action=playcount_Movie&name=%s&imdb=%s&query=5)' % (sysaddon, sysname, imdb)))
						meta.update({'playcount': 0, 'overlay': 4})
				except: pass
				sysmeta, sysart = quote_plus(jsdumps(meta)), quote_plus(jsdumps(art))
				url = '%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s' % (sysaddon, systitle, year, imdb, tmdb, sysmeta)
				sysurl = quote_plus(url)
				cm.append((playlistManagerMenu, 'RunPlugin(%s?action=playlist_Manager&name=%s&url=%s&meta=%s&art=%s)' % (sysaddon, sysname, sysurl, sysmeta, sysart)))
				cm.append((queueMenu, 'RunPlugin(%s?action=playlist_QueueItem&name=%s)' % (sysaddon, sysname)))
				cm.append((playbackMenu, 'RunPlugin(%s?action=alterSources&url=%s&meta=%s)' % (sysaddon, sysurl, sysmeta)))
				if hosts_mode == '1':
					cm.append(('Rescrape Item', 'RunPlugin(%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s&rescrape=true)' % (sysaddon, systitle, year, imdb, tmdb, sysmeta)))
				elif hosts_mode != '1':
					cm.append(('Rescrape Item', 'PlayMedia(%s?action=play&title=%s&year=%s&imdb=%s&tmdb=%s&meta=%s&rescrape=true)' % (sysaddon, systitle, year, imdb, tmdb, sysmeta)))
				cm.append((addToLibrary, 'RunPlugin(%s?action=library_movieToLibrary&name=%s&title=%s&year=%s&imdb=%s&tmdb=%s)' % (sysaddon, sysname, systitle, year, imdb, tmdb)))
				cm.append(('Find similar', 'ActivateWindow(10025,%s?action=movies&url=https://api.trakt.tv/movies/%s/related,return)' % (sysaddon, imdb)))
				cm.append((clearSourcesMenu, 'RunPlugin(%s?action=cache_clearSources)' % sysaddon))
				cm.append(('[COLOR red]Venom Settings[/COLOR]', 'RunPlugin(%s?action=tools_openSettings)' % sysaddon))
####################################
				if trailer: meta.update({'trailer': trailer})
				else: meta.update({'trailer': '%s?action=trailer&type=%s&name=%s&year=%s&imdb=%s' % (sysaddon, 'movie', sysname, year, imdb)})
				item = control.item(label=labelProgress, offscreen=True)
				if 'castandart' in i: item.setCast(i['castandart'])
				item.setArt(art)
				item.setUniqueIDs({'imdb': imdb, 'tmdb': tmdb})
				item.setProperty('IsPlayable', isPlayable)
				if is_widget: item.setProperty('isVenom_widget', 'true')
				resumetime = Bookmarks().get(name=label, imdb=imdb, tmdb=tmdb, year=str(year), runtime=runtime, ck=True)
				# item.setProperty('TotalTime', str(meta['duration'])) # Adding this property causes the Kodi bookmark CM items to be added
				item.setProperty('ResumeTime', str(resumetime))
				try:
					watched_percent = round(float(resumetime) / float(runtime) * 100, 1) # resumetime and runtime are both in seconds
					item.setProperty('PercentPlayed', str(watched_percent))
				except: pass
				item.setInfo(type='video', infoLabels=control.metadataClean(meta))
				item.addContextMenuItems(cm)
				control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False)
			except:
				log_utils.error()
		if next:
			try:
				if not items: raise Exception()
				url = items[0]['next']
				if not url: raise Exception()
				url_params = dict(parse_qsl(urlsplit(url).query))
				if 'imdb.com' in url and 'start' in url_params:
					page = '  [I](%s)[/I]' % str(int(((int(url_params.get('start')) - 1) / int(self.count)) + 1))
				else:
					page = '  [I](%s)[/I]' % url_params.get('page')
				nextMenu = '[COLOR skyblue]' + nextMenu + page + '[/COLOR]'
				u = urlparse(url).netloc.lower()
				if u not in self.tmdb_link:
					url = '%s?action=moviePage&url=%s' % (sysaddon, quote_plus(url))
				elif u in self.tmdb_link:
					url = '%s?action=tmdbmoviePage&url=%s' % (sysaddon, quote_plus(url))
				item = control.item(label=nextMenu, offscreen=True)
				icon = control.addonNext()
				item.setProperty('IsPlayable', 'false')
				item.setArt({'icon': icon, 'thumb': icon, 'poster': icon, 'banner': icon})
				item.setProperty ('SpecialSort', 'bottom')
				control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True)
			except:
				log_utils.error()
		control.content(syshandle, 'movies')
		control.directory(syshandle, cacheToDisc=True)
		control.sleep(500)
		views.setView('movies', {'skin.estuary': 55, 'skin.confluence': 500})
Ejemplo n.º 30
0
    def play_source(self,
                    title,
                    year,
                    season,
                    episode,
                    imdb,
                    tvdb,
                    url,
                    meta,
                    select=None):
        try:
            if url is None:
                control.cancelPlayback()
                raise Exception

            self.media_type = 'movie' if season is None or episode is None else 'episode'
            self.title = title
            self.year = str(year)

            if self.media_type == 'movie':
                self.name = quote_plus(title) + quote_plus(' (%s)' % self.year)
                self.season = None
                self.episode = None

            elif self.media_type == 'episode':
                self.name = quote_plus(title) + quote_plus(
                    ' S%02dE%02d' % (int(season), int(episode)))
                self.season = '%01d' % int(season)
                self.episode = '%01d' % int(episode)

            self.name = unquote_plus(
                self.name)  # this looks dumb, quote to only unquote?

            self.DBID = None

            self.imdb = imdb if imdb is not None else '0'
            self.tvdb = tvdb if tvdb is not None else '0'
            self.ids = {'imdb': self.imdb, 'tvdb': self.tvdb}
            self.ids = dict(
                (k, v) for k, v in self.ids.iteritems() if v != '0')
            self.meta = meta
            self.offset = Bookmarks().get(self.name, self.year)

            item = control.item(path=url)

            ## - compare meta received to database and use largest(eventually switch to a request to fetch missing db meta for item)
            self.imdb_user = control.setting('imdb.user').replace('ur', '')
            self.tmdb_key = control.setting('tm.user')
            if self.tmdb_key == '' or self.tmdb_key is None:
                self.tmdb_key = '3320855e65a9758297fec4f7c9717698'
            tvdb_key_list = [
                'MDZjZmYzMDY5MGY5Yjk2MjI5NTcwNDRmMjE1OWZmYWU=',
                'MUQ2MkYyRjkwMDMwQzQ0NA==', 'N1I4U1paWDkwVUE5WU1CVQ=='
            ]
            self.tvdb_key = tvdb_key_list[int(control.setting('tvdb.api.key'))]

            if self.media_type == 'episode':
                self.user = str(self.imdb_user) + str(self.tvdb_key)
            else:
                self.user = str(self.tmdb_key)
            self.lang = control.apiLanguage()['tvdb']
            items = [{
                'imdb': imdb,
                'tvdb': tvdb
            }]  # need to add tmdb but it's not passed as of now
            items_ck = copy.deepcopy(items)

            meta1 = meta
            meta2 = metacache.fetch(items, self.lang, self.user)[0]
            if meta1 is not None:
                if len(meta2) > len(meta1):
                    meta = meta2
                else:
                    meta = meta1
            else:
                meta = meta2 if meta2 != items_ck[0] else meta1


##################

            poster, thumb, season_poster, fanart, banner, clearart, clearlogo, discart, meta = self.getMeta(
                meta)
            if self.media_type == 'episode':
                self.episodeIDS = meta.get('episodeIDS', '0')
                item.setUniqueIDs(self.episodeIDS)
                if control.setting('disable.player.art') == 'true':
                    item.setArt({
                        'thumb': thumb,
                        'tvshow.poster': season_poster,
                        'season.poster': season_poster,
                        'tvshow.fanart': fanart
                    })
                else:
                    item.setArt({
                        'tvshow.clearart': clearart,
                        'tvshow.clearlogo': clearlogo,
                        'tvshow.discart': discart,
                        'thumb': thumb,
                        'tvshow.poster': season_poster,
                        'season.poster': season_poster,
                        'tvshow.fanart': fanart
                    })
            else:
                item.setUniqueIDs(self.ids)
                if control.setting('disable.player.art') == 'true':
                    item.setArt({
                        'thumb': thumb,
                        'poster': poster,
                        'fanart': fanart
                    })
                else:
                    item.setArt({
                        'clearart': clearart,
                        'clearlogo': clearlogo,
                        'discart': discart,
                        'thumb': thumb,
                        'poster': poster,
                        'fanart': fanart
                    })

            if 'castandart' in meta:
                item.setCast(meta.get('castandart', ''))

            item.setInfo(type='video', infoLabels=control.metadataClean(meta))

            if 'plugin' not in control.infoLabel(
                    'Container.PluginName') or select != '1':
                if control.window.getProperty('infodialogs.active') or \
                control.window.getProperty('extendedinfo_running'):
                    control.closeAll()
                control.resolve(int(sys.argv[1]), True, item)

            elif select == '1':
                control.closeAll()
                control.player.play(url, item)

            self.keepAlive()
            control.window.setProperty('script.trakt.ids',
                                       json.dumps(self.ids))
            control.window.clearProperty('script.trakt.ids')
        except:
            log_utils.error()
            return control.cancelPlayback()