def movies_add_all_to_library(items, noscan=False): library_folder = lib_movies.setup_library( plugin.get_setting('movies_library_folder', unicode)) if 'results' in items: ids = '\n'.join([str(r['id']) for r in items['results']]) else: ids = '\n'.join([ i['movie']['ids']['imdb'] if i['movie']['ids']['imdb'] != None and i['movie']['ids']['imdb'] != '' else str( i['movie']['ids']['tmdb']) for i in items ]) movies_batch_add_file = plugin.get_setting('movies_batch_add_file_path', unicode) if xbmcvfs.exists(movies_batch_add_file): batch_add_file = xbmcvfs.File(movies_batch_add_file) pre_ids = batch_add_file.read() xids = pre_ids.split('\n') for id in xids: if id != '' and id != None and id not in ids: ids = ids + str(id) + '\n' batch_add_file.close() xbmcvfs.delete(movies_batch_add_file) batch_add_file = xbmcvfs.File(movies_batch_add_file, 'w') batch_add_file.write(str(ids)) batch_add_file.close() xbmc.executebuiltin( 'RunPlugin(plugin://plugin.video.openmeta/movies/batch_add_to_library)' )
def movies_add_to_library(src, id): from resources.lib.TheMovieDB import Movies library_folder = lib_movies.setup_library(plugin.get_setting('movies_library_folder', unicode)) if library_folder == False: return date = None if src == 'tmdb': movie = Movies(id).info() date = text.date_to_timestamp(movie.get('release_date')) imdb_id = movie.get('imdb_id') if imdb_id: src = 'imdb' id = imdb_id ids = [str(movie.get('id')), str(movie.get('imdb_id', None))] try: libmovies = RPC.VideoLibrary.GetMovies(properties=['imdbnumber', 'title', 'year'])['movies'] libmovies = [i for i in libmovies if str(i['imdbnumber']) in ids or (str(i['year']) == str(movie.get('year', 0)) and equals(movie.get['title'], i['title']))] libmovie = libmovies[0] except: libmovie = [] else: ids = [str(id), 'None'] try: libmovies = RPC.VideoLibrary.GetMovies(properties=['imdbnumber', 'title', 'year'])['movies'] libmovies = [i for i in libmovies if str(i['imdbnumber']) in ids] libmovie = libmovies[0] except: libmovie = [] if libmovie != []: return lib_movies.add_movie_to_library(library_folder, src, id) tools.scan_library(path=plugin.get_setting('movies_library_folder', unicode))
def update_library(): now = time.time() is_syncing = plugin.getProperty('openmeta_syncing_library') is_updating = plugin.getProperty('openmeta_updating_library') if is_syncing and now - int(is_syncing) < 120: plugin.log.debug('Skipping library sync') else: if plugin.get_setting('library_sync_collection', bool) == True: try: plugin.setProperty('openmeta_syncing_library', int(now)) plugin.notify('OpenMeta', 'Syncing library', plugin.get_addon_icon(), 1000) lib_tvshows.sync_trakt_collection() lib_movies.sync_trakt_collection() finally: plugin.clearProperty('openmeta_syncing_library') if is_updating and now - int(is_updating) < 120: plugin.log.debug('Skipping library update') return else: if plugin.get_setting('library_updates', bool) == True: try: plugin.setProperty('openmeta_updating_library', int(now)) plugin.notify('OpenMeta', 'Updating library', plugin.get_addon_icon(), 1000) lib_tvshows.update_library() finally: plugin.clearProperty('openmeta_updating_library')
def update_library(): folder_path = plugin.get_setting('tv_library_folder', unicode) if not xbmcvfs.exists(folder_path): return library_folder = setup_library(folder_path) try: shows = xbmcvfs.listdir(library_folder)[0] except: shows = [] clean_needed = False updated = 0 for id in shows: try: id = int(id) with TVDB.session.cache_disabled(): if add_tvshow_to_library(library_folder, TVDB[id]): clean_needed = True except: continue updated += 1 if clean_needed: plugin.setProperty('plugin.video.openmeta.clean_library', 'true') if updated > 0: tools.scan_library( path=plugin.get_setting('tv_library_folder', unicode))
def movies_batch_add_to_library(): from resources.lib.TheMovieDB import Movies movie_batch_file = plugin.get_setting('movies_batch_add_file_path', unicode) if xbmcvfs.exists(movie_batch_file): try: f = open(xbmc.translatePath(movie_batch_file), 'r') r = f.read() f.close() ids = r.split('\n') except: plugin.notify('Movies', 'not found', plugin.get_addon_icon(), 3000) library_folder = lib_movies.setup_library(plugin.get_setting('movies_library_folder', unicode)) for id in ids: if ',' in id: csvs = id.split(',') for csv in csvs: if not str(csv).startswith('tt') and csv != '': movie = Movies(csv).info() csv = movie.get('imdb_id') lib_movies.batch_add_movies_to_library(library_folder, csv) else: if not str(id).startswith('tt') and id != '': movie = Movies(id).info() id = movie.get('imdb_id') lib_movies.batch_add_movies_to_library(library_folder, id) os.remove(xbmc.translatePath(movie_batch_file)) lib_movies.update_library() return True
def tv_add_all_to_library(items, noscan=False): library_folder = lib_tvshows.setup_library( plugin.get_setting('tv_library_folder', unicode)) ids = '' if 'results' in items: preids = [] for tvdb_show, tmdb_show in executor.execute(tmdb_to_tvdb, items['results'], workers=10): if tvdb_show is not None: preids.append(tvdb_show['id']) ids = '\n'.join(preids) else: ids = '\n'.join([ str(i['show']['ids']['tvdb']) if i['show']['ids']['tvdb'] != None and i['show']['ids']['tvdb'] != '' else i['show']['ids']['imdb'] for i in items ]) shows_batch_add_file = plugin.get_setting('tv_batch_add_file_path', unicode) if xbmcvfs.exists(shows_batch_add_file): batch_add_file = xbmcvfs.File(shows_batch_add_file) pre_ids = batch_add_file.read() xids = pre_ids.split('\n') for id in xids: if id != '' and id != None and id not in ids: ids = ids + str(id) + '\n' batch_add_file.close() xbmcvfs.delete(shows_batch_add_file) batch_add_file = xbmcvfs.File(shows_batch_add_file, 'w') batch_add_file.write(str(ids)) batch_add_file.close() xbmc.executebuiltin( 'RunPlugin(plugin://plugin.video.openmeta/tv/batch_add_to_library)')
def tv_add_to_library(id): library_folder = lib_tvshows.setup_library(plugin.get_setting('tv_library_folder', unicode)) show = TVDB[int(id)] imdb = show['imdb_id'] library_folder = lib_tvshows.setup_library(plugin.get_setting('tv_library_folder', unicode)) if lib_tvshows.add_tvshow_to_library(library_folder, show): plugin.setProperty('plugin.video.openmeta.clean_library', 'true') tools.scan_library(path=plugin.get_setting('tv_library_folder', unicode))
def sources_setup(): movielibraryfolder = plugin.get_setting('movies_library_folder', unicode) tvlibraryfolder = plugin.get_setting('tv_library_folder', unicode) try: lib_movies.auto_movie_setup(movielibraryfolder) lib_tvshows.auto_tvshows_setup(tvlibraryfolder) plugin.notify('OpenMeta sources setup', 'Done', plugin.get_addon_icon(), 3000) except: plugin.notify('OpenMeta sources setup', 'Failed', plugin.get_addon_icon(), 3000) return True
def silent_setup(): plugin.setProperty('totalopenmeta', 'true') movielibraryfolder = plugin.get_setting('movies_library_folder', unicode) tvlibraryfolder = plugin.get_setting('tv_library_folder', unicode) try: lib_movies.auto_movie_setup(movielibraryfolder) lib_tvshows.auto_tvshows_setup(tvlibraryfolder) except: pass plugin.clearProperty('totalopenmeta')
def tv_add_to_library_parsed(id, player): if id.startswith('tt'): try: id = TVDB.search_by_imdb(id) except: plugin.ok('TV show not found', 'no show information found for %s in TheTVDB' % id) library_folder = lib_tvshows.setup_library(plugin.get_setting('tv_library_folder', unicode)) show = TVDB[int(id)] imdb = show['imdb_id'] library_folder = lib_tvshows.setup_library(plugin.get_setting('tv_library_folder', unicode)) if lib_tvshows.add_tvshow_to_library(library_folder, show, player): plugin.setProperty('plugin.video.openmeta.clean_library', 'true') tools.scan_library(path=plugin.get_setting('tv_library_folder', unicode))
def movies_add_to_library_parsed(src, id, player): from resources.lib.TheMovieDB import Movies library_folder = lib_movies.setup_library(plugin.get_setting('movies_library_folder', unicode)) date = None if src == 'tmdb': movie = Movies(id).info() date = text.date_to_timestamp(movie.get('release_date')) imdb_id = movie.get('imdb_id') if imdb_id: if imdb_id != None and imdb_id != '': src = 'imdb' id = imdb_id lib_movies.add_movie_to_library(library_folder, src, id, player) tools.scan_library(path=plugin.get_setting('movies_library_folder', unicode))
def tv_batch_add_to_library(): tv_batch_file = plugin.get_setting('tv_batch_add_file_path', unicode) if xbmcvfs.exists(tv_batch_file): try: f = open(xbmc.translatePath(tv_batch_file), 'r') r = f.read() f.close() ids = r.split('\n') except: plugin.notify('TV shows', 'not found', plugin.get_addon_icon(), 3000) library_folder = lib_tvshows.setup_library( plugin.get_setting('tv_library_folder', unicode)) ids_index = 0 for id in ids: if id == None or id == 'None': pass elif ',' in id: csvs = id.split(',') for csv in csvs: if csv == None or csv == 'None': pass elif str(csv).startswith('tt') and csv != '': tvdb_id = get_tvdb_id_from_imdb_id(csv) else: tvdb_id = csv show = TVDB[int(tvdb_id)] lib_tvshows.batch_add_tvshows_to_library( library_folder, show) else: if id == None or id == 'None' or id == '': pass elif str(id).startswith('tt'): tvdb_id = get_tvdb_id_from_imdb_id(id) else: tvdb_id = id try: show = TVDB[int(tvdb_id)] lib_tvshows.batch_add_tvshows_to_library( library_folder, show) except: # plugin.notify('Failed to add', '%s' % id, plugin.get_addon_icon(), 3000) xbmc.log('Failed to add' + '%s' % id, xbmc.LOGERROR) ids_index += 1 os.remove(xbmc.translatePath(tv_batch_file)) lib_tvshows.update_library() return True
def search(self, series, year=None, language=plugin.get_setting('LangID', str)): series = urllib.quote(to_bytes(series)) result = self._loadUrl(self.config['url_search'] % (series, language)) seriesEt = self._parseXML(result) allSeries = [] for series in seriesEt: result = dict( (k.tag.lower(), k.text) for k in series.getchildren()) result['id'] = int(result['id']) if 'aliasnames' in result: if result['aliasnames'] is not None: result['aliasnames'] = result['aliasnames'].split('|') if year: try: year = int(year) aired_year = int( result['firstaired'].split('-')[0].strip()) if aired_year != year: continue except: continue allSeries.append(result) return allSeries
def __init__(self, language=plugin.get_setting('LangID', str)): languages = [ 'da', 'fi', 'nl', 'de', 'it', 'es', 'fr', 'pl', 'hu', 'el', 'tr', 'ru', 'he', 'ja', 'pt', 'zh', 'cs', 'sl', 'hr', 'ko', 'sv', 'no' ] config = {} config['apikey'] = API_key if language in languages: config['language'] = language else: config['language'] = 'en' config[ 'url_search'] = u'https://thetvdb.com/api/GetSeries.php?seriesname=%%s&language=%%s' % config config[ 'url_search_by_imdb'] = u'https://thetvdb.com/api/GetSeriesByRemoteID.php?imdbid=%%s&language=%%s' % config config[ 'url_sid_full'] = u'https://thetvdb.com/api/%(apikey)s/series/%%s/all/%%s.zip' % config config[ 'url_sid_base'] = u'https://thetvdb.com/api/%(apikey)s/series/%%s/%%s.xml' % config config[ 'url_artwork_prefix'] = u'https://thetvdb.com/banners/%%s' % config self.config = config self.session = requests_cache.CachedSession(expire_after=21600, backend='sqlite', cache_name=os.path.join( plugin.storage_path, 'TheTVDB')) self.shows = {}
def update_players(url=None): url = plugin.get_setting('players_update_url', unicode) if updater.update_players(url): plugin.notify('OpenMeta players update', 'Done', plugin.get_addon_icon(), 3000) else: plugin.notify('OpenMeta players update', 'Failed', plugin.get_addon_icon(), 3000)
def update_players(url=None): url = plugin.get_setting('players_update_url', unicode) if updater.update_players(url): plugin.notify('KodiTVR_VIDEO_PLAYER players update', 'Done', plugin.get_addon_icon(), 3000) else: plugin.notify('KodiTVR_VIDEO_PLAYER players update', 'Failed', plugin.get_addon_icon(), 3000)
def send_query(): if with_auth: try: expires_at = plugin.get_setting('trakt_expires_at', int) if time.time() > expires_at: trakt_refresh_token() except: pass token = plugin.get_setting('trakt_access_token', unicode) if token: headers['Authorization'] = 'Bearer ' + token if data is not None: assert not params return requests.post('https://api.trakt.tv/' + path, json=data, headers=headers) elif is_delete: return requests.delete('https://api.trakt.tv/' + path, headers=headers) else: return requests.get('https://api.trakt.tv/' + path, params, headers=headers)
def search_by_imdb(self, imdb_id, year=None): language = plugin.get_setting('LangID', str) result = self._loadUrl(self.config['url_search_by_imdb'] % (imdb_id, language)) pre_tvdb = str(result).split('<seriesid>') if len(pre_tvdb) > 1: tvdb = str(pre_tvdb[1]).split('</seriesid>') return tvdb[0] else: return None
def movies_play(src, id, usedefault='True'): playaction = plugin.get_setting('movies_default_action', int) if playaction == 1 and xbmc.getCondVisibility( 'system.hasaddon(script.KodiTVRinfo)' ) and not plugin.getProperty('infodialogs.active'): from resources.lib.play_base import action_cancel action_cancel() src = 'id' if src == 'tmdb' else 'imdb_id' xbmc.executebuiltin( 'RunScript(script.KodiTVRinfo,info=KodiTVRinfo,%s=%s)' % (src, id)) else: movies_play_choose_player(src, id, usedefault)
def trakt_refresh_token(): data = { 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob', 'grant_type': 'refresh_token', 'refresh_token': plugin.get_setting('trakt_refresh_token', unicode) } response = call_trakt('oauth/token', data=data, with_auth=False) if response: plugin.set_setting('trakt_access_token', response['access_token']) plugin.set_setting('trakt_refresh_token', response['refresh_token'])
def play_movie(tmdb_id, usedefault): from resources.lib.TheMovieDB import Movies play_plugin = meta_players.ADDON_SELECTOR.id players = meta_players.get_players('movies') players = [p for p in players if p.id == play_plugin] or players if not players or len(players) == 0: xbmc.executebuiltin('Action(Info)') play_base.action_cancel() return if usedefault == 'True': default = plugin.get_setting('moviesdefault', unicode) for player in players: if player.title == default: players = [player] movie = Movies(tmdb_id).info( language='en', append_to_response= 'external_ids,alternative_titles,credits,images,keywords,releases,translations,rating' ) movie_info = meta_info.get_movie_metadata(movie) imdb_id = movie['imdb_id'] if 'imdb_id' in movie else None id_type = 'imdb' if imdb_id and imdb_id.startswith('tt') else 'tmdb' id = imdb_id if imdb_id and imdb_id.startswith('tt') else tmdb_id trakt_ids = play_base.get_trakt_ids(id_type=id_type, id=id, type='movie') params = {} for lang in meta_players.get_needed_langs(players): if lang == 'en': tmdb_data = movie else: tmdb_data = Movies(tmdb_id).info( language=lang, append_to_response= 'external_ids,alternative_titles,credits,images,keywords,releases,translations,rating' ) params[lang] = get_movie_parameters(tmdb_data) if trakt_ids != None: params[lang].update(trakt_ids) params[lang]['info'] = movie_info params[lang] = text.to_unicode(params[lang]) link = play_base.on_play_video(players, params, trakt_ids) if link: movie = Movies(tmdb_id).info(language='en') play_base.action_play({ 'label': movie_info['title'], 'path': link, 'info': movie_info, 'is_playable': True, 'info_type': 'video', 'thumbnail': movie_info['poster'], 'poster': movie_info['poster'], 'fanart': movie_info['fanart'] })
def tv_play(id, season, episode, usedefault='True'): playaction = plugin.get_setting('tvshows_default_action', int) if playaction == 1 and xbmc.getCondVisibility('system.hasaddon(script.extendedinfo)') and not plugin.getProperty('infodialogs.active'): from resources.lib.play_base import action_cancel action_cancel() xbmc.executebuiltin('RunScript(script.extendedinfo,info=extendedtvinfo,tvdb_id=%s)' % (id)) elif playaction == 2 and xbmc.getCondVisibility('system.hasaddon(script.extendedinfo)') and not plugin.getProperty('infodialogs.active'): from resources.lib.play_base import action_cancel action_cancel() xbmc.executebuiltin('RunScript(script.extendedinfo,info=extendedepisodeinfo,tvdb_id=%s,season=%s,episode=%s)' % (id, season, episode)) else: play_tvshows.play_episode(id, season, episode, usedefault)
def players_setup(): plugin.setProperty('openmeta_players_setup', 'true') url = plugin.get_setting('players_update_url', unicode) if url == '': if plugin.yesno('OpenMeta players setup', 'Would you like to set a URL for players now?'): plugin.open_settings() else: plugin.notify('OpenMeta players setup', 'Failed', plugin.get_addon_icon(), 3000) elif updater.update_players(url): plugin.notify('OpenMeta players setup', 'Done', plugin.get_addon_icon(), 3000) else: plugin.notify('OpenMeta players setup', 'Failed', plugin.get_addon_icon(), 3000) plugin.clearProperty('openmeta_players_setup') return True
def tv_tvshow(id): flatten = plugin.get_setting('flatten.tvshows', int) if flatten == 2: plugin.set_content('episodes') action = 'all' elif flatten == 1: id = int(id) show = TVDB[id] if len(show.items()) == 1 or (len(show.items()) == 2 and show.items()[1][0] == 1): plugin.set_content('episodes') action = 'one' else: plugin.set_content('seasons') action = 'none' else: plugin.set_content('seasons') action = 'none' return plugin.finish(items=list_seasons_tvdb(id, action), sort_methods=SORT)
import datetime import xbmc from addon import update_library from resources.lib.xswift2 import plugin from resources.lib.video_player import PLAYER def go_idle(duration): while not xbmc.Monitor().abortRequested() and duration > 0: if PLAYER.isPlayingVideo(): PLAYER.currentTime = PLAYER.getTime() xbmc.sleep(1000) duration -= 1 def future(seconds): return datetime.datetime.now() + datetime.timedelta(seconds=seconds) if __name__ == '__main__': go_idle(5) if plugin.get_setting('total_setup_done', bool) == False: xbmc.executebuiltin( 'RunPlugin(plugin://plugin.video.openmeta/setup/total)') plugin.set_setting('total_setup_done', 'true') next_update = future(0) while not xbmc.Monitor().abortRequested(): if next_update <= future(0): next_update = future(8 * 60 * 60) update_library() go_idle(30 * 60)
import os, json, requests, requests_cache from resources.lib.xswift2 import plugin ext_key = plugin.get_setting('tmdb_api', str) if len(ext_key) == 32: API_key = ext_key else: API_key = '772defd0fb9daa76166a0163c458ad7e' requests_cache.install_cache(os.path.join(plugin.storage_path, 'TheMovieDB'), expire_after=21600) class TMDB(object): BASE_PATH = '' URLS = {} def _get_path(self, key): return self.BASE_PATH + self.URLS[key] def _get_id_path(self, key): return self._get_path(key).format(id=self.id) def _get_guest_session_id_path(self, key): return self._get_path(key).format(guest_session_id=self.guest_session_id) def _get_credit_id_path(self, key): return self._get_path(key).format(credit_id=self.credit_id) def _get_series_id_season_number_path(self, key): return self._get_path(key).format(series_id=self.series_id, season_number=self.season_number) def _get_series_id_season_number_episode_number_path(self, key):
import os, time, _strptime import xbmc, xbmcvfs, xbmcplugin from resources.lib import text from resources.lib import Trakt from resources.lib import tools from resources.lib import executor from resources.lib import nav_base from resources.lib import meta_info from resources.lib import lib_tvshows from resources.lib import play_tvshows from resources.lib.TheTVDB import TVDB from resources.lib import fanarttv from resources.lib.xswift2 import plugin enablefanart = plugin.get_setting('enablefanart', bool) specialsenabled = plugin.get_setting('include_specials', bool) countenabled = plugin.get_setting('countenabled', bool) traktenabled = True if plugin.get_setting('trakt_access_token', unicode) != '' else False SORT = [ xbmcplugin.SORT_METHOD_UNSORTED, xbmcplugin.SORT_METHOD_LABEL, xbmcplugin.SORT_METHOD_VIDEO_YEAR, xbmcplugin.SORT_METHOD_GENRE, xbmcplugin.SORT_METHOD_VIDEO_RATING, xbmcplugin.SORT_METHOD_PLAYCOUNT ] SORTRAKT = [ xbmcplugin.SORT_METHOD_UNSORTED, xbmcplugin.SORT_METHOD_LABEL, xbmcplugin.SORT_METHOD_VIDEO_YEAR, xbmcplugin.SORT_METHOD_GENRE, xbmcplugin.SORT_METHOD_VIDEO_RATING, xbmcplugin.SORT_METHOD_PLAYCOUNT, xbmcplugin.SORT_METHOD_DURATION, xbmcplugin.SORT_METHOD_MPAA_RATING ]
def play_episode(id, season, episode, usedefault): from resources.lib.TheTVDB import TVDB from resources.lib.TheTVDB import create_tvdb id = int(id) season = int(season) episode = int(episode) dbid = xbmc.getInfoLabel('ListItem.DBID') try: dbid = int(dbid) except: dbid = None show = TVDB[id] show_info = meta_info.get_tvshow_metadata_tvdb(show, banners=False) play_plugin = meta_players.ADDON_SELECTOR.id players = meta_players.get_players( 'tvshows', filters={'network': show.get('network')}) players = [p for p in players if p.id == play_plugin] or players if not players or len(players) == 0: xbmc.executebuiltin('Action(Info)') play_base.action_cancel() return if usedefault == 'True': default = plugin.get_setting('tvshowsdefault', unicode) for player in players: if player.title == default: players = [player] trakt_ids = play_base.get_trakt_ids(id_type='tvdb', id=id, type='show') params = {} for lang in meta_players.get_needed_langs(players): tvdb_data = create_tvdb(lang)[id] if tvdb_data['seriesname'] is None: continue episode_parameters = get_episode_parameters(tvdb_data, season, episode) if episode_parameters is not None: params[lang] = episode_parameters else: if trakt_ids['tmdb'] != None and trakt_ids['tmdb'] != '': return tmdb_play_episode(trakt_ids['tmdb'], season, episode) elif trakt_ids['tvdb'] == None or trakt_ids['tvdb'] == '': plugin.ok('Information not found for:', '%s - S%sE%s' % (show_info['name'], season, episode)) else: plugin.ok('Information not found for:', '%s - S%sE%s' % (show_info['name'], season, episode)) if trakt_ids != None: params[lang].update(trakt_ids) params[lang]['info'] = show_info params[lang] = text.to_unicode(params[lang]) link = play_base.on_play_video(players, params, trakt_ids) if link: plugin.setProperty( 'plugin.video.openmeta.data', json.dumps({ 'dbid': dbid, 'tvdb': id, 'season': season, 'episode': episode })) season_info = meta_info.get_season_metadata_tvdb(show_info, show[season], banners=False) episode_info = meta_info.get_episode_metadata_tvdb( season_info, show[season][episode]) play_base.action_play({ 'label': episode_info['name'], 'path': link, 'info': episode_info, 'is_playable': True, 'info_type': 'video', 'thumbnail': episode_info['poster'], 'poster': episode_info['poster'], 'fanart': episode_info['fanart'] })
def trakt_movies_play_random_trending(): result = [] pages = plugin.get_setting('random_pages', int) + 1 for i in range(1, pages): result.extend(trakt_movies_trending(i, raw=True)) trakt_movies_play_random(result)
def tmdb_movies_play_random_top_rated(): result = {} pages = plugin.get_setting('random_pages', int) + 1 for i in range(1, pages): result.update(tmdb_movies_top_rated(i, raw=True)) tmdb_movies_play_random(result)