def gmusic_playlist_to_xspf(playlist_id, playlist): """ Convert a playlist from gmusicapi into an XSPF playlist. :type playlist: dict :return: XSPF (XML), UTF-8 encoded :rtype: str """ create_ts = int(playlist['creationTimestamp']) / 1000000.0 create_iso = datetime.utcfromtimestamp(create_ts).isoformat() p_url = url_for('get_playlist', _external=True, playlist_id=playlist_id) xspf = Xspf(title=playlist['name'], creator=playlist['ownerName'], date=create_iso, location=p_url) for track in playlist['tracks']: if 'track' not in track: continue tmd = track['track'] url = url_for('get_song', _external=True, song_id=tmd['storeId']) metadata = { 'location': url, 'title': tmd['title'], 'creator': tmd['artist'], 'album': tmd['album'], 'trackNum': str(tmd['trackNumber']), 'duration': tmd['durationMillis'], } album_art = tmd.get('albumArtRef', []) if album_art: metadata['image'] = album_art[0]['url'] xspf.add_track(metadata) return xspf.toXml()
def get_playlists(): """ Retrieve all of the logged in user's playlists. By default, it returns an XSPF_-formatted playlist. If ``application/json`` is preferred in the ``Accept`` HTTP header, it will return the JSON representation that is returned by GMusic. .. _XSPF: http://xspf.org/ """ gmusic_playlists = music.get_all_user_playlist_contents() resp_type = request.accept_mimetypes.best_match([XSPF_TYPE, JSON_TYPE]) # Return JSON playlist only if explicitly requested. if resp_type == JSON_TYPE: return jsonify({ 'playlists': gmusic_playlists, }) # Generate XSPF playlist, otherwise. xspf = Xspf(title='Playlists', location=url_for('get_playlists', _external=True)) for playlist in gmusic_playlists: if playlist['deleted']: continue xspf.add_track({ 'location': url_for('get_playlist', _external=True, playlist_id=playlist['id']), 'title': playlist['name'], 'creator': playlist['ownerName'], }) return Response(xspf.toXml(), mimetype=XSPF_TYPE)
def gmusic_playlist_to_xspf(playlist_id, playlist): """ Convert a playlist from gmusicapi into an XSPF playlist. :type playlist: dict :return: XSPF (XML), UTF-8 encoded :rtype: str """ all_songs = playlist_id == 'all_songs' if all_songs: xspf_kwargs = { 'title': 'All Songs', 'date': datetime.now().isoformat(), 'location': url_for('get_all_songs_playlist', _external=True), } elif playlist_id.startswith('B') and len(playlist_id) == 27: xspf_kwargs = { 'title': playlist['name'], 'date': datetime(playlist['year'], 1, 1).isoformat(), 'location': url_for('get_album_info', _external=True, album_id=playlist_id), } else: create_ts = int(playlist['creationTimestamp']) / 1000000.0 xspf_kwargs = { 'title': playlist['name'], 'creator': playlist['ownerName'], 'date': datetime.utcfromtimestamp(create_ts).isoformat(), 'location': url_for('get_playlist', _external=True, playlist_id=playlist_id), } xspf = Xspf(**xspf_kwargs) for track in playlist['tracks']: if not all_songs and 'track' not in track: continue tmd = track['track'] url = url_for('get_song', _external=True, song_id=tmd['storeId']) metadata = { 'location': url, 'title': tmd['title'], 'creator': tmd['artist'], 'album': tmd['album'], 'trackNum': str(tmd['trackNumber']), 'duration': tmd['durationMillis'], } album_art = tmd.get('albumArtRef', []) if album_art: metadata['image'] = album_art[0]['url'] xspf.add_track(metadata) return xspf.toXml()