def artist(artist_id): top_songs = xbmcgui.ListItem(utils.translate(30066)) top_songs.setArt({'thumb': thumbs.IMG_STAR, 'poster': thumbs.IMG_STAR}) related_artists = xbmcgui.ListItem(utils.translate(30067)) related_artists.setArt({ 'thumb': thumbs.IMG_ARTIST, 'poster': thumbs.IMG_ARTIST }) items = [ (utils.build_url(url=URL, paths=['browse', 'artist', artist_id, 'top-songs'], r_path=True), top_songs, True), (utils.build_url( url=URL, paths=['browse', 'artist', artist_id, 'related-artists'], r_path=True), related_artists, True) ] info = GMUSIC.get_artist_info(artist_id=artist_id, include_albums=True, max_top_tracks=0, max_rel_artist=0) if 'albums' in info: albums = info['albums'] albums.sort(key=itemgetter('name')) albums.sort(key=itemgetter('year'), reverse=True) items += listing.build_album_listitems(albums) listing.list_albums(items) else: listing.list_items([])
def my_library_playlists(): # Auto playlists - "Thumbs up" and "Last added" thumbs_up = xbmcgui.ListItem(utils.translate(30027)) thumbs_up.setArt({ 'thumb': thumbs.IMG_THUMB_UP, 'poster': thumbs.IMG_THUMB_UP }) last_added = xbmcgui.ListItem(utils.translate(30026)) last_added.setArt({'thumb': thumbs.IMG_CLOCK, 'poster': thumbs.IMG_CLOCK}) items = [ (utils.build_url( url=URL, paths=['browse', 'my-library', 'playlist', 'thumbsup'], r_path=True, r_query=True), thumbs_up, True), (utils.build_url( url=URL, paths=['browse', 'my-library', 'playlist', 'lastadded'], r_path=True, r_query=True), last_added, True), ] # User playlists items += listing.build_playlist_listitems(GMUSIC.get_user_playlists()) listing.list_playlists(items)
def list_network(network): items = [] aa = addict.AudioAddict.get(PROFILE_DIR, network) xbmcplugin.setPluginCategory(HANDLE, aa.name) xbmcplugin.setContent(HANDLE, 'files') # Channels items.append((utils.build_path('channels', network), xbmcgui.ListItem(utils.translate(30321)), True)) # Shows if aa.network['has_shows']: items.append((utils.build_path('shows', network), xbmcgui.ListItem(utils.translate(30322)), True)) items.append((utils.build_path('shows', network, 'schedule'), xbmcgui.ListItem(utils.translate(30332)), True)) # Playlists if aa.network['has_playlists']: items.append((utils.build_path('playlists', network), xbmcgui.ListItem(utils.translate(30338)), True)) # Search items.append((utils.build_path('search', network), xbmcgui.ListItem(utils.translate(30323)), True)) utils.list_items(items)
def update_networks(network=None): networks = None if network: networks = [network] else: networks = addict.NETWORKS.keys() diag = xbmcgui.DialogProgress() diag.create(utils.translate(30312)) quality_id = utils.get_quality_id(TEST_LOGIN_NETWORK) utils.logd('Got quality-id:', quality_id) for i, network in enumerate(networks): utils.logd('Updating network', network) aa = addict.AudioAddict.get(PROFILE_DIR, network) progress = i * 100 // len(networks) diag.update(progress, utils.translate(30313).format(aa.name)) aa.get_channels(refresh=True) aa.get_favorite_channels(refresh=True) if aa.is_premium: utils.logd('Setting preferred quality') aa.preferred_quality(quality_id) diag.update(100, utils.translate(30314)) diag.close()
def rate(track_id): rating = [ utils.translate(30027), # Thumbs up utils.translate(30028), # No Thumbs utils.translate(30029), # Thumbs down ] dialog = xbmcgui.Dialog() selection = dialog.select(utils.translate(30041), rating, 0) if selection == -1: return song = GMUSIC.get_track_info(track_id) if not song: return if selection == 0: GMUSIC.rate_songs(song, 5) elif selection == 1: GMUSIC.rate_songs(song, 0) elif selection == 2: GMUSIC.rate_songs(song, 1) utils.notify(utils.translate(30099), "")
def station(station_id=None, station_name=None, artist_id=None, album_id=None, track_id=None, genre_id=None, curated_station_id=None, playlist_token=None): if not station_id: station_id = GMUSIC.create_station( name=station_name, artist_id=artist_id, album_id=album_id, track_id=track_id, genre_id=genre_id, curated_station_id=curated_station_id, playlist_token=playlist_token) if not station_id: utils.notify(utils.translate(30050), utils.translate(30051)) return tracks = GMUSIC.get_station_tracks(station_id=station_id, num_tracks=25) items = listing.build_song_listitems(tracks=tracks, station_id=station_id) listing.list_songs(items)
def _make_call(self, protocol, *args, **kwargs): try: return super(GMusic, self)._make_call(protocol, *args, **kwargs) except: utils.notify(utils.translate(30050), utils.translate(30051)) utils.log(traceback.format_exc(), lvl=xbmc.LOGERROR) return None
def listen_now(): ifl = xbmcgui.ListItem(utils.translate(30045)) ifl.setArt({'thumb': thumbs.IMG_IFL, 'poster': thumbs.IMG_IFL}) albums = xbmcgui.ListItem(utils.translate(30023)) albums.setArt({'thumb': thumbs.IMG_ALBUM, 'poster': thumbs.IMG_ALBUM}) stations = xbmcgui.ListItem(utils.translate(30021)) stations.setArt({ 'thumb': thumbs.IMG_STATION, 'poster': thumbs.IMG_STATION }) playlists = xbmcgui.ListItem(utils.translate(30020)) playlists.setArt({ 'thumb': thumbs.IMG_PLAYLIST, 'poster': thumbs.IMG_PLAYLIST }) items = [ (utils.build_url(url=URL, paths=['play', 'station'], queries={'station_id': 'IFL'}, r_path=True, r_query=True), ifl, False), (utils.build_url(URL, ['albums']), albums, True), (utils.build_url(URL, ['stations']), stations, True), (utils.build_url(URL, ['playlists']), playlists, True), ] # Only fetch new information if one full hour has passed # to keep things speedy on slow devices try: last_check = ADDON.getSetting('listen_now_last_update') except: last_check = -1 from_cache = True if last_check != time.strftime('%Y%m%d%H'): from_cache = False ADDON.setSetting('listen_now_last_update', time.strftime('%Y%m%d%H')) primary_header, situations = gmusic.get_listen_now_situations(from_cache) if primary_header and situations: situations = xbmcgui.ListItem(primary_header) situations.setArt({ 'thumb': thumbs.IMG_ALBUM, 'poster': thumbs.IMG_ALBUM }) # Add Situations after IFL items.insert(1, (utils.build_url(URL, ['situations']), situations, True)) listing.list_items(items)
def my_library_update(): utils.notify(utils.translate(30030), utils.translate(30043)) GMUSIC.get_my_library_songs(from_cache=False) GMUSIC.get_my_library_artists(from_cache=False) GMUSIC.get_my_library_albums(from_cache=False) utils.notify(utils.translate(30030), utils.translate(30044)) xbmc.executebuiltin('Container.Refresh')
def browse_stations_station(station_name, curated_station_id): station_id = GMUSIC.create_station( name=station_name, curated_station_id=curated_station_id) if not station_id: utils.notify(utils.translate(30050), utils.translate(30051)) return items = listing.build_song_listitems( GMUSIC.get_station_tracks(station_id=station_id, num_tracks=25)) listing.list_songs(items)
def top_charts(): songs = xbmcgui.ListItem(utils.translate(30024)) songs.setArt({'thumb': thumbs.IMG_TRACK, 'poster': thumbs.IMG_TRACK}) albums = xbmcgui.ListItem(utils.translate(30023)) albums.setArt({'thumb': thumbs.IMG_ALBUM, 'poster': thumbs.IMG_ALBUM}) items = [(utils.build_url(URL, ['songs']), songs, True), (utils.build_url(URL, ['albums']), albums, True)] listing.list_items(items)
def my_library_add(album_id=None, track_id=None): if track_id: GMUSIC.add_store_track(track_id) elif album_id: album = GMUSIC.get_album_info(album_id=album_id, include_tracks=True) for track in album['tracks']: if 'storeId' in track: GMUSIC.add_store_track(track['storeId']) if xbmcgui.Dialog().yesno(heading=utils.translate(30030), line1=utils.translate(30065)): my_library_update()
def search(network, filter_=None, query=None, page=1): aa = addict.AudioAddict.get(PROFILE_DIR, network) xbmcplugin.setPluginCategory(HANDLE, aa.name) per_page = ADDON.getSettingInt('aa.shows_per_page') if not query: k = xbmc.Keyboard(heading=utils.translate(30323)) k.doModal() if not k.isConfirmed(): return False query = k.getText() if not aa.network['has_shows']: filter_ = 'channels' items = [] if not filter_: # Channels items.append((utils.build_path('search', network, 'channels', query), xbmcgui.ListItem(utils.translate(30321)), True)) # Shows items.append((utils.build_path('search', network, 'shows', query), xbmcgui.ListItem(utils.translate(30322)), True)) else: if filter_ == 'channels': channels = aa.search_channels(query, page=page) if channels: items = list_channels(network, channels=channels, do_list=False) elif filter_ == 'shows': for show in aa.search_shows(query, page).get('results', []): item = utils.build_show_item(network, show) items.append((item.getPath(), item, True)) if filter_ and len(items) >= per_page: items.append(( utils.build_path('search', network, query, filter_, page=page + 1), xbmcgui.ListItem(utils.translate(30318)), True, )) utils.list_items(items)
def my_library_playlist_add(playlist_id=None, album_id=None, track_id=None): # In case no playlist_id is specified we guide the user through # the process of selecting one. # He will also have the ability to create a new one if not playlist_id: action_dialog = xbmcgui.Dialog() playlists = GMUSIC.get_user_playlists() playlist_names = [] playlist_ids = [] for playlist in playlists: if playlist['type'] != 'USER_GENERATED': continue playlist_names.append(playlist['name']) playlist_ids.append(playlist['id']) playlist_names.insert(0, utils.translate(30052)) selection = action_dialog.select(utils.translate(30020), playlist_names, 0) if selection == -1: return if selection == 0: keyboard = xbmc.Keyboard() keyboard.doModal() if keyboard.isConfirmed() and keyboard.getText(): playlist_id = GMUSIC.create_playlist(name=keyboard.getText()) else: playlist_id = playlist_ids[selection - 1] if playlist_id: if track_id: GMUSIC.add_songs_to_playlist(playlist_id=playlist_id, song_ids=track_id) elif album_id: album = GMUSIC.get_album_info(album_id=album_id, include_tracks=True) track_ids = [] for track in album['tracks']: if 'storeId' in track: track_ids.append(track['storeId']) GMUSIC.add_songs_to_playlist(playlist_id=playlist_id, song_ids=track_ids)
def list_episodes(network, slug, page=1): aa = addict.AudioAddict.get(PROFILE_DIR, network) xbmcplugin.setContent(HANDLE, 'songs') xbmcplugin.setPluginCategory(HANDLE, aa.name) per_page = ADDON.getSettingInt('aa.shows_per_page') items = [] for ep in aa.get_show_episodes(slug, page, per_page): tracks = ep.get('tracks', []) if not tracks: continue item = utils.build_track_item(tracks[0]) item = utils.add_aa_art(item, ep.get('show')) items.append((item.getPath(), item, False)) if len(items) >= per_page: items.append(( utils.build_path('episodes', network, slug, page=page + 1), xbmcgui.ListItem(utils.translate(30318)), True, )) utils.list_items(items)
def unfollow(network, slug, show_name=''): aa = addict.AudioAddict.get(PROFILE_DIR, network) with utils.busy_dialog(): aa.unfollow_show(slug) utils.notify(utils.translate(30337).format(show_name)) xbmc.executebuiltin('Container.Refresh')
def my_library_remove(album_id=None, track_id=None): if not album_id and not track_id: return if not xbmcgui.Dialog().yesno(heading=utils.translate(30061), line1=utils.translate(30063)): return if album_id: GMUSIC.delete_album(album_id) elif track_id: GMUSIC.delete_songs([track_id]) if xbmcgui.Dialog().yesno(heading=utils.translate(30030), line1=utils.translate(30065)): my_library_update()
def unfavorite(network, channel, channel_name=''): aa = addict.AudioAddict.get(PROFILE_DIR, network) with utils.busy_dialog(): aa.remove_favorite(channel) utils.notify(utils.translate(30329).format(channel_name)) xbmc.executebuiltin('Container.Refresh')
def my_library_artist(artist_id): if artist_id: top_songs = xbmcgui.ListItem(utils.translate(30066)) top_songs.setArt({'thumb': thumbs.IMG_STAR, 'poster': thumbs.IMG_STAR}) related_artists = xbmcgui.ListItem(utils.translate(30067)) related_artists.setArt({ 'thumb': thumbs.IMG_ARTIST, 'poster': thumbs.IMG_ARTIST }) all_albums = xbmcgui.ListItem(utils.translate(30098)) all_albums.setArt({ 'thumb': thumbs.IMG_ALBUM, 'poster': thumbs.IMG_ALBUM }) items = [ (utils.build_url( url=URL, paths=['browse', 'artist', artist_id, 'top-songs'], r_path=True, r_query=True, ), top_songs, True), (utils.build_url( url=URL, paths=['browse', 'artist', artist_id, 'related-artists'], r_path=True, r_query=True, ), related_artists, True), (utils.build_url( url=URL, paths=['browse', 'artist', artist_id], r_path=True, r_query=True, ), all_albums, True), ] albums = GMUSIC.get_user_artist_albums(artist_id=artist_id) albums.sort(key=itemgetter('name')) albums.sort(key=itemgetter('year'), reverse=True) items += listing.build_album_listitems(albums, True) listing.list_albums(items)
def build_artist_listitems(artists, my_library=False): items = [] for artist in artists: # Applies to e.g. search results if 'artist' in artist: artist = artist['artist'] if 'artistId' not in artist or 'name' not in artist: continue artist_id = artist['artistId'] artist_name = artist['name'] artist_art = thumbs.IMG_ARTIST_FLAT if 'artistArtRef' in artist: artist_art = artist['artistArtRef'] item = xbmcgui.ListItem(artist_name) item.setArt({ 'thumb': artist_art, 'poster': artist_art, # 'fanart' : artist_art + '=s1920' }) item.setInfo('music', { 'mediatype': 'artist', 'artist': artist_name, }) item.addContextMenuItems(items=[( utils.translate(30036), 'XBMC.RunPlugin(%s)' % utils.build_url(url=URL, paths=['play', 'station'], queries={ 'station_name': artist_name.encode('utf-8'), 'artist_id': artist_id }, r_path=True, r_query=True))]) # My Library entries differ from normal AllAcces ones as users are able # to add only parts of the item to there library if my_library: items.append((utils.build_url( url=URL, paths=['browse', 'my-library', 'artist', artist_id], r_path=True, r_query=True), item, True)) else: items.append( (utils.build_url(url=URL, paths=['browse', 'artist', artist_id], r_path=True, r_query=True), item, True)) return items
def logout(): for network in addict.NETWORKS.keys(): addict.AudioAddict.get(PROFILE_DIR, network).logout() utils.clear_cache() ADDON.setSetting('aa.email', '') utils.notify(utils.translate(30306)) sys.exit(0)
def list_playlist_menu(network): aa = addict.AudioAddict.get(PROFILE_DIR, network) xbmcplugin.setPluginCategory(HANDLE, aa.name) items = [] # Popular Playlists items.append((utils.build_path('playlists', network, 'popular'), xbmcgui.ListItem(utils.translate(30339)), True)) # Newest Playlists items.append((utils.build_path('playlists', network, 'newest'), xbmcgui.ListItem(utils.translate(30340)), True)) # Followed Playlists items.append((utils.build_path('playlists', network, 'followed'), xbmcgui.ListItem(utils.translate(30341)), True)) utils.list_items(items)
def list_shows_schedule(network, page=1): aa = addict.AudioAddict.get(PROFILE_DIR, network) xbmcplugin.setPluginCategory(HANDLE, aa.name) shows = aa.get_upcoming() shows = sorted(shows, key=lambda s: s['start_at']) # Shows for "get_upcoming" have "following" always set to False # Have to work around this for now :/ followed_shows = aa.get_shows_followed() followed_slugs = [s.get('slug') for s in followed_shows] now = addict.datetime_now() active = utils.get_playing() or {} utils.log('active item', active) items = [] for show in shows: end_at = addict.parse_datetime(show.get('end_at')) if end_at < now: continue start_at = addict.parse_datetime(show.get('start_at')) show = show.get('show', {}) channel = show.get('channels', [])[0] item = utils.build_show_item(network, show, followed_slugs) item.setPath( utils.build_path('play', 'channel', network, channel.get('key'), live=show.get('now_playing', False))) if show.get('now_playing', False): label_prefix = utils.translate(30333) # Live now item.setProperty('IsPlayable', 'false') if (active.get('is_live', False) and active.get('channel') == channel.get('key')): item.select(True) else: label_prefix = '{} - {}'.format(start_at.strftime('%H:%M'), end_at.strftime('%H:%M')) item.setLabel('[B]{}[/B] - {} [I]({})[/I]'.format( label_prefix, _enc(show.get('name')), _enc(channel.get('name')))) items.append((item.getPath(), item, False)) utils.list_items(items)
def my_library(): playlists = xbmcgui.ListItem(utils.translate(30020)) playlists.setArt({ 'thumb': thumbs.IMG_PLAYLIST, 'poster': thumbs.IMG_PLAYLIST }) stations = xbmcgui.ListItem(utils.translate(30021)) stations.setArt({ 'thumb': thumbs.IMG_STATION, 'poster': thumbs.IMG_STATION }) artists = xbmcgui.ListItem(utils.translate(30022)) artists.setArt({'thumb': thumbs.IMG_ARTIST, 'poster': thumbs.IMG_ARTIST}) albums = xbmcgui.ListItem(utils.translate(30023)) albums.setArt({'thumb': thumbs.IMG_ALBUM, 'poster': thumbs.IMG_ALBUM}) songs = xbmcgui.ListItem(utils.translate(30024)) songs.setArt({'thumb': thumbs.IMG_TRACK, 'poster': thumbs.IMG_TRACK}) genres = xbmcgui.ListItem(utils.translate(30025)) genres.setArt({'thumb': thumbs.IMG_GENRE, 'poster': thumbs.IMG_GENRE}) items = [ (utils.build_url(URL, ['playlists']), playlists, True), (utils.build_url(URL, ['stations']), stations, True), (utils.build_url(URL, ['artists']), artists, True), (utils.build_url(URL, ['albums']), albums, True), (utils.build_url(URL, ['songs']), songs, True), (utils.build_url(URL, ['genres']), genres, True), ] listing.list_items(items)
def login(self): # Set Kodis locale to super class locale_code = xbmc.getLanguage(xbmc.ISO_639_1) locale_code = locale.normalize(locale_code).split('.')[0] if not locale_code: locale_code = 'en_US' self.locale = locale_code if self._is_logged_in and not self._should_test_login(): return True username = ADDON.getSetting('username') password = ADDON.getSetting('password') device_id = ADDON.getSetting('device_id') authtoken = ADDON.getSetting('authtoken') if authtoken: self.android_id = device_id self.session._authtoken = authtoken self.session.is_authenticated = True ADDON.setSetting('last_login_check', str(int(time.time()))) try: # Send a test request to ensure our authtoken # is still valide and working self.get_registered_devices() self._is_logged_in = True return True except: # Faild with the test-request so we set # "is_authenticated=False" and go through the login-process # again to get a new "authtoken" self.session.is_authenticated = False if device_id: success = super(GMusic, self).login(username, password, device_id, self.locale) if success: ADDON.setSetting('authtoken', self.session._authtoken) self._is_logged_in = True return True utils.notify(utils.translate(30048), '') ADDON.setSetting('is_setup', 'false') # Prevent further addon execution in case we failed with the login-process raise SystemExit
def list_shows_menu(network): aa = addict.AudioAddict.get(PROFILE_DIR, network) xbmcplugin.setPluginCategory(HANDLE, aa.name) items = [] # Followed Shows items.append((utils.build_path('shows', network, 'followed'), xbmcgui.ListItem(utils.translate(30324)), True)) # By Style items.append((utils.build_path('shows', network, 'fields', 'channel_filter_name'), xbmcgui.ListItem(utils.translate(30325)), True)) # By Channel items.append((utils.build_path('shows', network, 'fields', 'channel_name'), xbmcgui.ListItem(utils.translate(30316)), True)) # Schedule items.append((utils.build_path('shows', network, 'schedule'), xbmcgui.ListItem(utils.translate(30332)), True)) utils.list_items(items)
def list_networks(): items = [] for key, data in addict.NETWORKS.items(): item = xbmcgui.ListItem(data['name']) item.setArt({ 'thumb': os.path.join(ADDON_DIR, 'resources', 'assets', key + '.png'), }) item.addContextMenuItems([ (utils.translate(30307), 'RunPlugin({})'.format( utils.build_path('refresh', key))), ], True) items.append((utils.build_path('networks', key), item, True)) utils.list_items(items)
def setup(notice=True, update_cache=False): for network in addict.NETWORKS.keys(): addict.AudioAddict.get(PROFILE_DIR, network).logout() aa = addict.AudioAddict.get(PROFILE_DIR, TEST_LOGIN_NETWORK) ADDON.setSetting('aa.email', '') if notice: xbmcgui.Dialog().textviewer(utils.translate(30300), utils.translate(30301)) k = xbmc.Keyboard(aa.member.get('email', ''), utils.translate(30319)) k.doModal() if not k.isConfirmed(): return False username = k.getText() k = xbmc.Keyboard('', utils.translate(30320), True) k.doModal() if not k.isConfirmed(): return False password = k.getText() if not aa.login(username, password): if xbmcgui.Dialog().yesno(utils.translate(30309), utils.translate(30310)): return setup(False, update_cache) return False ADDON.setSetting('aa.email', username) utils.notify(utils.translate(30304), utils.translate(30305)) if not aa.is_premium: utils.go_premium() ADDON.setSettingInt('addon.last_premium_prompt', int(time.time())) if update_cache: update_networks() return True
def list_shows(network, facet='All', page=1): aa = addict.AudioAddict.get(PROFILE_DIR, network) xbmcplugin.setPluginCategory(HANDLE, aa.name) per_page = ADDON.getSettingInt('aa.shows_per_page') shows = aa.get_shows(facet, page=page, per_page=per_page) items = [] for show in shows: item = utils.build_show_item(network, show) items.append((item.getPath(), item, True)) if len(items) >= per_page: items.append(( utils.build_path('shows', network, 'followed', page=page + 1), xbmcgui.ListItem(utils.translate(30318)), True, )) utils.list_items(items)
def search_history(): history = _get_search_history() # Add "New Search" to the list item = xbmcgui.ListItem(utils.translate(30053)) item.setArt({'thumb': thumbs.IMG_SEARCH, 'poster': thumbs.IMG_SEARCH}) items = [(utils.build_url(url=URL, paths=['search', 'new'], r_path=True, r_query=True), item, True)] for hist in history: item = xbmcgui.ListItem(hist) item.setArt({'thumb': thumbs.IMG_SEARCH, 'poster': thumbs.IMG_SEARCH}) items.append((utils.build_url(url=URL, paths=['search', hist], r_path=True, r_query=True), item, True)) listing.list_items(items)