diff --git a/.gitignore b/.gitignore index 816df52f..78333e14 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,3 @@ build/lib/ampache.py test*.py .idea/ get_art.jpg -*ampyche.conf -docs/examples/ampache.py diff --git a/README.rst b/README.rst index 3e1b9cdb..e44c8327 100644 --- a/README.rst +++ b/README.rst @@ -8,54 +8,13 @@ Upload to PyPI INFO ==== -A python3 library for interaction with your Ampache 5.x.x server using the XML & JSON API +A python3 library for interaction with your Ampache server using the XML API +https://github.com/ampache/ampache/wiki/API -``_ +If you run a develop server you now have access to JSON as well! Code examples and scripts are available from github -The class documentation has been extracted out into a markdown file for easier reading. - -``_ - -There has been a pretty significant change in the library between Ampache 4 and Ampache 5. - -For anyone wanting to stay on v4 the branch has been separated from the master branch. - -``_ - -Once you connect with your passphrase or api key, the url and auth token are stored allowing you to call methods without them. - -.. code-block:: python3 - - import ampache - import time - - # connect to the server - ampacheConnection = ampache.API() - - # if using password auth use encrypt_password - mytime = int(time.time()) - passphrase = ampacheConnection.encrypt_password('mypassword', mytime) - auth = ampacheConnection.handshake('https://music.com.au', passphrase, 'my username', mytime) - - # if using an API key auth keep using encrypt_string - passphrase = ampacheConnection.encrypt_string('my apikey', 'my username') - auth = ampacheConnection.handshake('https://music.com.au', passphrase) - - # now you can call methods without having to keep putting in the url and userkey - ampacheConnection.label(1677) - - # ping has always allowed empty calls so you have to ping with a url and session still - ampacheConnection.ping('https://music.com.au', auth) - -NEWS -==== - -* Password handshake auth is available now. -* This library only supports Ampache 5+ with a lot of significant change on the Ampache and library side - - INSTALL ======= @@ -66,52 +25,25 @@ You can now install from pip directly:: EXAMPLES ======== -There is a fairly simple cli example for windows/linux to perform a few functions. -It's a good example for testing and might make things a bit easier to follow. - -``_ - -ampyche.py help: - -.. code-block:: bash - - Possible Actions: - - /u:%CUSTOM_USER% (Custom username for the current action) - /k:%CUSTOM_APIKEY% (Custom apikey for the current action) - /a:%ACTION% (ping, playlists, localplay, download, configure, logout, showconfig) - /l:%LIMIT% (integer) - /o:%OBJECT_ID% (string) - /t:%OBJECT_TYPE% (song, playlist) - /p:%PATH% (folder for downloads) - /f:%FORMAT% (raw, mp3, ogg, flac) - /usb (split files into numeric 0-9 folders for car USBs) - /c:%COMMAND% (localplay command) - (next, prev, stop, play, pause, add, volume_up, - volume_down, volume_mute, delete_all, skip, status) - -Here is a short code sample for python to scrobble a track to your server - -.. code-block:: python3 +Practical example:: import time import ampache # user variables ampache_url = 'https://music.server' - my_api_key = 'mysuperapikey' - user = 'myusername' + my_api_key = 'mysuperapikey' + user = 'myusername' # processed details encrypted_key = ampache.encrypt_string(my_api_key, user) - ampache_session = ampache.handshake(ampache_url, encrypted_key) + ampache_api = ampache.handshake(ampache_url, encrypted_key) - if ampache_session: + if ampache_api: # Scrobble a music track to your ampache server Process(target=ampache.scrobble, - args=(ampache_url, ampache_session, - 'Hear.Life.Spoken', 'Sub Atari Knives', 'Unearthed', - '', '', int(time.time()))).start() + args=(ampache_url, ampache_api, 'Hear.Life.Spoken', 'Sub Atari Knives', 'Unearthed', + '', '', int(time.time()))).start() LINKS ===== diff --git a/build_docs.py b/build_docs.py index e07abe45..57e2082a 100644 --- a/build_docs.py +++ b/build_docs.py @@ -1,8 +1,6 @@ #!/usr/bin/env python3 -import configparser import os -import re import shutil import sys import time @@ -10,291 +8,296 @@ from src import ampache # user variables -url = None -api = None -user = None try: - if sys.argv[1]: - url = sys.argv[1] - if sys.argv[2]: - api = sys.argv[2] - if sys.argv[3]: - user = sys.argv[3] + if sys.argv[1] and sys.argv[2] and sys.argv[2]: + ampache_url = sys.argv[1] + ampache_api = sys.argv[2] + ampache_user = sys.argv[3] except IndexError: - if os.path.isfile('docs/examples/ampyche.conf'): - conf = configparser.RawConfigParser() - conf.read('docs/examples/ampyche.conf') - if not url: - url = conf.get('conf', 'ampache_url') - if not api: - api = conf.get('conf', 'ampache_apikey') - if not user: - user = conf.get('conf', 'ampache_user') - -limit = 4 -offset = 0 -api_version = '5.0.0' -song_url = 'https://music.com.au/play/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=60&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.wma' + ampache_url = 'https://music.server' + ampache_api = 'mysuperapikey' + ampache_user = 'myusername' +limit = 4 +song_url = 'https://music.com.au/play/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=164215&uid=2&player=api&name=Hellyeah%20-%20-.mp3' def build_docs(ampache_url, ampache_api, ampache_user, api_format): - ampacheConnection = ampache.API() """TODO - def stream(id, type, destination, api_format = 'xml'): - def download(id, type, destination, format = 'raw', api_format = 'xml'): + def update_art(ampache_url, ampache_api, ampache_type, ampache_id, overwrite = False, api_format = 'xml'): + def update_artist_info(ampache_url, ampache_api, id, api_format = 'xml'): + def stream(ampache_url, ampache_api, id, type, destination, api_format = 'xml'): + def download(ampache_url, ampache_api, id, type, destination, format = 'raw', api_format = 'xml'): + def get_art(ampache_url, ampache_api, id, type, api_format = 'xml'): get_similar: send artist or song id to get related objects from last.fm + shares: get a list of shares you can access + share: get a share by id + share_create: create a share + share_edit: edit an existing share + share_delete: delete an existing share + podcasts: get a list of podcasts you can access + podcast: get a podcast by id + podcast_episodes: get a list of podcast_episodes you can access + podcast_episode: get a podcast_episode by id podcast_episode_delete: delete an existing podcast_episode + podcast_create: create a podcast + podcast_edit: edit an existing podcast + podcast_delete: delete an existing podcast + update_podcast: sync and download new episodes catalogs: get all the catalogs catalog: get a catalog by id catalog_file: clean, add, verify using the file path (good for scripting) """ - """ def set_debug(boolean): - This function can be used to enable/disable debugging messages + """ encrypt_string + def encrypt_string(ampache_api, user): """ - ampacheConnection.set_debug(True) - ampacheConnection.set_format(api_format) + original_api = ampache_api + encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) - # send a bad ping - ampacheConnection.ping(ampache_url, False, api_version) - if os.path.isfile("docs/" + api_format + "-responses/ping." + api_format): - shutil.move("docs/" + api_format + "-responses/ping." + api_format, - "docs/" + api_format + "-responses/ping (no auth)." + api_format) - - """ def encrypt_string(ampache_api, user) - This function can be used to encrypt your apikey into the accepted format. - """ - encrypted_key = ampacheConnection.encrypt_string(ampache_api, ampache_user) - - """ def handshake(user = False, timestamp = False, version = '5.0.0', api_format = 'xml'): - This is the function that handles verifying a new handshake - Takes a timestamp, auth key, and username. + """ handshake + def handshake(ampache_url, ampache_api, user = False, timestamp = False, version = '400004', api_format = 'xml'): """ - # bad handshake - ampacheConnection.handshake(ampache_url, 'badkey', False, False, api_version) - if os.path.isfile("docs/" + api_format + "-responses/handshake." + api_format): - shutil.move("docs/" + api_format + "-responses/handshake." + api_format, - "docs/" + api_format + "-responses/handshake (error)." + api_format) - # use correct details - ampache_session = ampacheConnection.handshake(ampache_url, encrypted_key, False, False, api_version) - if not ampache_session: - print(encrypted_key) + # processed details + ampache_api = ampache.handshake(ampache_url, encrypted_key, False, False, '400004', api_format) + if not ampache_api: + print() sys.exit('ERROR: Failed to connect to ' + ampache_url) - """ def ping(api_format = 'xml'): - This can be called without being authenticated, it is useful for determining if what the status - of the server is, and what version it is running/compatible with + """ ping + def ping(ampache_url, ampache_api, api_format = 'xml'): """ - my_ping = ampacheConnection.ping(ampache_url, ampache_session, api_version) + # did all this work? + my_ping = ampache.ping(ampache_url, ampache_api, api_format) if not my_ping: print() sys.exit('ERROR: Failed to ping ' + ampache_url) - """ def system_update(ampache_url: str, ampache_api: str, api_format: str = 'xml'): + """ set_debug + def set_debug(mybool): """ - ampacheConnection.system_update() + ampache.set_debug(True) - """ def labels(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): + """ url_to_song + def url_to_song(ampache_url, ampache_api, url, api_format = 'xml'): """ - ampacheConnection.labels(False, False, offset, limit) + url_to_song = ampache.url_to_song(ampache_url, ampache_api, song_url, api_format) - """ def label(filter, api_format = 'xml'): + """ user_create + def user_create(ampache_url, ampache_api, username, password, email, fullname = False, disable = False, api_format = 'xml'): """ - ampacheConnection.label(1677) + tempusername = 'temp_user' + createuser = ampache.user_create(ampache_url, ampache_api, tempusername, 'supoersecretpassword', 'email@gmail.com', False, False, api_format) + tmpuser = ampache.user(ampache_url, ampache_api, tempusername, api_format) - """ def label_songs(filter, api_format = 'xml'): + """ user_edit + def user_update(ampache_url, ampache_api, username, password = False, fullname = False, email = False, website = False, state = False, city = False, disable = False, maxbitrate = False, api_format = 'xml'): """ - ampacheConnection.label_artists(1677) + edituser = ampache.user_update(ampache_url, ampache_api, tempusername, False, False, False, False, False, False, True, False, api_format) + tmpuser = ampache.user(ampache_url, ampache_api, tempusername, api_format) + shutil.move("docs/" + api_format + "-responses/user." + api_format, + "docs/" + api_format + "-responses/user (disabled)." + api_format) - """ def url_to_song(url, api_format = 'xml'): + """ user_delete + def user_delete(ampache_url, ampache_api, username, api_format = 'xml'): """ - ampacheConnection.url_to_song(song_url) + deleteuser = ampache.user_delete(ampache_url, ampache_api, tempusername, api_format) - """ def user_create(username, password, email, fullname = False, disable = False, api_format = 'xml'): + """ user + def user(ampache_url, ampache_api, username, api_format = 'xml'): """ - tempusername = 'temp_user' - ampacheConnection.user_create(tempusername, 'supoersecretpassword', 'email@gmail.com', False, False) - ampacheConnection.user(tempusername) + myuser = ampache.user(ampache_url, ampache_api, 'missing_user', api_format) + shutil.move("docs/" + api_format + "-responses/user." + api_format, + "docs/" + api_format + "-responses/user (error)." + api_format) - """ def user_update(username, password = False, fullname = False, email = False, website = False, state = False, city = False, disable = False, maxbitrate = False, api_format = 'xml'): - """ - ampacheConnection.user_update(tempusername, False, False, False, False, False, False, True, False) - ampacheConnection.user(tempusername) - if os.path.isfile("docs/" + api_format + "-responses/user." + api_format): - shutil.move("docs/" + api_format + "-responses/user." + api_format, - "docs/" + api_format + "-responses/user (disabled)." + api_format) + myuser = ampache.user(ampache_url, ampache_api, ampache_user, api_format) + if api_format == 'xml': + for child in myuser: + if child.tag == 'user': + user_id = child.attrib['id'] + else: + user_id = myuser[0]['id'] - """ def user_delete(username, api_format = 'xml'): + """ get_indexes + def get_indexes(ampache_url, ampache_api, type, filter = False, add = False, update = False, offset = 0, limit = 0, api_format = 'xml'): + + 'song'|'album'|'artist'|'playlist' """ - ampacheConnection.user_delete(tempusername) + songs = ampache.get_indexes(ampache_url, ampache_api, 'song', False, False, False, 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, + "docs/" + api_format + "-responses/get_indexes (song)." + api_format) + if api_format == 'xml': + for child in songs: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print() + sys.exit('ERROR: songs ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue + + albums = ampache.get_indexes(ampache_url, ampache_api, 'album', False, False, False, 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, + "docs/" + api_format + "-responses/get_indexes (album)." + api_format) + if api_format == 'xml': + for child in albums: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print() + sys.exit('ERROR: albums ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue + + artists = ampache.get_indexes(ampache_url, ampache_api, 'artist', False, False, False, 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, + "docs/" + api_format + "-responses/get_indexes (artist)." + api_format) + if api_format == 'xml': + for child in artists: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print() + sys.exit('ERROR: artists ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue + + playlists = ampache.get_indexes(ampache_url, ampache_api, 'playlist', False, False, False, 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, + "docs/" + api_format + "-responses/get_indexes (playlist)." + api_format) + if api_format == 'xml': + for child in playlists: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print() + sys.exit('ERROR: playlists ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue - """ def user(username, api_format = 'xml'): + """ videos + def videos(ampache_url, ampache_api, filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.user('missing_user') - if os.path.isfile("docs/" + api_format + "-responses/user." + api_format): - shutil.move("docs/" + api_format + "-responses/user." + api_format, - "docs/" + api_format + "-responses/user (error)." + api_format) + videos = ampache.videos(ampache_url, ampache_api, False, False, 0, 0, api_format) - myuser = ampacheConnection.user('demo') if api_format == 'xml': - for child in myuser: - if child.tag == 'user': - myuser = child.attrib['id'] + for child in songs: + if child.tag == 'song': + single_song = child.attrib['id'] + for child in albums: + if child.tag == 'album': + single_album = child.attrib['id'] + for child in artists: + if child.tag == 'artist': + single_artist = child.attrib['id'] + for child in playlists: + if child.tag == 'playlist': + single_playlist = child.attrib['id'] + for child in videos: + if child.tag == 'video': + single_video = child.attrib['id'] else: - user_id = myuser['id'] + single_song = songs[0]['id'] + single_album = albums[0]['id'] + single_artist = artists[0]['id'] + single_playlist = playlists[0]['id'] + single_video = videos[0]['id'] - """ def get_indexes(object_type, filter_str, exact, add, update, include, offset, limit)): + """ video + def video(ampache_url, ampache_api, filter, api_format = 'xml'): + """ + ampache.video(ampache_url, ampache_api, single_video, api_format) - 'song'|'album'|'artist'|'playlist' + """ advanced_search + def advanced_search(ampache_url, ampache_api, rules, operator = 'and', type = 'song', offset = 0, limit = 0, api_format = 'xml'): """ - songs = ampacheConnection.get_indexes('song', False, False, False, False, False, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (song)." + api_format) - single_song = ampacheConnection.get_id_list(songs, 'song')[0] - - ampacheConnection.get_indexes('song', False, False, False, False, True, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (song with include)." + api_format) - - albums = ampacheConnection.get_indexes('album', False, False, False, False, False, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (album)." + api_format) - single_album = ampacheConnection.get_id_list(albums, 'album')[0] - - ampacheConnection.get_indexes('album', False, False, False, False, True, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (album with include)." + api_format) - single_album = ampacheConnection.get_id_list(albums, 'album')[0] - single_album = 12 - - artists = ampacheConnection.get_indexes('artist', False, False, False, False, False, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (artist)." + api_format) - single_artist = ampacheConnection.get_id_list(artists, 'artist')[0] - - ampacheConnection.get_indexes('artist', False, False, False, False, True, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (artist with include)." + api_format) - single_artist = ampacheConnection.get_id_list(artists, 'artist')[0] - - playlists = ampacheConnection.get_indexes('playlist', False, False, False, False, False, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (playlist)." + api_format) - single_playlist = ampacheConnection.get_id_list(playlists, 'playlist')[0] - - ampacheConnection.get_indexes('playlist', False, False, False, False, True, offset, 1) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (playlist with include)." + api_format) - - ampacheConnection.get_indexes('podcast', False, False, False, False, False, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (podcast)." + api_format) - - ampacheConnection.get_indexes('podcast', False, False, False, False, True, offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/get_indexes." + api_format): - shutil.move("docs/" + api_format + "-responses/get_indexes." + api_format, - "docs/" + api_format + "-responses/get_indexes (podcast with include)." + api_format) - - """ def videos(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): - """ - videos = ampacheConnection.videos(False, False, 0, 0) - single_video = 1 - - """ def video(filter, api_format = 'xml'): - """ - ampacheConnection.video(single_video) - - """ def advanced_search(rules, operator = 'and', type = 'song', offset = 0, limit = 0, api_format = 'xml'): - """ - search_rules = [['favorite', 0, '%'], ['title', 2, 'D']] - search_song = ampacheConnection.advanced_search(search_rules, 'or', 'song', offset, limit, 0) - if os.path.isfile("docs/" + api_format + "-responses/advanced_search." + api_format): - shutil.move("docs/" + api_format + "-responses/advanced_search." + api_format, - "docs/" + api_format + "-responses/advanced_search (song)." + api_format) + search_rules = [['favorite', 0, '%'], ['artist', 3, 'Prodigy']] + search_song = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'or', 'song', 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/advanced_search." + api_format, + "docs/" + api_format + "-responses/advanced_search (song)." + api_format) if api_format == 'xml': - song_id = search_song[1].attrib['id'] + for child in search_song: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print() + sys.exit('ERROR: advanced_search (song) ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue + song_title = child.find('title').text else: - print(search_song['song'][0]['title']) - song_id = search_song['song'][0]['id'] - song_title = "Fasten Your Seatbelt" + song_title = search_song[0]['title'] - search_rules = [['artist', 0, 'Synthetic']] - search_album = ampacheConnection.advanced_search(search_rules, 'or', 'album', offset, limit, 0) - if os.path.isfile("docs/" + api_format + "-responses/advanced_search." + api_format): - shutil.move("docs/" + api_format + "-responses/advanced_search." + api_format, - "docs/" + api_format + "-responses/advanced_search (album)." + api_format) + search_rules = [['favorite', 0, '%'], ['artist', 0, 'Men']] + search_album = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'or', 'album', 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/advanced_search." + api_format, + "docs/" + api_format + "-responses/advanced_search (album)." + api_format) if api_format == 'xml': for child in search_album: - if child.tag == 'album': - album_title = child.find('name').text + if child.tag == 'total_count': + if int(child.text) > int(limit): + print() + sys.exit('ERROR: advanced_search (album) ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue + album_title = child.find('name').text else: - album_title = search_album['album'][0]['name'] + album_title = search_album[0]['name'] - search_rules = [['artist', 2, 'CARN'], ['artist', 2, 'Synthetic']] - search_artist = ampacheConnection.advanced_search(search_rules, 'or', 'artist', offset, limit, 0) - if os.path.isfile("docs/" + api_format + "-responses/advanced_search." + api_format): - shutil.move("docs/" + api_format + "-responses/advanced_search." + api_format, - "docs/" + api_format + "-responses/advanced_search (artist)." + api_format) + search_rules = [['favorite', 0, '%'], ['artist', limit, 'Prodigy']] + search_artist = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'or', 'artist', 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/advanced_search." + api_format, + "docs/" + api_format + "-responses/advanced_search (artist)." + api_format) if api_format == 'xml': for child in search_artist: - if child.tag == 'artist': - artist_title = child.find('name').text + if child.tag == 'total_count': + if int(child.text) > int(limit): + print() + sys.exit('ERROR: advanced_search (artist) ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue + artist_title = child.find('name').text else: - artist_title = search_artist['artist'][0]['name'] + artist_title = search_artist[0]['name'] - """ def album(filter, include = False, api_format = 'xml'): + """ album + def album(ampache_url, ampache_api, filter, include = False, api_format = 'xml'): """ - ampacheConnection.album(single_album, True) - if os.path.isfile("docs/" + api_format + "-responses/album." + api_format): - shutil.move("docs/" + api_format + "-responses/album." + api_format, - "docs/" + api_format + "-responses/album (with include)." + api_format) - - album = ampacheConnection.album(single_album, False) + album = ampache.album(ampache_url, ampache_api, single_album, False, api_format) if api_format == 'xml': for child in album: if child.tag == 'album': album_title = child.find('name').text else: - album_title = search_album['album'][0]['name'] + album_title = search_album[0]['name'] - """ def album_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + """ album_songs + def album_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.album_songs(single_album, offset, limit) + album_songs = ampache.album_songs(ampache_url, ampache_api, single_album, 0, limit, api_format) - """ def albums(filter = False, exact = False, add = False, update = False, offset = 0, limit = 0, include = False, api_format = 'xml'): + """ albums + def albums(ampache_url, ampache_api, filter = False, exact = False, add = False, update = False, offset = 0, limit = 0, include = False, api_format = 'xml'): """ - ampacheConnection.albums(album_title, 1, False, False, 0, 2, True) - if os.path.isfile("docs/" + api_format + "-responses/albums." + api_format): - shutil.move("docs/" + api_format + "-responses/albums." + api_format, - "docs/" + api_format + "-responses/albums (with include)." + api_format) - - albums = ampacheConnection.albums(album_title, 1, False, False, 0, 10, False) + albums = ampache.albums(ampache_url, ampache_api, album_title, 1, False, False, 0, 10, False, api_format) + if api_format == 'xml': + for child in albums: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print() + sys.exit('ERROR: albums ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue - """ def stats(type, filter = 'random', username = False, user_id = False, offset = 0, limit = 0, api_format = 'xml'): + """ stats + def stats(ampache_url, ampache_api, type, filter = 'random', username = False, user_id = False, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.stats('song', 'random', ampache_user, None, 0, 2) - if os.path.isfile("docs/" + api_format + "-responses/stats." + api_format): - shutil.move("docs/" + api_format + "-responses/stats." + api_format, - "docs/" + api_format + "-responses/stats (song)." + api_format) + stats = ampache.stats(ampache_url, ampache_api, 'song', 'random', ampache_user, None, 0, 2, api_format) + shutil.move("docs/" + api_format + "-responses/stats." + api_format, + "docs/" + api_format + "-responses/stats (song)." + api_format) - stats = ampacheConnection.stats('artist', 'random', ampache_user, False, 0, 2) - if os.path.isfile("docs/" + api_format + "-responses/stats." + api_format): - shutil.move("docs/" + api_format + "-responses/stats." + api_format, - "docs/" + api_format + "-responses/stats (artist)." + api_format) + stats = ampache.stats(ampache_url, ampache_api, 'artist', 'random', ampache_user, False, 0, 2, api_format) + shutil.move("docs/" + api_format + "-responses/stats." + api_format, + "docs/" + api_format + "-responses/stats (artist)." + api_format) if api_format == 'xml': for child in stats: @@ -303,13 +306,11 @@ def download(id, type, destination, format = 'raw', api_format = 'xml'): single_artist = child.attrib['id'] print(child.tag, child.attrib) else: - single_artist = stats['artist'][0]['id'] - single_artist = 2 + single_artist = stats[0]['id'] - stats = ampacheConnection.stats('album', 'random', ampache_user, None, 0, 2) - if os.path.isfile("docs/" + api_format + "-responses/stats." + api_format): - shutil.move("docs/" + api_format + "-responses/stats." + api_format, - "docs/" + api_format + "-responses/stats (album)." + api_format) + stats = ampache.stats(ampache_url, ampache_api, 'album', 'random', ampache_user, None, 0, 2, api_format) + shutil.move("docs/" + api_format + "-responses/stats." + api_format, + "docs/" + api_format + "-responses/stats (album)." + api_format) if api_format == 'xml': for child in stats: @@ -318,188 +319,178 @@ def download(id, type, destination, format = 'raw', api_format = 'xml'): single_album = child.attrib['id'] album_title = child.find('name').text else: - album_title = stats['album'][0]['name'] - - """ def artist(filter, include = False, api_format = 'xml'): - """ - ampacheConnection.artist(single_artist, True) - if os.path.isfile("docs/" + api_format + "-responses/artist." + api_format): - shutil.move("docs/" + api_format + "-responses/artist." + api_format, - "docs/" + api_format + "-responses/artist (with include songs,albums)." + api_format) - ampacheConnection.artist(single_artist, 'songs') - if os.path.isfile("docs/" + api_format + "-responses/artist." + api_format): - shutil.move("docs/" + api_format + "-responses/artist." + api_format, - "docs/" + api_format + "-responses/artist (with include songs)." + api_format) - ampacheConnection.artist(single_artist, 'albums') - if os.path.isfile("docs/" + api_format + "-responses/artist." + api_format): - shutil.move("docs/" + api_format + "-responses/artist." + api_format, - "docs/" + api_format + "-responses/artist (with include albums)." + api_format) - artist = ampacheConnection.artist(single_artist, False) + album_title = stats[0]['name'] + + """ artist + def artist(ampache_url, ampache_api, filter, include = False, api_format = 'xml'): + """ + artist = ampache.artist(ampache_url, ampache_api, single_artist, False, api_format) if api_format == 'xml': for child in artist: if child.tag == 'artist': print('\nsearching for an artist with this id', single_artist) - """ def artist_albums(filter, offset = 0, limit = 0, api_format = 'xml'): + """ artist_albums + def artist_albums(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.artist_albums(single_artist, offset, limit) + artist_albums = ampache.artist_albums(ampache_url, ampache_api, single_artist, 0, limit, api_format) - """ def artist_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + """ artist_songs + def artist_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.artist_songs(single_artist, offset, limit) + artist_songs = ampache.artist_songs(ampache_url, ampache_api, single_artist, 0, limit, api_format) - """ def artists(filter = False, add = False, update = False, offset = 0, limit = 0, include = False, api_format = 'xml'): + """ artists + def artists(ampache_url, ampache_api, filter = False, add = False, update = False, offset = 0, limit = 0, include = False, api_format = 'xml'): """ - ampacheConnection.artists(False, False, False, offset, limit, True) - if os.path.isfile("docs/" + api_format + "-responses/artists." + api_format): - shutil.move("docs/" + api_format + "-responses/artists." + api_format, - "docs/" + api_format + "-responses/artists (with include songs,albums)." + api_format) - ampacheConnection.artists(False, False, False, offset, limit, 'songs') - if os.path.isfile("docs/" + api_format + "-responses/artists." + api_format): - shutil.move("docs/" + api_format + "-responses/artists." + api_format, - "docs/" + api_format + "-responses/artists (with include songs)." + api_format) - ampacheConnection.artists(False, False, False, offset, limit, 'albums') - if os.path.isfile("docs/" + api_format + "-responses/artists." + api_format): - shutil.move("docs/" + api_format + "-responses/artists." + api_format, - "docs/" + api_format + "-responses/artists (with include albums)." + api_format) - ampacheConnection.artists(False, False, False, offset, limit, False) + myartists = ampache.artists(ampache_url, ampache_api, False, False, False, 0, limit, False, api_format) - """ def catalog_action(task, catalog, api_format = 'xml'): + """ catalog_action + def catalog_action(ampache_url, ampache_api, task, catalog, api_format = 'xml'): """ - ampacheConnection.catalog_action('clean', 2) - if os.path.isfile("docs/" + api_format + "-responses/catalog_action." + api_format): - shutil.move("docs/" + api_format + "-responses/catalog_action." + api_format, - "docs/" + api_format + "-responses/catalog_action (error)." + api_format) + catalog_action = ampache.catalog_action(ampache_url, ampache_api, 'clean', 2, api_format) + shutil.move("docs/" + api_format + "-responses/catalog_action." + api_format, + "docs/" + api_format + "-responses/catalog_action (error)." + api_format) - ampacheConnection.catalog_action('clean_catalog', 2) + catalog_action = ampache.catalog_action(ampache_url, ampache_api, 'clean_catalog', 2, api_format) - """ def flag(type, id, flag, api_format = 'xml'): + """ flag + def flag(ampache_url, ampache_api, type, id, flag, api_format = 'xml'): """ - ampacheConnection.flag('playlist', 2, True) + ampache.flag(ampache_url, ampache_api, 'playlist', 2069, True, api_format) - """ def rate(type, id, rating, api_format = 'xml'): + """ rate + def rate(ampache_url, ampache_api, type, id, rating, api_format = 'xml'): """ - ampacheConnection.rate('playlist', 2, 2) + ampache.rate(ampache_url, ampache_api, 'playlist', 2069, 2, api_format) - """ def record_play(id, user, client = 'AmpacheAPI', api_format = 'xml'): + """ record_play + def record_play(ampache_url, ampache_api, id, user, client = 'AmpacheAPI', api_format = 'xml'): """ - ampacheConnection.record_play(song_id, 4, 'debug') + ampache.record_play(ampache_url, ampache_api, 77371, user_id, 'AmpacheAPI', api_format) - """ def followers(username, api_format = 'xml'): + """ followers + def followers(ampache_url, ampache_api, username, api_format = 'xml'): """ - ampacheConnection.followers(ampache_user) + followers = ampache.followers(ampache_url, ampache_api, ampache_user, api_format) - """ def following(username, api_format = 'xml'): + """ following + def following(ampache_url, ampache_api, username, api_format = 'xml'): """ - ampacheConnection.following(ampache_user) + following = ampache.following(ampache_url, ampache_api, ampache_user, api_format) - """ def friends_timeline(limit = 0, since = 0, api_format = 'xml'): + """ friends_timeline + def friends_timeline(ampache_url, ampache_api, limit = 0, since = 0, api_format = 'xml'): """ - ampacheConnection.friends_timeline(limit, 0) + friends_timeline = ampache.friends_timeline(ampache_url, ampache_api, limit, 0, api_format) - """ def last_shouts(username, limit = 0, api_format = 'xml'): + """ last_shouts + def last_shouts(ampache_url, ampache_api, username, limit = 0, api_format = 'xml'): """ - ampacheConnection.last_shouts(ampache_user, limit) + last_shouts = ampache.last_shouts(ampache_url, ampache_api, ampache_user, limit, api_format) - """ def playlists(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): + """ playlists + def playlists(ampache_url, ampache_api, filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.playlists(False, False, offset, limit) + playlists = ampache.playlists(ampache_url, ampache_api, False, False, 0, limit, api_format) - """ def playlist_create(name, type, api_format = 'xml'): + """ playlist_create + def playlist_create(ampache_url, ampache_api, name, type, api_format = 'xml'): """ - playlist_create = ampacheConnection.playlist_create('rename', 'private') - + playlist_create = ampache.playlist_create(ampache_url, ampache_api, 'rename', 'private', api_format) + if api_format == 'xml': - for child in playlist_create: - if child.tag == 'playlist': - tmp_playlist = child.attrib['id'] - single_playlist = tmp_playlist + tmp_playlist = playlist_create[1].attrib + single_playlist = tmp_playlist['id'] else: - single_playlist = playlist_create['id'] + single_playlist = playlist_create[0]['id'] - """ def playlist_edit(filter, name = False, type = False, api_format = 'xml'): + """ playlist_edit + def playlist_edit(ampache_url, ampache_api, filter, name = False, type = False, api_format = 'xml'): """ - ampacheConnection.playlist_edit(single_playlist, 'documentation', 'public') + ampache.playlist_edit(ampache_url, ampache_api, single_playlist, 'documentation', 'public', api_format) - """ def playlist_add_song(filter, song, check = 0, api_format = 'xml'): + """ playlist_add_song + def playlist_add_song(ampache_url, ampache_api, filter, song, check = 0, api_format = 'xml'): """ - ampacheConnection.playlist_add_song(single_playlist, 71, 0) - ampacheConnection.playlist_add_song(single_playlist, 72, 0) - ampacheConnection.playlist_add_song(single_playlist, single_song, 0) - ampacheConnection.playlist_add_song(single_playlist, single_song, 1) - if os.path.isfile("docs/" + api_format + "-responses/playlist_add_song." + api_format): - shutil.move("docs/" + api_format + "-responses/playlist_add_song." + api_format, - "docs/" + api_format + "-responses/playlist_add_song (error)." + api_format) - ampacheConnection.playlist_add_song(single_playlist, single_song, 1) - ampacheConnection.playlist_add_song(single_playlist, single_song, 0) + ampache.playlist_add_song(ampache_url, ampache_api, single_playlist, 77371, 0, api_format) + ampache.playlist_add_song(ampache_url, ampache_api, single_playlist, 77371, 1, api_format) + shutil.move("docs/" + api_format + "-responses/playlist_add_song." + api_format, + "docs/" + api_format + "-responses/playlist_add_song (error)." + api_format) + ampache.playlist_add_song(ampache_url, ampache_api, single_playlist, 77371, 0, api_format) - """ def playlist_remove_song(filter, song = False, track = False, api_format = 'xml'): + """ playlist_remove_song + def playlist_remove_song(ampache_url, ampache_api, filter, song = False, track = False, api_format = 'xml'): """ - ampacheConnection.playlist_remove_song(single_playlist, False, 1) + ampache.playlist_remove_song(ampache_url, ampache_api, single_playlist, False, 1, api_format) - """ def playlist(filter, api_format = 'xml'): + """ playlist + def playlist(ampache_url, ampache_api, filter, api_format = 'xml'): """ - ampacheConnection.playlist(single_playlist) + playlist = ampache.playlist(ampache_url, ampache_api, single_playlist, api_format) - """ def playlist_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + """ playlist_songs + def playlist_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.playlist_songs(single_playlist, offset, limit) + playlist_songs = ampache.playlist_songs(ampache_url, ampache_api, single_playlist, 0, limit, api_format) - """ def playlist_delete(filter, api_format = 'xml'): + """ playlist_delete + def playlist_delete(ampache_url, ampache_api, filter, api_format = 'xml'): """ - ampacheConnection.playlist_delete(single_playlist) + ampache.playlist_delete(ampache_url, ampache_api, single_playlist, api_format) - """ def playlist_generate(mode = 'random', filter = False, album = False, artist = False, flag = False, format = 'song', offset = 0, limit = 0, api_format = 'xml'): + """ playlist_generate + def playlist_generate(ampache_url, ampache_api, mode = 'random', filter = False, album = False, artist = False, flag = False, format = 'song', offset = 0, limit = 0, api_format = 'xml'): 'song'|'index'|'id' """ - ampacheConnection.playlist_generate('random', False, False, False, False, 'song', offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/playlist_generate." + api_format): - shutil.move("docs/" + api_format + "-responses/playlist_generate." + api_format, - "docs/" + api_format + "-responses/playlist_generate (song)." + api_format) + ampache.playlist_generate(ampache_url, ampache_api, 'random', False, False, False, False, 'song', 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/playlist_generate." + api_format, + "docs/" + api_format + "-responses/playlist_generate (song)." + api_format) - ampacheConnection.playlist_generate('random', False, False, False, False, 'index', offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/playlist_generate." + api_format): - shutil.move("docs/" + api_format + "-responses/playlist_generate." + api_format, - "docs/" + api_format + "-responses/playlist_generate (index)." + api_format) + ampache.playlist_generate(ampache_url, ampache_api, 'random', False, False, False, False, 'index', 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/playlist_generate." + api_format, + "docs/" + api_format + "-responses/playlist_generate (index)." + api_format) - ampacheConnection.playlist_generate('random', False, False, False, False, 'id', offset, limit) - if os.path.isfile("docs/" + api_format + "-responses/playlist_generate." + api_format): - shutil.move("docs/" + api_format + "-responses/playlist_generate." + api_format, - "docs/" + api_format + "-responses/playlist_generate (id)." + api_format) + ampache.playlist_generate(ampache_url, ampache_api, 'random', False, False, False, False, 'id', 0, limit, api_format) + shutil.move("docs/" + api_format + "-responses/playlist_generate." + api_format, + "docs/" + api_format + "-responses/playlist_generate (id)." + api_format) - """ def scrobble(title, artist, album, MBtitle = False, MBartist = False, MBalbum = False, time = False, client = 'AmpacheAPI', api_format = 'xml'): + """ scrobble + def scrobble(ampache_url, ampache_api, title, artist, album, MBtitle = False, MBartist = False, MBalbum = False, time = False, client = 'AmpacheAPI', api_format = 'xml'): """ - ampacheConnection.scrobble('Hear. Life. Spoken', 'Sub Atari Knives', 'Sub Atari Knives', False, False, False, - int(time.time()), 'debug') - if os.path.isfile("docs/" + api_format + "-responses/scrobble." + api_format): - shutil.move("docs/" + api_format + "-responses/scrobble." + api_format, - "docs/" + api_format + "-responses/scrobble (error)." + api_format) + scrobble = ampache.scrobble(ampache_url, ampache_api, 'Hear. Life. Spoken', 'Sub Atari Knives', 'Sub Atari Knives', False, False, False, int(time.time()), 'AmpaceApi', api_format) + shutil.move("docs/" + api_format + "-responses/scrobble." + api_format, + "docs/" + api_format + "-responses/scrobble (error)." + api_format) - ampacheConnection.scrobble('Sensorisk Deprivation', 'IOK-1', 'Sensorisk Deprivation', False, False, False, - int(time.time()), 'debug') + scrobble = ampache.scrobble(ampache_url, ampache_api, 'Welcome to Planet Sexor', 'Tiga', 'Sexor', False, False, False, int(time.time()), 'test.py', api_format) - """ def record_play(object_id, user, client = 'AmpacheAPI', api_format = 'xml'): + """ record_play + def record_play(ampache_url, ampache_api, object_id, user, client='AmpacheAPI', api_format='xml'): """ - ampacheConnection.record_play(93, ampache_user, 'debug') + record_play = ampache.record_play(ampache_url, ampache_api, 164527, ampache_user, 'AmpaceApi', api_format) - """ def rate(ampache_dexesurl, ampache_api, object_type, object_id, rating, api_format = 'xml'): + """ rate + def rate(ampache_url, ampache_api, object_type, object_id, rating, api_format='xml'): """ - ampacheConnection.rate('song', 93, 5) - ampacheConnection.rate('song', 93, 0) + ampache.rate(ampache_url, ampache_api, 'song', 164527, 5, api_format) + ampache.rate(ampache_url, ampache_api, 'song', 164527, 0, api_format) - """ def flag(object_type, object_id, flag, api_format = 'xml'): + """ flag + def flag(ampache_url, ampache_api, object_type, object_id, flag, api_format='xml'): """ - ampacheConnection.flag('song', 93, True) - ampacheConnection.flag('song', 93, False) + ampache.flag(ampache_url, ampache_api, 'song', 164527, True, api_format) + ampache.flag(ampache_url, ampache_api, 'song', 164527, False, api_format) - """ def get_art(object_id, object_type, destination, api_format = 'xml'): + """ get_art + def get_art(ampache_url, ampache_api, object_id, object_type, destination, api_format='xml'): """ - ampacheConnection.get_art(93, 'song', (os.path.join(os.getcwd(), 'get_art.jpg'))) - - """ def search_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + ampache.get_art(ampache_url, ampache_api, 164527, 'song', (os.path.join(os.getcwd(), 'get_art.jpg')), api_format) + + """ search_songs + def search_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - search_songs = ampacheConnection.search_songs(song_title, offset, limit) + search_songs = ampache.search_songs(ampache_url, ampache_api, song_title, 0, limit, api_format) if api_format == 'xml': for child in search_songs: @@ -507,9 +498,10 @@ def download(id, type, destination, format = 'raw', api_format = 'xml'): for subchildren in child: print(str(subchildren.tag) + ': ' + str(subchildren.text)) - """ def song(filter, api_format = 'xml'): + """ song + def song(ampache_url, ampache_api, filter, api_format = 'xml'): """ - song = ampacheConnection.song(single_song) + song = ampache.song(ampache_url, ampache_api, single_song, api_format) if api_format == 'xml': for child in song: @@ -517,229 +509,153 @@ def download(id, type, destination, format = 'raw', api_format = 'xml'): for subchildren in child: print(str(subchildren.tag) + ': ' + str(subchildren.text)) - """ def songs(filter = False, exact = False, add = False, update = False, offset = 0, limit = 0, api_format = 'xml'): + """ songs + def songs(ampache_url, ampache_api, filter = False, exact = False, add = False, update = False, offset = 0, limit = 0, api_format = 'xml'): """ - songs = ampacheConnection.songs(False, False, False, False, offset, limit) + songs = ampache.songs(ampache_url, ampache_api, False, False, False, False, 0, limit, api_format) if api_format == 'xml': for child in songs: print(child.tag, child.attrib) for subchildren in child: print(str(subchildren.tag) + ': ' + str(subchildren.text)) - """ def genres(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): + """ tags + def tags(ampache_url, ampache_api, filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): """ genre = '' - tags = ampacheConnection.genres('D', False, offset, limit) + tags = ampache.tags(ampache_url, ampache_api, 'Brutal Death Metal', False, 0, limit, api_format) if api_format == 'xml': for child in tags: - if child.tag == 'genre': - genre = child.attrib['id'] + if child.tag == 'total_count': + print('total_count', child.text) + if int(child.text) > int(limit): + print() + sys.exit('ERROR: tags ' + child.text + ' found more items than the limit ' + str(limit)) + else: + continue + print(child.tag, child.attrib) + genre = child.attrib['id'] + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) else: - for tag in tags['genre']: + genre = tags[0]['tag'] + for tag in genre: print(tag) tmp_genre = tag['id'] genre = tmp_genre - """ def genre(filter, api_format = 'xml'): + """ tag + def tag(ampache_url, ampache_api, filter, api_format = 'xml'): """ - ampacheConnection.genre(genre) + tag = ampache.tag(ampache_url, ampache_api, genre, api_format) - """ def genre_albums(filter, offset = 0, limit = 0, api_format = 'xml'): + """ tag_albums + def tag_albums(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - genre_albums = ampacheConnection.genre_albums(genre, 0, 2) + tag_albums = ampache.tag_albums(ampache_url, ampache_api, genre, 0, 2, api_format) if api_format == 'xml': - for child in genre_albums: + for child in tag_albums: print(child.tag, child.attrib) for subchildren in child: print(str(subchildren.tag) + ': ' + str(subchildren.text)) - """ def genre_artists(filter, offset = 0, limit = 0, api_format = 'xml'): + """ tag_artists + def tag_artists(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - genre_artists = ampacheConnection.genre_artists(genre, 0, 1) + tag_artists = ampache.tag_artists(ampache_url, ampache_api, genre, 0, 1, api_format) if api_format == 'xml': - for child in genre_artists: + for child in tag_artists: print(child.tag, child.attrib) for subchildren in child: print(str(subchildren.tag) + ': ' + str(subchildren.text)) - """ def genre_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + """ tag_songs + def tag_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.genre_songs(genre, 0, 1) + tag_songs = ampache.tag_songs(ampache_url, ampache_api, genre, 0, 1, api_format) - """ def licenses(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): + """ licenses + def licenses(ampache_url, ampache_api, filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.licenses(False, False, offset, limit) + licenses = ampache.licenses(ampache_url, ampache_api, False, False, 0, limit, api_format) - """ def license(filter, api_format = 'xml'): + """ license + def license(ampache_url, ampache_api, filter, api_format = 'xml'): """ - ampacheConnection.license(1) + my_license = ampache.license(ampache_url, ampache_api, 2, api_format) - """ def license_songs(filter, api_format = 'xml'): + """ license_songs + def license_songs(ampache_url, ampache_api, filter, api_format = 'xml'): """ - ampacheConnection.license_songs(1) + license_songs = ampache.license_songs(ampache_url, ampache_api, 2, api_format) - """ def labels(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): + """ timeline + def timeline(ampache_url, ampache_api, username, limit = 0, since = 0, api_format = 'xml'): """ - ampacheConnection.labels(False, False, offset, limit) + timeline = ampache.timeline(ampache_url, ampache_api, ampache_user, 10, 0, api_format) - """ def label(filter, api_format = 'xml'): - """ - ampacheConnection.label(2) - - """ def label_songs(filter, api_format = 'xml'): - """ - ampacheConnection.label_artists(2) - - - """ def podcast(filter_str, api_format = 'xml'): - """ - ampacheConnection.podcast(1, 'episodes') - if os.path.isfile("docs/" + api_format + "-responses/podcast." + api_format): - shutil.move("docs/" + api_format + "-responses/podcast." + api_format, - "docs/" + api_format + "-responses/podcast (include episodes)." + api_format) - - ampacheConnection.podcast(1, False) - - """ def podcast_episodes - """ - ampacheConnection.podcast_episodes(1, offset, limit) - """ def podcast_episode - """ - ampacheConnection.podcast_episode(47) - - """ def podcast_create - """ - ampacheConnection.podcast_create('https://www.abc.net.au/radio/programs/trace/feed/8597522/podcast.xml', 3) - - """ def podcast_edit(filter_str, stream, download, expires, description) - """ - ampacheConnection.podcast_edit(1) - - """ def podcast_delete - """ - podcasts = ampacheConnection.podcasts('Trace', 1) - podcast_id = ampacheConnection.get_id_list(podcasts, 'podcast')[0] - ampacheConnection.podcast_delete(3) - - """ def podcasts(filter_str = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): - """ - ampacheConnection.podcasts(False, False, 0, 4) - - """ def update_podcast(filter_str, api_format = 'xml'): - """ - ampacheConnection.update_podcast(1) - - """ shares - """ - shares = ampacheConnection.shares(False, False, offset, limit) - share_id = ampacheConnection.get_id_list(shares, 'share')[0] - - """ share - """ - ampacheConnection.share(share_id) - - """ share_create - """ - share_create = ampacheConnection.share_create(single_song, 'song', False, False) - if api_format == 'xml': - share_new = share_create[1].attrib['id'] - else: - share_new = share_create['id'] - - """ share_edit - """ - ampacheConnection.share_edit(share_new, 0, 0, False, False) - - """ share_delete - """ - ampacheConnection.share_delete(share_new) - - """ def timeline(username, limit = 0, since = 0, api_format = 'xml'): - """ - ampacheConnection.timeline(ampache_user, 10, 0) - - """ def toggle_follow(username, api_format = 'xml'): + """ toggle_follow + def toggle_follow(ampache_url, ampache_api, username, api_format = 'xml'): """ toggle = 'generic' if ampache_user == 'generic': toggle = 'user' # unfollow and refollow for timeline stuff - ampacheConnection.toggle_follow(toggle) - ampacheConnection.toggle_follow(toggle) + ampache.toggle_follow(ampache_url, ampache_api, toggle, api_format) + togglefollow = ampache.toggle_follow(ampache_url, ampache_api, toggle, api_format) - """ def update_from_tags(ampache_type, ampache_id, api_format = 'xml'): + """ update_from_tags + def update_from_tags(ampache_url, ampache_api, ampache_type, ampache_id, api_format = 'xml'): """ - ampacheConnection.update_from_tags('album', 6) + update_from_tags = ampache.update_from_tags(ampache_url, ampache_api, 'album', single_album, api_format) - """ def update_artist_info(id, api_format = 'xml'): - """ - ampacheConnection.update_artist_info(26) - - """ def update_art(ampache_type, ampache_id, overwrite = False, api_format = 'xml'): - """ - ampacheConnection.update_art('artist', 26, True) + """ update_artist_info - """ def localplay(command, api_format = 'xml'): """ - ampacheConnection.localplay('status', False, False, 0) - if os.path.isfile("docs/" + api_format + "-responses/localplay." + api_format): - shutil.move("docs/" + api_format + "-responses/localplay." + api_format, - "docs/" + api_format + "-responses/localplay (status)." + api_format) + ampache.update_artist_info(ampache_url, ampache_api, single_artist, api_format) - ampacheConnection.localplay('stop', False, False, 0) + """ update_art - """ catalogs: get all the catalogs - """ - ampacheConnection.catalogs() - """ catalog: get a catalog by id - """ - ampacheConnection.catalog(1) - - """ def deleted_songs(offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.deleted_songs() + ampache.update_art(ampache_url, ampache_api, 'artist', single_artist, True, api_format) + + """ update_podcast - """ def deleted_podcast_episodes(offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.deleted_podcast_episodes() + ampache.update_podcast(ampache_url, ampache_api, 10, api_format) - """ def deleted_videos(offset = 0, limit = 0, api_format = 'xml'): + """ localplay + def localplay(ampache_url, ampache_api, command, api_format = 'xml'): """ - ampacheConnection.deleted_videos() + #print(ampache.localplay(ampache_url, ampache_api)) - """ def democratic(method, action, oid, api_format = 'xml'): + """ democratic + def democratic(ampache_url, ampache_api, method, action, oid, api_format = 'xml'): """ - # ampacheConnection.democratic() + #print(ampache.democratic(ampache_url, ampache_api)) - """ def goodbye(api_format = 'xml'): - Close your session when you're done + """ goodbye + def goodbye(ampache_url, ampache_api, api_format = 'xml'): """ - # ampacheConnection.goodbye() - - # Clean the files - self_check(api_format, ampache_url, ampache_api, ampache_session) - + # Close your session when you're done + goodbye = ampache.goodbye(ampache_url, ampache_api, api_format) -def self_check(api_format, ampache_url, ampache_api, ampache_session): print("Checking files in " + api_format + " for private strings") for files in os.listdir("./docs/" + api_format + "-responses/"): - f = open("./docs/" + api_format + "-responses/" + files, 'r', encoding="utf-8") + f = open("./docs/" + api_format + "-responses/" + files,'r', encoding="utf-8") filedata = f.read() f.close() url_text = ampache_url.replace("https://", "") - url_json = url_text.replace("/", "\\/") - newdata = re.sub(url_text, "music.com.au", filedata) - newdata = re.sub(url_text.replace("/", "\\/"), "music.com.au", newdata) - newdata = re.sub(ampache_api, "eeb9f1b6056246a7d563f479f518bb34", newdata) - newdata = re.sub('auth=[a-z0-9]*', "auth=eeb9f1b6056246a7d563f479f518bb34", newdata) - newdata = re.sub('ssid=[a-z0-9]*', "ssid=cfj3f237d563f479f5223k23189dbb34", newdata) - newdata = re.sub(ampache_session, "cfj3f237d563f479f5223k23189dbb34", newdata) - - f = open("./docs/" + api_format + "-responses/" + files, 'w', encoding="utf-8") + newdata = filedata.replace(url_text, "music.com.au") + newdata = newdata.replace(ampache_api, "eeb9f1b6056246a7d563f479f518bb34") + newdata = newdata.replace(original_api, "cfj3f237d563f479f5223k23189dbb34") + + f = open("./docs/" + api_format + "-responses/" + files,'w', encoding="utf-8") f.write(newdata) f.close() -build_docs(url, api, user, 'json') -build_docs(url, api, user, 'xml') +build_docs(ampache_url, ampache_api,ampache_user, 'xml') +build_docs(ampache_url, ampache_api,ampache_user, 'json') + diff --git a/docs/MANUAL.md b/docs/MANUAL.md deleted file mode 100644 index c62ae8d0..00000000 --- a/docs/MANUAL.md +++ /dev/null @@ -1,1150 +0,0 @@ -# Ampache class API (object) - -## Variables - -* AMPACHE_API ('xml'|'json') default: 'xml' -* AMPACHE_DEBUG (bool) default: False -* AMPACHE_URL (string) -* AMPACHE_SESSION (string) -* AMPACHE_USER (string) -* AMPACHE_KEY (string) - -## HELPER FUNCTIONS - -Functions that are used by the library to manipulate data, connect to Ampache or general processing - -### set_format - -set_format(myformat: str) - -Allow forcing a default format - -* myformat = (string) 'xml'|'json' - -### set_debug - -set_debug(mybool: bool) - -This function can be used to enable/disable debugging messages - -* bool = (boolean) Enable/disable debug messages - -### set_user - -set_user(myuser: str) - -Set the user string for connection - -* myuser (string) - -### set_key - -set_key(mykey: str) - -Set AMPACHE_KEY (api key or password) - -* mykey (string) - -### set_url - -set_url(myurl: str) - -Set the ampache url - -* myurl (string) - -### test_result - -test_result(result, title) - -This function can be used to enable/disable debugging messages - -* bool = (boolean) Enable/disable debug messages - -### return_data - -return_data(data) - -Return json or xml data based on api format - -* data (string) - -### get_id_list - -get_id_list(data, attribute: str) - -Return a list of id's from the data you've got from the api - -* data = (mixed) XML or JSON from the API -* attribute = (string) attribute you are searching for - -### get_object_list - -get_object_list(data, field: str, data_format: str = 'xml') @staticmethod - -return a list of objects from the data matching your field stirng - -* data = (mixed) XML or JSON from the API -* field = (string) field you are searching for -* data_format = (string) 'xml','json' - -### write_xml - -write_xml(xmlstr, filename: str) @staticmethod - -This function can be used to write your xml responses to a file. - -* xmlstr = (xml) xml to write to file -* filename = (string) path and filename (e.g. './ampache.xml') - -### get_message - -get_message(data) @staticmethod - -Return the string message text from the api response - -* data = (mixed) XML or JSON from the API - -### write_json - -write_json(json_data: str, filename: str) @staticmethod - -This function can be used to write your json responses to a file. - -* json_data = (json) json to write to file -* filename = (string) path and filename (e.g. './ampache.json') - -### encrypt_password - -encrypt_password(password: str, current_time: int) @staticmethod - -This function can be used to encrypt your password into the accepted format. - -* password = (string) unencrypted password string -* time = (integer) linux time - -### encrypt_string - -encrypt_string(api_key: str, username: str) @staticmethod - -This function can be used to encrypt your apikey into the accepted format. - -* api_key = (string) unencrypted apikey -* user = (string) username - -### fetch_url - -fetch_url(full_url: str, api_format: str, method: str) - -This function is used to fetch the string results using urllib - -* full_url = (string) url to fetch -* api_format = (string) 'xml'|'json' -* method = (string) - -## API FUNCTIONS - -All the Ampache functions from the API - -### handshake - -handshake(ampache_url: str, ampache_api: str, ampache_user: str = False, timestamp: int = 0, version: str = '5.0.0') - -This is the function that handles verifying a new handshake -Takes a timestamp, auth key, and username. - -* ampache_url = (string) Full Ampache URL e.g. 'https://music.com.au' -* ampache_api = (string) encrypted apikey OR password if using password auth -* user = (string) username //optional -* timestamp = (integer) UNIXTIME() //optional -* version = (string) //optional - -### ping - -ping(ampache_url: str, ampache_api: str = False, version: str = '5.0.0') - -This can be called without being authenticated, it is useful for determining if what the status -of the server is, and what version it is running/compatible with - -* ampache_url = (string) Full Ampache URL e.g. 'https://music.com.au' -* ampache_api = (string) encrypted apikey //optional - -### goodbye - -goodbye() - -Destroy session for ampache_api auth key. - -### url_to_song - -url_to_song(url) - -This takes a url and returns the song object in question - -* url = (string) Full Ampache URL from server, translates back into a song XML - -### get_similar - -get_similar(object_type, filter_id: int, offset=0, limit=0) - -Return similar artist id's or similar song ids compared to the input filter - -* object_type = (string) 'song'|'album'|'artist'|'playlist' -* filter_id = (integer) $artist_id or song_id -* offset = (integer) //optional -* limit = (integer) //optional - -### get_indexes - -get_indexes(object_type, filter_str: str = False, exact: int = False, add: int = False, update: int = False, include=False, offset=0, limit=0) - -This takes a collection of inputs and returns ID + name for the object type - -* object_type = (string) 'song'|'album'|'artist'|'album_artist'|'playlist' -* filter_str = (string) search the name of the object_type //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* add = (integer) UNIXTIME() //optional -* update = (integer) UNIXTIME() //optional -* include = (integer) 0,1 include songs if available for that object //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### artists - -artists(filter_str: str = False, add: int = False, update: int = False, offset=0, limit=0, include=False) - -This takes a collection of inputs and returns artist objects. - -* filter_str = (string) search the name of an artist //optional -* add = (integer) UNIXTIME() //optional -* update = (integer) UNIXTIME() //optional -* offset = (integer) //optional -* limit = (integer) //optional -* include = (string) 'albums', 'songs' //optional -* album_artist = (boolean) 0,1 if true filter for album artists only //optional - -### artist - -artist(filter_id: int, include=False) - -This returns a single artist based on the UID of said artist - -* filter_id = (integer) $artist_id -* include = (string) 'albums', 'songs' //optional - -### artist_albums - -artist_albums(filter_id: int, offset=0, limit=0) - -This returns the albums of an artist - -* filter_id = (integer) $artist_id -* offset = (integer) //optional -* limit = (integer) //optional - -### artist_songs - -artist_songs(filter_id: int, offset=0, limit=0) - -This returns the songs of the specified artist - -* filter_id = (integer) $artist_id -* offset = (integer) //optional -* limit = (integer) //optional - -### albums - -albums(filter_str: str = False, exact=False, add: int = False, update: int = False, offset=0, limit=0, include=False) - -This returns albums based on the provided search filters - -* filter_str = (string) search the name of an album //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* add = (integer) UNIXTIME() //optional -* update = (integer) UNIXTIME() //optional -* offset = (integer) //optional -* limit = (integer) //optional -* include = (string) 'songs' //optional - -### album - -album(filter_id: int, include=False) - -This returns a single album based on the UID provided - -* filter_id = (integer) $album_id -* include = (string) 'songs' //optional - -### album_songs - -album_songs(filter_id: int, offset=0, limit=0) - -This returns the songs of a specified album - -* filter_id = (integer) $album_id -* offset = (integer) //optional -* limit = (integer) //optional - -### genres - -genres(filter_str: str = False, exact: int = False, offset=0, limit=0) - -This returns the genres (Tags) based on the specified filter - -* filter_str = (string) search the name of a genre //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### genre - -genre(filter_id: int) - -This returns a single genre based on UID - -* filter_id = (integer) $genre_id - -### genre_artists - -genre_artists(filter_id: int, offset=0, limit=0) - -This returns the artists associated with the genre in question as defined by the UID - -* filter_id = (integer) $genre_id -* offset = (integer) //optional -* limit = (integer) //optional - -### genre_albums - -genre_albums(filter_id: int, offset=0, limit=0) - -This returns the albums associated with the genre in question - -* filter_id = (integer) $genre_id -* offset = (integer) //optional -* limit = (integer) //optional - -### genre_songs - -genre_songs(filter_id: int, offset=0, limit=0) - -returns the songs for this genre - -* filter_id = (integer) $genre_id -* offset = (integer) //optional -* limit = (integer) //optional - -### songs - -songs(filter_str: str = False, exact: int = False, add: int = False, update: int = False, offset=0, limit=0) - -Returns songs based on the specified filter_str - -* filter_str = (string) search the name of a song //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* add = (integer) UNIXTIME() //optional -* update = (integer) UNIXTIME() //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### song - -song(filter_id: int) - -returns a single song - -* filter_id = (integer) $song_id - -### song_delete - -song_delete(filter_id: int) - -Delete an existing song. - -* filter_id = (string) UID of song to delete - -### playlists - -playlists(filter_str: str = False, exact: int = False, offset=0, limit=0) - -This returns playlists based on the specified filter - -* filter_str = (string) search the name of a playlist //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### playlist - -playlist(filter_id: int) - -This returns a single playlist - -* filter_id = (integer) $playlist_id - -### playlist_songs - -playlist_songs(filter_id: int, offset=0, limit=0) - -This returns the songs for a playlist - -* filter_id = (integer) $playlist_id -* offset = (integer) //optional -* limit = (integer) //optional - -### playlist_create - -playlist_create(name, object_type) - -This create a new playlist and return it - -* name = (string) -* object_type = (string) - -### playlist_edit - -playlist_edit(filter_id: int, name=False, object_type=False) - -This modifies name and type of a playlist - -* filter_id = (integer) -* name = (string) playlist name //optional -* object_type = (string) 'public'|'private' - -### playlist_delete - -playlist_delete(filter_id: int) - -This deletes a playlist - -* filter_id = (integer) $playlist_id - -### playlist_add_song - -playlist_add_song(filter_id: int, song_id, check=False) - -This adds a song to a playlist. -Added duplicate checks in 400003 - -* filter_id = (integer) $playlist_id -* song_id = (integer) $song_id -* check = (boolean|integer) (True,False | 0|1) Check for duplicates //optional - -### playlist_remove_song - -playlist_remove_song(filter_id: int, song_id=False, track=False) - - -This removes a song from a playlist. Previous versions required 'track' instead of 'song'. - -* filter_id = (integer) $playlist_id -* song_id = (integer) $song_id //optional -* track = (integer) $playlist_track number //optional - -### playlist_generate - -playlist_generate(mode='random', filter_str: str = False, album_id=False, artist_id=False, flagged=False, list_format='song', offset=0, limit=0) - -Get a list of song XML, indexes or id's based on some simple search criteria - -'recent' will search for tracks played after 'Popular Threshold' days - -'forgotten' will search for tracks played before 'Popular Threshold' days - -'unplayed' added in 400002 for searching unplayed tracks - -* mode = (string) 'recent', 'forgotten', 'unplayed', 'random' (default = 'random') //optional -* filter_str = (string) string LIKE matched to song title //optional -* album_id = (integer) $album_id //optional -* artist_id = (integer) $artist_id //optional -* flagged = (integer) get flagged songs only 0, 1 (default=0) //optional -* list_format = (string) 'song', 'index','id' (default = 'song') //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### shares - -shares(filter_str: str = False, exact: int = False, offset=0, limit=0) - -* filter_str = (string) search the name of a share //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### share - -share(filter_id: int) - -Return shares by UID - -* filter_id = (integer) UID of Share - -### share_create - -share_create(filter_id: int, object_type, description=False, expires=False) - -Create a public url that can be used by anyone to stream media. -Takes the file id with optional description and expires parameters. - -* filter_id = (integer) $object_id -* object_type = (string) object_type ('song', 'album', 'artist') -* description = (string) description (will be filled for you if empty) //optional -* expires = (integer) days to keep active //optional - -### share_edit - -share_edit(filter_id: int, can_stream=False, can_download=False, expires=False, description=False) - -Update the description and/or expiration date for an existing share. -Takes the share id to update with optional description and expires parameters. - -INPUT -* filter_id = (integer) UID of Share -* can_stream = (boolean) 0,1 //optional -* can_download = (boolean) 0,1 //optional -* expires = (integer) number of whole days before expiry //optional -* description = (string) update description //optional - -### share_delete - -share_delete(filter_id: int) - -Delete an existing share. - -INPUT -* filter_id = (integer) UID of Share to delete - -### catalogs - -catalogs(filter_str: str = False, offset=0, limit=0) - -* filter_str = (string) search the name of a catalog //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### catalog - -catalog(filter_id: int, offset=0, limit=0) - -Return catalogs by UID - -* filter_id = (integer) UID of catalog - -### catalog_action - -catalog_action(task, catalog_id) - -Kick off a catalog update or clean for the selected catalog - -* task = (string) 'add_to_catalog'|'clean_catalog'|'verify_catalog'|'gather_art' -* catalog_id = (integer) $catalog_id - -### catalog_file - -catalog_file(file, task, catalog_id) - -Perform actions on local catalog files. -Single file versions of catalog add, clean and verify. -Make sure you remember to urlencode those file names! - -* file = (string) urlencode(FULL path to local file) -* task = (string) 'add'|'clean'|'verify'|'remove' -* catalog_id = (integer) $catalog_id - -### podcasts - -podcasts(filter_str: str = False, exact: int = False, offset=0, limit=0) - -* filter_str = (string) search the name of a podcast //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### podcast - -podcast(filter_id: int, include=False) - -Return podcasts by UID - -* filter_id = (integer) UID of Podcast -* include = (string) 'episodes' Include episodes with the response //optional - -### podcast_create - -podcast_create(url, catalog_id) - -Return podcasts by UID - -* url = (string) rss url for podcast -* catalog_id = (string) podcast catalog - -### podcast_edit - -podcast_edit(filter_id: int, feed=False, title=False, website=False, description=False, generator=False, copyright_str=False) - -Update the description and/or expiration date for an existing podcast. -Takes the podcast id to update with optional description and expires parameters. - -* filter_id = (integer) $podcast_id -* feed = (string) feed url (xml!) //optional -* title = (string) title string //optional -* website = (string) source website url //optional -* description = (string) //optional -* generator = (string) //optional -* copyright_str = (string) //optional - -### podcast_delete - -podcast_delete(filter_id: int) - -Delete an existing podcast. - -* filter_id = (integer) UID of podcast to delete - -### podcast_episodes - -podcast_episodes(filter_id: int, offset=0, limit=0) - -* filter_id = (string) UID of podcast -* offset = (integer) //optional -* limit = (integer) //optional - -### podcast_episode - -podcast_episode(filter_id: int) - -Return podcast_episodes by UID - -* filter_id = (integer) UID of Podcast - -### podcast_episode_delete - -podcast_episode_delete(filter_id: int) - -Delete an existing podcast_episode. - -* filter_id = (integer) UID of podcast_episode to delete - -### update_podcast - -update_podcast(filter_id: int) - -Sync and download new podcast episodes - -* filter_id = (integer) UID of Podcast - -### search_songs - -search_songs(filter_str, offset=0, limit=0) - -This searches the songs and returns... songs - -* filter_str = (string) search the name of a song -* offset = (integer) //optional -* limit = (integer) //optional - -### advanced_search - -advanced_search(rules, operator='and', object_type='song', offset=0, limit=0, random=0) - -Perform an advanced search given passed rules -the rules can occur multiple times and are joined by the operator item. - -Refer to the wiki for further information -http://ampache.org/api/api-advanced-search - -* rules = (array) = [[rule_1,rule_1_operator,rule_1_input], [rule_2,rule_2_operator,rule_2_input], [etc]] -* operator = (string) 'and'|'or' (whether to match one rule or all) //optional -* object_type = (string) //optional -* offset = (integer) //optional -* limit = (integer) //optional -* random = (integer) 0|1' //optional - -### videos - -videos(filter_str: str = False, exact: int = False, offset=0, limit=0) - -This returns video objects! - -* filter_str = (string) search the name of a video //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### video - -video(filter_id: int) - -This returns a single video - -* filter_id = (integer) $video_id - -### localplay - -localplay(command, oid=False, otype=False, clear=0) - -This is for controlling localplay - -* command = (string) 'next', 'prev', 'stop', 'play', 'pause', 'add', 'volume_up', 'volume_down', 'volume_mute', 'delete_all', 'skip', 'status' -* oid = (integer) object_id //optional -* otype = (string) 'Song', 'Video', 'Podcast_Episode', 'Channel', 'Broadcast', 'Democratic', 'Live_Stream' //optional -* clear = (integer) 0,1 Clear the current playlist before adding //optional - -### localplay_songs - -localplay() - -Get the list of songs in your localplay playlist - -### democratic - -democratic(method, oid) - -This is for controlling democratic play - -* oid = (integer) object_id (song_id|playlist_id) -* method = (string) 'vote'|'devote'|'playlist'|'play' - -### stats - -stats(object_type, filter_str='random', username=False, user_id=False, offset=0, limit=0) - -This gets library stats for different object types. When filter is null get some random items instead - -* object_type = (string) 'song'|'album'|'artist' -* filter_str = (string) 'newest'|'highest'|'frequent'|'recent'|'flagged'|'random' -* offset = (integer) //optional -* limit = (integer) //optional -* user_id = (integer) //optional -* username = (string) //optional - -### users - -users() - -Get ids and usernames for your site users - -INPUTS - -### user - -user(username) - -This get an user public information - -* username = (string) - -### followers - -followers(username) - -This get an user followers - -* username = (string) - -### following - -following(username) - -This get the user list followed by an user - -* username = (string) - -### toggle_follow - -toggle_follow(username) - -This follow/unfollow an user - -* username = (string) - -### last_shouts - -last_shouts(username, limit=0) - -This get the latest posted shouts - -* username = (string) -* limit = (integer) //optional - -### rate - -rate(object_type, object_id, rating) - -This rates a library item - -* object_type = (string) 'song'|'album'|'artist' -* object_id = (integer) $object_id -* rating = (integer) 0|1|2|3|4|5 - -### flag - -flag(object_type, object_id, flagbool) - -This flags a library item as a favorite - -Setting flagbool to true (1) will set the flag -Setting flagbool to false (0) will remove the flag - -* object_type = (string) 'song'|'album'|'artist' -* object_id = (integer) $object_id -* flagbool = (boolean|integer) (True,False | 0|1) - -### record_play - -record_play(object_id, user_id, client='AmpacheAPI') - -Take a song_id and update the object_count and user_activity table with a play. -This allows other sources to record play history to ampache - -* object_id = (integer) $object_id -* user_id = (integer) $user_id -* client = (string) $agent //optional - -### scrobble - -scrobble(title, artist_name, album_name, mbtitle=False, mbartist=False, mbalbum=False, stime=False, client='AmpacheAPI') - -Search for a song using text info and then record a play if found. -This allows other sources to record play history to ampache - -* title = (string) song title -* artist_name = (string) artist name -* album_name = (string) album name -* mbtitle = (string) song mbid //optional -* mbartist = (string) artist mbid //optional -* mbalbum = (string) album mbid //optional -* stime = (integer) UNIXTIME() //optional -* client = (string) //optional - -### timeline - -timeline(username, limit=0, since=0) - -This get a user timeline - -* username = (string) -* limit = (integer) //optional -* since = (integer) UNIXTIME() //optional - -### friends_timeline - -friends_timeline(limit=0, since=0) - -This get current user friends timeline - -* limit = (integer) //optional -* since = (integer) UNIXTIME() //optional - -### update_from_tags - -update_from_tags(ampache_type, ampache_id) - -updates a single album,artist,song from the tag data - -* object_type = (string) 'artist'|'album'|'song' -* object_id = (integer) $artist_id, $album_id, $song_id - -### update_art - -update_art(ampache_type, ampache_id, overwrite=False) - -updates a single album, artist, song looking for art files -Doesn't overwrite existing art by default. - -* object_type = (string) 'artist'|'album'|'song' -* object_id = (integer) $artist_id, $album_id, $song_id -* overwrite = (boolean|integer) (True,False | 0|1) //optional - -### update_artist_info - -update_artist_info(object_id) - -Update artist information and fetch similar artists from last.fm -Make sure lastfm_api_key is set in your configuration file - -* object_id = (integer) $artist_id - -### stream - -stream(object_id, object_type, destination) - -stream a song or podcast episode - -* object_id = (string) $song_id / $podcast_episode_id -* object_type = (string) 'song'|'podcast' -* destination = (string) full file path - -### download - -download(object_id, object_type, destination, transcode='raw') - -download a song or podcast episode - -* object_id = (string) $song_id / $podcast_episode_id -* object_type = (string) 'song'|'podcast' -* destination = (string) full file path -* transcode = (string) 'mp3', 'ogg', etc. ('raw' / original by default) //optional - -### get_art - -get_art(object_id, object_type, destination) - -get the binary art for an item - -* object_id = (string) $song_id / $podcast_episode_id -* object_type = (string) 'song', 'artist', 'album', 'playlist', 'search', 'podcast' -* destination = (string) output file path - -### user_create - -user_create(username: str, password: str, email: str, fullname: str = False, disable=False) - -Create a new user. (Requires the username, password and email.) @param array $input - -* username = (string) $username -* password = (string) hash('sha256', $password)) -* email = (string) 'user@gmail.com' -* fullname = (string) //optional -* disable = (boolean|integer) (True,False | 0|1) //optional - -### user_update - -user_update(username, password=False, fullname=False, email=False, website=False, state=False, city=False, disable=False, maxbitrate=False) - -Update an existing user. @param array $input - -* username = (string) $username -* password = (string) hash('sha256', $password)) //optional -* fullname = (string) //optional -* email = (string) 'user@gmail.com' //optional -* website = (string) //optional -* state = (string) //optional -* city = (string) //optional -* disable = (boolean|integer) (True,False | 0|1) //optional -* maxbitrate = (string) //optional - -### user_delete - -user_delete(username) - -Delete an existing user. @param array $input - -* username = (string) $username - -### user_preferences - -user_preferences() - -Returns user_preferences - -INPUTS - -### user_preference - -user_preference(filter_str) - -Returns preference based on the specified filter_str - -* filter_str = (string) search the name of a preference //optional - -### system_preferences - -system_preferences() - -Returns system_preferences - -INPUTS - -### system_preference - -system_preference(filter_str) - -Returns preference based on the specified filter_str - -* filter_str = (string) search the name of a preference //optional - -### system_update - -system_update() - -update ampache - -INPUTS - -### preference_create - -preference_create(filter_str, type_str, default, category, description=False, subcategory=False, level=100) - -Returns preference based on the specified filter_str - -* filter_str = (string) search the name of a preference -* type_str = (string) 'boolean', 'integer', 'string', 'special' -* default = (string|integer) default value -* category = (string) 'interface', 'internal', 'options', 'playlist', 'plugins', 'streaming', 'system' -* description = (string) description of preference //optional -* subcategory = (string) $subcategory //optional -* level = (integer) access level required to change the value (default 100) //optional - -### preference_edit - -preference_edit(filter_str, value, apply_all=0) - -Returns preference based on the specified filter_str - -* filter_str = (string) search the name of a preference -* value = (string|integer) Preference value -* apply_all = (boolean) apply to all users //optional - -### preference_delete - -preference_delete(filter_str) - -Returns preference based on the specified filter_str - -* filter_str = (string) search the name of a preference - -### licenses - -licenses(filter_str: str = False, exact: int = False, add: int = False, update: int = False, offset=0, limit=0) - -Returns licenses based on the specified filter_str - -* filter_str = (string) search the name of a license //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* add = (integer) UNIXTIME() //optional -* update = (integer) UNIXTIME() //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### license - -license(filter_id: int) - -returns a single license - -* filter_id = (integer) $license_id - -### license_songs - -license_songs(filter_id: int) - -returns a songs for a single license ID - -* filter_id = (integer) $license_id - -### labels - -labels(filter_str: str = False, exact: int = False, offset=0, limit=0) - -Returns labels based on the specified filter_str - -* filter_str = (string) search the name of a label //optional -* exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional -* offset = (integer) //optional -* limit = (integer) //optional - -### label - -label(filter_id: int) - -returns a single label - -* filter_id = (integer) $label_id - -### label_artists - -label_artists(filter_id: int) - -returns a artists for a single label ID - -* filter_id = (integer) $label_id - -### get_bookmark - -get_bookmark(filter_id: str, object_type: str) - -Get the bookmark from it's object_id and object_type. - -* filter_id = (integer) object_id -* object_type = (string) object_type ('song', 'video', 'podcast_episode') - -### bookmarks - -bookmarks() - -Get information about bookmarked media this user is allowed to manage. - -INPUTS - -### bookmark_create - -bookmark_create(filter_id, object_type, position: int = 0, client: str = 'AmpacheAPI', date=False) - -Create a placeholder for the current media that you can return to later. - -* filter_id = (integer) object_id -* object_type = (string) object_type ('song', 'video', 'podcast_episode') -* position = (integer) current track time in seconds -* client = (string) Agent string. (Default: 'AmpacheAPI') //optional -* date = (integer) update time (Default: UNIXTIME()) //optional - -### bookmark_edit - -bookmark_edit(filter_id, object_type, position: int = 0, client: str = 'AmpacheAPI', date=False) - -Edit a placeholder for the current media that you can return to later. - -* filter_id = (integer) object_id -* object_type = (string) object_type ('song', 'video', 'podcast_episode') -* position = (integer) current track time in seconds -* client = (string) Agent string. (Default: 'AmpacheAPI') //optional -* date = (integer) update time (Default: UNIXTIME()) //optional - -### bookmark_delete - -bookmark_delete(filter_id: int, object_type=False) - -Delete an existing bookmark. (if it exists) - -* filter_id = (integer) object_id -* object_type = (string) object_type ('song', 'video', 'podcast_episode') - -### deleted_songs - -deleted_songs(offset=0, limit=0) - -Returns deleted_song - -* offset = (integer) //optional -* limit = (integer) //optional - -### deleted_podcast_episodes - -deleted_podcast_episodes(offset=0, limit=0) - -Returns deleted_podcast_episode - -* offset = (integer) //optional -* limit = (integer) //optional - -### deleted_videos - -deleted_videos(offset=0, limit=0) - -Returns deleted_video - -* offset = (integer) //optional -* limit = (integer) //optional - -## BACKWARD COMPATIBLE FUNCTION NAMES - -Renamed Ampache 4 functions that are not part of Ampache 5 - -* tag = genre -* tags = genres -* tag_artists = genre_artists -* tag_albums = genre_albums -* tag_songs = genre_songs - - diff --git a/docs/examples/advanced_search.py b/docs/examples/advanced_search.py index 1f098ae0..9101c17c 100644 --- a/docs/examples/advanced_search.py +++ b/docs/examples/advanced_search.py @@ -1,48 +1,60 @@ #!/usr/bin/env python3 -import ampache import sys +import ampache + # user variables -ampache_url = 'https://develop.ampache.dev' -ampache_api = 'demodemo' -ampache_user = 'demo' +ampache_url = 'https://music.server' +ampache_api = 'mysuperapikey' +ampache_user = 'myusername' """ encrypt_string """ -ampacheConnection = ampache.API() -encrypted_key = ampacheConnection.encrypt_string(ampache_api, ampache_user) +encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) """ handshake """ +# processed details print('Connecting to:\n ', ampache_url) src_api = ampache_api -ampache_api = ampacheConnection.handshake(ampache_url, encrypted_key, False, False, '420000') - +ampache_api = ampache.handshake(ampache_url, encrypted_key, False, False, '400004', 'xml') print('\nThe ampache handshake for:\n ', src_api, '\n\nReturned the following session key:\n ', ampache_api) if not ampache_api: - print() - sys.exit('ERROR: Failed to connect to ' + ampache_url) + print() + sys.exit('ERROR: Failed to connect to ' + ampache_url) -print('\nPing returned:\n ', ampacheConnection.ping(ampache_url, ampache_api)) +print('\nPing returned:\n ', ampache.ping(ampache_url, ampache_api, 'json')) print() """ advanced_search """ -print("\nadvanced_search\nsearch song year = 2009 or CONTAINS artist 'Pro'\n") -search_rules = [['year', 2, 2009], ['artist', 0, 'Pro']] -search_song = ampacheConnection.advanced_search(search_rules, 'or', 'song', 0, 0) -for child in search_song: - if child.tag == 'total_count': - continue - print(child.tag, child.attrib) - print(child.find('filename').text) +print('\nadvanced_search\nmetadata, BPM, is greater than, 200\n') +search_rules = [['metadata', 8, 200, 9]] +search_song = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'and', 'song', 0, 0, 'xml') +if search_song: + for child in search_song: + if child.tag == 'total_count': + continue + print(child.tag, child.attrib) + print(child.find('filename').text) + +print("\nadvanced_search\nsearch song year = 1999 and CONTAINS artist 'Prodigy'\n") +search_rules = [['year', 2, 1999], ['artist', 0, 'Prodigy']] +search_song = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'and', 'song', 0, 0, 'xml') +if search_song: + for child in search_song: + if child.tag == 'total_count': + continue + print(child.tag, child.attrib) + print(child.find('filename').text) """ -Close your session when you're done +goodbye """ +# Close your session when you're done print('\nWhen you are finished it\'s a good idea to kill your session') -ampacheConnection.goodbye() +print(' ', ampache.goodbye(ampache_url, ampache_api, 'xml')) \ No newline at end of file diff --git a/docs/examples/ampyche.py b/docs/examples/ampyche.py deleted file mode 100644 index f1a7dcaf..00000000 --- a/docs/examples/ampyche.py +++ /dev/null @@ -1,419 +0,0 @@ -#!/usr/bin/env python3 - -import ampache -import configparser -import os -import playsound -import sys - - -VERSION = "0.0.2" - -# Get OS type -OS = os.name -if OS == 'nt': - SLASH = '\\' - CONFIG = './ampyche.conf' -elif OS == 'posix': - from xdg.BaseDirectory import xdg_config_dirs - SLASH = '/' - CONFIG = xdg_config_dirs[0] + '/ampyche.conf' - -# troublesome unicode characters -REPLACE = ('%', "#", ';', '"', '<', '>', '?', '[', '\\', "]", '^', '`', '{', - '|', '}', '€', '‚', 'ƒ', '„', '…', '†', '‡', 'ˆ', '‰', 'Š', '‹', - 'Œ', 'Ž', '‘', '’', '“', '”', '•', '–', '—', '˜', '™', 'š', '›', - 'œ', 'ž', 'Ÿ', '¡', '¢', '£', '¥', '"', '§', '¨', '©', 'ª', '«', - '¬', '¯', '®', '¯', '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', - '¹', 'º', '»', '¼', '½', '¾', '¿', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', - 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', - 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', - 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', - 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', '÷', 'ø', 'ù', 'ú', - 'û', 'ü', 'ý', 'þ', 'ÿ', '¦', ':', '*', '<<', '...') - - -def check_config(): - """ create a default config if not available """ - if not os.path.isdir(os.path.dirname(CONFIG)): - os.makedirs(os.path.dirname(CONFIG)) - if not os.path.isfile(CONFIG): - print("This is the first time you're running amPYche.\nEnter your user and site details.\n") - ampache_url = input("Enter Ampache URL:") - username = input("Enter Username:") - apikey = input("Enter apikey:") - conffile = open(CONFIG, "w") - conffile.write("[conf]\nampache_url = " + ampache_url + - "\nampache_user = " + username + - "\nampache_apikey = " + apikey + - "\nampache_session = None" + - "\napi_format = xml") - conffile.close() - return - - -# Process names and replace any undesired characters -def process(string): - """ Prevent / character to avoid creating folders """ - string = string.replace('/', '_') # if present - for items in REPLACE: - string = string.replace(items, '') - string = ''.join(c for c in string if c not in '<>:"\\|?*') - while string.endswith('.'): - string = string[:-1] - return string - - -def show_help(): - """ show the help and current config """ - if os.path.isfile(CONFIG): - conf = configparser.RawConfigParser() - conf.read(CONFIG) - print("\n##################\n" - "# amPYche v" + VERSION + " #\n" - "##################\n" - "\nHOW DOES ALL THIS WORK?\n" - "\n Possible Actions:\n" - "\n /u:%CUSTOM_USER%\t(Custom username for the current action)" - "\n /k:%CUSTOM_APIKEY%\t(Custom apikey for the current action)" - "\n /a:%ACTION% \t(ping, playlists, localplay, stream, download, configure, logout, showconfig)" - "\n /l:%LIMIT% \t(integer)" - "\n /o:%OBJECT_ID% \t(string)" - "\n /t:%OBJECT_TYPE% \t(song, playlist)" - "\n /p:%PATH%\t\t(folder for downloads)" - "\n /f:%FORMAT% \t(raw, mp3, ogg, flac)" - "\n /usb\t\t(split files into numeric 0-9 folders for car USBs)" - "\n /c:%COMMAND%\t(localplay command)" - "\n (next, prev, stop, play, pause, add, volume_up," - "\n volume_down, volume_mute, delete_all, skip, status)\n") - print("URL: " + conf.get('conf', 'ampache_url')) - print("USER: " + conf.get('conf', 'ampache_user')) - print("API_KEY: " + conf.get('conf', 'ampache_apikey')) - print("SESSION: " + conf.get('conf', 'ampache_session')) - print("FORMAT: " + conf.get('conf', 'api_format')) - print() - return - - -# default action is to just send a ping -ACTION = 'ping' -LIMIT = 0 -OID = 0 -TRANSCODE = 'raw' -TYPE = 'song' -NUMERIC = False -COMMAND = 'status' - -# get custom options from launch arguments -for arguments in sys.argv: - if arguments[:2] == '/h': - # SHOW HELP HERE - show_help() - sys.exit() - if arguments[:3] == '/a:': - ACTION = arguments[3:] - if arguments[:3] == '/u:': - CUSTOM_USER = arguments[3:] - if arguments[:3] == '/k:': - CUSTOM_APIKEY = arguments[3:] - if arguments[:3] == '/l:': - LIMIT = arguments[3:] - if arguments[:3] == '/o:': - OID = arguments[3:] - if arguments[:3] == '/t:': - TYPE = arguments[3:] - if arguments[:3] == '/c:': - COMMAND = arguments[3:] - if arguments[:3] == '/f:': - TRANSCODE = arguments[3:] - if arguments[:3] == '/p:': - DESTIN = arguments[3:] - if arguments[:4] == '/usb': - NUMERIC = True - - -class AMPYCHE(object): - """ do commands from the cli! """ - def __init__(self): - """ start amPYche """ - print("\n##################\n" - "# amPYche v" + VERSION + " #\n" - "##################\n") - check_config() - self.conf = configparser.RawConfigParser() - self.conf.read(CONFIG) - self.ampache_url = self.conf.get('conf', 'ampache_url') - self.ampache_user = self.conf.get('conf', 'ampache_user') - self.ampache_apikey = self.conf.get('conf', 'ampache_apikey') - self.ampache_session = self.conf.get('conf', 'ampache_session') - self.api_format = self.conf.get('conf', 'api_format') - self.ampacheConnection = ampache.API() - self.ampacheConnection.set_format(self.api_format) - - # ping the last session to see if active - my_ping = self.ampacheConnection.ping(self.ampache_url, self.ampache_session) - if not my_ping: - self.handshake() - if not my_ping: - print('CONNECTION ERROR') - return - - # workaround for bugs - if not self.ampacheConnection.AMPACHE_URL: - self.ampacheConnection.AMPACHE_URL = self.ampache_url - if not self.ampacheConnection.AMPACHE_SESSION: - self.ampacheConnection.AMPACHE_SESSION = self.ampache_session - - # get your lists - self.list_songs = list() - if int(OID) > 0: - if TYPE == 'playlist': - self.playlist_songs(OID) - if TYPE == 'song': - song = self.ampacheConnection.song(OID) - if self.api_format == 'xml': - for child in song: - if child.tag == 'song': - self.list_songs.append(child.attrib['id']) - else: - for child in song: - self.list_songs.append(child['id']) - # run your action - if ACTION == 'ping': - print("\nSESSION: " + self.ampacheConnection.ping(self.ampache_url, self.ampache_session)) - elif ACTION == 'configure': - self.saveconf() - elif ACTION == 'logout': - self.quit() - elif ACTION == 'showconfig': - print("\nURL: " + self.conf.get('conf', 'ampache_url')) - print("USER: " + self.conf.get('conf', 'ampache_user')) - print("API_KEY: " + self.conf.get('conf', 'ampache_apikey')) - print("SESSION: " + self.conf.get('conf', 'ampache_session')) - print("FORMAT: " + self.conf.get('conf', 'api_format') + "\n") - elif ACTION == 'playlists': - self.playlists() - elif ACTION == 'localplay': - for song_id in self.list_songs: - if song_id: - self.localplay('add', song_id, 'song', 0) - if COMMAND != 'add': - result = self.localplay(COMMAND) - if result: - for lines in result: - if self.api_format == 'xml': - print(lines[0] + ": " + lines[1]) - else: - print(str(lines) + ": " + str(result[lines])) - elif ACTION == 'download': - if not os.path.isdir(DESTIN): - os.makedirs(DESTIN) - for song_id in self.list_songs: - if song_id and os.path.isdir(os.path.dirname(DESTIN)): - self.download(song_id, DESTIN, TRANSCODE) - elif ACTION == 'stream': - for song_id in self.list_songs: - if song_id: - self.stream(song_id, TRANSCODE) - return - - def saveconf(self): - """ save any config changes or press enter to keep the current value """ - self.conf.read(CONFIG) - ampache_url = input("\nAmpache URL [" + self.ampache_url + "]\nEnter: ") - ampache_user = input("\nUsername [" + self.ampache_user + "]\nEnter: ") - ampache_apikey = input("\nAPIKey [" + self.ampache_apikey + "]\nEnter: ") - api_format = input("\nAPI Format (json/xml) [" + self.api_format + "]\nEnter: ") - if ampache_url: - self.conf.set('conf', 'ampache_url', ampache_url) - if ampache_user: - self.conf.set('conf', 'ampache_user', ampache_user) - if ampache_apikey: - self.conf.set('conf', 'ampache_apikey', ampache_apikey) - if api_format: - self.conf.set('conf', 'api_format', api_format.lower()) - - # write to conf file - conffile = open(CONFIG, "w") - self.conf.write(conffile) - conffile.close() - return - - def handshake(self): - """ Log into Ampache """ - encrypted_key = self.ampacheConnection.encrypt_string(self.ampache_apikey, self.ampache_user) - - # handshake - self.ampache_session = self.ampacheConnection.handshake(self.ampache_url, encrypted_key, False, False, '430000') - # if you didn't get a sessoin there's nothing you can do - if not self.ampache_session: - print() - sys.exit('ERROR: Failed to connect to ' + self.ampache_url) - - # did all this work? - my_ping = self.ampacheConnection.ping(self.ampache_url, self.ampache_session) - if not my_ping: - print() - sys.exit('ERROR: Failed to ping ' + self.ampache_url) - - # save the last session key so you don't have to keep shaking each run - self.conf.read(CONFIG) - self.conf.set('conf', 'ampache_session', self.ampache_session) - - # write to conf file - conffile = open(CONFIG, "w") - self.conf.write(conffile) - conffile.close() - - def quit(self): - """ delete your session and close the program""" - return self.ampacheConnection.goodbye(self.ampache_url, self.ampache_session) - - def playlists(self): - """ print a list of playlists """ - print("\nChecking for playlists\n") - playlists = self.ampacheConnection.playlists(False, False, 0, LIMIT) - if playlists: - if self.api_format == 'xml': - for child in playlists: - if child.tag == 'playlist': - print("\t" + child.attrib['id'] + ":\t" + child.find('name').text) - else: - for child in playlists: - print("\t" + child['id'] + ":\t" + child['name']) - - def playlist_songs(self, playlist_id): - """ collect all the songs in chosen playlist into self.list_songs """ - playlist = self.ampacheConnection.playlist_songs(playlist_id, 0, LIMIT) - print("\nChecking for songs in playlist " + str(playlist_id) + " with a limit of " + str(LIMIT) + "\n") - if self.api_format == 'xml': - for child in playlist: - if child.tag == 'song': - self.list_songs.append(child.attrib['id']) - else: - for child in playlist: - self.list_songs.append(child['id']) - - def localplay(self, action, object_id='', object_type='', clear=0): - """ Perform a localplay command/action """ - command = self.ampacheConnection.localplay(action, object_id, object_type, clear) - - result = False - statuslist = list() - # if your command processed you will have a response - if command: - if self.api_format == 'xml': - for child in command: - if action == 'status': - for status in child[0][0]: - statuslist.append([status.tag, status.text]) - elif child.tag == 'localplay': - try: - result = child[0][0].text - except TypeError: - result = False - else: - if action == 'status': - statuslist = command['localplay']['command'][action] - else: - result = command['localplay']['command'][action] - if result: - # All commands except status have a single response which isn't that exciting - if object_id: - print(action + " to localplay: " + str(object_id)) - self.ampacheConnection.localplay('play', False, False, False, - self.api_format) - else: - print("\n" + action + " sent to localplay\n") - else: - # If you've requested the status, lets return all the details you asked for - if action == 'status': - return statuslist - # otherwise it's a failed action - elif object_id: - print("Failed localplay action " + action + " on " + str(object_id)) - else: - print("Failed localplay action " + action) - - def download(self, song_id, destination, transcode='raw'): - """ Download the requested track This could be extended or changed to support lists""" - # look for various Artists - object_id = song_id - search_song = self.ampacheConnection.song(object_id) - list_songs = list() - # get your song details into a list - for child in search_song: - if self.api_format == 'xml': - if child.tag == 'song': - if transcode != 'raw': - # transcoded files have a different extension to the original - list_songs.append([child.attrib['id'], - process(child.find('albumartist').text), - process(child.find('album').text), - process(os.path.basename(os.path.splitext(child.find('filename').text)[0] + '.' + transcode))]) - else: - list_songs.append([child.attrib['id'], - process(child.find('albumartist').text), - process(child.find('album').text), - process(os.path.basename(child.find('filename').text))]) - else: - if transcode != 'raw': - # transcoded files have a different extension to the original - list_songs.append([child['id'], - process(child['albumartist']['name']), - process(child['album']['name']), - process(os.path.basename(os.path.splitext(child['filename'])[0] + '.' + transcode))]) - else: - list_songs.append([child['id'], - process(child['albumartist']['name']), - process(child['album']['name']), - process(os.path.basename(child['filename']))]) - # now you have the details you can construct a file destination - for object_id in list_songs: - if NUMERIC: - # e.g. E:\7\Elliott Smith - 108 - Last Call.mp3 - output = os.path.join(destination, (object_id[0][-1]), object_id[1] + " - " + object_id[3]) - else: - # e.g. E:\Elliott Smith\An Introduction to Elliott Smith\108 - Last Call.mp3 - output = os.path.join(destination, object_id[1], object_id[2], object_id[3]) - if not os.path.isfile(output): - # download this file if it's not already there - print('OUTPUT: ' + output) - self.ampacheConnection.download(object_id[0], - 'song', output, transcode) - else: - # skip existing files - print('**EXISTS**: ' + output) - - def stream(self, song_id, transcode='raw'): - """ Download the requested track This could be extended or changed to support lists""" - # look for various Artists - object_id = song_id - search_song = self.ampacheConnection.song(object_id) - list_songs = list() - # get your song details into a list - for child in search_song: - if self.api_format == 'xml': - if child.tag == 'song': - if transcode != 'raw': - # transcoded files have a different extension to the original - list_songs.append([child.attrib['id'], child.find('url').text]) - else: - list_songs.append([child.attrib['id'], child.find('url').text]) - else: - if transcode != 'raw': - # transcoded files have a different extension to the original - list_songs.append([child['id'], child['url']['name']]) - else: - list_songs.append([child['id'], child['url']['name']]) - # now you have the details you can construct a file destination - for song_object in list_songs: - print("Playing " + song_object[0]) - print("URL " + song_object[1]) - - playsound.playsound(song_object[1]) - - -if __name__ == "__main__": - check_config() - AMPYCHE() diff --git a/docs/examples/cache_playlist.py b/docs/examples/cache_playlist.py deleted file mode 100755 index 0a5fd4f5..00000000 --- a/docs/examples/cache_playlist.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python3 - -import os -import sys -import ampache - -# user variables -url = 'https://develop.ampache.dev' -api = 'demodemo' -user = 'demo' -smart_list = 21 -my_limit = 4 -my_transcode = 'raw' -my_destin = '/tmp' - - -def cache_playlist(ampache_url, ampache_api, ampache_user, api_format, smartlist, destination, transcode, limit): - ampacheConnection = ampache.API() - ampacheConnection.set_format(api_format) - """ encrypt_string - def encrypt_string(ampache_api, user): - """ - encrypted_key = ampacheConnection.encrypt_string(ampache_api, ampache_user) - - """ handshake - def handshake(ampache_url, ampache_api, user = False, timestamp = False, version = '420000'): - # processed details - """ - ampache_session = ampacheConnection.handshake(ampache_url, encrypted_key, False, False, '420000') - if not ampache_session: - print() - sys.exit('ERROR: Failed to connect to ' + ampache_url) - - """ ping - def ping(ampache_url, ampache_api): - # did all this work? - """ - my_ping = ampacheConnection.ping(ampache_url, ampache_session) - if not my_ping: - print() - sys.exit('ERROR: Failed to ping ' + ampache_url) - - """ set_debug - def set_debug(mybool): - """ - ampacheConnection.set_debug(False) - - """ advanced_search - def advanced_search(ampache_url, ampache_api, rules, operator = 'and', - type = 'song', offset = 0, limit = 0, random = 0): - """ - list_songs = list() - search_rules = [['smartplaylist', 0, smartlist]] - search_song = ampacheConnection.advanced_search(search_rules, 'or', 'song', 0, limit, 1) - - if api_format == 'xml': - for child in search_song: - if child.tag == 'song': - list_songs.append([child.attrib['id'], os.path.basename(child.find('filename').text)]) - else: - for child in search_song['song']: - print('list') - print(child) - list_songs.append([child['id'], os.path.basename(child['filename'])]) - - print(list_songs) - - """ download - def download(ampache_url, ampache_api, object_id, object_type, destination, file_format='raw'): - """ - for object_id in list_songs: - if not os.path.isfile(os.path.join(destination, object_id[1])): - ampacheConnection.download(object_id[0], 'song', os.path.join(destination, object_id[1]), transcode) - else: - print('File exists') - - """ goodbye - def goodbye(ampache_url, ampache_api): - Close your session when you're done - """ - ampacheConnection.goodbye() - - -cache_playlist(url, api, user, 'xml', smart_list, my_destin, my_transcode, my_limit) -cache_playlist(url, api, user, 'json', smart_list, my_destin, my_transcode, my_limit) diff --git a/docs/examples/example-json.py b/docs/examples/example-json.py new file mode 100644 index 00000000..a2d5fedf --- /dev/null +++ b/docs/examples/example-json.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 + +import sys + +import ampache + +# user variables +ampache_url = 'https://music.server' +ampache_api = 'mysuperapikey' +ampache_user = 'myusername' + +print('\n#######################\nTesting the ampache API\n#######################\n') + +""" +encrypt_string +""" +encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) + +""" +handshake +""" +# processed details +print('Connecting to:\n ', ampache_url) +src_api = ampache_api +ampache_api = ampache.handshake(ampache_url, encrypted_key, False, False, '400004', 'json') +print('\nThe ampache handshake for:\n ', src_api, '\n\nReturned the following session key:\n ', ampache_api) +if not ampache_api: + print() + sys.exit('ERROR: Failed to connect to ' + ampache_url) + +""" +ping +""" +# did all this work? +my_ping = ampache.ping(ampache_url, ampache_api, 'json') +print('\nif your handshake was correct, ping will return your session key and extend the session.') +print('\nPing returned:\n ', my_ping) +if not my_ping: + print() + sys.exit('ERROR: Failed to ping ' + ampache_url) +""" +get_indexes +'song'|'album'|'artist'|'playlist' +""" +songs = ampache.get_indexes(ampache_url, ampache_api, 'song', '', '', '', '', 4, 'json') +albums = ampache.get_indexes(ampache_url, ampache_api, 'album', '', '', '', '', 4, 'json') +artists = ampache.get_indexes(ampache_url, ampache_api, 'artist', '', '', '', '', 4, 'json') +playlists = ampache.get_indexes(ampache_url, ampache_api, 'playlist', '', '', '', '', 4, 'json') +input("\nPress Enter to continue...\n") +single_song = 16776 +single_album = 54185 +single_artist = 605 +single_playlist = 2069 +print('\nget_indexes is good for listing all the ids\n') +#print('This server has:', songs.find('total_count').text, 'songs') +#print('This server has:', albums.find('total_count').text, 'albums') +#print('This server has:', artists.find('total_count').text, 'artists') +#print('This server has:', playlists.find('total_count').text, 'playlists\n') + +#for child in songs: +# if child.tag == 'song': +# single_song = child.attrib['id'] +#for child in albums: +# if child.tag == 'album': +# single_album = child.attrib['id'] +#for child in artists: +# if child.tag == 'artist': +# single_artist = child.attrib['id'] +#for child in playlists: +# if child.tag == 'playlist': +# single_playlist = child.attrib['id'] + +""" +user +""" +myuser = ampache.user(ampache_url, ampache_api, ampache_user, 'json') +# print('\ndata for my user account details:') + +input("\nPress Enter to continue...\n") +""" +advanced_search +""" +print() +search_rules = [['favorite', 0, '%'], ['artist', 3, 'Prodigy']] +search_song = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'and', 'song', 0, 0, 'json') + +input("\nPress Enter to continue...\n") +song_title = 'funky' +print() +search_rules = [['favorite', 0, '%'], ['artist', 0, 'Men']] +search_album = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'and', 'album', 0, 1, 'json') + +input("\nPress Enter to continue...\n") +print() +search_rules = [['favorite', 0, '%'], ['artist', 4, 'Prodigy']] +search_artist = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'and', 'artist', 0, 1, 'json') +input("\nPress Enter to continue...\n") + + +""" +album +""" +input("\nPress Enter to continue...\n") +ampache.album(ampache_url, ampache_api, single_album, '', 'json') + +album_title = 'Fat of the Land' +""" +album_songs +""" +input("\nPress Enter to continue...\n") +ampache.album_songs(ampache_url, ampache_api, single_album, '', 0, 'json') + +""" +albums +""" +input("\nPress Enter to continue...\n") +print('\nSearching for albums called', album_title) +albums = ampache.albums(ampache_url, ampache_api, 'Fat', 0, 0, 0, '', 0, 0, 'json') +input("\nPress Enter to continue...\n") + +""" +stats +""" +input("\nPress Enter to continue...\n") + +ampache.stats(ampache_url, ampache_api, 'artist', '%', ampache_user, None, 0, 3, 'json') +input("\nPress Enter to continue...\n") + +ampache.stats(ampache_url, ampache_api, 'album', '%', ampache_user, None, 0, 3, 'json') +input("\nPress Enter to continue...\n") + +""" +artist +""" +ampache.artist(ampache_url, ampache_api, single_artist, None, 'json') + + +""" +artist_albums +""" +# print('\nsearching for albums that are in this artist', single_artist) +input("\nPress Enter to continue...\n") +ampache.artist_albums(ampache_url, ampache_api, single_artist, None, 0, 'json') + +""" +artist_songs +""" +# print('\nsearching for songs that are in this artist', single_artist) +input("\nPress Enter to continue...\n") +ampache.artist_songs(ampache_url, ampache_api, single_artist, 0, 5, 'json') + + +""" +artists +""" +myartists = ampache.artists(ampache_url, ampache_api, '%', None, None, 0, 5, None, 'json') +input("\nPress Enter to continue...\n") + + +""" +catalog_action +""" +print("\nampache.catalog_action was sent an intentionally bad task. 'clean' does not exist so return False") +ampache.catalog_action(ampache_url, ampache_api, 'clean', 2, 'json') +print() + +""" +democratic +""" +#ampache.democratic(ampache_url, ampache_api) + +""" +flag +""" +#ampache.flag(ampache_url, ampache_api) + +""" +followers +""" +followers = ampache.followers(ampache_url, ampache_api, ampache_user, 'json') + +input("\nPress Enter to continue...\n") + +""" +following +""" +following = ampache.following(ampache_url, ampache_api, ampache_user, 'json') + +input("\nPress Enter to continue...\n") + +""" +friends_timeline +""" +friends_timeline = ampache.friends_timeline(ampache_url, ampache_api, 5, 0, 'json') + +input("\nPress Enter to continue...\n") + +""" +last_shouts +""" +last_shouts = ampache.last_shouts(ampache_url, ampache_api, ampache_user, 5, 'json') + +input("\nPress Enter to continue...\n") + +""" +localplay +""" +#ampache.localplay(ampache_url, ampache_api) + +""" +playlists +""" +playlists = ampache.playlists(ampache_url, ampache_api, '%', 0, 0, 5, 'json') + +input("\nPress Enter to continue...\n") + +""" +playlist +""" +playlist = ampache.playlist(ampache_url, ampache_api, single_playlist, 'json') + +input("\nPress Enter to continue...\n") + +""" +playlist_songs +""" +playlist_songs = ampache.playlist_songs(ampache_url, ampache_api, single_playlist, 0, 5, 'json') + +input("\nPress Enter to continue...\n") + +""" +playlist_create +""" +#ampache.playlist_create(ampache_url, ampache_api, 'json') + +""" +playlist_edit +""" +#ampache.playlist_edit(ampache_url, ampache_api, 'json') + +""" +playlist_add_song +""" +#ampache.playlist_add_song(ampache_url, ampache_api, 'json') + +""" +playlist_remove_song +""" +#ampache.playlist_remove_song(ampache_url, ampache_api, 'json') + +""" +playlist_delete +""" +#ampache.playlist_delete(ampache_url, ampache_api, 'json') + +""" +rate +""" +#ampache.rate(ampache_url, ampache_api, 'json') + +""" +record_play +""" +#ampache.record_play(ampache_url, ampache_api, 'json') + +""" +scrobble +""" +#ampache.scrobble(ampache_url, ampache_api, 'json') + +""" +search_songs +""" +search_songs = ampache.search_songs(ampache_url, ampache_api, song_title, '%', 0, 5, 'json') + +input("\nPress Enter to continue...\n") + +""" +song +""" +song = ampache.song(ampache_url, ampache_api, 16822, 'json') + +input("\nPress Enter to continue...\n") + +""" +songs +""" +songs = ampache.songs(ampache_url, ampache_api, '%', 0, None, None, 0, 5, 'json') + +input("\nPress Enter to continue...\n") + + +""" +tags +""" +genre = '' +tags = ampache.tags(ampache_url, ampache_api, 'Brutal Death Metal', 'exact', 0, 1, 'json') +print('\nLooking for the tag Brutal Death Metal') + +input("\nPress Enter to continue...\n") + +""" +tag_albums +""" +tag_albums = ampache.tag_albums(ampache_url, ampache_api, genre, 0, 1, 'json') +input("\nPress Enter to continue...\n") + +""" +tag_artists +""" +tag_artists = ampache.tag_artists(ampache_url, ampache_api, genre, 0, 1, 'json') +input("\nPress Enter to continue...\n") + +""" +tag_songs +""" +ampache.tag_songs(ampache_url, ampache_api, genre, 0, 1) + +input("\nPress Enter to continue...\n") +""" +timeline +""" +print("\nampache.timeline for username:", ampache_user) +timeline = ampache.timeline(ampache_url, ampache_api, ampache_user, 10, 10, 'json') + +input("\nPress Enter to continue...\n") + +""" +toggle_follow +""" +#ampache.toggle_follow(ampache_url, ampache_api, 'json') + +""" +update_from_tags +""" +print("\nampache.update from tags is verifying the album", album_title, 'json') + +ampache.update_from_tags(ampache_url, ampache_api, 'album', single_album, 'json') + +""" +url_to_song +""" +#ampache.url_to_song(ampache_url, ampache_api, 'json') + +""" +video +""" +#ampache.video(ampache_url, ampache_api, 'json') + +""" +videos +""" +#ampache.videos(ampache_url, ampache_api, 'json') + +""" +goodbye +""" +# Close your session when you're done +print('\nWhen you are finished it\'s a good idea to kill your session') +ampache.goodbye(ampache_url, ampache_api, 'json') + diff --git a/docs/examples/example.py b/docs/examples/example.py new file mode 100644 index 00000000..585cb015 --- /dev/null +++ b/docs/examples/example.py @@ -0,0 +1,447 @@ +#!/usr/bin/env python3 + +import sys + +import ampache + +# user variables +ampache_url = 'https://music.server' +ampache_api = 'mysuperapikey' +ampache_user = 'myusername' + +print('\n#######################\nTesting the ampache API\n#######################\n') + +""" +encrypt_string +""" +encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) + +""" +handshake +""" +# processed details +print('Connecting to:\n ', ampache_url) +src_api = ampache_api +ampache_api = ampache.handshake(ampache_url, encrypted_key) +print('\nThe ampache handshake for:\n ', src_api, '\n\nReturned the following session key:\n ', ampache_api) +if not ampache_api: + print() + sys.exit('ERROR: Failed to connect to ' + ampache_url) + +""" +ping +""" +# did all this work? +my_ping = ampache.ping(ampache_url, ampache_api) +print('\nif your handshake was correct, ping will return your session key and extend the session.') +print('\nPing returned:\n ', my_ping) +if not my_ping: + print() + sys.exit('ERROR: Failed to ping ' + ampache_url) +""" +get_indexes +'song'|'album'|'artist'|'playlist' +""" +songs = ampache.get_indexes(ampache_url, ampache_api, 'song', '', '', '', '', 1) +albums = ampache.get_indexes(ampache_url, ampache_api, 'album', '', '', '', '', 1) +artists = ampache.get_indexes(ampache_url, ampache_api, 'artist', '', '', '', '', 1) +playlists = ampache.get_indexes(ampache_url, ampache_api, 'playlist', '', '', '', '', 1) + +print('\nget_indexes is good for listing all the ids\n') +print('This server has:', songs.find('total_count').text, 'songs') +print('This server has:', albums.find('total_count').text, 'albums') +print('This server has:', artists.find('total_count').text, 'artists') +print('This server has:', playlists.find('total_count').text, 'playlists\n') + +for child in songs: + if child.tag == 'song': + single_song = child.attrib['id'] +for child in albums: + if child.tag == 'album': + single_album = child.attrib['id'] +for child in artists: + if child.tag == 'artist': + single_artist = child.attrib['id'] +for child in playlists: + if child.tag == 'playlist': + single_playlist = child.attrib['id'] + +""" +user +""" +myuser = ampache.user(ampache_url, ampache_api, ampache_user) +print('\ndata for my user account details:') +for child in myuser: + print(child.tag, child.attrib) + #print('\nusername ', child.find('username').text) + #print('create_date ', child.find('create_date').text) + #print('last_seen ', child.find('last_seen').text) + #print('website ', child.find('website').text) + #print('state ', child.find('state').text) + #print('city ', child.find('city').text) + #print('fullname ', child.find('fullname').text) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +advanced_search +""" +print() +search_rules = [['favorite', 0, '%'], ['artist', 3, 'Prodigy']] +search_song = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'and', 'song', 0, 0) +for child in search_song: + if child.tag == 'total_count': + continue + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + song_title = child.find('title').text + +print() +search_rules = [['favorite', 0, '%'], ['artist', 0, 'Men']] +search_album = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'and', 'album', 0, 1) +for child in search_album: + if child.tag == 'total_count': + continue + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + album_title = child.find('name').text + +print() +search_rules = [['favorite', 0, '%'], ['artist', 4, 'Prodigy']] +search_artist = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'and', 'artist', 0, 1) +for child in search_artist: + if child.tag == 'total_count': + print('total_count', search_artist.find('total_count').text) + continue + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + artist_title = child.find('name').text + +""" +album +""" +for child in ampache.album(ampache_url, ampache_api, single_album, ''): + if child.tag == 'album': + print(child.tag, child.attrib) + album_title = child.find('name').text + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +album_songs +""" +print('\nsearching for songs that are in this album', single_album) +for child in ampache.album_songs(ampache_url, ampache_api, single_album, '', 0): + if child.tag == 'song': + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +albums +""" +print('\nSearching for albums called', album_title) +albums = ampache.albums(ampache_url, ampache_api, album_title, 1, 0, 0, '', 0, 0) +for child in albums: + if child.tag == 'total_count': + continue + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +stats +""" +for child in ampache.stats(ampache_url, ampache_api, 'artist', '', ampache_user, None, 0, 1): + if child.tag == 'artist': + print('\ngetting a random artist using the stats method and found', child.find('name').text) + single_artist = child.attrib['id'] + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +for child in ampache.stats(ampache_url, ampache_api, 'album', '', ampache_user, None, 0, 1): + if child.tag == 'artist': + print('\ngetting a random album using the stats method and found', child.find('name').text) + single_album = child.attrib['id'] + album_title = child.find('name').text + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +artist +""" +for child in ampache.artist(ampache_url, ampache_api, single_artist): + if child.tag == 'artist': + print('\nsearching for an artist with this id', single_artist) + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +artist_albums +""" +print('\nsearching for albums that are in this artist', single_artist) +for child in ampache.artist_albums(ampache_url, ampache_api, single_artist, None, 0): + if child.tag == 'album': + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +artist_songs +""" +print('\nsearching for songs that are in this artist', single_artist) +for child in ampache.artist_songs(ampache_url, ampache_api, single_artist, '', 0): + if child.tag == 'song': + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +artists +""" +myartists = ampache.artists(ampache_url, ampache_api) +for child in myartists: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +catalog_action +""" +print("\nampache.catalog_action was sent an intentionally bad task. 'clean' does not exist so return False") +print(ampache.catalog_action(ampache_url, ampache_api, 'clean', 2)) +print() + +""" +democratic +""" +#print(ampache.democratic(ampache_url, ampache_api)) + +""" +flag +""" +#print(ampache.flag(ampache_url, ampache_api)) + +""" +followers +""" +followers = ampache.followers(ampache_url, ampache_api, ampache_user) + +for child in followers: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +following +""" +following = ampache.following(ampache_url, ampache_api, ampache_user) + +for child in following: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +friends_timeline +""" +friends_timeline = ampache.friends_timeline(ampache_url, ampache_api) + +for child in friends_timeline: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +last_shouts +""" +last_shouts = ampache.last_shouts(ampache_url, ampache_api, ampache_user) + +for child in last_shouts: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +localplay +""" +#print(ampache.localplay(ampache_url, ampache_api)) + +""" +playlists +""" +playlists = ampache.playlists(ampache_url, ampache_api) + +for child in playlists: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +playlist +""" +playlist = ampache.playlist(ampache_url, ampache_api, single_playlist) + +for child in playlist: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +playlist_songs +""" +playlist_songs = ampache.playlist_songs(ampache_url, ampache_api, single_playlist) + +for child in playlist_songs: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +playlist_create +""" +#print(ampache.playlist_create(ampache_url, ampache_api)) + +""" +playlist_edit +""" +#print(ampache.playlist_edit(ampache_url, ampache_api)) + +""" +playlist_add_song +""" +#print(ampache.playlist_add_song(ampache_url, ampache_api)) + +""" +playlist_remove_song +""" +#print(ampache.playlist_remove_song(ampache_url, ampache_api)) + +""" +playlist_delete +""" +#print(ampache.playlist_delete(ampache_url, ampache_api)) + +""" +rate +""" +#print(ampache.rate(ampache_url, ampache_api)) + +""" +record_play +""" +#print(ampache.record_play(ampache_url, ampache_api)) + +""" +scrobble +""" +#print(ampache.scrobble(ampache_url, ampache_api)) + +""" +search_songs +""" +search_songs = ampache.search_songs(ampache_url, ampache_api, song_title) + +for child in search_songs: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +song +""" +song = ampache.song(ampache_url, ampache_api, song_title) + +for child in song: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +songs +""" +songs = ampache.songs(ampache_url, ampache_api) + +for child in songs: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +tags +""" +genre = '' +tags = ampache.tags(ampache_url, ampache_api, 'Brutal Death Metal', 'exact', 0, 1) +print('\nLooking for the tag Brutal Death Metal') + +for child in tags: + if child.tag == 'total_count': + print('total_count', search_artist.find('total_count').text) + continue + print(child.tag, child.attrib) + genre = child.attrib['id'] + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +tag_albums +""" +tag_albums = ampache.tag_albums(ampache_url, ampache_api, genre, 0, 1) +for child in tag_albums: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +tag_artists +""" +tag_artists = ampache.tag_artists(ampache_url, ampache_api, genre, 0, 1) +for child in tag_artists: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) + +""" +tag_songs +""" +print(ampache.tag_songs(ampache_url, ampache_api, genre, 0, 1)) + +""" +timeline +""" +print("\nampache.timeline for username:", ampache_user) +timeline = ampache.timeline(ampache_url, ampache_api, ampache_user, 10, 10) + +for child in timeline: + print(child.tag, child.attrib) + for subchildren in child: + print(str(subchildren.tag) + ': ' + str(subchildren.text)) +""" +toggle_follow +""" +#print(ampache.toggle_follow(ampache_url, ampache_api)) + +""" +update_from_tags +""" +print("\nampache.update from tags is verifying the album", album_title) +print(ampache.update_from_tags(ampache_url, ampache_api, 'album', single_album)) + +""" +url_to_song +""" +#print(ampache.url_to_song(ampache_url, ampache_api)) + +""" +video +""" +#print(ampache.video(ampache_url, ampache_api)) + +""" +videos +""" +#print(ampache.videos(ampache_url, ampache_api)) + +""" +goodbye +""" +# Close your session when you're done +print('\nWhen you are finished it\'s a good idea to kill your session') +print(' ', ampache.goodbye(ampache_url, ampache_api)) + diff --git a/docs/examples/login-json.py b/docs/examples/login-json.py new file mode 100644 index 00000000..f131d32a --- /dev/null +++ b/docs/examples/login-json.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +import sys + +import ampache + +# user variables +ampache_url = 'https://music.server' +ampache_api = 'mysuperapikey' +ampache_user = 'myusername' + +""" +encrypt_string +""" +encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) + +""" +handshake +""" +# processed details +print('Connecting to:\n ', ampache_url) +src_api = ampache_api +ampache_api = ampache.handshake(ampache_url, encrypted_key, False, False, '400004', 'json') +print('\nThe ampache handshake for:\n ', src_api, '\n\nReturned the following session key:\n ', ampache_api) +if not ampache_api: + print() + sys.exit('ERROR: Failed to connect to ' + ampache_url) diff --git a/docs/examples/login.py b/docs/examples/login.py index aa03633a..215f4a36 100644 --- a/docs/examples/login.py +++ b/docs/examples/login.py @@ -5,29 +5,23 @@ import ampache # user variables -ampache_url = 'https://develop.ampache.dev' -ampache_api = 'demodemo' -ampache_user = 'demo' - -# xml or json supported formats -api_format = 'json' - -ampacheConnection = ampache.API() -ampacheConnection.set_format(api_format) +ampache_url = 'https://music.server' +ampache_api = 'mysuperapikey' +ampache_user = 'myusername' """ encrypt_string """ -encrypted_key = ampacheConnection.encrypt_string(ampache_api, ampache_user) +encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) """ handshake """ +# processed details print('Connecting to:\n ', ampache_url) src_api = ampache_api -ampache_api = ampacheConnection.handshake(ampache_url, encrypted_key, False, False, '420000') - +ampache_api = ampache.handshake(ampache_url, encrypted_key) print('\nThe ampache handshake for:\n ', src_api, '\n\nReturned the following session key:\n ', ampache_api) if not ampache_api: - print() - sys.exit('ERROR: Failed to connect to ' + ampache_url) + print() + sys.exit('ERROR: Failed to connect to ' + ampache_url) diff --git a/docs/examples/playlist_test.py b/docs/examples/playlist_test.py index 37a7a586..4f224b10 100644 --- a/docs/examples/playlist_test.py +++ b/docs/examples/playlist_test.py @@ -5,16 +5,16 @@ import ampache # user variables -ampache_url = 'https://develop.ampache.dev' -ampache_api = 'demodemo' -ampache_user = 'demo' +ampache_url = 'https://music.server' +ampache_api = 'mysuperapikey' +ampache_user = 'myusername' -ampacheConnection = ampache.API() +print('\n#######################\nTesting the ampache API\n#######################\n') """ encrypt_string """ -encrypted_key = ampacheConnection.encrypt_string(ampache_api, ampache_user) +encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) """ handshake @@ -22,32 +22,32 @@ # processed details print('Connecting to:\n ', ampache_url) src_api = ampache_api -ampache_api = ampacheConnection.handshake(ampache_url, encrypted_key) +ampache_api = ampache.handshake(ampache_url, encrypted_key) print('\nThe ampache handshake for:\n ', src_api, '\n\nReturned the following session key:\n ', ampache_api) if not ampache_api: - print() - sys.exit('ERROR: Failed to connect to ' + ampache_url) + print() + sys.exit('ERROR: Failed to connect to ' + ampache_url) """ ping """ # did all this work? -my_ping = ampacheConnection.ping(ampache_url, ampache_api) +my_ping = ampache.ping(ampache_url, ampache_api) print('\nif your handshake was correct, ping will return your session key and extend the session.') print('\nPing returned:\n ', my_ping) if not my_ping: - print() - sys.exit('ERROR: Failed to ping ' + ampache_url) + print() + sys.exit('ERROR: Failed to ping ' + ampache_url) """ playlists """ -playlists = ampacheConnection.playlists() +#playlists = ampache.playlists(ampache_url, ampache_api) """ playlist_create """ -playlist_create = (ampacheConnection.playlist_create('python-test', 'private')) +playlist_create = (ampache.playlist_create(ampache_url, ampache_api, 'python-test', 'private')) if playlist_create: for child in playlist_create: if child.tag == 'playlist': @@ -57,47 +57,51 @@ """ playlist """ -playlist = ampacheConnection.playlists('python-test', 'private') -if playlist: - for child in playlist: - print(child.tag, child.attrib) - if child.tag == 'playlist': - single_playlist = child.attrib['id'] - for subchildren in child: - print(str(subchildren.tag) + ': ' + str(subchildren.text)) +#playlist = ampache.playlists(ampache_url, ampache_api, 'python-test', 'private') +#if playlist: + #for child in playlist: + #print(child.tag, child.attrib) + #if child.tag == 'playlist': + # single_playlist = child.attrib['id'] + #for subchildren in child: + # print(str(subchildren.tag) + ': ' + str(subchildren.text)) """ playlist_add_song """ -songs = ampacheConnection.get_indexes('song', False, False, False, False, False, 0, 10) - -for child in ampacheConnection.get_id_list(songs, 'song'): - ampacheConnection.playlist_add_song(single_playlist, child, 1) +songs = ampache.get_indexes(ampache_url, ampache_api, 'song', '', '', '', '', 10) +for child in songs: + if child.tag == 'song': + print(ampache.playlist_add_song(ampache_url, ampache_api, single_playlist, child.attrib['id'], 1)) + print(ampache.playlist_add_song(ampache_url, ampache_api, single_playlist, child.attrib['id'], 1)) """ playlist_songs """ -playlist_songs = ampacheConnection.playlist_songs(single_playlist) +playlist_songs = ampache.playlist_songs(ampache_url, ampache_api, single_playlist) """ playlist_remove_song """ -for child in ampacheConnection.get_id_list(playlist_songs, 'song'): - ampacheConnection.playlist_remove_song(single_playlist, child) +for child in playlist_songs: + if child.tag == 'song': + print(ampache.playlist_remove_song(ampache_url, ampache_api, single_playlist, child.attrib['id'])) """ playlist_edit """ +print(ampache.playlist_edit(ampache_url, ampache_api, single_playlist, 'generic', 'public')) """ playlist_delete """ -ampacheConnection.playlist_delete(single_playlist) +print(ampache.playlist_delete(ampache_url, ampache_api, single_playlist)) """ goodbye """ # Close your session when you're done print('\nWhen you are finished it\'s a good idea to kill your session') -ampacheConnection.goodbye() +print(' ', ampache.goodbye(ampache_url, ampache_api)) + diff --git a/docs/examples/requirements.txt b/docs/examples/requirements.txt deleted file mode 100644 index f7f2f6d2..00000000 --- a/docs/examples/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -ampache~=5 -requests~=2.22.0 -setuptools~=44.0.0 -playsound~=1.2 diff --git a/docs/examples/scrobble.py b/docs/examples/scrobble.py index aa536f00..0501b185 100644 --- a/docs/examples/scrobble.py +++ b/docs/examples/scrobble.py @@ -1,44 +1,34 @@ #!/usr/bin/env python3 -import ampache import sys import time +import ampache + from multiprocessing import Process # user variables -ampache_url = 'https://develop.ampache.dev' -ampache_api = 'demodemo' -ampache_user = 'demo' - -ampacheConnection = ampache.API() +ampache_url = 'https://music.server' +ampache_api = 'mysuperapikey' +ampache_user = 'myusername' """ encrypt_string """ -encrypted_key = ampacheConnection.encrypt_string(ampache_api, ampache_user) - +encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) """ handshake """ +# processed details print('Connecting to:\n ', ampache_url) -ampache_session = ampacheConnection.handshake(ampache_url, encrypted_key) -print('\nThe ampache handshake for:\n ', - ampache_api, '\n\nReturned the following session key:\n ', - ampache_session) - -""" -if you didn't connect you can't do anything -""" -if not ampache_session: - print() - sys.exit('ERROR: Failed to connect to ' + ampache_url) - -""" -scrobble -""" -if ampache_session: - Process(target=ampacheConnection.scrobble, - args=('Beneath The Cold Clay', 'Crust', '...and a Dirge Becomes an Anthem', - '', '', '', int(time.time()))).start() +src_api = ampache_api +ampache_api = ampache.handshake(ampache_url, encrypted_key) +print('\nThe ampache handshake for:\n ', src_api, '\n\nReturned the following session key:\n ', ampache_api) +if not ampache_api: + print() + sys.exit('ERROR: Failed to connect to ' + ampache_url) + +Process(target=ampache.scrobble, + args=(ampache_url, ampache_api, 'Hear.Life.Spoken', 'Sub Atari Knives', 'Unearthed', + '', '', '', int(time.time()))).start() diff --git a/docs/examples/update_from_tags.py b/docs/examples/update_from_tags.py deleted file mode 100644 index fa43fd9e..00000000 --- a/docs/examples/update_from_tags.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 - -import configparser -import os -import re -import shutil -import sys -import time - -import ampache - -# user variables -ampache_url = 'https://develop.ampache.dev' -ampache_api = 'demodemo' -ampache_user = 'demo' - -# xml or json supported formats -api_format = 'json' -api_version = '5.0.0' - -""" -handshake -""" -print('Connecting to:\n ', ampache_url) -ampacheConnection = ampache.API() -ampacheConnection.set_debug(False) -ampacheConnection.set_format(api_format) -encrypted_key = ampacheConnection.encrypt_string(ampache_api, ampache_user) -ampache_session = ampacheConnection.handshake(ampache_url, encrypted_key, False, False, api_version) - -if not ampache_api: - print() - sys.exit('ERROR: Failed to connect to ' + ampache_url) - -my_list = [1] -# for each artist get their albums and update_from tags to help keep alive while updating -for artist in my_list: - print("\nArtist:", artist) - albums = ampacheConnection.artist_albums(artist) - for child in albums['album']: - print("-------", child['name'], "-", child['artist']['name']) - ampacheConnection.ping(ampache_url, ampache_session, api_version) - ampacheConnection.update_from_tags('album', int(child['id'])) - diff --git a/docs/json-responses/advanced_search (album).json b/docs/json-responses/advanced_search (album).json index bb86ade4..82f0a6bb 100644 --- a/docs/json-responses/advanced_search (album).json +++ b/docs/json-responses/advanced_search (album).json @@ -1,30 +1,100 @@ -{ - "album": [ - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" +[ + { + "id": "57887", + "name": "(It (Is) It) Critical Band", + "artist": { + "id": "9205", + "name": "90 Day Men \/ GoGoGoAirheart" + }, + "year": 2000, + "tracks": 8, + "disk": 1, + "tag": [ + { + "id": "674", + "name": "Math Rock" }, - "time": 4568, - "year": 2007, - "tracks": [], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null - } - ] -} \ No newline at end of file + { + "id": "1415", + "name": "Post Rock" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=57887&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "d6fc36cc-9351-4b53-b7db-7f5b30804800" + }, + { + "id": "43867", + "name": "(It's Not Me) Talking", + "artist": { + "id": "1229", + "name": "Flock of Seagulls" + }, + "year": 1983, + "tracks": 4, + "disk": 1, + "tag": [], + "art": "https:\/\/music.com.au\/image.php?object_id=43867&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "mbid": null + }, + { + "id": "33429", + "name": "+-", + "artist": { + "id": "456", + "name": "Joy Division" + }, + "year": 2010, + "tracks": 19, + "disk": 9, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "36", + "name": "Indie Rock" + }, + { + "id": "48", + "name": "New Wave" + }, + { + "id": "73", + "name": "Post-Punk" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=33429&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "mbid": "85bd4a0e-d28a-442c-922e-394b939e7af9" + }, + { + "id": "73836", + "name": "... De Los Valles y Las Monta\u00f1as", + "artist": { + "id": "16949", + "name": "Bosques de mi Mente" + }, + "year": 2016, + "tracks": 10, + "disk": 1, + "tag": [], + "art": "https:\/\/music.com.au\/image.php?object_id=73836&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "3e775784-6e32-4433-9023-8711cff98df3" + } +] \ No newline at end of file diff --git a/docs/json-responses/advanced_search (artist).json b/docs/json-responses/advanced_search (artist).json index 039cace0..441d3959 100644 --- a/docs/json-responses/advanced_search (artist).json +++ b/docs/json-responses/advanced_search (artist).json @@ -1,47 +1,186 @@ -{ - "artist": [ - { - "id": "16", - "name": "CARN\u00daN", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 9, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=16&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": "", - "summary": " ", - "time": 3873, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "2", - "name": "Synthetic", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 12, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": "1", - "summary": "Synthetic was formed in the late 90's by Steve Engler (formerly of Primitive Modern, Twitch Revolt & Domestic Violence), Synthetic is an eclectic act. Influences range from Aphex Twin to Frank Zappa and everything in between. Currently has 3 remixes on Bush-of-ghosts.com under artist names: AAASYNTHETIC and STEVEEDENVER. Has several remixes on RealWorldRemixed.com (Peter Gabriel's Label). Also is he represented on mp3unsigned.com as Synthetic. Synthetic has completed 5 LPs and 8-10 EPs. ", - "time": 4568, - "yearformed": 0, - "placeformed": "" - } - ] -} \ No newline at end of file +[ + { + "id": "58", + "name": "Ratatat", + "albums": 2, + "songs": 25, + "tag": [ + { + "id": "4", + "name": "Electronic" + }, + { + "id": "6", + "name": "Rock" + }, + { + "id": "16", + "name": "Alternative" + }, + { + "id": "36", + "name": "Indie Rock" + }, + { + "id": "55", + "name": "Electro" + }, + { + "id": "77", + "name": "Experimental" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=58&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "f467181e-d5e0-4285-b47e-e853dcc89ee7", + "summary": "Ratatat, from Brooklyn, New York, United States is an electronic music duo: guitarist Mike Stroud and synthesizer driver and producer Evan Mast (E*Vax).\n\nStroud and Mast originally met as students at Skidmore College, but did not work together musically until 2001, when their project was named Cherry (later the name of the final song on their debut album). Written and recorded in the bedroom of Mast's Crown Heights, Brooklyn apartment, the band's debut album Ratatat for XL Recordings was released in 2004. ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "145", + "name": "Nine Inch Nails", + "albums": 25, + "songs": 231, + "tag": [ + { + "id": "3", + "name": "Punk" + }, + { + "id": "4", + "name": "Electronic" + }, + { + "id": "6", + "name": "Rock" + }, + { + "id": "9", + "name": "Industrial" + }, + { + "id": "11", + "name": "Techno" + }, + { + "id": "28", + "name": "House" + }, + { + "id": "33", + "name": "Alternative Rock" + }, + { + "id": "36", + "name": "Indie Rock" + }, + { + "id": "43", + "name": "Soundtrack" + }, + { + "id": "46", + "name": "Ambient" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=145&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "mbid": "b7ffd2af-418f-4be2-bdd1-22f8b48613da", + "summary": "Nine Inch Nails, commonly abbreviated as NIN (stylized as NI\u0418), is an American industrial rock band formed in 1988 in Cleveland, Ohio. Singer, songwriter, multi-instrumentalist, and producer Trent Reznor was the only permanent member of the band until the official addition of English musician Atticus Ross in 2016. \n\nReznor recorded the band's debut album, Pretty Hate Machine (1989), while working overnight as a janitor at a Cleveland recording studio. ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "559", + "name": "Jos\u00e9 Gonz\u00e1lez", + "albums": 3, + "songs": 31, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "22", + "name": "Pop" + }, + { + "id": "36", + "name": "Indie Rock" + }, + { + "id": "70", + "name": "Folk" + }, + { + "id": "378", + "name": "Acoustic" + }, + { + "id": "1396", + "name": "Folk Rock" + }, + { + "id": "2367", + "name": "Folk World & Country" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=559&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "cd8c5019-5d75-4d5c-bc28-e1e26a7dd5c8", + "summary": "Jos\u00e9 Gonz\u00e1lez (born 1978 in Gothenburg, Sweden) is a Swedish indie folk singer-songwriter and guitarist (of Argentinian extraction). In 2003, he released his debut album, Veneer, in Europe. The album has since been released in the UK, on April 25, 2005, and in the United States on September 6, 2005. Gonz\u00e1lez is also a member of the Swedish band Junip, along with Elias Araya and Tobias Winterkorn.\n\nThe song Crosses, from Crosses EP and the later Veneer ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "704", + "name": "Robert Rich", + "albums": 6, + "songs": 45, + "tag": [ + { + "id": "4", + "name": "Electronic" + }, + { + "id": "19", + "name": "New Age" + }, + { + "id": "46", + "name": "Ambient" + }, + { + "id": "53", + "name": "Dark Ambient" + }, + { + "id": "77", + "name": "Experimental" + }, + { + "id": "80", + "name": "Trance" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=704&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "93209865-ebeb-4346-96a5-f64305cd0185", + "summary": "Robert Rich (born August 23, 1963) is an ambient musician and composer based in San Francisco, California, United States.\n\nWith a musical career spanning three decades and over 30 albums, Robert Rich has helped define the genres of ambient music, dark ambient, tribal ambient and trance, yet his music remains hard to categorize. Part of his unique sound comes from using home-made acoustic and electronic instruments, microtonal harmonies, computer-based signal processing, chaotic systems and feedback networks. ", + "yearformed": "0", + "placeformed": "" + } +] \ No newline at end of file diff --git a/docs/json-responses/advanced_search (song).json b/docs/json-responses/advanced_search (song).json index 90e2d732..c07b547f 100644 --- a/docs/json-responses/advanced_search (song).json +++ b/docs/json-responses/advanced_search (song).json @@ -1,115 +1,236 @@ -{ - "song": [ - { - "id": "109", - "title": "Dance with the Devil", - "name": "Dance with the Devil", - "artist": { - "id": "34", - "name": "Comedown Kid" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/03ComedownKid-DanceWithTheDevil.wma", - "genre": [], - "playlisttrack": 1, - "time": 116, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=109&uid=4&player=api&name=Comedown%20Kid%20-%20Dance%20with%20the%20Devil.wma", - "size": 483444, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null +[ + { + "id": "802560", + "title": "Baker Street", + "name": "Baker Street", + "artist": { + "id": "254", + "name": "Foo Fighters" }, - { - "id": "126", - "title": "Don't Show This Message Again", - "name": "Don't Show This Message Again", - "artist": { - "id": "36", - "name": "Comfort Fit" + "album": { + "id": "71644", + "name": "My Hero" + }, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "22", + "name": "Pop" }, - "album": { - "id": "21", - "name": "Forget and Remember" + { + "id": "33", + "name": "Alternative Rock" + } + ], + "filename": "\/mnt\/music\/Foo Fighters\/(1998) My Hero (single) [CDCL 796]\/102 - Baker Street.mp3", + "track": 2, + "playlisttrack": 1, + "time": 339, + "year": 1998, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=802560&uid=2&player=api&name=Foo%20Fighters%20-%20Baker%20Street.mp3", + "size": 13650833, + "mbid": "57497521-16ac-4870-8fe0-4f486652d8ef", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=71644&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Gerry Rafferty", + "channels": null, + "comment": "", + "publisher": "Capitol Records", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-7.200000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" + { + "name": "Pop" }, - "disk": 1, - "track": 12, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/12 - Don\u2019t Show This Message Again.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 2, - "time": 197, - "year": 2005, - "bitrate": 232690, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=126&uid=4&player=api&name=Comfort%20Fit%20-%20Don-t%20Show%20This%20Message%20Again.mp3", - "size": 5755191, - "mbid": "6b582438-c034-47c2-86b0-61c63ec96b4b", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-12-comfort_fit-dont_show_this_message_again\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + { + "name": "Alternative Rock" + } + ] + }, + { + "id": "1008", + "title": "Coma (original version)", + "name": "Coma (original version)", + "artist": { + "id": "8990", + "name": "Pendulum" + }, + "album": { + "id": "67470", + "name": "Coma" + }, + "tag": [ + { + "id": "28", + "name": "House" + } + ], + "filename": "\/mnt\/music\/Pendulum\/(1998) Coma\/104 - Coma (Original Version).mp3", + "track": 4, + "playlisttrack": 2, + "time": 406, + "year": 1998, + "bitrate": 250659, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=1008&uid=2&player=api&name=Pendulum%20-%20Coma%20-original%20version-.mp3", + "size": 12778055, + "mbid": "1dc5a9ce-0867-4a41-a0bc-71e015e3c8ad", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=67470&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-5.670000", + "replaygain_track_peak": "0.977000", + "genre": [ + { + "name": "House" + } + ] + }, + { + "id": "1026", + "title": "Crush", + "name": "Crush", + "artist": { + "id": "57", + "name": "Pendulum" + }, + "album": { + "id": "48760", + "name": "Immersion" + }, + "tag": [ + { + "id": "1461", + "name": "Drum N Bass" + } + ], + "filename": "\/mnt\/music\/Pendulum\/(2010) Immersion\/105 - Crush.mp3", + "track": 5, + "playlisttrack": 3, + "time": 253, + "year": 2010, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=1026&uid=2&player=api&name=Pendulum%20-%20Crush.mp3", + "size": 10357155, + "mbid": "55375fb8-162b-4539-bb1f-88524eadb442", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=48760&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-11.120000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Drum N Bass" + } + ] + }, + { + "id": "1084", + "title": "Fasten Your Seatbelt", + "name": "Fasten Your Seatbelt", + "artist": { + "id": "57", + "name": "Pendulum" + }, + "album": { + "id": "48761", + "name": "Hold Your Colour" + }, + "tag": [ + { + "id": "1461", + "name": "Drum N Bass" + } + ], + "filename": "\/mnt\/music\/Pendulum\/(2005) Hold Your Colour\/104 - Fasten Your Seatbelt.mp3", + "track": 4, + "playlisttrack": 4, + "time": 398, + "year": 2007, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=1084&uid=2&player=api&name=Pendulum%20-%20Fasten%20Your%20Seatbelt.mp3", + "size": 15937872, + "mbid": "7f151e01-0e89-4c37-9c6d-85311eea23bf", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=48761&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Matt Cantor", + "channels": null, + "comment": "", + "publisher": "Breakbeat Kaos", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-9.080000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Drum N Bass" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/album (with include).json b/docs/json-responses/album (with include).json deleted file mode 100644 index 20b43fb4..00000000 --- a/docs/json-responses/album (with include).json +++ /dev/null @@ -1,509 +0,0 @@ -{ - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [ - { - "id": "110", - "title": "I wanna walk through the fire", - "name": "I wanna walk through the fire", - "artist": { - "id": "23", - "name": "Manic Notion" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/01ManicNotion-IWannaWalkThroughTheFire.m4a", - "genre": [], - "playlisttrack": 1, - "time": 197, - "year": 2012, - "bitrate": 267320, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=110&uid=4&player=api&name=Manic%20Notion%20-%20I%20wanna%20walk%20through%20the%20fire.m4a", - "size": 6651911, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.150000", - "replaygain_track_peak": "0.989000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "114", - "title": "He is the Master of War", - "name": "He is the Master of War", - "artist": { - "id": "26", - "name": "Stress Builds Character" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/02StressBuildsCharacter-HeIsTheMasterOfWar.m4a", - "genre": [], - "playlisttrack": 2, - "time": 233, - "year": 2012, - "bitrate": 256245, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=114&uid=4&player=api&name=Stress%20Builds%20Character%20-%20He%20is%20the%20Master%20of%20War.m4a", - "size": 7535126, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-10.740000", - "replaygain_track_peak": "1.035000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "109", - "title": "Dance with the Devil", - "name": "Dance with the Devil", - "artist": { - "id": "34", - "name": "Comedown Kid" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/03ComedownKid-DanceWithTheDevil.wma", - "genre": [], - "playlisttrack": 3, - "time": 116, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=109&uid=4&player=api&name=Comedown%20Kid%20-%20Dance%20with%20the%20Devil.wma", - "size": 483444, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "113", - "title": "Representin", - "name": "Representin", - "artist": { - "id": "32", - "name": "Shorty Mac" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/04ShortyMac-Representin.mp3", - "genre": [], - "playlisttrack": 4, - "time": 234, - "year": 2012, - "bitrate": 123814, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=113&uid=4&player=api&name=Shorty%20Mac%20-%20Representin.mp3", - "size": 3628327, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "http:\/\/archive.org\/details\/gt477BuriedInNausea", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "1.910000", - "replaygain_track_peak": "0.851000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "111", - "title": "The art of free expression", - "name": "The art of free expression", - "artist": { - "id": "35", - "name": "Tip-C" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/05Tip-c-TheArtOfFreeExpression.wma", - "genre": [], - "playlisttrack": 5, - "time": 110, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=111&uid=4&player=api&name=Tip-C%20-%20The%20art%20of%20free%20expression.wma", - "size": 460498, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "108", - "title": "I've been down this road before", - "name": "I've been down this road before", - "artist": { - "id": "21", - "name": "Tip-C (featuring Mike Beers)" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/06Tip-cfeaturingMikeBeers-IveBeenDownThisRoadBefore.wma", - "genre": [], - "playlisttrack": 6, - "time": 252, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=108&uid=4&player=api&name=Tip-C%20-featuring%20Mike%20Beers-%20-%20I-ve%20been%20down%20this%20road%20before.wma", - "size": 1035322, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "115", - "title": "Are we going Crazy", - "name": "Are we going Crazy", - "artist": { - "id": "27", - "name": "Chi.Otic" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/07Chi.otic-AreWeGoingCrazy.wma", - "genre": [], - "playlisttrack": 7, - "time": 433, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=115&uid=4&player=api&name=Chi.Otic%20-%20Are%20we%20going%20Crazy.wma", - "size": 1776580, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "112", - "title": "Personal Truth", - "name": "Personal Truth", - "artist": { - "id": "33", - "name": "MxBxCx" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/08Mxbxcx-PersonalTruth.mp3", - "genre": [], - "playlisttrack": 8, - "time": 208, - "year": 2012, - "bitrate": 179860, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=112&uid=4&player=api&name=MxBxCx%20-%20Personal%20Truth.mp3", - "size": 4693165, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "http:\/\/archive.org\/details\/gt477BuriedInNausea", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-8.270000", - "replaygain_track_peak": "0.881000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "107", - "title": "Arrest Me", - "name": "Arrest Me", - "artist": { - "id": "20", - "name": "R\/B" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/09R_b-ArrestMe.m4a", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "playlisttrack": 9, - "time": 96, - "year": 2012, - "bitrate": 252864, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=107&uid=4&player=api&name=R-B%20-%20Arrest%20Me.m4a", - "size": 3091727, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-1.350000", - "replaygain_track_peak": "0.881000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null -} \ No newline at end of file diff --git a/docs/json-responses/album.json b/docs/json-responses/album.json index d1706aad..c4ef1f15 100644 --- a/docs/json-responses/album.json +++ b/docs/json-responses/album.json @@ -1,26 +1,29 @@ -{ - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null -} \ No newline at end of file +[ + { + "id": "54130", + "name": "\"...Famous Last Words...\"", + "artist": { + "id": "6778", + "name": "Supertramp" + }, + "year": 2002, + "tracks": 9, + "disk": 1, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "47", + "name": "Pop Rock" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=54130&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "dc0bdca9-ae06-426b-9a43-f23334d0e939" + } +] \ No newline at end of file diff --git a/docs/json-responses/album_songs.json b/docs/json-responses/album_songs.json index edcdc368..b0662e14 100644 --- a/docs/json-responses/album_songs.json +++ b/docs/json-responses/album_songs.json @@ -1,216 +1,250 @@ -{ - "song": [ - { - "id": "110", - "title": "I wanna walk through the fire", - "name": "I wanna walk through the fire", - "artist": { - "id": "23", - "name": "Manic Notion" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" +[ + { + "id": "130769", + "title": "Crazy", + "name": "Crazy", + "artist": { + "id": "6778", + "name": "Supertramp" + }, + "album": { + "id": "54130", + "name": "\"...Famous Last Words...\"" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "19", - "name": "Various Artists" + { + "id": "47", + "name": "Pop Rock" + } + ], + "filename": "\/mnt\/music\/Supertramp\/(1982) \"...Famous Last Words...\" [493 353-2]\/101 - Crazy.mp3", + "track": 1, + "playlisttrack": 1, + "time": 284, + "year": 2002, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=130769&uid=2&player=api&name=Supertramp%20-%20Crazy.mp3", + "size": 11401970, + "mbid": "1f54f7f0-f63b-47d0-abcc-e06db26ba9f0", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=54130&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "Roger Hodgson", + "channels": null, + "comment": "", + "publisher": "A&M Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-7.660000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/01ManicNotion-IWannaWalkThroughTheFire.m4a", - "genre": [], - "playlisttrack": 1, - "time": 197, - "year": 2012, - "bitrate": 267320, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=110&uid=4&player=api&name=Manic%20Notion%20-%20I%20wanna%20walk%20through%20the%20fire.m4a", - "size": 6651911, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.150000", - "replaygain_track_peak": "0.989000", - "r128_album_gain": null, - "r128_track_gain": null + { + "name": "Pop Rock" + } + ] + }, + { + "id": "130773", + "title": "Put on Your Old Brown Shoes", + "name": "Put on Your Old Brown Shoes", + "artist": { + "id": "6778", + "name": "Supertramp" }, - { - "id": "114", - "title": "He is the Master of War", - "name": "He is the Master of War", - "artist": { - "id": "26", - "name": "Stress Builds Character" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" + "album": { + "id": "54130", + "name": "\"...Famous Last Words...\"" + }, + "tag": [ + { + "id": "47", + "name": "Pop Rock" }, - "albumartist": { - "id": "19", - "name": "Various Artists" + { + "id": "6", + "name": "Rock" + } + ], + "filename": "\/mnt\/music\/Supertramp\/(1982) \"...Famous Last Words...\" [493 353-2]\/102 - Put on Your Old Brown Shoes.mp3", + "track": 2, + "playlisttrack": 2, + "time": 259, + "year": 2002, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=130773&uid=2&player=api&name=Supertramp%20-%20Put%20on%20Your%20Old%20Brown%20Shoes.mp3", + "size": 10400957, + "mbid": "d837f15b-e74d-4463-8bdb-25c36eb9c7a5", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=54130&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Rick Davies", + "channels": null, + "comment": "", + "publisher": "A&M Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-5.630000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Pop Rock" }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/02StressBuildsCharacter-HeIsTheMasterOfWar.m4a", - "genre": [], - "playlisttrack": 2, - "time": 233, - "year": 2012, - "bitrate": 256245, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=114&uid=4&player=api&name=Stress%20Builds%20Character%20-%20He%20is%20the%20Master%20of%20War.m4a", - "size": 7535126, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-10.740000", - "replaygain_track_peak": "1.035000", - "r128_album_gain": null, - "r128_track_gain": null + { + "name": "Rock" + } + ] + }, + { + "id": "130770", + "title": "It's Raining Again", + "name": "It's Raining Again", + "artist": { + "id": "6778", + "name": "Supertramp" }, - { - "id": "109", - "title": "Dance with the Devil", - "name": "Dance with the Devil", - "artist": { - "id": "34", - "name": "Comedown Kid" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" + "album": { + "id": "54130", + "name": "\"...Famous Last Words...\"" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "19", - "name": "Various Artists" + { + "id": "47", + "name": "Pop Rock" + } + ], + "filename": "\/mnt\/music\/Supertramp\/(1982) \"...Famous Last Words...\" [493 353-2]\/103 - It's Raining Again.mp3", + "track": 3, + "playlisttrack": 3, + "time": 264, + "year": 2002, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=130770&uid=2&player=api&name=Supertramp%20-%20It-s%20Raining%20Again.mp3", + "size": 10583815, + "mbid": "45b93719-bc48-4ee9-bb7a-b5f8b8a2e5f5", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=54130&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "Roger Hodgson", + "channels": null, + "comment": "", + "publisher": "A&M Records", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-7.840000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/03ComedownKid-DanceWithTheDevil.wma", - "genre": [], - "playlisttrack": 3, - "time": 116, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=109&uid=4&player=api&name=Comedown%20Kid%20-%20Dance%20with%20the%20Devil.wma", - "size": 483444, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null + { + "name": "Pop Rock" + } + ] + }, + { + "id": "130776", + "title": "Bonnie", + "name": "Bonnie", + "artist": { + "id": "6778", + "name": "Supertramp" }, - { - "id": "113", - "title": "Representin", - "name": "Representin", - "artist": { - "id": "32", - "name": "Shorty Mac" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" + "album": { + "id": "54130", + "name": "\"...Famous Last Words...\"" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "19", - "name": "Various Artists" + { + "id": "47", + "name": "Pop Rock" + } + ], + "filename": "\/mnt\/music\/Supertramp\/(1982) \"...Famous Last Words...\" [493 353-2]\/104 - Bonnie.mp3", + "track": 4, + "playlisttrack": 4, + "time": 335, + "year": 2002, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=130776&uid=2&player=api&name=Supertramp%20-%20Bonnie.mp3", + "size": 13441610, + "mbid": "849a2238-5854-4f02-8b6b-4800281775be", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=54130&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "Rick Davies", + "channels": null, + "comment": "", + "publisher": "A&M Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-6.760000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/04ShortyMac-Representin.mp3", - "genre": [], - "playlisttrack": 4, - "time": 234, - "year": 2012, - "bitrate": 123814, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=113&uid=4&player=api&name=Shorty%20Mac%20-%20Representin.mp3", - "size": 3628327, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "http:\/\/archive.org\/details\/gt477BuriedInNausea", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "1.910000", - "replaygain_track_peak": "0.851000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + { + "name": "Pop Rock" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/albums (with include).json b/docs/json-responses/albums (with include).json deleted file mode 100644 index 519f549f..00000000 --- a/docs/json-responses/albums (with include).json +++ /dev/null @@ -1,727 +0,0 @@ -{ - "album": [ - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "time": 4568, - "year": 2007, - "tracks": [ - { - "id": "56", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/01-Synthetic_-_BlackBlueSmokeDM20k22kh_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 500, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=56&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.mp3", - "size": 4010069, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.110000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "64", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/01-Synthetic_-_BlackBlueSmokeDM20k22kh.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 500, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=64&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.wma", - "size": 1298295, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "59", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/02-Synthetic_-_YellowSmoke20k22hS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 3, - "time": 290, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=59&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.mp3", - "size": 2325568, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "2.750000", - "replaygain_track_peak": "0.716000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "65", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/02-Synthetic_-_YellowSmoke20k22hS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 4, - "time": 290, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=65&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.wma", - "size": 754935, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "57", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/03-Synthetic_-_PurpleSmokeVMix20k22khS2_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 5, - "time": 390, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=57&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.mp3", - "size": 3131519, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.130000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "62", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/03-Synthetic_-_PurpleSmokeVMix20k22khS2.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 6, - "time": 390, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=62&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.wma", - "size": 1014135, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "58", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/04-Synthetic_-_BrownSmokeYSBM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 7, - "time": 304, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=58&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.mp3", - "size": 2441886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "0.960000", - "replaygain_track_peak": "0.912000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "60", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/04-Synthetic_-_BrownSmokeYSBM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 8, - "time": 304, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=60&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.wma", - "size": 792375, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 9, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "55", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 10, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=55&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-4.060000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "61", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/05-Synthetic_-_RedGreenSmokePM20k44khM.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 11, - "time": 400, - "year": 2007, - "bitrate": 20627, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=61&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.wma", - "size": 1044851, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "63", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/05-Synthetic_-_RedGreenSmokePM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 12, - "time": 400, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=63&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.wma", - "size": 1041065, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/albums.json b/docs/json-responses/albums.json index bb86ade4..8fcb16c6 100644 --- a/docs/json-responses/albums.json +++ b/docs/json-responses/albums.json @@ -1,30 +1,29 @@ -{ - "album": [ - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" +[ + { + "id": "57887", + "name": "(It (Is) It) Critical Band", + "artist": { + "id": "9205", + "name": "90 Day Men \/ GoGoGoAirheart" + }, + "year": 2000, + "tracks": 8, + "disk": 1, + "tag": [ + { + "id": "674", + "name": "Math Rock" }, - "time": 4568, - "year": 2007, - "tracks": [], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null - } - ] -} \ No newline at end of file + { + "id": "1415", + "name": "Post Rock" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=57887&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "d6fc36cc-9351-4b53-b7db-7f5b30804800" + } +] \ No newline at end of file diff --git a/docs/json-responses/artist (with include albums).json b/docs/json-responses/artist (with include albums).json deleted file mode 100644 index 4da76a9c..00000000 --- a/docs/json-responses/artist (with include albums).json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "id": "2", - "name": "Synthetic", - "albums": [ - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "time": 4568, - "year": 2007, - "tracks": [], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null - } - ], - "albumcount": 1, - "songs": [], - "songcount": 12, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": "1", - "summary": "Synthetic was formed in the late 90's by Steve Engler (formerly of Primitive Modern, Twitch Revolt & Domestic Violence), Synthetic is an eclectic act. Influences range from Aphex Twin to Frank Zappa and everything in between. Currently has 3 remixes on Bush-of-ghosts.com under artist names: AAASYNTHETIC and STEVEEDENVER. Has several remixes on RealWorldRemixed.com (Peter Gabriel's Label). Also is he represented on mp3unsigned.com as Synthetic. Synthetic has completed 5 LPs and 8-10 EPs. ", - "time": 4568, - "yearformed": 0, - "placeformed": "" -} \ No newline at end of file diff --git a/docs/json-responses/artist (with include songs).json b/docs/json-responses/artist (with include songs).json deleted file mode 100644 index e7627edb..00000000 --- a/docs/json-responses/artist (with include songs).json +++ /dev/null @@ -1,721 +0,0 @@ -{ - "id": "2", - "name": "Synthetic", - "albums": [], - "albumcount": 1, - "songs": [ - { - "id": "64", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/01-Synthetic_-_BlackBlueSmokeDM20k22kh.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 500, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=64&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.wma", - "size": 1298295, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "56", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/01-Synthetic_-_BlackBlueSmokeDM20k22kh_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 500, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=56&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.mp3", - "size": 4010069, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.110000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "65", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/02-Synthetic_-_YellowSmoke20k22hS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 3, - "time": 290, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=65&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.wma", - "size": 754935, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "59", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/02-Synthetic_-_YellowSmoke20k22hS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 4, - "time": 290, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=59&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.mp3", - "size": 2325568, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "2.750000", - "replaygain_track_peak": "0.716000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "57", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/03-Synthetic_-_PurpleSmokeVMix20k22khS2_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 5, - "time": 390, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=57&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.mp3", - "size": 3131519, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.130000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "62", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/03-Synthetic_-_PurpleSmokeVMix20k22khS2.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 6, - "time": 390, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=62&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.wma", - "size": 1014135, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "60", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/04-Synthetic_-_BrownSmokeYSBM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 7, - "time": 304, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=60&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.wma", - "size": 792375, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "58", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/04-Synthetic_-_BrownSmokeYSBM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 8, - "time": 304, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=58&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.mp3", - "size": 2441886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "0.960000", - "replaygain_track_peak": "0.912000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "61", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/05-Synthetic_-_RedGreenSmokePM20k44khM.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 9, - "time": 400, - "year": 2007, - "bitrate": 20627, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=61&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.wma", - "size": 1044851, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "63", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/05-Synthetic_-_RedGreenSmokePM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 10, - "time": 400, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=63&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.wma", - "size": 1041065, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "55", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 11, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=55&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-4.060000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 12, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 12, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": "1", - "summary": "Synthetic was formed in the late 90's by Steve Engler (formerly of Primitive Modern, Twitch Revolt & Domestic Violence), Synthetic is an eclectic act. Influences range from Aphex Twin to Frank Zappa and everything in between. Currently has 3 remixes on Bush-of-ghosts.com under artist names: AAASYNTHETIC and STEVEEDENVER. Has several remixes on RealWorldRemixed.com (Peter Gabriel's Label). Also is he represented on mp3unsigned.com as Synthetic. Synthetic has completed 5 LPs and 8-10 EPs. ", - "time": 4568, - "yearformed": 0, - "placeformed": "" -} \ No newline at end of file diff --git a/docs/json-responses/artist (with include songs,albums).json b/docs/json-responses/artist (with include songs,albums).json deleted file mode 100644 index 491c5048..00000000 --- a/docs/json-responses/artist (with include songs,albums).json +++ /dev/null @@ -1,748 +0,0 @@ -{ - "id": "2", - "name": "Synthetic", - "albums": [ - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "time": 4568, - "year": 2007, - "tracks": [], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null - } - ], - "albumcount": 1, - "songs": [ - { - "id": "64", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/01-Synthetic_-_BlackBlueSmokeDM20k22kh.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 500, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=64&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.wma", - "size": 1298295, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "56", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/01-Synthetic_-_BlackBlueSmokeDM20k22kh_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 500, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=56&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.mp3", - "size": 4010069, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.110000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "65", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/02-Synthetic_-_YellowSmoke20k22hS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 3, - "time": 290, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=65&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.wma", - "size": 754935, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "59", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/02-Synthetic_-_YellowSmoke20k22hS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 4, - "time": 290, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=59&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.mp3", - "size": 2325568, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "2.750000", - "replaygain_track_peak": "0.716000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "57", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/03-Synthetic_-_PurpleSmokeVMix20k22khS2_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 5, - "time": 390, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=57&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.mp3", - "size": 3131519, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.130000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "62", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/03-Synthetic_-_PurpleSmokeVMix20k22khS2.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 6, - "time": 390, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=62&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.wma", - "size": 1014135, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "60", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/04-Synthetic_-_BrownSmokeYSBM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 7, - "time": 304, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=60&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.wma", - "size": 792375, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "58", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/04-Synthetic_-_BrownSmokeYSBM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 8, - "time": 304, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=58&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.mp3", - "size": 2441886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "0.960000", - "replaygain_track_peak": "0.912000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "61", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/05-Synthetic_-_RedGreenSmokePM20k44khM.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 9, - "time": 400, - "year": 2007, - "bitrate": 20627, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=61&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.wma", - "size": 1044851, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "63", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/05-Synthetic_-_RedGreenSmokePM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 10, - "time": 400, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=63&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.wma", - "size": 1041065, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "55", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 11, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=55&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-4.060000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 12, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 12, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": "1", - "summary": "Synthetic was formed in the late 90's by Steve Engler (formerly of Primitive Modern, Twitch Revolt & Domestic Violence), Synthetic is an eclectic act. Influences range from Aphex Twin to Frank Zappa and everything in between. Currently has 3 remixes on Bush-of-ghosts.com under artist names: AAASYNTHETIC and STEVEEDENVER. Has several remixes on RealWorldRemixed.com (Peter Gabriel's Label). Also is he represented on mp3unsigned.com as Synthetic. Synthetic has completed 5 LPs and 8-10 EPs. ", - "time": 4568, - "yearformed": 0, - "placeformed": "" -} \ No newline at end of file diff --git a/docs/json-responses/artist.json b/docs/json-responses/artist.json index 7c3b4779..b2d67f03 100644 --- a/docs/json-responses/artist.json +++ b/docs/json-responses/artist.json @@ -1,24 +1,31 @@ -{ - "id": "2", - "name": "Synthetic", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 12, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": "1", - "summary": "Synthetic was formed in the late 90's by Steve Engler (formerly of Primitive Modern, Twitch Revolt & Domestic Violence), Synthetic is an eclectic act. Influences range from Aphex Twin to Frank Zappa and everything in between. Currently has 3 remixes on Bush-of-ghosts.com under artist names: AAASYNTHETIC and STEVEEDENVER. Has several remixes on RealWorldRemixed.com (Peter Gabriel's Label). Also is he represented on mp3unsigned.com as Synthetic. Synthetic has completed 5 LPs and 8-10 EPs. ", - "time": 4568, - "yearformed": 0, - "placeformed": "" -} \ No newline at end of file +[ + { + "id": "2298", + "name": "The Cops", + "albums": 3, + "songs": 32, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "16", + "name": "Alternative" + }, + { + "id": "47", + "name": "Pop Rock" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=2298&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "mbid": "4035f854-00f1-43c7-b90b-41b0b541f8ee", + "summary": "There are at least two artists with this name.\n\n1. The Cops are a post-punk band from Seattle, Washington that formed in late 2003 with Michael Jaworski on lead vocals and guitar, John Randolph on guitar and David Weeks on drums. Seattle label Mt. Fuji Records released their debut EP Why Kids Go Wrong in March of 2005, and followed up to release the critically acclaimed full-length Get Good or Stay Bad in November of 2005. Former Supersuckers and Hater bassist ", + "yearformed": "0", + "placeformed": "" + } +] \ No newline at end of file diff --git a/docs/json-responses/artist_albums.json b/docs/json-responses/artist_albums.json index bb86ade4..0dc324f5 100644 --- a/docs/json-responses/artist_albums.json +++ b/docs/json-responses/artist_albums.json @@ -1,30 +1,56 @@ -{ - "album": [ - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "time": 4568, - "year": 2007, - "tracks": [], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null - } - ] -} \ No newline at end of file +[ + { + "id": "52480", + "name": "Drop It in Their Laps", + "artist": { + "id": "2298", + "name": "Cops" + }, + "year": 2007, + "tracks": 13, + "disk": 1, + "tag": [], + "art": "https:\/\/music.com.au\/image.php?object_id=52480&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "mbid": "562ad680-4423-456c-9d5b-224c5ad4e019" + }, + { + "id": "52482", + "name": "80 in the Shade", + "artist": { + "id": "2298", + "name": "Cops" + }, + "year": 2006, + "tracks": 4, + "disk": 1, + "tag": [], + "art": "https:\/\/music.com.au\/image.php?object_id=52482&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "0000d81a-136a-48c3-9c08-2cd45df6467b" + }, + { + "id": "52481", + "name": "Stomp on Tripwires", + "artist": { + "id": "2298", + "name": "Cops" + }, + "year": 2004, + "tracks": 15, + "disk": 1, + "tag": [], + "art": "https:\/\/music.com.au\/image.php?object_id=52481&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": 3, + "rating": 3, + "averagerating": null, + "mbid": "839643bb-3304-4ae0-bd3d-94246523a995" + } +] \ No newline at end of file diff --git a/docs/json-responses/artist_songs.json b/docs/json-responses/artist_songs.json index 4cc79487..308b9af6 100644 --- a/docs/json-responses/artist_songs.json +++ b/docs/json-responses/artist_songs.json @@ -1,236 +1,250 @@ -{ - "song": [ - { - "id": "64", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" +[ + { + "id": "95577", + "title": "Out of the Fridge \/ Into the Fire", + "name": "Out of the Fridge \/ Into the Fire", + "artist": { + "id": "2298", + "name": "The Cops" + }, + "album": { + "id": "52480", + "name": "Drop It in Their Laps" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "2", - "name": "Synthetic" + { + "id": "47", + "name": "Pop Rock" + } + ], + "filename": "\/mnt\/music\/The Cops\/(2007) Drop It in Their Laps [IR5225CD]\/101 - Out of the Fridge _ Into the Fire.mp3", + "track": 1, + "playlisttrack": 1, + "time": 261, + "year": 2007, + "bitrate": 320031, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=95577&uid=2&player=api&name=The%20Cops%20-%20Out%20of%20the%20Fridge%20-%20Into%20the%20Fire.mp3", + "size": 10454247, + "mbid": "b3d81e9c-0a7a-48dc-9888-f48f2325dfe5", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=52480&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Inertia Recordings", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.870000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/01-Synthetic_-_BlackBlueSmokeDM20k22kh.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 500, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=64&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.wma", - "size": 1298295, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null + { + "name": "Pop Rock" + } + ] + }, + { + "id": "95571", + "title": "Cop Pop", + "name": "Cop Pop", + "artist": { + "id": "2298", + "name": "The Cops" }, - { - "id": "56", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" + "album": { + "id": "52480", + "name": "Drop It in Their Laps" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "2", - "name": "Synthetic" + { + "id": "47", + "name": "Pop Rock" + } + ], + "filename": "\/mnt\/music\/The Cops\/(2007) Drop It in Their Laps [IR5225CD]\/102 - Cop Pop.mp3", + "track": 2, + "playlisttrack": 2, + "time": 168, + "year": 2007, + "bitrate": 320049, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=95571&uid=2&player=api&name=The%20Cops%20-%20Cop%20Pop.mp3", + "size": 6767074, + "mbid": "85932e71-c812-46ec-8765-1beb98665888", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=52480&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Inertia Recordings", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.390000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/01-Synthetic_-_BlackBlueSmokeDM20k22kh_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 500, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=56&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.mp3", - "size": 4010069, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.110000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null + { + "name": "Pop Rock" + } + ] + }, + { + "id": "95575", + "title": "Call Me Anytime", + "name": "Call Me Anytime", + "artist": { + "id": "2298", + "name": "The Cops" }, - { - "id": "65", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" + "album": { + "id": "52480", + "name": "Drop It in Their Laps" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "2", - "name": "Synthetic" + { + "id": "47", + "name": "Pop Rock" + } + ], + "filename": "\/mnt\/music\/The Cops\/(2007) Drop It in Their Laps [IR5225CD]\/103 - Call Me Anytime.mp3", + "track": 3, + "playlisttrack": 3, + "time": 229, + "year": 2007, + "bitrate": 320036, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=95575&uid=2&player=api&name=The%20Cops%20-%20Call%20Me%20Anytime.mp3", + "size": 9178427, + "mbid": "eba800a2-cc6a-4f35-926b-553ae6a7302b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=52480&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Inertia Recordings", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.030000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/02-Synthetic_-_YellowSmoke20k22hS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 3, - "time": 290, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=65&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.wma", - "size": 754935, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null + { + "name": "Pop Rock" + } + ] + }, + { + "id": "95582", + "title": "The Message", + "name": "The Message", + "artist": { + "id": "2298", + "name": "The Cops" }, - { - "id": "59", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" + "album": { + "id": "52480", + "name": "Drop It in Their Laps" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "2", - "name": "Synthetic" + { + "id": "47", + "name": "Pop Rock" + } + ], + "filename": "\/mnt\/music\/The Cops\/(2007) Drop It in Their Laps [IR5225CD]\/104 - The Message.mp3", + "track": 4, + "playlisttrack": 4, + "time": 253, + "year": 2007, + "bitrate": 320032, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=95582&uid=2&player=api&name=The%20Cops%20-%20The%20Message.mp3", + "size": 10133464, + "mbid": "588a5193-cc90-4392-ace2-a16db728d3f7", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=52480&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Inertia Recordings", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.500000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/02-Synthetic_-_YellowSmoke20k22hS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 4, - "time": 290, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=59&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.mp3", - "size": 2325568, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "2.750000", - "replaygain_track_peak": "0.716000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + { + "name": "Pop Rock" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/artists (with include albums).json b/docs/json-responses/artists (with include albums).json deleted file mode 100644 index 83759452..00000000 --- a/docs/json-responses/artists (with include albums).json +++ /dev/null @@ -1,188 +0,0 @@ -{ - "artist": [ - { - "id": "16", - "name": "CARN\u00daN", - "albums": [ - { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "time": 3873, - "year": 1996, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": null, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": null - } - ], - "albumcount": 1, - "songs": [], - "songcount": 9, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=16&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": "", - "summary": " ", - "time": 3873, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "27", - "name": "Chi.Otic", - "albums": [ - { - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null - } - ], - "albumcount": 0, - "songs": [], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=27&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "7", - "summary": " ", - "time": 433, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "34", - "name": "Comedown Kid", - "albums": [ - { - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null - } - ], - "albumcount": 0, - "songs": [], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=34&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "", - "summary": null, - "time": 116, - "yearformed": 0, - "placeformed": null - }, - { - "id": "36", - "name": "Comfort Fit", - "albums": [ - { - "id": "21", - "name": "Forget and Remember", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "time": 4248, - "year": 2005, - "tracks": [], - "songcount": 20, - "diskcount": 1, - "type": "album", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "6e1d48f7-717c-416e-af35-5d2454a13af2" - } - ], - "albumcount": 1, - "songs": [], - "songcount": 20, - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=36&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "e6e2b787-0b4c-4267-8161-310399b101a5", - "summary": "Comfort Fit\u2019s(Boris Mezga) versatile influences range from early detroit techno and minimal electronica to jazz, broken beats and hip-hop. This makes it easy for him to invisibly switch between musical styles within a fingersnap, taking the listener onto long and exciting journies. Wisely using music codes of genres such as hip-hop, dubstep and techno as a mere comic template, Comfort Fit has inspired hip-hop and techno artists around the world with his heavy beat techniques. Besides his numerous remix requests, even major brands have discovered his outstanding production skills and request his music for advertisements regularly. Since 2000 he has ", - "time": 4248, - "yearformed": 0, - "placeformed": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/artists (with include songs).json b/docs/json-responses/artists (with include songs).json deleted file mode 100644 index b0c08934..00000000 --- a/docs/json-responses/artists (with include songs).json +++ /dev/null @@ -1,1832 +0,0 @@ -{ - "artist": [ - { - "id": "16", - "name": "CARN\u00daN", - "albums": [], - "albumcount": 1, - "songs": [ - { - "id": "106", - "title": "Malkuth - Intro", - "name": "Malkuth - Intro", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/01Intro.ogg", - "genre": [], - "playlisttrack": 1, - "time": 91, - "year": 1996, - "bitrate": 80962, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=106&uid=4&player=api&name=CARN-N%20-%20Malkuth%20-%20Intro.ogg", - "size": 930226, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 2, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "1.980000", - "replaygain_track_peak": "0.861000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "100", - "title": "The Prophecies Of The Horned One", - "name": "The Prophecies Of The Horned One", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/02ThePropheciesOfTheHornedOne.ogg", - "genre": [], - "playlisttrack": 2, - "time": 378, - "year": 1996, - "bitrate": 89965, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=100&uid=4&player=api&name=CARN-N%20-%20The%20Prophecies%20Of%20The%20Horned%20One.ogg", - "size": 4265791, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-10.510000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "98", - "title": "In The Seven Woods", - "name": "In The Seven Woods", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/03InTheSevenWoods.ogg", - "genre": [], - "playlisttrack": 3, - "time": 420, - "year": 1996, - "bitrate": 84423, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=98&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods.ogg", - "size": 4444403, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-9.700000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "104", - "title": "The Infernal Serpent", - "name": "The Infernal Serpent", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/04TheInfernalSerpent.ogg", - "genre": [], - "playlisttrack": 4, - "time": 404, - "year": 1996, - "bitrate": 100053, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=104&uid=4&player=api&name=CARN-N%20-%20The%20Infernal%20Serpent.ogg", - "size": 5066698, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 4, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-11.260000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "102", - "title": "Moremque Sinistrum Sacrorum", - "name": "Moremque Sinistrum Sacrorum", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/05MoremqueSinistrumSacrorum.ogg", - "genre": [], - "playlisttrack": 5, - "time": 164, - "year": 1996, - "bitrate": 106647, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=102&uid=4&player=api&name=CARN-N%20-%20Moremque%20Sinistrum%20Sacrorum.ogg", - "size": 2202971, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 3, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-7.480000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "99", - "title": "The Prophecies Of The Horned One (Instrumental Re-Recording)", - "name": "The Prophecies Of The Horned One (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/06ThePropheciesOfTheHornedOne_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 6, - "time": 427, - "year": 1996, - "bitrate": 143788, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=99&uid=4&player=api&name=CARN-N%20-%20The%20Prophecies%20Of%20The%20Horned%20One%20-Instrumental%20Re-Recording-.ogg", - "size": 7696008, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.660000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "103", - "title": "In The Seven Woods (Instrumental Re-Recording)", - "name": "In The Seven Woods (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/07InTheSevenWoods_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 7, - "time": 452, - "year": 1996, - "bitrate": 138338, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=103&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods%20-Instrumental%20Re-Recording-.ogg", - "size": 7826238, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.210000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "105", - "title": "The Infernal Serpent (Instrumental Re-Recording)", - "name": "The Infernal Serpent (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/08TheInfernalSerpent_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 8, - "time": 557, - "year": 1996, - "bitrate": 139453, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=105&uid=4&player=api&name=CARN-N%20-%20The%20Infernal%20Serpent%20-Instrumental%20Re-Recording-.ogg", - "size": 9722091, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.240000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "101", - "title": "Rehearsal Tape (1996)", - "name": "Rehearsal Tape (1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/09RehearsalTape1996.ogg", - "genre": [], - "playlisttrack": 9, - "time": 980, - "year": 1996, - "bitrate": 66912, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=101&uid=4&player=api&name=CARN-N%20-%20Rehearsal%20Tape%20-1996-.ogg", - "size": 8219821, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-9.560000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 9, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=16&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": "", - "summary": " ", - "time": 3873, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "27", - "name": "Chi.Otic", - "albums": [], - "albumcount": 0, - "songs": [ - { - "id": "115", - "title": "Are we going Crazy", - "name": "Are we going Crazy", - "artist": { - "id": "27", - "name": "Chi.Otic" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/07Chi.otic-AreWeGoingCrazy.wma", - "genre": [], - "playlisttrack": 1, - "time": 433, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=115&uid=4&player=api&name=Chi.Otic%20-%20Are%20we%20going%20Crazy.wma", - "size": 1776580, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=27&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "7", - "summary": " ", - "time": 433, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "34", - "name": "Comedown Kid", - "albums": [], - "albumcount": 0, - "songs": [ - { - "id": "109", - "title": "Dance with the Devil", - "name": "Dance with the Devil", - "artist": { - "id": "34", - "name": "Comedown Kid" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/03ComedownKid-DanceWithTheDevil.wma", - "genre": [], - "playlisttrack": 1, - "time": 116, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=109&uid=4&player=api&name=Comedown%20Kid%20-%20Dance%20with%20the%20Devil.wma", - "size": 483444, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=34&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "", - "summary": null, - "time": 116, - "yearformed": 0, - "placeformed": null - }, - { - "id": "36", - "name": "Comfort Fit", - "albums": [], - "albumcount": 1, - "songs": [ - { - "id": "116", - "title": "Can I Help U?", - "name": "Can I Help U?", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/1 - Can I Help U?.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 1, - "time": 103, - "year": 2005, - "bitrate": 216839, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=116&uid=4&player=api&name=Comfort%20Fit%20-%20Can%20I%20Help%20U-.mp3", - "size": 2811819, - "mbid": "51d0e252-f20c-414c-b169-8dcf18ef9d26", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-01-comfort_fit-can_i_help_u\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "121", - "title": "Planetary Picknick", - "name": "Planetary Picknick", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/2 - Planetary Picknick.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 2, - "time": 358, - "year": 2005, - "bitrate": 238812, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=121&uid=4&player=api&name=Comfort%20Fit%20-%20Planetary%20Picknick.mp3", - "size": 10715592, - "mbid": "6defae67-37da-4a85-90f6-80df5c27d88c", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-02-comfort_fit-planetary_picknick\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "119", - "title": "Sorry", - "name": "Sorry", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/3 - Sorry.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 3, - "time": 200, - "year": 2005, - "bitrate": 239161, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=119&uid=4&player=api&name=Comfort%20Fit%20-%20Sorry.mp3", - "size": 6018213, - "mbid": "261964a4-8062-426d-b88e-82c0097ca98c", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/03_Sorry\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: Creative Commons\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "120", - "title": "Freeze the Cut", - "name": "Freeze the Cut", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/4 - Freeze The Cut.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 4, - "time": 168, - "year": 2005, - "bitrate": 246979, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=120&uid=4&player=api&name=Comfort%20Fit%20-%20Freeze%20the%20Cut.mp3", - "size": 5216305, - "mbid": "d927db0b-7d3a-4fba-867c-d140cb19aeb9", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-04-comfort_fit-freeze_the_cut_feat_blaktroniks\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "125", - "title": "Take a Look", - "name": "Take a Look", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/5 - Take a Look.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 5, - "time": 230, - "year": 2005, - "bitrate": 243729, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=125&uid=4&player=api&name=Comfort%20Fit%20-%20Take%20a%20Look.mp3", - "size": 7018987, - "mbid": "8a3bdac5-f0bd-4197-9deb-d4880d6f3b6d", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-05-comfort_fit-take_a_look\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "124", - "title": "True Form", - "name": "True Form", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/6 - True Form.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 6, - "time": 192, - "year": 2005, - "bitrate": 243031, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=124&uid=4&player=api&name=Comfort%20Fit%20-%20True%20Form.mp3", - "size": 5848663, - "mbid": "8bf3acd2-860b-4ece-896f-9b2de89e35fa", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-06-comfort_fit-true_form\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "122", - "title": "Thursday Is Thursty", - "name": "Thursday Is Thursty", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/7 - Thursday is Thursdy.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 7, - "time": 92, - "year": 2005, - "bitrate": 225219, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=122&uid=4&player=api&name=Comfort%20Fit%20-%20Thursday%20Is%20Thursty.mp3", - "size": 2607497, - "mbid": "36fa39a1-483d-49d9-907b-17c4e3d60b47", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-07-comfort_fit-thursday_is_thursty\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "128", - "title": "Whenever You Wanna Call Me", - "name": "Whenever You Wanna Call Me", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/8 - Whenever You Wanna Call Me.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 8, - "time": 188, - "year": 2005, - "bitrate": 250322, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=128&uid=4&player=api&name=Comfort%20Fit%20-%20Whenever%20You%20Wanna%20Call%20Me.mp3", - "size": 5897286, - "mbid": "0cc9456b-1750-4739-9346-90d9247da292", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-08-comfort_fit-whenever_you_wanna_call_me_feat_prymer\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "118", - "title": "As Pure as Possible", - "name": "As Pure as Possible", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/9 - As Pure as Possible.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 9, - "time": 128, - "year": 2005, - "bitrate": 234690, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=118&uid=4&player=api&name=Comfort%20Fit%20-%20As%20Pure%20as%20Possible.mp3", - "size": 3789410, - "mbid": "7a3d740d-5546-4900-88af-b97b42c3344e", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-09-comfort_fit-as_pure_as_possible\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "127", - "title": "She Knows Me Now", - "name": "She Knows Me Now", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 10, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/10 - She Knows Me Now (re-edit).mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 10, - "time": 209, - "year": 2005, - "bitrate": 217167, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=127&uid=4&player=api&name=Comfort%20Fit%20-%20She%20Knows%20Me%20Now.mp3", - "size": 5690938, - "mbid": "3845cef9-b874-449f-94a5-5c9acdead9df", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-10-comfort_fit-she_knows_me_now_feat_mercury_waters__prymer\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "117", - "title": "Remember Something I Forgot", - "name": "Remember Something I Forgot", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 11, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/11 - Remember Something I Forgot.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 11, - "time": 163, - "year": 2005, - "bitrate": 235109, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=117&uid=4&player=api&name=Comfort%20Fit%20-%20Remember%20Something%20I%20Forgot.mp3", - "size": 4816734, - "mbid": "ba784e10-e268-4c44-9c82-091167162c27", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-11-comfort_fit-remember_something_i_forgot\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "126", - "title": "Don't Show This Message Again", - "name": "Don't Show This Message Again", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 12, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/12 - Don\u2019t Show This Message Again.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 12, - "time": 197, - "year": 2005, - "bitrate": 232690, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=126&uid=4&player=api&name=Comfort%20Fit%20-%20Don-t%20Show%20This%20Message%20Again.mp3", - "size": 5755191, - "mbid": "6b582438-c034-47c2-86b0-61c63ec96b4b", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-12-comfort_fit-dont_show_this_message_again\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "133", - "title": "Kurz Vor Danach Ganz '05", - "name": "Kurz Vor Danach Ganz '05", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 13, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/13 - Kurz Vor Danach Ganz \u201805.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 13, - "time": 247, - "year": 2005, - "bitrate": 230429, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=133&uid=4&player=api&name=Comfort%20Fit%20-%20Kurz%20Vor%20Danach%20Ganz%20-05.mp3", - "size": 7136353, - "mbid": "60ca3461-5f2b-4d0d-9cc5-ce79b358de7b", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-13-comfort_fit-kurz_vor_danach_ganz_05\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "135", - "title": "Emotional Draft", - "name": "Emotional Draft", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 14, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/14 - Emotional Draft.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 14, - "time": 379, - "year": 2005, - "bitrate": 235925, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=135&uid=4&player=api&name=Comfort%20Fit%20-%20Emotional%20Draft.mp3", - "size": 11216864, - "mbid": "ab598f5a-4cbb-4ce0-a3ac-9de17026f528", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-14-comfort_fit-emotional_draft\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "132", - "title": "Hairy Crushed Nuts", - "name": "Hairy Crushed Nuts", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 15, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/15 - Hairy Crushed Nuts.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 15, - "time": 267, - "year": 2005, - "bitrate": 248806, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=132&uid=4&player=api&name=Comfort%20Fit%20-%20Hairy%20Crushed%20Nuts.mp3", - "size": 8328099, - "mbid": "db672da0-963b-45a4-b3d8-23efc9c1953d", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-15-comfort_fit-hairy_crushed_nuts\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "129", - "title": "The Hunt", - "name": "The Hunt", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 16, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/16 - The Hunt.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 16, - "time": 226, - "year": 2005, - "bitrate": 224425, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=129&uid=4&player=api&name=Comfort%20Fit%20-%20The%20Hunt.mp3", - "size": 6373874, - "mbid": "8d22ccfd-38e9-42ca-9664-a236302ab8bf", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-16-comfort_fit-the_hunt\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "130", - "title": "Something to Do", - "name": "Something to Do", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 17, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/17 - Something To Do.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 17, - "time": 261, - "year": 2005, - "bitrate": 246373, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=130&uid=4&player=api&name=Comfort%20Fit%20-%20Something%20to%20Do.mp3", - "size": 8072761, - "mbid": "143eca6b-26d6-4b5d-a6b2-7e7cc9e05769", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-17-comfort_fit-something_to_do_feat_blaktroniks\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "123", - "title": "Go on, Take It Further", - "name": "Go on, Take It Further", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 18, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/18 - Go On, Take It Further.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 18, - "time": 69, - "year": 2005, - "bitrate": 206742, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=123&uid=4&player=api&name=Comfort%20Fit%20-%20Go%20on-%20Take%20It%20Further.mp3", - "size": 1795861, - "mbid": "64f731fb-da3f-41d0-a08b-47ecce55a3e4", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-18-comfort_fit-go_on_take_it_further\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "134", - "title": "Swabian Sound System", - "name": "Swabian Sound System", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 19, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/19 - Swabian Sound System.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 19, - "time": 281, - "year": 2005, - "bitrate": 244202, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=134&uid=4&player=api&name=Comfort%20Fit%20-%20Swabian%20Sound%20System.mp3", - "size": 8594721, - "mbid": "8e993e63-ddf9-4603-a2c0-5d2f18efebce", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-19-comfort_fit-swabian_sound_system\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "131", - "title": "Miles of Smiles", - "name": "Miles of Smiles", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 20, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/20 - Miles of Smiles.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 20, - "time": 290, - "year": 2005, - "bitrate": 247925, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=131&uid=4&player=api&name=Comfort%20Fit%20-%20Miles%20of%20Smiles.mp3", - "size": 9028758, - "mbid": "ec160787-e0db-4f76-85b5-5a76f59f36f9", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-20-comfort_fit-miles_of_smiles\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 20, - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=36&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "e6e2b787-0b4c-4267-8161-310399b101a5", - "summary": "Comfort Fit\u2019s(Boris Mezga) versatile influences range from early detroit techno and minimal electronica to jazz, broken beats and hip-hop. This makes it easy for him to invisibly switch between musical styles within a fingersnap, taking the listener onto long and exciting journies. Wisely using music codes of genres such as hip-hop, dubstep and techno as a mere comic template, Comfort Fit has inspired hip-hop and techno artists around the world with his heavy beat techniques. Besides his numerous remix requests, even major brands have discovered his outstanding production skills and request his music for advertisements regularly. Since 2000 he has ", - "time": 4248, - "yearformed": 0, - "placeformed": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/artists (with include songs,albums).json b/docs/json-responses/artists (with include songs,albums).json deleted file mode 100644 index f1a98fe5..00000000 --- a/docs/json-responses/artists (with include songs,albums).json +++ /dev/null @@ -1,1935 +0,0 @@ -{ - "artist": [ - { - "id": "16", - "name": "CARN\u00daN", - "albums": [ - { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "time": 3873, - "year": 1996, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": null, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": null - } - ], - "albumcount": 1, - "songs": [ - { - "id": "106", - "title": "Malkuth - Intro", - "name": "Malkuth - Intro", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/01Intro.ogg", - "genre": [], - "playlisttrack": 1, - "time": 91, - "year": 1996, - "bitrate": 80962, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=106&uid=4&player=api&name=CARN-N%20-%20Malkuth%20-%20Intro.ogg", - "size": 930226, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 2, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "1.980000", - "replaygain_track_peak": "0.861000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "100", - "title": "The Prophecies Of The Horned One", - "name": "The Prophecies Of The Horned One", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/02ThePropheciesOfTheHornedOne.ogg", - "genre": [], - "playlisttrack": 2, - "time": 378, - "year": 1996, - "bitrate": 89965, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=100&uid=4&player=api&name=CARN-N%20-%20The%20Prophecies%20Of%20The%20Horned%20One.ogg", - "size": 4265791, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-10.510000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "98", - "title": "In The Seven Woods", - "name": "In The Seven Woods", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/03InTheSevenWoods.ogg", - "genre": [], - "playlisttrack": 3, - "time": 420, - "year": 1996, - "bitrate": 84423, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=98&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods.ogg", - "size": 4444403, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-9.700000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "104", - "title": "The Infernal Serpent", - "name": "The Infernal Serpent", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/04TheInfernalSerpent.ogg", - "genre": [], - "playlisttrack": 4, - "time": 404, - "year": 1996, - "bitrate": 100053, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=104&uid=4&player=api&name=CARN-N%20-%20The%20Infernal%20Serpent.ogg", - "size": 5066698, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 4, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-11.260000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "102", - "title": "Moremque Sinistrum Sacrorum", - "name": "Moremque Sinistrum Sacrorum", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/05MoremqueSinistrumSacrorum.ogg", - "genre": [], - "playlisttrack": 5, - "time": 164, - "year": 1996, - "bitrate": 106647, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=102&uid=4&player=api&name=CARN-N%20-%20Moremque%20Sinistrum%20Sacrorum.ogg", - "size": 2202971, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 3, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-7.480000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "99", - "title": "The Prophecies Of The Horned One (Instrumental Re-Recording)", - "name": "The Prophecies Of The Horned One (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/06ThePropheciesOfTheHornedOne_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 6, - "time": 427, - "year": 1996, - "bitrate": 143788, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=99&uid=4&player=api&name=CARN-N%20-%20The%20Prophecies%20Of%20The%20Horned%20One%20-Instrumental%20Re-Recording-.ogg", - "size": 7696008, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.660000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "103", - "title": "In The Seven Woods (Instrumental Re-Recording)", - "name": "In The Seven Woods (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/07InTheSevenWoods_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 7, - "time": 452, - "year": 1996, - "bitrate": 138338, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=103&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods%20-Instrumental%20Re-Recording-.ogg", - "size": 7826238, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.210000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "105", - "title": "The Infernal Serpent (Instrumental Re-Recording)", - "name": "The Infernal Serpent (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/08TheInfernalSerpent_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 8, - "time": 557, - "year": 1996, - "bitrate": 139453, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=105&uid=4&player=api&name=CARN-N%20-%20The%20Infernal%20Serpent%20-Instrumental%20Re-Recording-.ogg", - "size": 9722091, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.240000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "101", - "title": "Rehearsal Tape (1996)", - "name": "Rehearsal Tape (1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/09RehearsalTape1996.ogg", - "genre": [], - "playlisttrack": 9, - "time": 980, - "year": 1996, - "bitrate": 66912, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=101&uid=4&player=api&name=CARN-N%20-%20Rehearsal%20Tape%20-1996-.ogg", - "size": 8219821, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-9.560000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 9, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=16&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": "", - "summary": " ", - "time": 3873, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "27", - "name": "Chi.Otic", - "albums": [ - { - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null - } - ], - "albumcount": 0, - "songs": [ - { - "id": "115", - "title": "Are we going Crazy", - "name": "Are we going Crazy", - "artist": { - "id": "27", - "name": "Chi.Otic" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/07Chi.otic-AreWeGoingCrazy.wma", - "genre": [], - "playlisttrack": 1, - "time": 433, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=115&uid=4&player=api&name=Chi.Otic%20-%20Are%20we%20going%20Crazy.wma", - "size": 1776580, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=27&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "7", - "summary": " ", - "time": 433, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "34", - "name": "Comedown Kid", - "albums": [ - { - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null - } - ], - "albumcount": 0, - "songs": [ - { - "id": "109", - "title": "Dance with the Devil", - "name": "Dance with the Devil", - "artist": { - "id": "34", - "name": "Comedown Kid" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/03ComedownKid-DanceWithTheDevil.wma", - "genre": [], - "playlisttrack": 1, - "time": 116, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=109&uid=4&player=api&name=Comedown%20Kid%20-%20Dance%20with%20the%20Devil.wma", - "size": 483444, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=34&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "", - "summary": null, - "time": 116, - "yearformed": 0, - "placeformed": null - }, - { - "id": "36", - "name": "Comfort Fit", - "albums": [ - { - "id": "21", - "name": "Forget and Remember", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "time": 4248, - "year": 2005, - "tracks": [], - "songcount": 20, - "diskcount": 1, - "type": "album", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "6e1d48f7-717c-416e-af35-5d2454a13af2" - } - ], - "albumcount": 1, - "songs": [ - { - "id": "116", - "title": "Can I Help U?", - "name": "Can I Help U?", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/1 - Can I Help U?.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 1, - "time": 103, - "year": 2005, - "bitrate": 216839, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=116&uid=4&player=api&name=Comfort%20Fit%20-%20Can%20I%20Help%20U-.mp3", - "size": 2811819, - "mbid": "51d0e252-f20c-414c-b169-8dcf18ef9d26", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-01-comfort_fit-can_i_help_u\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "121", - "title": "Planetary Picknick", - "name": "Planetary Picknick", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/2 - Planetary Picknick.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 2, - "time": 358, - "year": 2005, - "bitrate": 238812, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=121&uid=4&player=api&name=Comfort%20Fit%20-%20Planetary%20Picknick.mp3", - "size": 10715592, - "mbid": "6defae67-37da-4a85-90f6-80df5c27d88c", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-02-comfort_fit-planetary_picknick\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "119", - "title": "Sorry", - "name": "Sorry", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/3 - Sorry.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 3, - "time": 200, - "year": 2005, - "bitrate": 239161, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=119&uid=4&player=api&name=Comfort%20Fit%20-%20Sorry.mp3", - "size": 6018213, - "mbid": "261964a4-8062-426d-b88e-82c0097ca98c", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/03_Sorry\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: Creative Commons\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "120", - "title": "Freeze the Cut", - "name": "Freeze the Cut", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/4 - Freeze The Cut.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 4, - "time": 168, - "year": 2005, - "bitrate": 246979, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=120&uid=4&player=api&name=Comfort%20Fit%20-%20Freeze%20the%20Cut.mp3", - "size": 5216305, - "mbid": "d927db0b-7d3a-4fba-867c-d140cb19aeb9", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-04-comfort_fit-freeze_the_cut_feat_blaktroniks\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "125", - "title": "Take a Look", - "name": "Take a Look", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/5 - Take a Look.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 5, - "time": 230, - "year": 2005, - "bitrate": 243729, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=125&uid=4&player=api&name=Comfort%20Fit%20-%20Take%20a%20Look.mp3", - "size": 7018987, - "mbid": "8a3bdac5-f0bd-4197-9deb-d4880d6f3b6d", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-05-comfort_fit-take_a_look\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "124", - "title": "True Form", - "name": "True Form", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/6 - True Form.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 6, - "time": 192, - "year": 2005, - "bitrate": 243031, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=124&uid=4&player=api&name=Comfort%20Fit%20-%20True%20Form.mp3", - "size": 5848663, - "mbid": "8bf3acd2-860b-4ece-896f-9b2de89e35fa", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-06-comfort_fit-true_form\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "122", - "title": "Thursday Is Thursty", - "name": "Thursday Is Thursty", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/7 - Thursday is Thursdy.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 7, - "time": 92, - "year": 2005, - "bitrate": 225219, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=122&uid=4&player=api&name=Comfort%20Fit%20-%20Thursday%20Is%20Thursty.mp3", - "size": 2607497, - "mbid": "36fa39a1-483d-49d9-907b-17c4e3d60b47", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-07-comfort_fit-thursday_is_thursty\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "128", - "title": "Whenever You Wanna Call Me", - "name": "Whenever You Wanna Call Me", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/8 - Whenever You Wanna Call Me.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 8, - "time": 188, - "year": 2005, - "bitrate": 250322, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=128&uid=4&player=api&name=Comfort%20Fit%20-%20Whenever%20You%20Wanna%20Call%20Me.mp3", - "size": 5897286, - "mbid": "0cc9456b-1750-4739-9346-90d9247da292", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-08-comfort_fit-whenever_you_wanna_call_me_feat_prymer\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "118", - "title": "As Pure as Possible", - "name": "As Pure as Possible", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/9 - As Pure as Possible.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 9, - "time": 128, - "year": 2005, - "bitrate": 234690, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=118&uid=4&player=api&name=Comfort%20Fit%20-%20As%20Pure%20as%20Possible.mp3", - "size": 3789410, - "mbid": "7a3d740d-5546-4900-88af-b97b42c3344e", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-09-comfort_fit-as_pure_as_possible\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "127", - "title": "She Knows Me Now", - "name": "She Knows Me Now", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 10, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/10 - She Knows Me Now (re-edit).mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 10, - "time": 209, - "year": 2005, - "bitrate": 217167, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=127&uid=4&player=api&name=Comfort%20Fit%20-%20She%20Knows%20Me%20Now.mp3", - "size": 5690938, - "mbid": "3845cef9-b874-449f-94a5-5c9acdead9df", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-10-comfort_fit-she_knows_me_now_feat_mercury_waters__prymer\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "117", - "title": "Remember Something I Forgot", - "name": "Remember Something I Forgot", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 11, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/11 - Remember Something I Forgot.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 11, - "time": 163, - "year": 2005, - "bitrate": 235109, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=117&uid=4&player=api&name=Comfort%20Fit%20-%20Remember%20Something%20I%20Forgot.mp3", - "size": 4816734, - "mbid": "ba784e10-e268-4c44-9c82-091167162c27", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-11-comfort_fit-remember_something_i_forgot\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "126", - "title": "Don't Show This Message Again", - "name": "Don't Show This Message Again", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 12, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/12 - Don\u2019t Show This Message Again.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 12, - "time": 197, - "year": 2005, - "bitrate": 232690, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=126&uid=4&player=api&name=Comfort%20Fit%20-%20Don-t%20Show%20This%20Message%20Again.mp3", - "size": 5755191, - "mbid": "6b582438-c034-47c2-86b0-61c63ec96b4b", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-12-comfort_fit-dont_show_this_message_again\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "133", - "title": "Kurz Vor Danach Ganz '05", - "name": "Kurz Vor Danach Ganz '05", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 13, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/13 - Kurz Vor Danach Ganz \u201805.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 13, - "time": 247, - "year": 2005, - "bitrate": 230429, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=133&uid=4&player=api&name=Comfort%20Fit%20-%20Kurz%20Vor%20Danach%20Ganz%20-05.mp3", - "size": 7136353, - "mbid": "60ca3461-5f2b-4d0d-9cc5-ce79b358de7b", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-13-comfort_fit-kurz_vor_danach_ganz_05\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "135", - "title": "Emotional Draft", - "name": "Emotional Draft", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 14, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/14 - Emotional Draft.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 14, - "time": 379, - "year": 2005, - "bitrate": 235925, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=135&uid=4&player=api&name=Comfort%20Fit%20-%20Emotional%20Draft.mp3", - "size": 11216864, - "mbid": "ab598f5a-4cbb-4ce0-a3ac-9de17026f528", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-14-comfort_fit-emotional_draft\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "132", - "title": "Hairy Crushed Nuts", - "name": "Hairy Crushed Nuts", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 15, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/15 - Hairy Crushed Nuts.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 15, - "time": 267, - "year": 2005, - "bitrate": 248806, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=132&uid=4&player=api&name=Comfort%20Fit%20-%20Hairy%20Crushed%20Nuts.mp3", - "size": 8328099, - "mbid": "db672da0-963b-45a4-b3d8-23efc9c1953d", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-15-comfort_fit-hairy_crushed_nuts\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "129", - "title": "The Hunt", - "name": "The Hunt", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 16, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/16 - The Hunt.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 16, - "time": 226, - "year": 2005, - "bitrate": 224425, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=129&uid=4&player=api&name=Comfort%20Fit%20-%20The%20Hunt.mp3", - "size": 6373874, - "mbid": "8d22ccfd-38e9-42ca-9664-a236302ab8bf", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-16-comfort_fit-the_hunt\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "130", - "title": "Something to Do", - "name": "Something to Do", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 17, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/17 - Something To Do.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 17, - "time": 261, - "year": 2005, - "bitrate": 246373, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=130&uid=4&player=api&name=Comfort%20Fit%20-%20Something%20to%20Do.mp3", - "size": 8072761, - "mbid": "143eca6b-26d6-4b5d-a6b2-7e7cc9e05769", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-17-comfort_fit-something_to_do_feat_blaktroniks\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "123", - "title": "Go on, Take It Further", - "name": "Go on, Take It Further", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 18, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/18 - Go On, Take It Further.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 18, - "time": 69, - "year": 2005, - "bitrate": 206742, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=123&uid=4&player=api&name=Comfort%20Fit%20-%20Go%20on-%20Take%20It%20Further.mp3", - "size": 1795861, - "mbid": "64f731fb-da3f-41d0-a08b-47ecce55a3e4", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-18-comfort_fit-go_on_take_it_further\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "134", - "title": "Swabian Sound System", - "name": "Swabian Sound System", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 19, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/19 - Swabian Sound System.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 19, - "time": 281, - "year": 2005, - "bitrate": 244202, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=134&uid=4&player=api&name=Comfort%20Fit%20-%20Swabian%20Sound%20System.mp3", - "size": 8594721, - "mbid": "8e993e63-ddf9-4603-a2c0-5d2f18efebce", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-19-comfort_fit-swabian_sound_system\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "131", - "title": "Miles of Smiles", - "name": "Miles of Smiles", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 20, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/20 - Miles of Smiles.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 20, - "time": 290, - "year": 2005, - "bitrate": 247925, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=131&uid=4&player=api&name=Comfort%20Fit%20-%20Miles%20of%20Smiles.mp3", - "size": 9028758, - "mbid": "ec160787-e0db-4f76-85b5-5a76f59f36f9", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-20-comfort_fit-miles_of_smiles\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 20, - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=36&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "e6e2b787-0b4c-4267-8161-310399b101a5", - "summary": "Comfort Fit\u2019s(Boris Mezga) versatile influences range from early detroit techno and minimal electronica to jazz, broken beats and hip-hop. This makes it easy for him to invisibly switch between musical styles within a fingersnap, taking the listener onto long and exciting journies. Wisely using music codes of genres such as hip-hop, dubstep and techno as a mere comic template, Comfort Fit has inspired hip-hop and techno artists around the world with his heavy beat techniques. Besides his numerous remix requests, even major brands have discovered his outstanding production skills and request his music for advertisements regularly. Since 2000 he has ", - "time": 4248, - "yearformed": 0, - "placeformed": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/artists.json b/docs/json-responses/artists.json index 338e891d..b19380d2 100644 --- a/docs/json-responses/artists.json +++ b/docs/json-responses/artists.json @@ -1,85 +1,146 @@ -{ - "artist": [ - { - "id": "16", - "name": "CARN\u00daN", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 9, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=16&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": "", - "summary": " ", - "time": 3873, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "27", - "name": "Chi.Otic", - "albums": [], - "albumcount": 0, - "songs": [], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=27&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "7", - "summary": " ", - "time": 433, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "34", - "name": "Comedown Kid", - "albums": [], - "albumcount": 0, - "songs": [], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=34&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "", - "summary": null, - "time": 116, - "yearformed": 0, - "placeformed": null - }, - { - "id": "36", - "name": "Comfort Fit", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 20, - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=36&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "e6e2b787-0b4c-4267-8161-310399b101a5", - "summary": "Comfort Fit\u2019s(Boris Mezga) versatile influences range from early detroit techno and minimal electronica to jazz, broken beats and hip-hop. This makes it easy for him to invisibly switch between musical styles within a fingersnap, taking the listener onto long and exciting journies. Wisely using music codes of genres such as hip-hop, dubstep and techno as a mere comic template, Comfort Fit has inspired hip-hop and techno artists around the world with his heavy beat techniques. Besides his numerous remix requests, even major brands have discovered his outstanding production skills and request his music for advertisements regularly. Since 2000 he has ", - "time": 4248, - "yearformed": 0, - "placeformed": null - } - ] -} \ No newline at end of file +[ + { + "id": "13429", + "name": "!!!", + "albums": 1, + "songs": 1, + "tag": [ + { + "id": "55", + "name": "Electro" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=13429&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "f26c72d3-e52c-467b-b651-679c73d8e1a7", + "summary": "!!! is an American dance-punk band from Sacramento, California that formed in Autumn 1996 from the former band members of The Yah Mos, Black Liquorice and Popesmashers.\n\nAfter a tour together, members of local Sacramento, CA bands Black Liquorice and Popesmashers formed !!!. The band's name was inspired by the subtitles of the movie The Gods Must Be Crazy, in which the mouth-clicking sounds of the Bushmen were represented as \"!\". Chk Chk Chk is the most common pronunciation ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "3858", + "name": "!Bang Elektronika", + "albums": 1, + "songs": 15, + "tag": [ + { + "id": "4", + "name": "Electronic" + }, + { + "id": "11", + "name": "Techno" + }, + { + "id": "50", + "name": "EBM" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=3858&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": 4, + "rating": 4, + "averagerating": null, + "mbid": "e01b0106-7781-4c80-b7d3-639610a6c5d7", + "summary": " ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "2461", + "name": "!distain", + "albums": 20, + "songs": 249, + "tag": [ + { + "id": "4", + "name": "Electronic" + }, + { + "id": "7", + "name": "Synthpop" + }, + { + "id": "22", + "name": "Pop" + }, + { + "id": "50", + "name": "EBM" + }, + { + "id": "55", + "name": "Electro" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=2461&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": 4, + "rating": 4, + "averagerating": null, + "mbid": "c60674c3-1cd8-4b2c-ada3-8f99d94c4aad", + "summary": "!distain (released as Distain! in the 1990's, by now the exclamation mark goes in the front of the name) is a friendly and unpretentious synth-pop band from Munich, Germany, consisting of singer Alexander Braun and Manfred Thomaser.\n\nHere's a short band biography:\n\n1992\nBand foundation by Alexander Braun, Oliver Faig and Sebastian von Wyschetzki.\n\n1994\nFirst public appearance: \"Pop Albert\" Contest Augsburg; first record deal with Chrom Records.\n\n1995 ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "1206", + "name": "\"Weird Al\" Yankovic", + "albums": 22, + "songs": 296, + "tag": [ + { + "id": "3", + "name": "Punk" + }, + { + "id": "5", + "name": "Comedy" + }, + { + "id": "6", + "name": "Rock" + }, + { + "id": "22", + "name": "Pop" + }, + { + "id": "43", + "name": "Soundtrack" + }, + { + "id": "184", + "name": "Parody" + }, + { + "id": "258", + "name": "Spoken Word" + }, + { + "id": "475", + "name": "Rock & Roll" + }, + { + "id": "830", + "name": "Novelty" + }, + { + "id": "1409", + "name": "Hip Hop" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=1206&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": 4, + "rating": 4, + "averagerating": null, + "mbid": "7746d775-9550-4360-b8d5-c37bd448ce01", + "summary": "Alfred Matthew \"Weird Al\" Yankovic (born October 23, 1959 in Downey, California) is an American singer-songwriter, music producer, actor, comedian, satirist, accordion player and kazooist. Yankovic is known in particular for his humorous songs that make light of popular culture and that often parody specific songs by contemporary musical acts. Since his first-aired song parody in 1976, he has sold more than 12 million albums\u2014more than any other comedy act in history\u2014recorded more than 150 parody and original songs ", + "yearformed": "0", + "placeformed": "" + } +] \ No newline at end of file diff --git a/docs/json-responses/catalog.json b/docs/json-responses/catalog.json deleted file mode 100644 index 3c1962a6..00000000 --- a/docs/json-responses/catalog.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id": "1", - "name": "music", - "type": "local", - "gather_types": "music", - "enabled": 1, - "last_add": "1627949046", - "last_clean": "1627949154", - "last_update": "1626835896", - "path": "\/mnt\/files-music\/ampache-test\/music", - "rename_pattern": "%T - %t", - "sort_pattern": "%a\/%A" -} \ No newline at end of file diff --git a/docs/json-responses/catalog_action (error).json b/docs/json-responses/catalog_action (error).json index 855a4ae6..c559dd96 100644 --- a/docs/json-responses/catalog_action (error).json +++ b/docs/json-responses/catalog_action (error).json @@ -1,8 +1,6 @@ { "error": { - "errorCode": "4710", - "errorAction": "catalog_action", - "errorType": "task", - "errorMessage": "Bad Request: clean" + "code": "401", + "message": "Incorrect catalogue task clean" } } \ No newline at end of file diff --git a/docs/json-responses/catalog_file.json b/docs/json-responses/catalog_file.json deleted file mode 100644 index 6474b84e..00000000 --- a/docs/json-responses/catalog_file.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "success": "successfully started: clean for \/mnt\/music\/Laura Veirs\/(2010) July Flame [BELLACD220]\/110 - Sleeper in the Valley.mp3" -} \ No newline at end of file diff --git a/docs/json-responses/catalogs.json b/docs/json-responses/catalogs.json deleted file mode 100644 index 823fca48..00000000 --- a/docs/json-responses/catalogs.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "catalog": [ - { - "id": "1", - "name": "music", - "type": "local", - "gather_types": "music", - "enabled": 1, - "last_add": "1627949046", - "last_clean": "1627949154", - "last_update": "1626835896", - "path": "\/mnt\/files-music\/ampache-test\/music", - "rename_pattern": "%T - %t", - "sort_pattern": "%a\/%A" - }, - { - "id": "3", - "name": "podcast", - "type": "local", - "gather_types": "podcast", - "enabled": 1, - "last_add": "1617260634", - "last_clean": "1617260599", - "last_update": "0", - "path": "\/mnt\/files-music\/ampache-test\/podcast", - "rename_pattern": "%T - %t", - "sort_pattern": "%a\/%A" - }, - { - "id": "4", - "name": "upload", - "type": "local", - "gather_types": "music", - "enabled": 1, - "last_add": "1617260634", - "last_clean": "1617260634", - "last_update": "0", - "path": "\/mnt\/files-music\/ampache-test\/upload", - "rename_pattern": "%T - %t", - "sort_pattern": "%a\/%A" - }, - { - "id": "2", - "name": "video", - "type": "local", - "gather_types": "clip", - "enabled": 1, - "last_add": "1627949054", - "last_clean": "1627949144", - "last_update": "0", - "path": "\/mnt\/files-music\/ampache-test\/video", - "rename_pattern": "%a - %t (%y)", - "sort_pattern": "" - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/deleted_podcast_episodes.json b/docs/json-responses/deleted_podcast_episodes.json deleted file mode 100644 index 6c03f223..00000000 --- a/docs/json-responses/deleted_podcast_episodes.json +++ /dev/null @@ -1,554 +0,0 @@ -{ - "deleted_podcast_episode": [ - { - "id": "44", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "COVID, Quickly, Episode 3: Vaccine Inequality--plus Your Body the Variant Fighter", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1616779800-COVID, Quickly, Episode 3: Vaccine Inequality--plus Your Body the Variant Fighter-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "45", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "Using Dragonflies as Contamination Detectors", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1616587200-Using Dragonflies as Contamination Detectors-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "46", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "Smartphones Can Hear the Shape of Your Door Keys", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1616068800-Smartphones Can Hear the Shape of Your Door Keys-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "47", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "Chimpanzees Show Altruism while Gathering around the Juice Fountain", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1615897800-Chimpanzees Show Altruism while Gathering around the Juice Fountain-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "48", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "Podcast Feed Drop: Introducing Powered by Audio [Sponsored]", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1615824000-Podcast Feed Drop: Introducing Powered by Audio [Sponsored]-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "49", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "COVID, Quickly, Episode 2: Lessons from a Pandemic Year", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1615503600-COVID, Quickly, Episode 2: Lessons from a Pandemic Year-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "50", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "That Mouse in Your House--It's Smarter, Thanks to You", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1615294800-That Mouse in Your House--It's Smarter, Thanks to You-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "51", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "Kangaroos with Puppy Dog Eyes", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1614870000-Kangaroos with Puppy Dog Eyes-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "52", - "addition_time": "1617170872", - "delete_time": "1627948508", - "title": "COVID, Quickly, Episode 1: Vaccines, Variants and Diabetes", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1614358800-COVID, Quickly, Episode 1: Vaccines, Variants and Diabetes-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "73", - "addition_time": "1617260601", - "delete_time": "1627948508", - "title": "Imperiled Freshwater Turtles Are Eating Plastics--Science Is Just Revealing the Threat", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/60-Second Science\/1617192000-Imperiled Freshwater Turtles Are Eating Plastics--Science Is Just Revealing the Threat-podcast.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "74", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 BONUS \u2014 The Price", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1608127260-S2 BONUS \u2014 The Price-tre_20201217_s2e9_the_price.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "75", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 08 | End game", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1600700400-S2 08 | End game-tre_20200922_s2e8_end_game.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "76", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 07 | Reckoning", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1600095660-S2 07 | Reckoning-tre_20200915_s2e7_reckoning.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "77", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 06 | Whatever it takes", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1599490800-S2 06 | Whatever it takes-tre_20200908_s2e6_what_ever_it_takes.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "78", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 05 | Glittering prize", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1598886000-S2 05 | Glittering prize-tre_20200901_s2e5_glittering_prize.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "79", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 04 | Rubicon", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1598281200-S2 04 | Rubicon-tre_20200825_s2e4_rubicon.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "80", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 03 | The darkest night", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1597676400-S2 03 | The darkest night-tre_20200818_s2e3_the_darkest_night.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "81", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 02 | One of the crew", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1597071600-S2 02 | One of the crew-tre_20200811_s2e2_one_of_the_crew.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "82", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "S2 01 | Nicola", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1596475800-S2 01 | Nicola-tre_20200804_s2e1_nicola.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "83", - "addition_time": "1627948502", - "delete_time": "1627949127", - "title": "INTRODUCING Trace season 2 - The Informer", - "file": "\/mnt\/files-music\/ampache-test\/podcast\/Trace\/1595862000-INTRODUCING Trace season 2 - The Informer-tre_20200728_s2e0_the_informer.mp3", - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "84", - "addition_time": "1627948502", - "delete_time": "1627948502", - "title": "S1 07 | Hope", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "85", - "addition_time": "1627948502", - "delete_time": "1627948502", - "title": "S1 06 | Limbo", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "86", - "addition_time": "1627948502", - "delete_time": "1627948502", - "title": "S1 05 | Wait", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "87", - "addition_time": "1627948502", - "delete_time": "1627948503", - "title": "S1 04 | DNA", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "88", - "addition_time": "1627948502", - "delete_time": "1627948503", - "title": "S1 03 | Sins", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "89", - "addition_time": "1627948502", - "delete_time": "1627948503", - "title": "BONUS | How your leads are helping the investigation", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "90", - "addition_time": "1627948502", - "delete_time": "1627948503", - "title": "S1 02 | Confessions", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "91", - "addition_time": "1627948502", - "delete_time": "1627948503", - "title": "S1 01 | Bookshop murder", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "92", - "addition_time": "1627948502", - "delete_time": "1627948503", - "title": "S1 | Preview", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "5" - }, - { - "id": "103", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "A 'Universal' Coronavirus Vaccine to Prevent the Next Pandemic", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "104", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "COVID, Quickly, Episode 8: The Pandemic's True Death Toll and the Big Lab-Leak Debate", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "105", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "Puppies Understand You Even at a Young Age, Most Adorable Study of the Year Confirms", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "106", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "New 3-D-Printed Material Is Tough, Flexible--and Alive", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "107", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "Bats on Helium Reveal an Innate Sense of the Speed of Sound", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "108", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "The Dirty Secret behind Some of the World's Earliest Microscopes", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "109", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "COVID, Quickly, Episode 7: The Coming Pandemic Grief Wave, and Mask Whiplash", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "110", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "Math and Sleuthing Help to Explain Epidemics of the Past", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "111", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "Who Laps Whom on the Walking Track--Tyrannosaurus rex or You? Science Has a New Answer", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "112", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "Artificial Light Keeps Mosquitoes Biting Late into the Night", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "113", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "COVID, Quickly, Episode 6: The Real Reason for India's Surge and Mask Liftoff", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "114", - "addition_time": "1627948504", - "delete_time": "1627948508", - "title": "Male Lyrebirds Lie to Get Sex", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "1" - }, - { - "id": "125", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "S1 07 | Hope", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - }, - { - "id": "126", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "S1 06 | Limbo", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - }, - { - "id": "127", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "S1 05 | Wait", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - }, - { - "id": "128", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "S1 04 | DNA", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - }, - { - "id": "129", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "S1 03 | Sins", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - }, - { - "id": "130", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "BONUS | How your leads are helping the investigation", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - }, - { - "id": "131", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "S1 02 | Confessions", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - }, - { - "id": "132", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "S1 01 | Bookshop murder", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - }, - { - "id": "133", - "addition_time": "1627949324", - "delete_time": "1627949324", - "title": "S1 | Preview", - "file": null, - "catalog": "3", - "total_count": "0", - "total_skip": "0", - "podcast": "6" - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/deleted_songs.json b/docs/json-responses/deleted_songs.json deleted file mode 100644 index 6e381ec5..00000000 --- a/docs/json-responses/deleted_songs.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "deleted_songs": [] -} \ No newline at end of file diff --git a/docs/json-responses/deleted_videos.json b/docs/json-responses/deleted_videos.json deleted file mode 100644 index 3aae5864..00000000 --- a/docs/json-responses/deleted_videos.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "deleted_videos": [] -} \ No newline at end of file diff --git a/docs/json-responses/democratic (play).json b/docs/json-responses/democratic (play).json deleted file mode 100644 index 9be21176..00000000 --- a/docs/json-responses/democratic (play).json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&uid=2&demo_id=1" -} \ No newline at end of file diff --git a/docs/json-responses/democratic (playlist).json b/docs/json-responses/democratic (playlist).json deleted file mode 100644 index 1cda8f63..00000000 --- a/docs/json-responses/democratic (playlist).json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "song": [ - { - "id": "123246", - "title": "Two Souls (Fisherman & Hawkins remix)", - "artist": { - "id": "7011", - "name": "Jes" - }, - "album": { - "id": "95409", - "name": "Black Hole Recordings: Best of 2015" - }, - "genre": [ - { - "id": "80", - "name": "Trance" - } - ], - "track": 13, - "time": 352, - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=123246&uid=2&player=api&name=Jes%20-%20Two%20Souls%20-Fisherman%20-%20Hawkins%20remix-.mp3", - "size": 14165432, - "art": "https:\/\/music.com.au\/image.php?object_id=95409&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "preciserating": null, - "rating": null, - "averagerating": null, - "vote": 0 - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/democratic (vote).json b/docs/json-responses/democratic (vote).json deleted file mode 100644 index 07096efa..00000000 --- a/docs/json-responses/democratic (vote).json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "method": "vote", - "result": true -} \ No newline at end of file diff --git a/docs/json-responses/error-4700.json b/docs/json-responses/error-4700.json deleted file mode 100644 index 1eac0071..00000000 --- a/docs/json-responses/error-4700.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4700", - "errorAction": "handshake", - "errorType": "system", - "errorMessage": "Access Denied" - } -} \ No newline at end of file diff --git a/docs/json-responses/error-4701.json b/docs/json-responses/error-4701.json deleted file mode 100644 index ddd44792..00000000 --- a/docs/json-responses/error-4701.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4701", - "errorAction": "playlist_create", - "errorType": "account", - "errorMessage": "Session Expired" - } -} \ No newline at end of file diff --git a/docs/json-responses/error-4703.json b/docs/json-responses/error-4703.json deleted file mode 100644 index 2ac5ad94..00000000 --- a/docs/json-responses/error-4703.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4703", - "errorAction": "podcasts", - "errorType": "system", - "errorMessage": "Enable: podcast" - } -} \ No newline at end of file diff --git a/docs/json-responses/error-4704.json b/docs/json-responses/error-4704.json deleted file mode 100644 index 49c8ea1a..00000000 --- a/docs/json-responses/error-4704.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4704", - "errorAction": "scrobble", - "errorType": "song", - "errorMessage": "Not Found" - } -} \ No newline at end of file diff --git a/docs/json-responses/error-4705.json b/docs/json-responses/error-4705.json deleted file mode 100644 index 9396b24b..00000000 --- a/docs/json-responses/error-4705.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4705", - "errorAction": "plafgfylist_create", - "errorType": "system", - "errorMessage": "Invalid Request" - } -} \ No newline at end of file diff --git a/docs/json-responses/error-4706.json b/docs/json-responses/error-4706.json deleted file mode 100644 index da2100c7..00000000 --- a/docs/json-responses/error-4706.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4706", - "errorAction": "tag_songs", - "errorType": "removed", - "errorMessage": "Depreciated" - } -} \ No newline at end of file diff --git a/docs/json-responses/error-4710.json b/docs/json-responses/error-4710.json deleted file mode 100644 index de3ae7cf..00000000 --- a/docs/json-responses/error-4710.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4710", - "errorAction": "playlist_create", - "errorType": "system", - "errorMessage": "Bad Request: name" - } -} \ No newline at end of file diff --git a/docs/json-responses/error-4742.json b/docs/json-responses/error-4742.json deleted file mode 100644 index 294f8f55..00000000 --- a/docs/json-responses/error-4742.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4742", - "errorAction": "playlist_delete", - "errorType": "account", - "errorMessage": "Require: 100" - } -} \ No newline at end of file diff --git a/docs/json-responses/flag.json b/docs/json-responses/flag.json index 812c0280..36ea7e5a 100644 --- a/docs/json-responses/flag.json +++ b/docs/json-responses/flag.json @@ -1,3 +1,3 @@ { - "success": "flag REMOVED from 93" + "success": "flag ADDED to 2069" } \ No newline at end of file diff --git a/docs/json-responses/followers.json b/docs/json-responses/followers.json index 3bce267c..922f5c49 100644 --- a/docs/json-responses/followers.json +++ b/docs/json-responses/followers.json @@ -1,8 +1,18 @@ -{ - "user": [ - { - "id": "2", - "username": "admin" - } - ] -} \ No newline at end of file +[ + { + "user": [ + { + "id": "7", + "username": "tom" + }, + { + "id": "4", + "username": "generic" + }, + { + "id": "8", + "username": "admin" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/following.json b/docs/json-responses/following.json index 7d42dc24..de95a6f7 100644 --- a/docs/json-responses/following.json +++ b/docs/json-responses/following.json @@ -1,12 +1,38 @@ -{ - "user": [ - { - "id": "2", - "username": "admin" - }, - { - "id": "10", - "username": "generic" - } - ] -} \ No newline at end of file +[ + { + "user": [ + { + "id": "7", + "username": "tom" + }, + { + "id": "5", + "username": "nyssa" + }, + { + "id": "9", + "username": "sam" + }, + { + "id": "10", + "username": "glen" + }, + { + "id": "21", + "username": "shaun" + }, + { + "id": "22", + "username": "jake" + }, + { + "id": "4", + "username": "generic" + }, + { + "id": "8", + "username": "admin" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/friends_timeline.json b/docs/json-responses/friends_timeline.json index 5c673efe..26719158 100644 --- a/docs/json-responses/friends_timeline.json +++ b/docs/json-responses/friends_timeline.json @@ -1,48 +1,56 @@ { - "activity": [ + "timeline": [ { - "id": "31", - "date": "1614055275", - "object_type": "video", - "object_id": "1", + "id": "167387", + "data": "1595916266", + "object_type": "song", + "object_id": "77371", "action": "play", - "user": { - "id": "2", - "username": "admin" - } + "user": [ + { + "id": "4", + "username": "generic" + } + ] }, { - "id": "30", - "date": "1614055252", + "id": "167382", + "data": "1595916087", "object_type": "song", - "object_id": "79", + "object_id": "77371", "action": "play", - "user": { - "id": "2", - "username": "admin" - } + "user": [ + { + "id": "4", + "username": "generic" + } + ] }, { - "id": "26", - "date": "1614055014", + "id": "166906", + "data": "1595373969", "object_type": "song", - "object_id": "76", + "object_id": "886242", "action": "play", - "user": { - "id": "2", - "username": "admin" - } + "user": [ + { + "id": "4", + "username": "generic" + } + ] }, { - "id": "25", - "date": "1614054865", - "object_type": "video", - "object_id": "1", - "action": "userflag", - "user": { - "id": "2", - "username": "admin" - } + "id": "166904", + "data": "1595373920", + "object_type": "song", + "object_id": "886249", + "action": "play", + "user": [ + { + "id": "4", + "username": "generic" + } + ] } ] } \ No newline at end of file diff --git a/docs/json-responses/genre.json b/docs/json-responses/genre.json deleted file mode 100644 index add8afc7..00000000 --- a/docs/json-responses/genre.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "4", - "name": "Dark Ambient", - "albums": 1, - "artists": 1, - "songs": 4, - "videos": 0, - "playlists": 0, - "live_streams": 0 -} \ No newline at end of file diff --git a/docs/json-responses/genre_albums.json b/docs/json-responses/genre_albums.json deleted file mode 100644 index c571b4a1..00000000 --- a/docs/json-responses/genre_albums.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "album": [ - { - "id": "7", - "name": "Sensorisk Deprivation", - "artist": { - "id": "13", - "name": "IOK-1" - }, - "time": 3428, - "year": 2011, - "tracks": [], - "songcount": 4, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "4", - "name": "Dark Ambient" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=7&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/genre_artists.json b/docs/json-responses/genre_artists.json deleted file mode 100644 index e880851b..00000000 --- a/docs/json-responses/genre_artists.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "artist": [ - { - "id": "13", - "name": "IOK-1", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 4, - "genre": [ - { - "id": "4", - "name": "Dark Ambient" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=13&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "", - "summary": "IOK-1 was a side project of Tarmskrap, but it became his main project. \nHe creates ambient, dark ambient, drone something.\n\nIOK-1 soundcloud \n \nHas released one 3\" cdr on Witte Dood Records called \"Rost\", appears on Public Spaces Lab's Ceci n\u2019est pas une pipe and Public Spaces Lab's The Future Lab\n\nHe released a full length called \"Poems\" on Deersound. \nIt is limited to 10 copies, 4 discs, clocks in at just over five hours. ", - "time": 3428, - "yearformed": 0, - "placeformed": "" - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/genre_songs.json b/docs/json-responses/genre_songs.json deleted file mode 100644 index 0f5399ab..00000000 --- a/docs/json-responses/genre_songs.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "song": [ - { - "id": "81", - "title": "Galenskap", - "name": "Galenskap", - "artist": { - "id": "13", - "name": "IOK-1" - }, - "album": { - "id": "7", - "name": "Sensorisk Deprivation" - }, - "albumartist": { - "id": "13", - "name": "IOK-1" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/IOK-1\/Sensorisk Deprivation\/03_-_IOK-1_-_Galenskap.flac", - "genre": [ - { - "id": "4", - "name": "Dark Ambient" - } - ], - "playlisttrack": 1, - "time": 998, - "year": 2011, - "bitrate": 389683, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/x-flac", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=81&uid=4&player=api&name=IOK-1%20-%20Galenskap.flac", - "size": 48633049, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=7&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "DNA Production release\r\nCatalogue # DNA 119", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.330000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/genres.json b/docs/json-responses/genres.json deleted file mode 100644 index 67afb692..00000000 --- a/docs/json-responses/genres.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "genre": [ - { - "id": "6", - "name": "Dance", - "albums": 1, - "artists": 1, - "songs": 11, - "videos": 0, - "playlists": 0, - "live_streams": 0 - }, - { - "id": "4", - "name": "Dark Ambient", - "albums": 1, - "artists": 1, - "songs": 4, - "videos": 0, - "playlists": 0, - "live_streams": 0 - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/get_indexes (album with include).json b/docs/json-responses/get_indexes (album with include).json deleted file mode 100644 index e74a1761..00000000 --- a/docs/json-responses/get_indexes (album with include).json +++ /dev/null @@ -1,1863 +0,0 @@ -{ - "album": [ - { - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [ - { - "id": "110", - "title": "I wanna walk through the fire", - "name": "I wanna walk through the fire", - "artist": { - "id": "23", - "name": "Manic Notion" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/01ManicNotion-IWannaWalkThroughTheFire.m4a", - "genre": [], - "playlisttrack": 1, - "time": 197, - "year": 2012, - "bitrate": 267320, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=110&uid=4&player=api&name=Manic%20Notion%20-%20I%20wanna%20walk%20through%20the%20fire.m4a", - "size": 6651911, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.150000", - "replaygain_track_peak": "0.989000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "114", - "title": "He is the Master of War", - "name": "He is the Master of War", - "artist": { - "id": "26", - "name": "Stress Builds Character" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/02StressBuildsCharacter-HeIsTheMasterOfWar.m4a", - "genre": [], - "playlisttrack": 2, - "time": 233, - "year": 2012, - "bitrate": 256245, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=114&uid=4&player=api&name=Stress%20Builds%20Character%20-%20He%20is%20the%20Master%20of%20War.m4a", - "size": 7535126, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-10.740000", - "replaygain_track_peak": "1.035000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "109", - "title": "Dance with the Devil", - "name": "Dance with the Devil", - "artist": { - "id": "34", - "name": "Comedown Kid" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/03ComedownKid-DanceWithTheDevil.wma", - "genre": [], - "playlisttrack": 3, - "time": 116, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=109&uid=4&player=api&name=Comedown%20Kid%20-%20Dance%20with%20the%20Devil.wma", - "size": 483444, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "113", - "title": "Representin", - "name": "Representin", - "artist": { - "id": "32", - "name": "Shorty Mac" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/04ShortyMac-Representin.mp3", - "genre": [], - "playlisttrack": 4, - "time": 234, - "year": 2012, - "bitrate": 123814, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=113&uid=4&player=api&name=Shorty%20Mac%20-%20Representin.mp3", - "size": 3628327, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "http:\/\/archive.org\/details\/gt477BuriedInNausea", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "1.910000", - "replaygain_track_peak": "0.851000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "111", - "title": "The art of free expression", - "name": "The art of free expression", - "artist": { - "id": "35", - "name": "Tip-C" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/05Tip-c-TheArtOfFreeExpression.wma", - "genre": [], - "playlisttrack": 5, - "time": 110, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=111&uid=4&player=api&name=Tip-C%20-%20The%20art%20of%20free%20expression.wma", - "size": 460498, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "108", - "title": "I've been down this road before", - "name": "I've been down this road before", - "artist": { - "id": "21", - "name": "Tip-C (featuring Mike Beers)" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/06Tip-cfeaturingMikeBeers-IveBeenDownThisRoadBefore.wma", - "genre": [], - "playlisttrack": 6, - "time": 252, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=108&uid=4&player=api&name=Tip-C%20-featuring%20Mike%20Beers-%20-%20I-ve%20been%20down%20this%20road%20before.wma", - "size": 1035322, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "115", - "title": "Are we going Crazy", - "name": "Are we going Crazy", - "artist": { - "id": "27", - "name": "Chi.Otic" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/07Chi.otic-AreWeGoingCrazy.wma", - "genre": [], - "playlisttrack": 7, - "time": 433, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=115&uid=4&player=api&name=Chi.Otic%20-%20Are%20we%20going%20Crazy.wma", - "size": 1776580, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "112", - "title": "Personal Truth", - "name": "Personal Truth", - "artist": { - "id": "33", - "name": "MxBxCx" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/08Mxbxcx-PersonalTruth.mp3", - "genre": [], - "playlisttrack": 8, - "time": 208, - "year": 2012, - "bitrate": 179860, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=112&uid=4&player=api&name=MxBxCx%20-%20Personal%20Truth.mp3", - "size": 4693165, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "http:\/\/archive.org\/details\/gt477BuriedInNausea", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-8.270000", - "replaygain_track_peak": "0.881000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "107", - "title": "Arrest Me", - "name": "Arrest Me", - "artist": { - "id": "20", - "name": "R\/B" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/09R_b-ArrestMe.m4a", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "playlisttrack": 9, - "time": 96, - "year": 2012, - "bitrate": 252864, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=107&uid=4&player=api&name=R-B%20-%20Arrest%20Me.m4a", - "size": 3091727, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-1.350000", - "replaygain_track_peak": "0.881000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null - }, - { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "time": 3873, - "year": 1996, - "tracks": [ - { - "id": "106", - "title": "Malkuth - Intro", - "name": "Malkuth - Intro", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/01Intro.ogg", - "genre": [], - "playlisttrack": 1, - "time": 91, - "year": 1996, - "bitrate": 80962, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=106&uid=4&player=api&name=CARN-N%20-%20Malkuth%20-%20Intro.ogg", - "size": 930226, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 2, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "1.980000", - "replaygain_track_peak": "0.861000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "100", - "title": "The Prophecies Of The Horned One", - "name": "The Prophecies Of The Horned One", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/02ThePropheciesOfTheHornedOne.ogg", - "genre": [], - "playlisttrack": 2, - "time": 378, - "year": 1996, - "bitrate": 89965, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=100&uid=4&player=api&name=CARN-N%20-%20The%20Prophecies%20Of%20The%20Horned%20One.ogg", - "size": 4265791, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-10.510000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "98", - "title": "In The Seven Woods", - "name": "In The Seven Woods", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/03InTheSevenWoods.ogg", - "genre": [], - "playlisttrack": 3, - "time": 420, - "year": 1996, - "bitrate": 84423, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=98&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods.ogg", - "size": 4444403, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-9.700000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "104", - "title": "The Infernal Serpent", - "name": "The Infernal Serpent", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/04TheInfernalSerpent.ogg", - "genre": [], - "playlisttrack": 4, - "time": 404, - "year": 1996, - "bitrate": 100053, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=104&uid=4&player=api&name=CARN-N%20-%20The%20Infernal%20Serpent.ogg", - "size": 5066698, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 4, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-11.260000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "102", - "title": "Moremque Sinistrum Sacrorum", - "name": "Moremque Sinistrum Sacrorum", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/05MoremqueSinistrumSacrorum.ogg", - "genre": [], - "playlisttrack": 5, - "time": 164, - "year": 1996, - "bitrate": 106647, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=102&uid=4&player=api&name=CARN-N%20-%20Moremque%20Sinistrum%20Sacrorum.ogg", - "size": 2202971, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 3, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-7.480000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "99", - "title": "The Prophecies Of The Horned One (Instrumental Re-Recording)", - "name": "The Prophecies Of The Horned One (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/06ThePropheciesOfTheHornedOne_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 6, - "time": 427, - "year": 1996, - "bitrate": 143788, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=99&uid=4&player=api&name=CARN-N%20-%20The%20Prophecies%20Of%20The%20Horned%20One%20-Instrumental%20Re-Recording-.ogg", - "size": 7696008, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.660000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "103", - "title": "In The Seven Woods (Instrumental Re-Recording)", - "name": "In The Seven Woods (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/07InTheSevenWoods_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 7, - "time": 452, - "year": 1996, - "bitrate": 138338, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=103&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods%20-Instrumental%20Re-Recording-.ogg", - "size": 7826238, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.210000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "105", - "title": "The Infernal Serpent (Instrumental Re-Recording)", - "name": "The Infernal Serpent (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/08TheInfernalSerpent_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 8, - "time": 557, - "year": 1996, - "bitrate": 139453, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=105&uid=4&player=api&name=CARN-N%20-%20The%20Infernal%20Serpent%20-Instrumental%20Re-Recording-.ogg", - "size": 9722091, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.240000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "101", - "title": "Rehearsal Tape (1996)", - "name": "Rehearsal Tape (1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/09RehearsalTape1996.ogg", - "genre": [], - "playlisttrack": 9, - "time": 980, - "year": 1996, - "bitrate": 66912, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=101&uid=4&player=api&name=CARN-N%20-%20Rehearsal%20Tape%20-1996-.ogg", - "size": 8219821, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-9.560000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 9, - "diskcount": 1, - "type": null, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": null - }, - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "time": 4568, - "year": 2007, - "tracks": [ - { - "id": "56", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/01-Synthetic_-_BlackBlueSmokeDM20k22kh_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 500, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=56&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.mp3", - "size": 4010069, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.110000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "64", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/01-Synthetic_-_BlackBlueSmokeDM20k22kh.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 500, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=64&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.wma", - "size": 1298295, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "59", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/02-Synthetic_-_YellowSmoke20k22hS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 3, - "time": 290, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=59&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.mp3", - "size": 2325568, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "2.750000", - "replaygain_track_peak": "0.716000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "65", - "title": "YellowSmoke", - "name": "YellowSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/02-Synthetic_-_YellowSmoke20k22hS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 4, - "time": 290, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=65&uid=4&player=api&name=Synthetic%20-%20YellowSmoke.wma", - "size": 754935, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "57", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/03-Synthetic_-_PurpleSmokeVMix20k22khS2_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 5, - "time": 390, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=57&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.mp3", - "size": 3131519, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.130000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "62", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/03-Synthetic_-_PurpleSmokeVMix20k22khS2.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 6, - "time": 390, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=62&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.wma", - "size": 1014135, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "58", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/04-Synthetic_-_BrownSmokeYSBM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 7, - "time": 304, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=58&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.mp3", - "size": 2441886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "0.960000", - "replaygain_track_peak": "0.912000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "60", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/04-Synthetic_-_BrownSmokeYSBM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 8, - "time": 304, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=60&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.wma", - "size": 792375, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 9, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "55", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 10, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=55&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-4.060000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "61", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/05-Synthetic_-_RedGreenSmokePM20k44khM.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 11, - "time": 400, - "year": 2007, - "bitrate": 20627, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=61&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.wma", - "size": 1044851, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "63", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/05-Synthetic_-_RedGreenSmokePM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 12, - "time": 400, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=63&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.wma", - "size": 1041065, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null - }, - { - "id": "9", - "name": "Creeping Lawler 2", - "artist": { - "id": "15", - "name": "Warfare 3.0" - }, - "time": 592, - "year": 0, - "tracks": [ - { - "id": "96", - "title": "Creeping Lawler 2", - "name": "Creeping Lawler 2", - "artist": { - "id": "15", - "name": "Warfare 3.0" - }, - "album": { - "id": "9", - "name": "Creeping Lawler 2" - }, - "albumartist": { - "id": "15", - "name": "Warfare 3.0" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Warfare 3.0\/Creeping Lawler 2\/01 - Creeping Lawler 2.wav", - "genre": [], - "playlisttrack": 1, - "time": 296, - "year": 0, - "bitrate": 1411200, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=96&uid=4&player=api&name=Warfare%203.0%20-%20Creeping%20Lawler%202.wav", - "size": 52345628, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=9&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 3, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-4.310000", - "replaygain_track_peak": "0.989000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "97", - "title": "Creeping Lawler 2", - "name": "Creeping Lawler 2", - "artist": { - "id": "15", - "name": "Warfare 3.0" - }, - "album": { - "id": "9", - "name": "Creeping Lawler 2" - }, - "albumartist": { - "id": "15", - "name": "Warfare 3.0" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Warfare 3.0\/Creeping Lawler 2\/01 - Creeping Lawler 2.mp3", - "genre": [], - "playlisttrack": 2, - "time": 296, - "year": 0, - "bitrate": 177349, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=97&uid=4&player=api&name=Warfare%203.0%20-%20Creeping%20Lawler%202.mp3", - "size": 6652448, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=9&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "https:\/\/archive.org\/details\/Creeping_Lawler_2", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-4.320000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 2, - "diskcount": 1, - "type": null, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=9&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": 3, - "rating": 3, - "averagerating": 3, - "mbid": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/get_indexes (album).json b/docs/json-responses/get_indexes (album).json index 2c3a57e7..45cc4ac5 100644 --- a/docs/json-responses/get_indexes (album).json +++ b/docs/json-responses/get_indexes (album).json @@ -1,98 +1,102 @@ -{ - "album": [ - { - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null +[ + { + "id": "54130", + "name": "\"...Famous Last Words...\"", + "artist": { + "id": "6778", + "name": "Supertramp" }, - { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" + "year": 2002, + "tracks": 9, + "disk": 1, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "time": 3873, - "year": 1996, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": null, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": null + { + "id": "47", + "name": "Pop Rock" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=54130&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "dc0bdca9-ae06-426b-9a43-f23334d0e939" + }, + { + "id": "72713", + "name": "\"Awaken, My Love!\"", + "artist": { + "id": "13600", + "name": "Childish Gambino" }, - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" + "year": 2016, + "tracks": 11, + "disk": 1, + "tag": [ + { + "id": "360", + "name": "R&B" }, - "time": 4568, - "year": 2007, - "tracks": [], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null + { + "id": "2701", + "name": "HipHop" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=72713&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "c716704d-b2a1-44f9-8cec-66b10361c4ed" + }, + { + "id": "63679", + "name": "\"Bettin' on a Longshot\" The Singles Collection", + "artist": { + "id": "9303", + "name": "Harrington Saints" }, - { - "id": "9", - "name": "Creeping Lawler 2", - "artist": { - "id": "15", - "name": "Warfare 3.0" - }, - "time": 592, - "year": 0, - "tracks": [], - "songcount": 2, - "diskcount": 1, - "type": null, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=9&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": 3, - "rating": 3, - "averagerating": 3, - "mbid": null - } - ] -} \ No newline at end of file + "year": 2013, + "tracks": 15, + "disk": 1, + "tag": [ + { + "id": "60", + "name": "Punk Rock" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=63679&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "71baccde-5011-43b6-b175-30b08c726b06" + }, + { + "id": "75376", + "name": "\"C\" Is for (Please Insert Sophomoric Genitalia Reference HERE)", + "artist": { + "id": "474", + "name": "Puscifer" + }, + "year": 2010, + "tracks": 8, + "disk": 1, + "tag": [ + { + "id": "4", + "name": "Electronic" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=75376&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "46e02dda-058d-4226-a356-76b6bfdd5790" + } +] \ No newline at end of file diff --git a/docs/json-responses/get_indexes (artist with include).json b/docs/json-responses/get_indexes (artist with include).json deleted file mode 100644 index f1a98fe5..00000000 --- a/docs/json-responses/get_indexes (artist with include).json +++ /dev/null @@ -1,1935 +0,0 @@ -{ - "artist": [ - { - "id": "16", - "name": "CARN\u00daN", - "albums": [ - { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "time": 3873, - "year": 1996, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": null, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": null - } - ], - "albumcount": 1, - "songs": [ - { - "id": "106", - "title": "Malkuth - Intro", - "name": "Malkuth - Intro", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/01Intro.ogg", - "genre": [], - "playlisttrack": 1, - "time": 91, - "year": 1996, - "bitrate": 80962, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=106&uid=4&player=api&name=CARN-N%20-%20Malkuth%20-%20Intro.ogg", - "size": 930226, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 2, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "1.980000", - "replaygain_track_peak": "0.861000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "100", - "title": "The Prophecies Of The Horned One", - "name": "The Prophecies Of The Horned One", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/02ThePropheciesOfTheHornedOne.ogg", - "genre": [], - "playlisttrack": 2, - "time": 378, - "year": 1996, - "bitrate": 89965, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=100&uid=4&player=api&name=CARN-N%20-%20The%20Prophecies%20Of%20The%20Horned%20One.ogg", - "size": 4265791, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-10.510000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "98", - "title": "In The Seven Woods", - "name": "In The Seven Woods", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/03InTheSevenWoods.ogg", - "genre": [], - "playlisttrack": 3, - "time": 420, - "year": 1996, - "bitrate": 84423, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=98&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods.ogg", - "size": 4444403, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-9.700000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "104", - "title": "The Infernal Serpent", - "name": "The Infernal Serpent", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/04TheInfernalSerpent.ogg", - "genre": [], - "playlisttrack": 4, - "time": 404, - "year": 1996, - "bitrate": 100053, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=104&uid=4&player=api&name=CARN-N%20-%20The%20Infernal%20Serpent.ogg", - "size": 5066698, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 4, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-11.260000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "102", - "title": "Moremque Sinistrum Sacrorum", - "name": "Moremque Sinistrum Sacrorum", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/05MoremqueSinistrumSacrorum.ogg", - "genre": [], - "playlisttrack": 5, - "time": 164, - "year": 1996, - "bitrate": 106647, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=102&uid=4&player=api&name=CARN-N%20-%20Moremque%20Sinistrum%20Sacrorum.ogg", - "size": 2202971, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 3, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-7.480000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "99", - "title": "The Prophecies Of The Horned One (Instrumental Re-Recording)", - "name": "The Prophecies Of The Horned One (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/06ThePropheciesOfTheHornedOne_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 6, - "time": 427, - "year": 1996, - "bitrate": 143788, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=99&uid=4&player=api&name=CARN-N%20-%20The%20Prophecies%20Of%20The%20Horned%20One%20-Instrumental%20Re-Recording-.ogg", - "size": 7696008, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.660000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "103", - "title": "In The Seven Woods (Instrumental Re-Recording)", - "name": "In The Seven Woods (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/07InTheSevenWoods_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 7, - "time": 452, - "year": 1996, - "bitrate": 138338, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=103&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods%20-Instrumental%20Re-Recording-.ogg", - "size": 7826238, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.210000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "105", - "title": "The Infernal Serpent (Instrumental Re-Recording)", - "name": "The Infernal Serpent (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/08TheInfernalSerpent_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 8, - "time": 557, - "year": 1996, - "bitrate": 139453, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=105&uid=4&player=api&name=CARN-N%20-%20The%20Infernal%20Serpent%20-Instrumental%20Re-Recording-.ogg", - "size": 9722091, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.240000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "101", - "title": "Rehearsal Tape (1996)", - "name": "Rehearsal Tape (1996)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/09RehearsalTape1996.ogg", - "genre": [], - "playlisttrack": 9, - "time": 980, - "year": 1996, - "bitrate": 66912, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=101&uid=4&player=api&name=CARN-N%20-%20Rehearsal%20Tape%20-1996-.ogg", - "size": 8219821, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-9.560000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 9, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=16&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": "", - "summary": " ", - "time": 3873, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "27", - "name": "Chi.Otic", - "albums": [ - { - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null - } - ], - "albumcount": 0, - "songs": [ - { - "id": "115", - "title": "Are we going Crazy", - "name": "Are we going Crazy", - "artist": { - "id": "27", - "name": "Chi.Otic" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/07Chi.otic-AreWeGoingCrazy.wma", - "genre": [], - "playlisttrack": 1, - "time": 433, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=115&uid=4&player=api&name=Chi.Otic%20-%20Are%20we%20going%20Crazy.wma", - "size": 1776580, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=27&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "7", - "summary": " ", - "time": 433, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "34", - "name": "Comedown Kid", - "albums": [ - { - "id": "12", - "name": "Buried in Nausea", - "artist": { - "id": "19", - "name": "Various Artists" - }, - "time": 1879, - "year": 2012, - "tracks": [], - "songcount": 9, - "diskcount": 1, - "type": "compilation", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": null - } - ], - "albumcount": 0, - "songs": [ - { - "id": "109", - "title": "Dance with the Devil", - "name": "Dance with the Devil", - "artist": { - "id": "34", - "name": "Comedown Kid" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/03ComedownKid-DanceWithTheDevil.wma", - "genre": [], - "playlisttrack": 1, - "time": 116, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=109&uid=4&player=api&name=Comedown%20Kid%20-%20Dance%20with%20the%20Devil.wma", - "size": 483444, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=34&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "", - "summary": null, - "time": 116, - "yearformed": 0, - "placeformed": null - }, - { - "id": "36", - "name": "Comfort Fit", - "albums": [ - { - "id": "21", - "name": "Forget and Remember", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "time": 4248, - "year": 2005, - "tracks": [], - "songcount": 20, - "diskcount": 1, - "type": "album", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "6e1d48f7-717c-416e-af35-5d2454a13af2" - } - ], - "albumcount": 1, - "songs": [ - { - "id": "116", - "title": "Can I Help U?", - "name": "Can I Help U?", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/1 - Can I Help U?.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 1, - "time": 103, - "year": 2005, - "bitrate": 216839, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=116&uid=4&player=api&name=Comfort%20Fit%20-%20Can%20I%20Help%20U-.mp3", - "size": 2811819, - "mbid": "51d0e252-f20c-414c-b169-8dcf18ef9d26", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-01-comfort_fit-can_i_help_u\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "121", - "title": "Planetary Picknick", - "name": "Planetary Picknick", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 2, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/2 - Planetary Picknick.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 2, - "time": 358, - "year": 2005, - "bitrate": 238812, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=121&uid=4&player=api&name=Comfort%20Fit%20-%20Planetary%20Picknick.mp3", - "size": 10715592, - "mbid": "6defae67-37da-4a85-90f6-80df5c27d88c", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-02-comfort_fit-planetary_picknick\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "119", - "title": "Sorry", - "name": "Sorry", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/3 - Sorry.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 3, - "time": 200, - "year": 2005, - "bitrate": 239161, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=119&uid=4&player=api&name=Comfort%20Fit%20-%20Sorry.mp3", - "size": 6018213, - "mbid": "261964a4-8062-426d-b88e-82c0097ca98c", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/03_Sorry\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: Creative Commons\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "120", - "title": "Freeze the Cut", - "name": "Freeze the Cut", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/4 - Freeze The Cut.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 4, - "time": 168, - "year": 2005, - "bitrate": 246979, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=120&uid=4&player=api&name=Comfort%20Fit%20-%20Freeze%20the%20Cut.mp3", - "size": 5216305, - "mbid": "d927db0b-7d3a-4fba-867c-d140cb19aeb9", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-04-comfort_fit-freeze_the_cut_feat_blaktroniks\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "125", - "title": "Take a Look", - "name": "Take a Look", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/5 - Take a Look.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 5, - "time": 230, - "year": 2005, - "bitrate": 243729, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=125&uid=4&player=api&name=Comfort%20Fit%20-%20Take%20a%20Look.mp3", - "size": 7018987, - "mbid": "8a3bdac5-f0bd-4197-9deb-d4880d6f3b6d", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-05-comfort_fit-take_a_look\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "124", - "title": "True Form", - "name": "True Form", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/6 - True Form.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 6, - "time": 192, - "year": 2005, - "bitrate": 243031, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=124&uid=4&player=api&name=Comfort%20Fit%20-%20True%20Form.mp3", - "size": 5848663, - "mbid": "8bf3acd2-860b-4ece-896f-9b2de89e35fa", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-06-comfort_fit-true_form\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "122", - "title": "Thursday Is Thursty", - "name": "Thursday Is Thursty", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/7 - Thursday is Thursdy.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 7, - "time": 92, - "year": 2005, - "bitrate": 225219, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=122&uid=4&player=api&name=Comfort%20Fit%20-%20Thursday%20Is%20Thursty.mp3", - "size": 2607497, - "mbid": "36fa39a1-483d-49d9-907b-17c4e3d60b47", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-07-comfort_fit-thursday_is_thursty\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "128", - "title": "Whenever You Wanna Call Me", - "name": "Whenever You Wanna Call Me", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 8, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/8 - Whenever You Wanna Call Me.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 8, - "time": 188, - "year": 2005, - "bitrate": 250322, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=128&uid=4&player=api&name=Comfort%20Fit%20-%20Whenever%20You%20Wanna%20Call%20Me.mp3", - "size": 5897286, - "mbid": "0cc9456b-1750-4739-9346-90d9247da292", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-08-comfort_fit-whenever_you_wanna_call_me_feat_prymer\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "118", - "title": "As Pure as Possible", - "name": "As Pure as Possible", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/9 - As Pure as Possible.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 9, - "time": 128, - "year": 2005, - "bitrate": 234690, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=118&uid=4&player=api&name=Comfort%20Fit%20-%20As%20Pure%20as%20Possible.mp3", - "size": 3789410, - "mbid": "7a3d740d-5546-4900-88af-b97b42c3344e", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-09-comfort_fit-as_pure_as_possible\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "127", - "title": "She Knows Me Now", - "name": "She Knows Me Now", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 10, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/10 - She Knows Me Now (re-edit).mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 10, - "time": 209, - "year": 2005, - "bitrate": 217167, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=127&uid=4&player=api&name=Comfort%20Fit%20-%20She%20Knows%20Me%20Now.mp3", - "size": 5690938, - "mbid": "3845cef9-b874-449f-94a5-5c9acdead9df", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-10-comfort_fit-she_knows_me_now_feat_mercury_waters__prymer\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "117", - "title": "Remember Something I Forgot", - "name": "Remember Something I Forgot", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 11, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/11 - Remember Something I Forgot.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 11, - "time": 163, - "year": 2005, - "bitrate": 235109, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=117&uid=4&player=api&name=Comfort%20Fit%20-%20Remember%20Something%20I%20Forgot.mp3", - "size": 4816734, - "mbid": "ba784e10-e268-4c44-9c82-091167162c27", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-11-comfort_fit-remember_something_i_forgot\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "126", - "title": "Don't Show This Message Again", - "name": "Don't Show This Message Again", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 12, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/12 - Don\u2019t Show This Message Again.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 12, - "time": 197, - "year": 2005, - "bitrate": 232690, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=126&uid=4&player=api&name=Comfort%20Fit%20-%20Don-t%20Show%20This%20Message%20Again.mp3", - "size": 5755191, - "mbid": "6b582438-c034-47c2-86b0-61c63ec96b4b", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-12-comfort_fit-dont_show_this_message_again\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "133", - "title": "Kurz Vor Danach Ganz '05", - "name": "Kurz Vor Danach Ganz '05", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 13, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/13 - Kurz Vor Danach Ganz \u201805.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 13, - "time": 247, - "year": 2005, - "bitrate": 230429, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=133&uid=4&player=api&name=Comfort%20Fit%20-%20Kurz%20Vor%20Danach%20Ganz%20-05.mp3", - "size": 7136353, - "mbid": "60ca3461-5f2b-4d0d-9cc5-ce79b358de7b", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-13-comfort_fit-kurz_vor_danach_ganz_05\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "135", - "title": "Emotional Draft", - "name": "Emotional Draft", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 14, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/14 - Emotional Draft.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 14, - "time": 379, - "year": 2005, - "bitrate": 235925, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=135&uid=4&player=api&name=Comfort%20Fit%20-%20Emotional%20Draft.mp3", - "size": 11216864, - "mbid": "ab598f5a-4cbb-4ce0-a3ac-9de17026f528", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-14-comfort_fit-emotional_draft\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "132", - "title": "Hairy Crushed Nuts", - "name": "Hairy Crushed Nuts", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 15, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/15 - Hairy Crushed Nuts.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 15, - "time": 267, - "year": 2005, - "bitrate": 248806, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=132&uid=4&player=api&name=Comfort%20Fit%20-%20Hairy%20Crushed%20Nuts.mp3", - "size": 8328099, - "mbid": "db672da0-963b-45a4-b3d8-23efc9c1953d", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-15-comfort_fit-hairy_crushed_nuts\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "129", - "title": "The Hunt", - "name": "The Hunt", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 16, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/16 - The Hunt.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 16, - "time": 226, - "year": 2005, - "bitrate": 224425, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=129&uid=4&player=api&name=Comfort%20Fit%20-%20The%20Hunt.mp3", - "size": 6373874, - "mbid": "8d22ccfd-38e9-42ca-9664-a236302ab8bf", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-16-comfort_fit-the_hunt\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "130", - "title": "Something to Do", - "name": "Something to Do", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 17, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/17 - Something To Do.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 17, - "time": 261, - "year": 2005, - "bitrate": 246373, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=130&uid=4&player=api&name=Comfort%20Fit%20-%20Something%20to%20Do.mp3", - "size": 8072761, - "mbid": "143eca6b-26d6-4b5d-a6b2-7e7cc9e05769", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-17-comfort_fit-something_to_do_feat_blaktroniks\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "123", - "title": "Go on, Take It Further", - "name": "Go on, Take It Further", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 18, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/18 - Go On, Take It Further.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 18, - "time": 69, - "year": 2005, - "bitrate": 206742, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=123&uid=4&player=api&name=Comfort%20Fit%20-%20Go%20on-%20Take%20It%20Further.mp3", - "size": 1795861, - "mbid": "64f731fb-da3f-41d0-a08b-47ecce55a3e4", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-18-comfort_fit-go_on_take_it_further\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "134", - "title": "Swabian Sound System", - "name": "Swabian Sound System", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 19, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/19 - Swabian Sound System.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 19, - "time": 281, - "year": 2005, - "bitrate": 244202, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=134&uid=4&player=api&name=Comfort%20Fit%20-%20Swabian%20Sound%20System.mp3", - "size": 8594721, - "mbid": "8e993e63-ddf9-4603-a2c0-5d2f18efebce", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-19-comfort_fit-swabian_sound_system\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "131", - "title": "Miles of Smiles", - "name": "Miles of Smiles", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 20, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/20 - Miles of Smiles.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 20, - "time": 290, - "year": 2005, - "bitrate": 247925, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=131&uid=4&player=api&name=Comfort%20Fit%20-%20Miles%20of%20Smiles.mp3", - "size": 9028758, - "mbid": "ec160787-e0db-4f76-85b5-5a76f59f36f9", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-20-comfort_fit-miles_of_smiles\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ], - "songcount": 20, - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=36&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "e6e2b787-0b4c-4267-8161-310399b101a5", - "summary": "Comfort Fit\u2019s(Boris Mezga) versatile influences range from early detroit techno and minimal electronica to jazz, broken beats and hip-hop. This makes it easy for him to invisibly switch between musical styles within a fingersnap, taking the listener onto long and exciting journies. Wisely using music codes of genres such as hip-hop, dubstep and techno as a mere comic template, Comfort Fit has inspired hip-hop and techno artists around the world with his heavy beat techniques. Besides his numerous remix requests, even major brands have discovered his outstanding production skills and request his music for advertisements regularly. Since 2000 he has ", - "time": 4248, - "yearformed": 0, - "placeformed": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/get_indexes (artist).json b/docs/json-responses/get_indexes (artist).json index 338e891d..b19380d2 100644 --- a/docs/json-responses/get_indexes (artist).json +++ b/docs/json-responses/get_indexes (artist).json @@ -1,85 +1,146 @@ -{ - "artist": [ - { - "id": "16", - "name": "CARN\u00daN", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 9, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=16&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 5, - "mbid": "", - "summary": " ", - "time": 3873, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "27", - "name": "Chi.Otic", - "albums": [], - "albumcount": 0, - "songs": [], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=27&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "7", - "summary": " ", - "time": 433, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "34", - "name": "Comedown Kid", - "albums": [], - "albumcount": 0, - "songs": [], - "songcount": 1, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=34&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "", - "summary": null, - "time": 116, - "yearformed": 0, - "placeformed": null - }, - { - "id": "36", - "name": "Comfort Fit", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 20, - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=36&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "e6e2b787-0b4c-4267-8161-310399b101a5", - "summary": "Comfort Fit\u2019s(Boris Mezga) versatile influences range from early detroit techno and minimal electronica to jazz, broken beats and hip-hop. This makes it easy for him to invisibly switch between musical styles within a fingersnap, taking the listener onto long and exciting journies. Wisely using music codes of genres such as hip-hop, dubstep and techno as a mere comic template, Comfort Fit has inspired hip-hop and techno artists around the world with his heavy beat techniques. Besides his numerous remix requests, even major brands have discovered his outstanding production skills and request his music for advertisements regularly. Since 2000 he has ", - "time": 4248, - "yearformed": 0, - "placeformed": null - } - ] -} \ No newline at end of file +[ + { + "id": "13429", + "name": "!!!", + "albums": 1, + "songs": 1, + "tag": [ + { + "id": "55", + "name": "Electro" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=13429&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "f26c72d3-e52c-467b-b651-679c73d8e1a7", + "summary": "!!! is an American dance-punk band from Sacramento, California that formed in Autumn 1996 from the former band members of The Yah Mos, Black Liquorice and Popesmashers.\n\nAfter a tour together, members of local Sacramento, CA bands Black Liquorice and Popesmashers formed !!!. The band's name was inspired by the subtitles of the movie The Gods Must Be Crazy, in which the mouth-clicking sounds of the Bushmen were represented as \"!\". Chk Chk Chk is the most common pronunciation ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "3858", + "name": "!Bang Elektronika", + "albums": 1, + "songs": 15, + "tag": [ + { + "id": "4", + "name": "Electronic" + }, + { + "id": "11", + "name": "Techno" + }, + { + "id": "50", + "name": "EBM" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=3858&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": 4, + "rating": 4, + "averagerating": null, + "mbid": "e01b0106-7781-4c80-b7d3-639610a6c5d7", + "summary": " ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "2461", + "name": "!distain", + "albums": 20, + "songs": 249, + "tag": [ + { + "id": "4", + "name": "Electronic" + }, + { + "id": "7", + "name": "Synthpop" + }, + { + "id": "22", + "name": "Pop" + }, + { + "id": "50", + "name": "EBM" + }, + { + "id": "55", + "name": "Electro" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=2461&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": 4, + "rating": 4, + "averagerating": null, + "mbid": "c60674c3-1cd8-4b2c-ada3-8f99d94c4aad", + "summary": "!distain (released as Distain! in the 1990's, by now the exclamation mark goes in the front of the name) is a friendly and unpretentious synth-pop band from Munich, Germany, consisting of singer Alexander Braun and Manfred Thomaser.\n\nHere's a short band biography:\n\n1992\nBand foundation by Alexander Braun, Oliver Faig and Sebastian von Wyschetzki.\n\n1994\nFirst public appearance: \"Pop Albert\" Contest Augsburg; first record deal with Chrom Records.\n\n1995 ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "1206", + "name": "\"Weird Al\" Yankovic", + "albums": 22, + "songs": 296, + "tag": [ + { + "id": "3", + "name": "Punk" + }, + { + "id": "5", + "name": "Comedy" + }, + { + "id": "6", + "name": "Rock" + }, + { + "id": "22", + "name": "Pop" + }, + { + "id": "43", + "name": "Soundtrack" + }, + { + "id": "184", + "name": "Parody" + }, + { + "id": "258", + "name": "Spoken Word" + }, + { + "id": "475", + "name": "Rock & Roll" + }, + { + "id": "830", + "name": "Novelty" + }, + { + "id": "1409", + "name": "Hip Hop" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=1206&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": 4, + "rating": 4, + "averagerating": null, + "mbid": "7746d775-9550-4360-b8d5-c37bd448ce01", + "summary": "Alfred Matthew \"Weird Al\" Yankovic (born October 23, 1959 in Downey, California) is an American singer-songwriter, music producer, actor, comedian, satirist, accordion player and kazooist. Yankovic is known in particular for his humorous songs that make light of popular culture and that often parody specific songs by contemporary musical acts. Since his first-aired song parody in 1976, he has sold more than 12 million albums\u2014more than any other comedy act in history\u2014recorded more than 150 parody and original songs ", + "yearformed": "0", + "placeformed": "" + } +] \ No newline at end of file diff --git a/docs/json-responses/get_indexes (playlist with include).json b/docs/json-responses/get_indexes (playlist with include).json deleted file mode 100644 index 5848acdb..00000000 --- a/docs/json-responses/get_indexes (playlist with include).json +++ /dev/null @@ -1,189 +0,0 @@ -{ - "playlist": [ - { - "id": "3", - "name": "random - admin - private (admin)", - "owner": "admin", - "items": [ - { - "id": "90", - "playlisttrack": 1 - }, - { - "id": "91", - "playlisttrack": 2 - }, - { - "id": "101", - "playlisttrack": 3 - }, - { - "id": "62", - "playlisttrack": 4 - }, - { - "id": "89", - "playlisttrack": 5 - }, - { - "id": "98", - "playlisttrack": 6 - }, - { - "id": "60", - "playlisttrack": 7 - }, - { - "id": "94", - "playlisttrack": 8 - }, - { - "id": "55", - "playlisttrack": 9 - }, - { - "id": "54", - "playlisttrack": 10 - }, - { - "id": "92", - "playlisttrack": 11 - }, - { - "id": "85", - "playlisttrack": 12 - }, - { - "id": "104", - "playlisttrack": 13 - }, - { - "id": "83", - "playlisttrack": 14 - }, - { - "id": "74", - "playlisttrack": 15 - }, - { - "id": "57", - "playlisttrack": 16 - }, - { - "id": "97", - "playlisttrack": 17 - }, - { - "id": "56", - "playlisttrack": 18 - }, - { - "id": "84", - "playlisttrack": 19 - }, - { - "id": "103", - "playlisttrack": 20 - }, - { - "id": "106", - "playlisttrack": 21 - }, - { - "id": "61", - "playlisttrack": 22 - }, - { - "id": "64", - "playlisttrack": 23 - }, - { - "id": "58", - "playlisttrack": 24 - }, - { - "id": "100", - "playlisttrack": 25 - }, - { - "id": "73", - "playlisttrack": 26 - }, - { - "id": "99", - "playlisttrack": 27 - }, - { - "id": "105", - "playlisttrack": 28 - }, - { - "id": "82", - "playlisttrack": 29 - }, - { - "id": "81", - "playlisttrack": 30 - }, - { - "id": "87", - "playlisttrack": 31 - }, - { - "id": "95", - "playlisttrack": 32 - }, - { - "id": "76", - "playlisttrack": 33 - }, - { - "id": "102", - "playlisttrack": 34 - }, - { - "id": "93", - "playlisttrack": 35 - }, - { - "id": "59", - "playlisttrack": 36 - }, - { - "id": "65", - "playlisttrack": 37 - }, - { - "id": "77", - "playlisttrack": 38 - }, - { - "id": "88", - "playlisttrack": 39 - }, - { - "id": "80", - "playlisttrack": 40 - }, - { - "id": "86", - "playlisttrack": 41 - }, - { - "id": "78", - "playlisttrack": 42 - }, - { - "id": "96", - "playlisttrack": 43 - } - ], - "type": "private", - "art": "https:\/\/music.com.au\/image.php?object_id=3&object_type=playlist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "" - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/get_indexes (playlist).json b/docs/json-responses/get_indexes (playlist).json index 2c8c272b..7de49b9d 100644 --- a/docs/json-responses/get_indexes (playlist).json +++ b/docs/json-responses/get_indexes (playlist).json @@ -1,28 +1,30 @@ -{ - "playlist": [ - { - "id": "3", - "name": "random - admin - private (admin)", - "owner": "admin", - "items": "43", - "type": "private", - "art": "https:\/\/music.com.au\/image.php?object_id=3&object_type=playlist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "" - }, - { - "id": "2", - "name": "random - admin - public (admin)", - "owner": "admin", - "items": "43", - "type": "public", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=playlist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": null, - "rating": null, - "averagerating": "" - } - ] -} \ No newline at end of file +[ + { + "id": "2002", + "name": "dewaardradio", + "owner": "System", + "items": 12694, + "type": "private" + }, + { + "id": "2069", + "name": "Hudson", + "owner": "user", + "items": 23, + "type": "public" + }, + { + "id": "1994", + "name": "nyssa mixed", + "owner": "nyssa", + "items": 3112, + "type": "private" + }, + { + "id": "19", + "name": "nyssaRadio", + "owner": "nyssa", + "items": 4456, + "type": "private" + } +] \ No newline at end of file diff --git a/docs/json-responses/get_indexes (podcast with include).json b/docs/json-responses/get_indexes (podcast with include).json deleted file mode 100644 index 6d5be4b4..00000000 --- a/docs/json-responses/get_indexes (podcast with include).json +++ /dev/null @@ -1,662 +0,0 @@ -{ - "podcast": [ - { - "id": "1", - "name": "60-Second Science", - "description": "Tune in every weekday for quick reports and commentaries on the world of science\u2014it'll just take a minute", - "language": "en-us", - "copyright": "False", - "feed_url": "http:\/\/rss.sciam.com\/sciam\/60secsciencepodcast", - "generator": "", - "website": "https:\/\/www.scientificamerican.com\/podcast\/60-second-science\/", - "build_date": "1970-01-01T10:00:00+10:00", - "sync_date": "2021-08-20T11:08:30+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=1", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [ - { - "id": "135", - "title": "The Incredible, Reanimated 24,000-Year-Old Rotifer", - "name": "The Incredible, Reanimated 24,000-Year-Old Rotifer", - "description": "The last time this tiny wheel animalcule was moving around, woolly mammoths roamed the earth.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=EI6kC4Uuf7k:1D8ECiIxgHk:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/EI6kC4Uuf7k\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/EI6kC4Uuf7k\/", - "pubdate": "2021-08-17T23:00:00+10:00", - "state": "Completed", - "filelength": "00:05:38", - "filesize": "5.66 MB", - "filename": "60-Second Science - The Incredible, Reanimated 24,000-Year-Old Rotifer.mp3", - "mime": "audio\/mpeg", - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=135", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=135&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20The%20Incredible-%20Reanimated%2024-000-Year-Old%20Rotifer.mp3", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "136", - "title": "Astronomers Find an Unexpected Bumper Crop of Black Holes", - "name": "Astronomers Find an Unexpected Bumper Crop of Black Holes", - "description": "In trying to explain the spectacular star trails of the star cluster Palomar 5, astronomers stumbled on a very large trove of black holes.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=VUajjnt6734:J8pSbd94Yeo:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/VUajjnt6734\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Space & Physics", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/VUajjnt6734\/", - "pubdate": "2021-08-13T00:00:00+10:00", - "state": "Pending", - "filelength": "00:03:24", - "filesize": "0 B", - "filename": "60-Second Science - Astronomers Find an Unexpected Bumper Crop of Black Holes.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=136", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=136&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Astronomers%20Find%20an%20Unexpected%20Bumper%20Crop%20of%20Black%20Holes.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "137", - "title": "Inside Millions of Invisible Droplets, Potential Superbug Killers Grow", - "name": "Inside Millions of Invisible Droplets, Potential Superbug Killers Grow", - "description": "New research has created microscopic antibiotic factories in droplets that measure a trillionth of liter in volume.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=2zrOPpKMzgc:Hy9BvZ5xmFo:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/2zrOPpKMzgc\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/2zrOPpKMzgc\/", - "pubdate": "2021-08-10T22:00:00+10:00", - "state": "Pending", - "filelength": "00:06:34", - "filesize": "0 B", - "filename": "60-Second Science - Inside Millions of Invisible Droplets, Potential Superbug Killers Grow.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=137", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=137&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Inside%20Millions%20of%20Invisible%20Droplets-%20Potential%20Superbug%20Killers%20Grow.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "138", - "title": "The Secret behind Songbirds' Magnetic Migratory Sense", - "name": "The Secret behind Songbirds' Magnetic Migratory Sense", - "description": "A molecule found in the retinas of European robins seems to be able to sense weak magnetic fields, such as that of Earth, after it is exposed to light.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=ZY769WpgVxQ:OhvpLpYtKxA:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/ZY769WpgVxQ\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/ZY769WpgVxQ\/", - "pubdate": "2021-08-05T00:00:00+10:00", - "state": "Pending", - "filelength": "00:02:54", - "filesize": "0 B", - "filename": "60-Second Science - The Secret behind Songbirds' Magnetic Migratory Sense.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=138", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=138&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20The%20Secret%20behind%20Songbirds-%20Magnetic%20Migratory%20Sense.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "93", - "title": "COVID, Quickly, Episode 12: Masking Up Again and Why People Refuse Shots", - "name": "COVID, Quickly, Episode 12: Masking Up Again and Why People Refuse Shots", - "description": "Today we bring you a new episode in our podcast series COVID, Quickly. Every two weeks, Scientific American’s senior health editors Tanya Lewis and Josh Fischman catch you up on the...<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=Jyx10yeCC4w:4dxFuClQTT0:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/Jyx10yeCC4w\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/Jyx10yeCC4w\/", - "pubdate": "2021-07-31T03:00:00+10:00", - "state": "Completed", - "filelength": "00:06:18", - "filesize": "6.28 MB", - "filename": "60-Second Science - COVID, Quickly, Episode 12: Masking Up Again and Why People Refuse Shots.mp3", - "mime": "audio\/mpeg", - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=93", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=93&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20COVID-%20Quickly-%20Episode%2012-%20Masking%20Up%20Again%20and%20Why%20People%20Refuse%20Shots.mp3", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "94", - "title": "The Kavli Prize Presents: Understanding Touch [Sponsored]", - "name": "The Kavli Prize Presents: Understanding Touch [Sponsored]", - "description": "Ardem Patapoutian shared the Kavli Prize in Neuroscience in 2020 for answering a basic question: How does touch actually work?<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=UbHjr2YNB_c:TLKeymYoepg:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/UbHjr2YNB_c\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/UbHjr2YNB_c\/", - "pubdate": "2021-07-23T04:00:00+10:00", - "state": "Pending", - "filelength": "00:05:46", - "filesize": "0 B", - "filename": "60-Second Science - The Kavli Prize Presents: Understanding Touch [Sponsored].", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=94", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=94&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20The%20Kavli%20Prize%20Presents-%20Understanding%20Touch%20-Sponsored-.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "95", - "title": "Moths Have an Acoustic Invisibility Cloak to Stay under Bats' Radar", - "name": "Moths Have an Acoustic Invisibility Cloak to Stay under Bats' Radar", - "description": "New research finds they fly around on noise-cancelling wings<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=UHImHfeFNNY:YbBf23xXc9Y:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/UHImHfeFNNY\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Evolution", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/UHImHfeFNNY\/", - "pubdate": "2021-07-21T22:00:00+10:00", - "state": "Pending", - "filelength": "00:02:45", - "filesize": "0 B", - "filename": "60-Second Science - Moths Have an Acoustic Invisibility Cloak to Stay under Bats' Radar.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=95", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=95&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Moths%20Have%20an%20Acoustic%20Invisibility%20Cloak%20to%20Stay%20under%20Bats-%20Radar.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "96", - "title": "COVID, Quickly, Episode 11: Vaccine Booster Shots, and Reopening Offices Safely", - "name": "COVID, Quickly, Episode 11: Vaccine Booster Shots, and Reopening Offices Safely", - "description": "Today we bring you a new episode in our podcast series: COVID, Quickly. Every two weeks, Scientific American’s senior health editors Tanya Lewis and Josh...<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=R97BXjeb_Ls:8mq9cZvxdGE:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/R97BXjeb_Ls\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/R97BXjeb_Ls\/", - "pubdate": "2021-07-17T03:00:00+10:00", - "state": "Pending", - "filelength": "00:05:33", - "filesize": "0 B", - "filename": "60-Second Science - COVID, Quickly, Episode 11: Vaccine Booster Shots, and Reopening Offices Safely.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=96", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=96&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20COVID-%20Quickly-%20Episode%2011-%20Vaccine%20Booster%20Shots-%20and%20Reopening%20Offices%20Safely.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "97", - "title": "Your Brain Does Something Amazing between Bouts of Intense Learning", - "name": "Your Brain Does Something Amazing between Bouts of Intense Learning", - "description": "New research shows that lightning-quick neural rehearsal can supercharge learning and memory.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=CmfbTZjHifo:H0G3SKLnQ-o:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/CmfbTZjHifo\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/CmfbTZjHifo\/", - "pubdate": "2021-07-07T22:00:00+10:00", - "state": "Pending", - "filelength": "00:04:02", - "filesize": "0 B", - "filename": "60-Second Science - Your Brain Does Something Amazing between Bouts of Intense Learning.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=97", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=97&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Your%20Brain%20Does%20Something%20Amazing%20between%20Bouts%20of%20Intense%20Learning.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "98", - "title": "COVID, Quickly, Episode 10: Long Haulers, Delta Woes and Barbershop Shots", - "name": "COVID, Quickly, Episode 10: Long Haulers, Delta Woes and Barbershop Shots", - "description": "Today we bring you a new episode in our podcast series: COVID, Quickly. Every two weeks, Scientific American’s senior health editors Tanya Lewis and Josh...<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=R-H1FpQu__E:J83fBQLBgOs:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/R-H1FpQu__E\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/R-H1FpQu__E\/", - "pubdate": "2021-07-02T06:00:00+10:00", - "state": "Pending", - "filelength": "00:07:00", - "filesize": "0 B", - "filename": "60-Second Science - COVID, Quickly, Episode 10: Long Haulers, Delta Woes and Barbershop Shots.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=98", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=98&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20COVID-%20Quickly-%20Episode%2010-%20Long%20Haulers-%20Delta%20Woes%20and%20Barbershop%20Shots.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - } - ] - }, - { - "id": "2", - "name": "Plays Well with Others", - "description": "From Creative Commons, a podcast about the art and science of collaboration. With a focus on the tools, techniques, and mechanics of collaboration, we explore how today's most interesting collaborators are making new things, solving old problems, and getting things done \u2014 together. Hosted by Creative Commons CEO Ryan Merkley. ", - "language": "en", - "copyright": "Creative Commons", - "feed_url": "https:\/\/anchor.fm\/s\/90932e8\/podcast\/rss", - "generator": "Anchor Podcasts", - "website": "playswellwithothers.org", - "build_date": "2021-02-23T14:18:58+10:00", - "sync_date": "2021-04-01T17:03:54+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=2", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [ - { - "id": "22", - "title": "What Do an Army of Ants and an Online Encyclopedia Have in Common?", - "name": "What Do an Army of Ants and an Online Encyclopedia Have in Common?", - "description": "<p>“Stigmergy is a mechanism of indirect coordination, through the environment, between agents or actions,” <a href=\"https:\/\/en.wikipedia.org\/wiki\/Stigmergy\">according to Wikipedia<\/a>. “The principle is that the trace left in the environment by an action stimulates the performance of a next action, by the same or a different agent.” Wikipedia should know all about stigmergy, since it’s almost a perfect description of how Wikipedia itself is made. While this model of collaboration is most commonly associated with ants, not global knowledge sharing, we’ll explore both and how they’ve shaped our world through asynchronous collaboration.<\/p>\n<p>Join us as we talk to Katherine Maher, the executive director of the Wikimedia Foundation (the nonprofit organization that runs Wikipedia), and Clint Penick, an ant researcher and assistant research professor in the Biomimicry Center at Arizona State University.<\/p>\n<p>===<\/p>\n<p>All original content in Plays Well with Others is available under a <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/\">Creative Commons BY license<\/a>.<\/p>\n<p>This episode contains music by <a href=\"https:\/\/www.sessions.blue\/\">Blue Dot Sessions<\/a>, available under a <a href=\"https:\/\/creativecommons.org\/licenses\/by-nc\/4.0\/\">Creative Commons BY-NC license<\/a> at the <a href=\"http:\/\/freemusicarchive.org\/music\/Blue_Dot_Sessions\/\">Free Music Archive<\/a>.<\/p>\n<p>We also use sound effects, available under CC licenses and in the public domain, from <a href=\"https:\/\/freesound.org\/\">Freesound<\/a>.<\/p>\n<p>For links to these tracks and for more information about our show, please visit <a href=\"http:\/\/playswellwithothers.org\/\">playswellwithothers.org<\/a>.<\/p>\n", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/anchor.fm\/playswellpod\/episodes\/What-Do-an-Army-of-Ants-and-an-Online-Encyclopedia-Have-in-Common-e3iphg", - "pubdate": "2019-03-28T17:00:00+10:00", - "state": "Completed", - "filelength": "14:00:00", - "filesize": "21.61 MB", - "filename": "Plays Well with Others - What Do an Army of Ants and an Online Encyclopedia Have in Common?.m4a", - "mime": "audio\/mp4", - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=22", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=22&uid=4&format=raw&player=api&name=Plays%20Well%20with%20Others%20-%20What%20Do%20an%20Army%20of%20Ants%20and%20an%20Online%20Encyclopedia%20Have%20in%20Common-.m4a", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "23", - "title": "I Laughed So Hard I Cried", - "name": "I Laughed So Hard I Cried", - "description": "<p>On our first episode, we look at how collaboration happens in one of comedy's most storied (and tough) environments — the TV writers' room. It's where the magic happens, but it can also be one of the most brutally competitive places a creative person will ever work. We talk to two writer-comedians, Anne Lane and Wayne Federman, about their experiences working in writers' rooms on shows like <em>Rick and Morty<\/em> and <em>Late Night with Jimmy Fallon<\/em>.<\/p>\n<p>===<\/p>\n<p>All original content in <em>Plays Well with Others<\/em> is available under a <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/\">Creative Commons BY license<\/a>.<\/p>\n", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/anchor.fm\/playswellpod\/episodes\/I-Laughed-So-Hard-I-Cried-e37hqp", - "pubdate": "2019-02-19T15:44:17+10:00", - "state": "Completed", - "filelength": "00:19:55", - "filesize": "18.43 MB", - "filename": "Plays Well with Others - I Laughed So Hard I Cried.m4a", - "mime": "audio\/mp4", - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=23", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=23&uid=4&format=raw&player=api&name=Plays%20Well%20with%20Others%20-%20I%20Laughed%20So%20Hard%20I%20Cried.m4a", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "1" - }, - { - "id": "24", - "title": "Coming Soon", - "name": "Coming Soon", - "description": "<p>From Creative Commons, a new podcast about the art and science of collaboration. With a focus on the tools, techniques, and mechanics of collaboration, we’re going to explore how today's most interesting collaborators are making new things, solving old problems, and getting things done — together. Hosted by Creative Commons CEO Ryan Merkley. Premieres Tuesday, February 19.<\/p>\n", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/anchor.fm\/playswellpod\/episodes\/Coming-Soon-e34lil", - "pubdate": "2019-02-07T07:33:45+10:00", - "state": "Completed", - "filelength": "00:23:21", - "filesize": "1.76 MB", - "filename": "Plays Well with Others - Coming Soon.mp3", - "mime": "audio\/mpeg", - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=24", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=24&uid=4&format=raw&player=api&name=Plays%20Well%20with%20Others%20-%20Coming%20Soon.mp3", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "1" - } - ] - }, - { - "id": "6", - "name": "Trace", - "description": "\n \n An investigative podcast hosted by ABC journalist Rachael Brown, Trace examines the fractures in Australia's criminal justice system, and the decades-long ripples they have caused.\n \n ", - "language": "en-AU", - "copyright": "Copyright 2021, Australian Broadcasting Corporation. All Rights Reserved.", - "feed_url": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/feed\/8597522\/podcast.xml", - "generator": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/", - "build_date": "2021-08-13T01:00:00+10:00", - "sync_date": "2021-08-20T10:51:24+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=6", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [ - { - "id": "115", - "title": "S1 | Breakthrough in Maria James cold case", - "name": "S1 | Breakthrough in Maria James cold case", - "description": "\n \n The discovery of a police exhibit - thought to be missing for around three decades - could finally help unmask the killer in the 1980 cold case of Maria James.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/breakthrough-in-maria-james-cold-case\/13494722", - "pubdate": "2021-08-13T01:00:00+10:00", - "state": "Pending", - "filelength": "00:26:45", - "filesize": "0 B", - "filename": "Trace - S1 | Breakthrough in Maria James cold case.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=115", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=115&uid=4&format=raw&player=api&name=Trace%20-%20S1%20-%20Breakthrough%20in%20Maria%20James%20cold%20case.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "116", - "title": "S2 BONUS — The Price", - "name": "S2 BONUS — The Price", - "description": "\n \n The Royal Commission has released its final report into defence lawyer turned police informer Nicola Gobbo.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/the-price\/12990516", - "pubdate": "2020-12-17T00:01:00+10:00", - "state": "Pending", - "filelength": "00:40:53", - "filesize": "0 B", - "filename": "Trace - S2 BONUS — The Price.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=116", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=116&uid=4&format=raw&player=api&name=Trace%20-%20S2%20BONUS%20-mdash-%20The%20Price.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "117", - "title": "S2 08 | End game", - "name": "S2 08 | End game", - "description": "\n \n We reveal the story of Nicola Gobbo's audacious bid to return to Australia.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/end-game\/12661588", - "pubdate": "2020-09-22T01:00:00+10:00", - "state": "Pending", - "filelength": "00:42:22", - "filesize": "0 B", - "filename": "Trace - S2 08 | End game.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=117", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=117&uid=4&format=raw&player=api&name=Trace%20-%20S2%2008%20-%20End%20game.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "118", - "title": "S2 07 | Reckoning", - "name": "S2 07 | Reckoning", - "description": "\n \n Everything unravels, for Nicola Gobbo and Victoria Police. Their secret is out.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/reckoning\/12661516", - "pubdate": "2020-09-15T01:01:00+10:00", - "state": "Pending", - "filelength": "00:40:35", - "filesize": "0 B", - "filename": "Trace - S2 07 | Reckoning.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=118", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=118&uid=4&format=raw&player=api&name=Trace%20-%20S2%2007%20-%20Reckoning.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "119", - "title": "S2 06 | Whatever it takes", - "name": "S2 06 | Whatever it takes", - "description": "\n \n Nicola hits rock bottom, but Victoria Police wants her to take on a new role ... as a witness.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/whatever-it-takes\/12635960", - "pubdate": "2020-09-08T01:00:00+10:00", - "state": "Pending", - "filelength": "00:40:58", - "filesize": "0 B", - "filename": "Trace - S2 06 | Whatever it takes.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=119", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=119&uid=4&format=raw&player=api&name=Trace%20-%20S2%2006%20-%20Whatever%20it%20takes.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "120", - "title": "S2 05 | Glittering prize", - "name": "S2 05 | Glittering prize", - "description": "\n \n Nicola wants to be the best source ever, and she leads police to the biggest target of all: the mafia. Her double life is getting riskier, but she can't stop. This episode charts an addiction and a crash.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/glittering-prize\/12611398", - "pubdate": "2020-09-01T01:00:00+10:00", - "state": "Pending", - "filelength": "00:39:37", - "filesize": "0 B", - "filename": "Trace - S2 05 | Glittering prize.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=120", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=120&uid=4&format=raw&player=api&name=Trace%20-%20S2%2005%20-%20Glittering%20prize.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "121", - "title": "S2 04 | Rubicon", - "name": "S2 04 | Rubicon", - "description": "\n \n Nicola crosses the point of no return and becomes a police informer. She'll represent clients, while passing on the underworld's secrets to Victoria Police.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/rubicon\/12588754", - "pubdate": "2020-08-25T01:00:00+10:00", - "state": "Pending", - "filelength": "00:37:47", - "filesize": "0 B", - "filename": "Trace - S2 04 | Rubicon.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=121", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=121&uid=4&format=raw&player=api&name=Trace%20-%20S2%2004%20-%20Rubicon.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "122", - "title": "S2 03 | The darkest night", - "name": "S2 03 | The darkest night", - "description": "\n \n A drug house burglary smells of police corruption and a police informer is executed.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/the-darkest-night\/12564680", - "pubdate": "2020-08-18T01:00:00+10:00", - "state": "Pending", - "filelength": "00:39:39", - "filesize": "0 B", - "filename": "Trace - S2 03 | The darkest night.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=122", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=122&uid=4&format=raw&player=api&name=Trace%20-%20S2%2003%20-%20The%20darkest%20night.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "123", - "title": "S2 02 | One of the crew", - "name": "S2 02 | One of the crew", - "description": "\n \n As the gangland war explodes, both police and criminals start questioning Nicola's allegiances. Where do her loyalties lie?\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/one-of-the-crew\/12541942", - "pubdate": "2020-08-11T01:00:00+10:00", - "state": "Pending", - "filelength": "00:37:37", - "filesize": "0 B", - "filename": "Trace - S2 02 | One of the crew.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=123", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=123&uid=4&format=raw&player=api&name=Trace%20-%20S2%2002%20-%20One%20of%20the%20crew.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "124", - "title": "S2 01 | Nicola", - "name": "S2 01 | Nicola", - "description": "\n \n We meet Nicola Gobbo in a secret location, in hiding, now that her double life as a police informer is out, and she begins telling us her full story.\n \n ", - "category": "", - "author": "", - "author_full": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/nicola\/12517632", - "pubdate": "2020-08-04T03:30:00+10:00", - "state": "Pending", - "filelength": "00:35:43", - "filesize": "0 B", - "filename": "Trace - S2 01 | Nicola.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=124", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=124&uid=4&format=raw&player=api&name=Trace%20-%20S2%2001%20-%20Nicola.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - } - ] - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/get_indexes (podcast).json b/docs/json-responses/get_indexes (podcast).json deleted file mode 100644 index 1790a184..00000000 --- a/docs/json-responses/get_indexes (podcast).json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "podcast": [ - { - "id": "1", - "name": "60-Second Science", - "description": "Tune in every weekday for quick reports and commentaries on the world of science\u2014it'll just take a minute", - "language": "en-us", - "copyright": "False", - "feed_url": "http:\/\/rss.sciam.com\/sciam\/60secsciencepodcast", - "generator": "", - "website": "https:\/\/www.scientificamerican.com\/podcast\/60-second-science\/", - "build_date": "1970-01-01T10:00:00+10:00", - "sync_date": "2021-08-20T11:08:30+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=1", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [] - }, - { - "id": "2", - "name": "Plays Well with Others", - "description": "From Creative Commons, a podcast about the art and science of collaboration. With a focus on the tools, techniques, and mechanics of collaboration, we explore how today's most interesting collaborators are making new things, solving old problems, and getting things done \u2014 together. Hosted by Creative Commons CEO Ryan Merkley. ", - "language": "en", - "copyright": "Creative Commons", - "feed_url": "https:\/\/anchor.fm\/s\/90932e8\/podcast\/rss", - "generator": "Anchor Podcasts", - "website": "playswellwithothers.org", - "build_date": "2021-02-23T14:18:58+10:00", - "sync_date": "2021-04-01T17:03:54+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=2", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [] - }, - { - "id": "6", - "name": "Trace", - "description": "\n \n An investigative podcast hosted by ABC journalist Rachael Brown, Trace examines the fractures in Australia's criminal justice system, and the decades-long ripples they have caused.\n \n ", - "language": "en-AU", - "copyright": "Copyright 2021, Australian Broadcasting Corporation. All Rights Reserved.", - "feed_url": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/feed\/8597522\/podcast.xml", - "generator": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/", - "build_date": "2021-08-13T01:00:00+10:00", - "sync_date": "2021-08-20T10:51:24+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=6", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [] - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/get_indexes (song with include).json b/docs/json-responses/get_indexes (song with include).json deleted file mode 100644 index cd33d234..00000000 --- a/docs/json-responses/get_indexes (song with include).json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "song": [ - { - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "55", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=55&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-4.060000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "56", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/01-Synthetic_-_BlackBlueSmokeDM20k22kh_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 3, - "time": 500, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=56&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.mp3", - "size": 4010069, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.110000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "57", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/03-Synthetic_-_PurpleSmokeVMix20k22khS2_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 4, - "time": 390, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=57&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.mp3", - "size": 3131519, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.130000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/get_indexes (song).json b/docs/json-responses/get_indexes (song).json index cd33d234..a0bb638c 100644 --- a/docs/json-responses/get_indexes (song).json +++ b/docs/json-responses/get_indexes (song).json @@ -1,236 +1,236 @@ -{ - "song": [ - { - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null +[ + { + "id": "953", + "title": "Wishmaster", + "name": "Wishmaster", + "artist": { + "id": "55", + "name": "Nightwish" + }, + "album": { + "id": "48753", + "name": "Wishmaster" }, - { + "tag": [ + { + "id": "20", + "name": "Metal" + } + ], + "filename": "\/mnt\/music\/Nightwish\/(2000) Wishmaster\/106 - Wishmaster.mp3", + "track": 6, + "playlisttrack": 1, + "time": 264, + "year": 2000, + "bitrate": 281749, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=953&uid=2&player=api&name=Nightwish%20-%20Wishmaster.mp3", + "size": 9379030, + "mbid": "d5332837-05a6-475c-8e7a-4a00bc621acc", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=48753&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": 3, + "rating": 3, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Tuomas Holopainen", + "channels": null, + "comment": "", + "publisher": "Drakkar Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.440000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Metal" + } + ] + }, + { + "id": "955", + "title": "Wanderlust", + "name": "Wanderlust", + "artist": { "id": "55", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k22khS_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=55&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209886, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 1, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-4.060000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null + "name": "Nightwish" }, - { - "id": "56", - "title": "Black&BlueSmoke", - "name": "Black&BlueSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/01-Synthetic_-_BlackBlueSmokeDM20k22kh_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 3, - "time": 500, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=56&uid=4&player=api&name=Synthetic%20-%20Black-BlueSmoke.mp3", - "size": 4010069, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.110000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null + "album": { + "id": "48753", + "name": "Wishmaster" + }, + "tag": [ + { + "id": "20", + "name": "Metal" + } + ], + "filename": "\/mnt\/music\/Nightwish\/(2000) Wishmaster\/104 - Wanderlust.mp3", + "track": 4, + "playlisttrack": 2, + "time": 290, + "year": 2000, + "bitrate": 265841, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=955&uid=2&player=api&name=Nightwish%20-%20Wanderlust.mp3", + "size": 9731039, + "mbid": "0584e353-a06f-4c97-a6fb-3ee521e65625", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=48753&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "Tuomas Holopainen", + "channels": null, + "comment": "", + "publisher": "Drakkar Records", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-9.490000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Metal" + } + ] + }, + { + "id": "956", + "title": "Come Cover Me", + "name": "Come Cover Me", + "artist": { + "id": "55", + "name": "Nightwish" + }, + "album": { + "id": "48753", + "name": "Wishmaster" }, - { - "id": "57", - "title": "PurpleSmoke", - "name": "PurpleSmoke", - "artist": { - "id": "2", - "name": "Synthetic" + "tag": [ + { + "id": "20", + "name": "Metal" + } + ], + "filename": "\/mnt\/music\/Nightwish\/(2000) Wishmaster\/103 - Come Cover Me.mp3", + "track": 3, + "playlisttrack": 3, + "time": 274, + "year": 2000, + "bitrate": 260129, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=956&uid=2&player=api&name=Nightwish%20-%20Come%20Cover%20Me.mp3", + "size": 9003198, + "mbid": "39aaa2f7-383b-443e-8c31-534df2b55845", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=48753&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "Tuomas Holopainen", + "channels": null, + "comment": "", + "publisher": "Drakkar Records", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-9.740000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Metal" + } + ] + }, + { + "id": "958", + "title": "Dead Boy's Poem", + "name": "Dead Boy's Poem", + "artist": { + "id": "55", + "name": "Nightwish" + }, + "album": { + "id": "48753", + "name": "Wishmaster" + }, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "20", + "name": "Metal" }, - "album": { - "id": "2", - "name": "Colorsmoke EP" + { + "id": "51", + "name": "Gothic Metal" + } + ], + "filename": "\/mnt\/music\/Nightwish\/(2000) Wishmaster\/110 - Dead Boy's Poem.mp3", + "track": 10, + "playlisttrack": 4, + "time": 407, + "year": 2000, + "bitrate": 252769, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=958&uid=2&player=api&name=Nightwish%20-%20Dead%20Boy-s%20Poem.mp3", + "size": 12954214, + "mbid": "c7b867bc-887d-4370-b230-68379c5347db", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=48753&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Tuomas Holopainen", + "channels": null, + "comment": "", + "publisher": "Drakkar Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-9.660000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "albumartist": { - "id": "2", - "name": "Synthetic" + { + "name": "Metal" }, - "disk": 1, - "track": 3, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/03-Synthetic_-_PurpleSmokeVMix20k22khS2_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 4, - "time": 390, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=57&uid=4&player=api&name=Synthetic%20-%20PurpleSmoke.mp3", - "size": 3131519, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.130000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + { + "name": "Gothic Metal" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/get_similar.json b/docs/json-responses/get_similar.json deleted file mode 100644 index 6538cb0b..00000000 --- a/docs/json-responses/get_similar.json +++ /dev/null @@ -1,320 +0,0 @@ -[ - { - "id": "41039", - "title": "Somebody Told Me", - "name": "Somebody Told Me", - "artist": { - "id": "2277", - "name": "The Killers" - }, - "album": { - "id": "50260", - "name": "Hot Fuss" - }, - "genre": [ - { - "id": "4", - "name": "Electronic" - }, - { - "id": "6", - "name": "Rock" - }, - { - "id": "7", - "name": "Synthpop" - }, - { - "id": "36", - "name": "Indie Rock" - }, - { - "id": "48", - "name": "New Wave" - } - ], - "albumartist": { - "id": "2277", - "name": "The Killers" - }, - "filename": "\/mnt\/music\/The Killers\/(2004) Hot Fuss\/104 - Somebody Told Me.mp3", - "track": 4, - "playlisttrack": 1, - "time": 197, - "year": 2004, - "bitrate": 320000, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=41039&uid=2&player=api&name=The%20Killers%20-%20Somebody%20Told%20Me.mp3", - "size": 7890120, - "mbid": "45024040-a343-4141-9bc9-27ef0cc9163d", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=50260&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 1, - "catalog": 2, - "composer": "", - "channels": null, - "comment": "", - "publisher": "Island; BMG Direct Marketing, Inc.", - "language": "", - "replaygain_album_gain": "0.000000", - "replaygain_album_peak": "0.000000", - "replaygain_track_gain": "-12.160000", - "replaygain_track_peak": "1.000000" - }, - { - "id": "41037", - "title": "Smile Like You Mean It", - "name": "Smile Like You Mean It", - "artist": { - "id": "2277", - "name": "The Killers" - }, - "album": { - "id": "50260", - "name": "Hot Fuss" - }, - "genre": [ - { - "id": "4", - "name": "Electronic" - }, - { - "id": "6", - "name": "Rock" - }, - { - "id": "7", - "name": "Synthpop" - }, - { - "id": "36", - "name": "Indie Rock" - }, - { - "id": "48", - "name": "New Wave" - } - ], - "albumartist": { - "id": "2277", - "name": "The Killers" - }, - "filename": "\/mnt\/music\/The Killers\/(2004) Hot Fuss\/103 - Smile Like You Mean It.mp3", - "track": 3, - "playlisttrack": 2, - "time": 234, - "year": 2004, - "bitrate": 185987, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=41037&uid=2&player=api&name=The%20Killers%20-%20Smile%20Like%20You%20Mean%20It.mp3", - "size": 5459658, - "mbid": "4381732e-4db2-4ed3-8151-e889f5118b34", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=50260&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 1, - "catalog": 2, - "composer": "", - "channels": null, - "comment": "", - "publisher": "Island; BMG Direct Marketing, Inc.", - "language": "", - "replaygain_album_gain": "0.000000", - "replaygain_album_peak": "0.000000", - "replaygain_track_gain": "-12.020000", - "replaygain_track_peak": "1.000000" - }, - { - "id": "169876", - "title": "Sex on Fire", - "name": "Sex on Fire", - "artist": { - "id": "5774", - "name": "Kings of Leon" - }, - "album": { - "id": "56356", - "name": "Only by the Night" - }, - "genre": [ - { - "id": "6", - "name": "Rock" - }, - { - "id": "36", - "name": "Indie Rock" - }, - { - "id": "1036", - "name": "Southern Rock" - } - ], - "albumartist": { - "id": "5774", - "name": "Kings of Leon" - }, - "filename": "\/mnt\/music\/Kings of Leon\/(2008) Only by the Night [88697 32712 2]\/103 - Sex on Fire.mp3", - "track": 3, - "playlisttrack": 3, - "time": 206, - "year": 2008, - "bitrate": 320000, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=169876&uid=2&player=api&name=Kings%20of%20Leon%20-%20Sex%20on%20Fire.mp3", - "size": 8245333, - "mbid": "051caac1-1f67-4733-80b5-62cb32660daa", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=56356&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 2, - "composer": "", - "channels": null, - "comment": "tagged by headphones\/beets", - "publisher": "RCA", - "language": "eng", - "replaygain_album_gain": "0.000000", - "replaygain_album_peak": "0.000000", - "replaygain_track_gain": "-8.980000", - "replaygain_track_peak": "1.000000" - }, - { - "id": "169866", - "title": "Use Somebody", - "name": "Use Somebody", - "artist": { - "id": "5774", - "name": "Kings of Leon" - }, - "album": { - "id": "56356", - "name": "Only by the Night" - }, - "genre": [ - { - "id": "6", - "name": "Rock" - }, - { - "id": "36", - "name": "Indie Rock" - }, - { - "id": "1036", - "name": "Southern Rock" - } - ], - "albumartist": { - "id": "5774", - "name": "Kings of Leon" - }, - "filename": "\/mnt\/music\/Kings of Leon\/(2008) Only by the Night [88697 32712 2]\/104 - Use Somebody.mp3", - "track": 4, - "playlisttrack": 4, - "time": 233, - "year": 2008, - "bitrate": 320000, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=169866&uid=2&player=api&name=Kings%20of%20Leon%20-%20Use%20Somebody.mp3", - "size": 9349790, - "mbid": "787d77e9-dac1-4ae3-a5f4-0ebba532f362", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=56356&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 2, - "composer": "", - "channels": null, - "comment": "tagged by headphones\/beets", - "publisher": "RCA", - "language": "eng", - "replaygain_album_gain": "0.000000", - "replaygain_album_peak": "0.000000", - "replaygain_track_gain": "-9.840000", - "replaygain_track_peak": "1.000000" - }, - { - "id": "777754", - "title": "Fluorescent Adolescent", - "name": "Fluorescent Adolescent", - "artist": { - "id": "10468", - "name": "Arctic Monkeys" - }, - "album": { - "id": "84543", - "name": "Favourite Worst Nightmare" - }, - "genre": [ - { - "id": "36", - "name": "Indie Rock" - } - ], - "albumartist": { - "id": "10468", - "name": "Arctic Monkeys" - }, - "filename": "\/mnt\/music\/Arctic Monkeys\/(2007) Favourite Worst Nightmare [HSE-10043; WIGCD188J]\/105 - Fluorescent Adolescent.mp3", - "track": 5, - "playlisttrack": 5, - "time": 177, - "year": 2007, - "bitrate": 320000, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=777754&uid=2&player=api&name=Arctic%20Monkeys%20-%20Fluorescent%20Adolescent.mp3", - "size": 7980113, - "mbid": "4810b42e-2bb1-4795-874b-85df8fd62ca9", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=84543&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 2, - "composer": "Jamie 'Cookie' Cook", - "channels": null, - "comment": "", - "publisher": "Hostess Entertainment Unlimited.; Domino", - "language": "eng", - "replaygain_album_gain": "0.000000", - "replaygain_album_peak": "0.000000", - "replaygain_track_gain": "-9.610000", - "replaygain_track_peak": "1.000000" - } -] \ No newline at end of file diff --git a/docs/json-responses/handshake (error).json b/docs/json-responses/handshake (error).json deleted file mode 100644 index 9cca2f06..00000000 --- a/docs/json-responses/handshake (error).json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4701", - "errorAction": "handshake", - "errorType": "account", - "errorMessage": "Received Invalid Handshake - Incorrect username or password" - } -} \ No newline at end of file diff --git a/docs/json-responses/handshake.json b/docs/json-responses/handshake.json index 5567d42f..e7c0217f 100644 --- a/docs/json-responses/handshake.json +++ b/docs/json-responses/handshake.json @@ -1,23 +1,14 @@ { - "auth": "cfj3f237d563f479f5223k23189dbb34", - "api": "5.0.0", - "session_expire": "2021-08-03T11:07:31+10:00", - "update": "2021-07-21T12:51:36+10:00", - "add": "2021-08-03T10:04:14+10:00", - "clean": "2021-08-03T10:05:54+10:00", - "songs": 75, - "albums": 9, - "artists": 17, - "genres": 7, - "playlists": 2, - "searches": 17, - "users": 8, - "catalogs": 4, - "videos": 2, - "podcasts": 2, - "podcast_episodes": 13, - "shares": 2, - "licenses": 14, - "live_streams": 3, - "labels": 3 + "auth": "eeb9f1b6056246a7d563f479f518bb34", + "api": "420000", + "session_expire": "2020-07-28T17:02:29+10:00", + "update": "2020-07-10T08:59:01+10:00", + "add": "2020-07-28T11:35:58+10:00", + "clean": "2020-07-28T11:34:56+10:00", + "songs": 305182, + "albums": 29490, + "artists": 12828, + "playlists": 31, + "videos": 14, + "catalogs": 5 } \ No newline at end of file diff --git a/docs/json-responses/label.json b/docs/json-responses/label.json deleted file mode 100644 index 9579520f..00000000 --- a/docs/json-responses/label.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "id": "2", - "name": "20kbps rec.", - "artists": 1, - "summary": null, - "external_link": "https:\/\/music.com.au\/labels.php?action=show&label=2", - "address": null, - "category": "tag_generated", - "email": null, - "website": null, - "user": "4" -} \ No newline at end of file diff --git a/docs/json-responses/label_artists.json b/docs/json-responses/label_artists.json deleted file mode 100644 index dbb7dbcd..00000000 --- a/docs/json-responses/label_artists.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "artist": [ - { - "id": "2", - "name": "Synthetic", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 12, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": "1", - "summary": "Synthetic was formed in the late 90's by Steve Engler (formerly of Primitive Modern, Twitch Revolt & Domestic Violence), Synthetic is an eclectic act. Influences range from Aphex Twin to Frank Zappa and everything in between. Currently has 3 remixes on Bush-of-ghosts.com under artist names: AAASYNTHETIC and STEVEEDENVER. Has several remixes on RealWorldRemixed.com (Peter Gabriel's Label). Also is he represented on mp3unsigned.com as Synthetic. Synthetic has completed 5 LPs and 8-10 EPs. ", - "time": 4568, - "yearformed": 0, - "placeformed": "" - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/labels.json b/docs/json-responses/labels.json deleted file mode 100644 index 36e7010d..00000000 --- a/docs/json-responses/labels.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "label": [ - { - "id": "2", - "name": "20kbps rec.", - "artists": 1, - "summary": null, - "external_link": "https:\/\/music.com.au\/labels.php?action=show&label=2", - "address": null, - "category": "tag_generated", - "email": null, - "website": null, - "user": "4" - }, - { - "id": "1", - "name": "archive.org", - "artists": 8, - "summary": null, - "external_link": "https:\/\/music.com.au\/labels.php?action=show&label=1", - "address": null, - "category": "tag_generated", - "email": null, - "website": null, - "user": "4" - }, - { - "id": "3", - "name": "DNA Production", - "artists": 1, - "summary": null, - "external_link": "https:\/\/music.com.au\/labels.php?action=show&label=3", - "address": null, - "category": "tag_generated", - "email": null, - "website": null, - "user": "4" - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/last_shouts.json b/docs/json-responses/last_shouts.json index c77ce2bf..c6c8444c 100644 --- a/docs/json-responses/last_shouts.json +++ b/docs/json-responses/last_shouts.json @@ -1,13 +1,24 @@ -{ - "shout": [ - { - "id": "1", - "date": "1613973947", - "text": "Love this album", - "user": { - "id": "4", +[ + { + "id": "9", + "date": "1594605026", + "text": "and another", + "user": [ + { + "id": "2", "username": "user" } - } - ] -} \ No newline at end of file + ] + }, + { + "id": "8", + "date": "1594604991", + "text": "leaving a shout", + "user": [ + { + "id": "2", + "username": "user" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/license.json b/docs/json-responses/license.json index 3b91a8d0..7e733fcc 100644 --- a/docs/json-responses/license.json +++ b/docs/json-responses/license.json @@ -1,6 +1,8 @@ -{ - "id": "1", - "name": "0 - default", - "description": null, - "external_link": "" -} \ No newline at end of file +[ + { + "id": "2", + "name": "CC BY", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by\/3.0\/" + } +] \ No newline at end of file diff --git a/docs/json-responses/license_songs.json b/docs/json-responses/license_songs.json index 6ce98850..01af7e98 100644 --- a/docs/json-responses/license_songs.json +++ b/docs/json-responses/license_songs.json @@ -1,3 +1,3583 @@ -{ - "song": [] -} \ No newline at end of file +[ + { + "id": "925850", + "title": "You Are Worthless Alec Baldwin (Bonus Track)", + "name": "You Are Worthless Alec Baldwin (Bonus Track)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/171 - You Are Worthless Alec Baldwin (Bonus Track).flac", + "track": 71, + "playlisttrack": 1, + "time": 80, + "year": 2014, + "bitrate": 716191, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925850&uid=2&player=api&name=DVDA%20-%20You%20Are%20Worthless%20Alec%20Baldwin%20-Bonus%20Track-.opus", + "size": 7233238, + "mbid": "2ced591e-4902-4cba-a107-30c5b7d5c8bf", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925851", + "title": "Freedom Isn't Free", + "name": "Freedom Isn't Free", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/102 - Freedom Isn't Free.flac", + "track": 2, + "playlisttrack": 2, + "time": 158, + "year": 2014, + "bitrate": 832013, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925851&uid=2&player=api&name=DVDA%20-%20Freedom%20Isn-t%20Free.opus", + "size": 16507142, + "mbid": "d1b1f835-1d2d-4709-812b-427ec1d493ed", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925852", + "title": "Hot Lava", + "name": "Hot Lava", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/109 - Hot Lava.flac", + "track": 9, + "playlisttrack": 3, + "time": 230, + "year": 2014, + "bitrate": 1019970, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925852&uid=2&player=api&name=DVDA%20-%20Hot%20Lava.opus", + "size": 29438436, + "mbid": "e9d78a27-c69a-46d2-b18d-bdfaafd45aad", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925853", + "title": "I'm In Love With Myself", + "name": "I'm In Love With Myself", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/146 - I'm In Love With Myself.flac", + "track": 46, + "playlisttrack": 4, + "time": 163, + "year": 2014, + "bitrate": 1200920, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925853&uid=2&player=api&name=DVDA%20-%20I-m%20In%20Love%20With%20Myself.opus", + "size": 24549065, + "mbid": "a6d77dfd-3ac6-4ec4-a298-9b62e11c624b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925854", + "title": "Don't Be Stupid", + "name": "Don't Be Stupid", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/165 - Don't Be Stupid.flac", + "track": 65, + "playlisttrack": 5, + "time": 27, + "year": 2014, + "bitrate": 1294047, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925854&uid=2&player=api&name=DVDA%20-%20Don-t%20Be%20Stupid.opus", + "size": 4525441, + "mbid": "f0064109-16c6-4b64-ae25-b7a6dbe2fedd", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925855", + "title": "Dead Ballernia", + "name": "Dead Ballernia", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/142 - Dead Ballernia.flac", + "track": 42, + "playlisttrack": 6, + "time": 187, + "year": 2014, + "bitrate": 1189455, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925855&uid=2&player=api&name=DVDA%20-%20Dead%20Ballernia.opus", + "size": 27845192, + "mbid": "e5aa9550-94c7-4ad3-8c54-69d89a8ea98e", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925856", + "title": "Without Lips", + "name": "Without Lips", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/152 - Without Lips.flac", + "track": 52, + "playlisttrack": 7, + "time": 119, + "year": 2014, + "bitrate": 1117108, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925856&uid=2&player=api&name=DVDA%20-%20Without%20Lips.opus", + "size": 16634695, + "mbid": "db02c3b7-0b43-47ec-99cb-797841c40fdf", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925857", + "title": "My Girl Is No Hobbit", + "name": "My Girl Is No Hobbit", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/132 - My Girl Is No Hobbit.flac", + "track": 32, + "playlisttrack": 8, + "time": 64, + "year": 2014, + "bitrate": 1268291, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925857&uid=2&player=api&name=DVDA%20-%20My%20Girl%20Is%20No%20Hobbit.opus", + "size": 10146331, + "mbid": "667a2861-3af2-463c-8abf-f48e56416a78", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925858", + "title": "Shpadoinkle (Reprise)", + "name": "Shpadoinkle (Reprise)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/154 - Shpadoinkle (Reprise).flac", + "track": 54, + "playlisttrack": 9, + "time": 64, + "year": 2014, + "bitrate": 1451879, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925858&uid=2&player=api&name=DVDA%20-%20Shpadoinkle%20-Reprise-.opus", + "size": 11749302, + "mbid": "0b3d3445-be74-48c5-b5bb-a1fccce5ce4b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925859", + "title": "Let's Fighting Love", + "name": "Let's Fighting Love", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/111 - Let's Fighting Love.flac", + "track": 11, + "playlisttrack": 10, + "time": 120, + "year": 2014, + "bitrate": 1044202, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925859&uid=2&player=api&name=DVDA%20-%20Let-s%20Fighting%20Love.opus", + "size": 15691168, + "mbid": "1714ed5b-49fb-4d63-9ed1-c5428202701a", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925860", + "title": "Everybody Is On Crack", + "name": "Everybody Is On Crack", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/120 - Everybody Is On Crack.flac", + "track": 20, + "playlisttrack": 11, + "time": 211, + "year": 2014, + "bitrate": 867603, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925860&uid=2&player=api&name=DVDA%20-%20Everybody%20Is%20On%20Crack.opus", + "size": 22989725, + "mbid": "c9372a6d-c5a8-4610-ae7f-cff152188c70", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925861", + "title": "Lemmiwinks", + "name": "Lemmiwinks", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/123 - Lemmiwinks.flac", + "track": 23, + "playlisttrack": 12, + "time": 188, + "year": 2014, + "bitrate": 853856, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925861&uid=2&player=api&name=DVDA%20-%20Lemmiwinks.opus", + "size": 20107791, + "mbid": "379f6c2e-167a-4446-8e25-726a3e80c665", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925862", + "title": "Something In My Front Pocket", + "name": "Something In My Front Pocket", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/169 - Something In My Front Pocket.flac", + "track": 69, + "playlisttrack": 13, + "time": 28, + "year": 2014, + "bitrate": 688399, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925862&uid=2&player=api&name=DVDA%20-%20Something%20In%20My%20Front%20Pocket.opus", + "size": 2485520, + "mbid": "41d528b2-6773-4de9-9914-d27966b23eed", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925863", + "title": "Yepper", + "name": "Yepper", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/135 - Yepper.flac", + "track": 35, + "playlisttrack": 14, + "time": 89, + "year": 2014, + "bitrate": 1374466, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925863&uid=2&player=api&name=DVDA%20-%20Yepper.opus", + "size": 15331398, + "mbid": "7c90a649-a489-475d-bec1-acbbc395bdfa", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925864", + "title": "Dead Fetus Song", + "name": "Dead Fetus Song", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/121 - Dead Fetus Song.flac", + "track": 21, + "playlisttrack": 15, + "time": 28, + "year": 2014, + "bitrate": 1173905, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925864&uid=2&player=api&name=DVDA%20-%20Dead%20Fetus%20Song.opus", + "size": 4182038, + "mbid": "83e36fd2-4348-4d55-9d41-f6bf04060a36", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925865", + "title": "Your Body", + "name": "Your Body", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/131 - Your Body.flac", + "track": 31, + "playlisttrack": 16, + "time": 21, + "year": 2014, + "bitrate": 1142471, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925865&uid=2&player=api&name=DVDA%20-%20Your%20Body.opus", + "size": 2998988, + "mbid": "05a3c9f6-1831-4583-a6b7-b5da7b282e61", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925866", + "title": "David Kelley, TV Warrior", + "name": "David Kelley, TV Warrior", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/119 - David Kelley, TV Warrior.flac", + "track": 19, + "playlisttrack": 17, + "time": 198, + "year": 2014, + "bitrate": 895412, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925866&uid=2&player=api&name=DVDA%20-%20David%20Kelley-%20TV%20Warrior.opus", + "size": 22250085, + "mbid": "999e63eb-be6e-4059-b0c3-d86516ed5736", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925867", + "title": "Pig and Elephant DNA Just Won't Splice", + "name": "Pig and Elephant DNA Just Won't Splice", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/147 - Pig and Elephant DNA Just Won't Splice.flac", + "track": 47, + "playlisttrack": 18, + "time": 16, + "year": 2014, + "bitrate": 1406613, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925867&uid=2&player=api&name=DVDA%20-%20Pig%20and%20Elephant%20DNA%20Just%20Won-t%20Splice.opus", + "size": 2982188, + "mbid": "762d5a77-d707-473a-983c-fc290b0b02c8", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925868", + "title": "Raise The Roof", + "name": "Raise The Roof", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/129 - Raise The Roof.flac", + "track": 29, + "playlisttrack": 19, + "time": 30, + "year": 2014, + "bitrate": 587530, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925868&uid=2&player=api&name=DVDA%20-%20Raise%20The%20Roof.opus", + "size": 2206237, + "mbid": "25096261-4fd5-4c58-af77-6bc0b1a021d7", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925869", + "title": "Chewbacca", + "name": "Chewbacca", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/118 - Chewbacca.flac", + "track": 18, + "playlisttrack": 20, + "time": 214, + "year": 2014, + "bitrate": 861678, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925869&uid=2&player=api&name=DVDA%20-%20Chewbacca.opus", + "size": 23128158, + "mbid": "790135b9-35f0-4ece-95db-e0adf6ef26d4", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": 3, + "rating": 3, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925870", + "title": "That's Alright, Mama", + "name": "That's Alright, Mama", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/168 - That's Alright, Mama.flac", + "track": 68, + "playlisttrack": 21, + "time": 68, + "year": 2014, + "bitrate": 509760, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925870&uid=2&player=api&name=DVDA%20-%20That-s%20Alright-%20Mama.opus", + "size": 4369377, + "mbid": "4db6d73a-b549-49c2-bda9-09bce3347e8e", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925871", + "title": "Sri Lankan Woman", + "name": "Sri Lankan Woman", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/148 - Sri Lankan Woman.flac", + "track": 48, + "playlisttrack": 22, + "time": 230, + "year": 2014, + "bitrate": 1104838, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925871&uid=2&player=api&name=DVDA%20-%20Sri%20Lankan%20Woman.opus", + "size": 31856590, + "mbid": "17bc02ff-bd77-41b8-bd38-59ee9e00ba36", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925872", + "title": "Princess", + "name": "Princess", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/145 - Princess.flac", + "track": 45, + "playlisttrack": 23, + "time": 39, + "year": 2014, + "bitrate": 1019548, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925872&uid=2&player=api&name=DVDA%20-%20Princess.opus", + "size": 5034020, + "mbid": "5d21ce4f-f204-40ab-ab48-2f081bcd1709", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925873", + "title": "Montage", + "name": "Montage", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/110 - Montage.flac", + "track": 10, + "playlisttrack": 24, + "time": 124, + "year": 2014, + "bitrate": 909737, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925873&uid=2&player=api&name=DVDA%20-%20Montage.opus", + "size": 14172590, + "mbid": "a9ea92d3-e4d7-4224-b80d-4130f3ff61c6", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925874", + "title": "Burn Down Hot Topic", + "name": "Burn Down Hot Topic", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/166 - Burn Down Hot Topic.flac", + "track": 66, + "playlisttrack": 25, + "time": 46, + "year": 2014, + "bitrate": 1389615, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925874&uid=2&player=api&name=DVDA%20-%20Burn%20Down%20Hot%20Topic.opus", + "size": 8090161, + "mbid": "eb37d58d-00e7-4069-9b2f-3fd50eb310e5", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925875", + "title": "The Butters Show", + "name": "The Butters Show", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/117 - The Butters Show.flac", + "track": 17, + "playlisttrack": 26, + "time": 44, + "year": 2014, + "bitrate": 1036645, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925875&uid=2&player=api&name=DVDA%20-%20The%20Butters%20Show.opus", + "size": 5728266, + "mbid": "5a55b5f2-3b70-40c2-9cab-8af6210cba45", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925876", + "title": "Now You're A Man", + "name": "Now You're A Man", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/104 - Now You're A Man.flac", + "track": 4, + "playlisttrack": 27, + "time": 132, + "year": 2014, + "bitrate": 932855, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925876&uid=2&player=api&name=DVDA%20-%20Now%20You-re%20A%20Man.opus", + "size": 15434373, + "mbid": "785e1c9d-236a-4f16-bf1d-a17c5ab1738b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925877", + "title": "Gay Fish", + "name": "Gay Fish", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/143 - Gay Fish.flac", + "track": 43, + "playlisttrack": 28, + "time": 149, + "year": 2014, + "bitrate": 1654279, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925877&uid=2&player=api&name=DVDA%20-%20Gay%20Fish.opus", + "size": 30937219, + "mbid": "8b717e80-6940-4145-82a5-e605c3d2845e", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925878", + "title": "When I Was On Top Of You", + "name": "When I Was On Top Of You", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/156 - When I Was On Top Of You.flac", + "track": 56, + "playlisttrack": 29, + "time": 159, + "year": 2014, + "bitrate": 1419141, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925878&uid=2&player=api&name=DVDA%20-%20When%20I%20Was%20On%20Top%20Of%20You.opus", + "size": 28305543, + "mbid": "5843ef83-d645-4536-a7ba-5eea2ec263c8", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925879", + "title": "Only a Woman", + "name": "Only a Woman", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/106 - Only a Woman.flac", + "track": 6, + "playlisttrack": 30, + "time": 178, + "year": 2014, + "bitrate": 905430, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925879&uid=2&player=api&name=DVDA%20-%20Only%20a%20Woman.opus", + "size": 20160425, + "mbid": "8f8aeb43-d36e-4191-a5f6-5bf351aa5c8c", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925880", + "title": "Mi Mi Mi", + "name": "Mi Mi Mi", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/137 - Mi Mi Mi.flac", + "track": 37, + "playlisttrack": 31, + "time": 119, + "year": 2014, + "bitrate": 1300242, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925880&uid=2&player=api&name=DVDA%20-%20Mi%20Mi%20Mi.opus", + "size": 19341102, + "mbid": "0f2454f6-6134-4f73-9dc5-8e4276ba2411", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925881", + "title": "Trapper Song", + "name": "Trapper Song", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/157 - Trapper Song.flac", + "track": 57, + "playlisttrack": 32, + "time": 144, + "year": 2014, + "bitrate": 1387653, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925881&uid=2&player=api&name=DVDA%20-%20Trapper%20Song.opus", + "size": 24990538, + "mbid": "27d8a2ea-e219-458e-96c8-a0ae4bc13851", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925882", + "title": "Everyone Has AIDS", + "name": "Everyone Has AIDS", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/101 - Everyone Has AIDS.flac", + "track": 1, + "playlisttrack": 33, + "time": 77, + "year": 2014, + "bitrate": 870883, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925882&uid=2&player=api&name=DVDA%20-%20Everyone%20Has%20AIDS.opus", + "size": 8448634, + "mbid": "cd37b67f-6d84-4560-b657-d9bd9731c9bd", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925883", + "title": "Evolution", + "name": "Evolution", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/140 - Evolution.flac", + "track": 40, + "playlisttrack": 34, + "time": 47, + "year": 2014, + "bitrate": 1545144, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925883&uid=2&player=api&name=DVDA%20-%20Evolution.opus", + "size": 9077721, + "mbid": "ee57160b-3ac2-4234-8955-be4200816fb7", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925884", + "title": "This Side Of Me", + "name": "This Side Of Me", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/158 - This Side Of Me.flac", + "track": 58, + "playlisttrack": 35, + "time": 207, + "year": 2014, + "bitrate": 1381326, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925884&uid=2&player=api&name=DVDA%20-%20This%20Side%20Of%20Me.opus", + "size": 35823476, + "mbid": "f1a4fb61-5b3f-40f2-9e0c-3b9f0afadf39", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925885", + "title": "I Spit On Your Love", + "name": "I Spit On Your Love", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/144 - I Spit On Your Love.flac", + "track": 44, + "playlisttrack": 36, + "time": 251, + "year": 2014, + "bitrate": 1172605, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925885&uid=2&player=api&name=DVDA%20-%20I%20Spit%20On%20Your%20Love.opus", + "size": 36808591, + "mbid": "c30e7d9d-452c-49b9-b0b1-baf17f90aea4", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925886", + "title": "The Lonely Jew on Christmas", + "name": "The Lonely Jew on Christmas", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/122 - The Lonely Jew on Christmas.flac", + "track": 22, + "playlisttrack": 37, + "time": 167, + "year": 2014, + "bitrate": 1576623, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925886&uid=2&player=api&name=DVDA%20-%20The%20Lonely%20Jew%20on%20Christmas.opus", + "size": 32949662, + "mbid": "cb171f5b-b525-4ad5-aa2b-91550bf18355", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925887", + "title": "Livin' A Lie", + "name": "Livin' A Lie", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/113 - Livin' A Lie.flac", + "track": 13, + "playlisttrack": 38, + "time": 153, + "year": 2014, + "bitrate": 962782, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925887&uid=2&player=api&name=DVDA%20-%20Livin-%20A%20Lie.opus", + "size": 18463422, + "mbid": "5cb3a4e2-94e9-4777-b8ca-a52e31dea9b0", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925888", + "title": "Let's Build A Snowman", + "name": "Let's Build A Snowman", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/159 - Let's Build A Snowman.flac", + "track": 59, + "playlisttrack": 39, + "time": 99, + "year": 2014, + "bitrate": 1405504, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925888&uid=2&player=api&name=DVDA%20-%20Let-s%20Build%20A%20Snowman.opus", + "size": 17565112, + "mbid": "86b0ff7a-4b38-4f60-b114-952f1ff667f7", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925889", + "title": "Sgt. Baker (Live)", + "name": "Sgt. Baker (Live)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/174 - Sgt. Baker (Live).flac", + "track": 74, + "playlisttrack": 40, + "time": 221, + "year": 2014, + "bitrate": 884631, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925889&uid=2&player=api&name=DVDA%20-%20Sgt.%20Baker%20-Live-.opus", + "size": 24498166, + "mbid": "e55f2e85-6200-468b-884d-693b1eb3346b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925890", + "title": "Latter Day Soldier", + "name": "Latter Day Soldier", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/149 - Latter Day Soldier.flac", + "track": 49, + "playlisttrack": 41, + "time": 50, + "year": 2014, + "bitrate": 1448625, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925890&uid=2&player=api&name=DVDA%20-%20Latter%20Day%20Soldier.opus", + "size": 9053908, + "mbid": "e4c73f67-051c-4535-9e06-3d2e06787f30", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925891", + "title": "Let's Build A Snowman (Reprise)", + "name": "Let's Build A Snowman (Reprise)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/160 - Let's Build A Snowman (Reprise).flac", + "track": 60, + "playlisttrack": 42, + "time": 29, + "year": 2014, + "bitrate": 1439242, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925891&uid=2&player=api&name=DVDA%20-%20Let-s%20Build%20A%20Snowman%20-Reprise-.opus", + "size": 5377816, + "mbid": "95b06dbf-50a0-4ed5-aea3-41459e561b94", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925892", + "title": "Sgt. Baker", + "name": "Sgt. Baker", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/115 - Sgt. Baker.flac", + "track": 15, + "playlisttrack": 43, + "time": 209, + "year": 2014, + "bitrate": 814125, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925892&uid=2&player=api&name=DVDA%20-%20Sgt.%20Baker.opus", + "size": 21280252, + "mbid": "bf86b84d-f8ea-4079-9d92-f565aca90933", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925893", + "title": "James Cameron Song", + "name": "James Cameron Song", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/167 - James Cameron Song.flac", + "track": 67, + "playlisttrack": 44, + "time": 31, + "year": 2014, + "bitrate": 1522400, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925893&uid=2&player=api&name=DVDA%20-%20James%20Cameron%20Song.opus", + "size": 5909569, + "mbid": "4bebd27d-de6f-4948-968b-8d90e41baa04", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925894", + "title": "Hell Isn't Good (Featuring James Hetfield)", + "name": "Hell Isn't Good (Featuring James Hetfield)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/114 - Hell Isn't Good (Featuring James Hetfield).flac", + "track": 14, + "playlisttrack": 45, + "time": 77, + "year": 2014, + "bitrate": 876874, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925894&uid=2&player=api&name=DVDA%20-%20Hell%20Isn-t%20Good%20-Featuring%20James%20Hetfield-.opus", + "size": 8463804, + "mbid": "0a292c22-1a05-4a71-91d8-919959c161b8", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925895", + "title": "Why Him", + "name": "Why Him", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/136 - Why Him.flac", + "track": 36, + "playlisttrack": 46, + "time": 112, + "year": 2014, + "bitrate": 1364632, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925895&uid=2&player=api&name=DVDA%20-%20Why%20Him.opus", + "size": 19104854, + "mbid": "7ba2a790-7fc2-4836-931b-2dfb3942a6b6", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925896", + "title": "Living on Hell", + "name": "Living on Hell", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/130 - Living on Hell.flac", + "track": 30, + "playlisttrack": 47, + "time": 27, + "year": 2014, + "bitrate": 1154514, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925896&uid=2&player=api&name=DVDA%20-%20Living%20on%20Hell.opus", + "size": 3953133, + "mbid": "50e7f932-959b-4f30-9a5a-4f8f6cd0ace9", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925897", + "title": "Time Warped Theme", + "name": "Time Warped Theme", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/134 - Time Warped Theme.flac", + "track": 34, + "playlisttrack": 48, + "time": 35, + "year": 2014, + "bitrate": 1551337, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925897&uid=2&player=api&name=DVDA%20-%20Time%20Warped%20Theme.opus", + "size": 6868716, + "mbid": "063b9c9e-f072-40d1-a356-1d8039408040", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925898", + "title": "Timmy and the Lords of the Underworld", + "name": "Timmy and the Lords of the Underworld", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/112 - Timmy and the Lords of the Underworld.flac", + "track": 12, + "playlisttrack": 49, + "time": 145, + "year": 2014, + "bitrate": 1027582, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925898&uid=2&player=api&name=DVDA%20-%20Timmy%20and%20the%20Lords%20of%20the%20Underworld.opus", + "size": 18625658, + "mbid": "0cb18ef7-8bdb-4828-8bdb-3d6a8f2eb89e", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925899", + "title": "What Would Brian Boitano Do (Live)", + "name": "What Would Brian Boitano Do (Live)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/175 - What Would Brian Boitano Do (Live).flac", + "track": 75, + "playlisttrack": 50, + "time": 156, + "year": 2014, + "bitrate": 849033, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925899&uid=2&player=api&name=DVDA%20-%20What%20Would%20Brian%20Boitano%20Do%20-Live-.opus", + "size": 16620264, + "mbid": "a0d1f5b1-5e7a-402f-8aba-5cc241ef58b0", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925900", + "title": "Shatter Proof!", + "name": "Shatter Proof!", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/164 - Shatter Proof!.flac", + "track": 64, + "playlisttrack": 51, + "time": 201, + "year": 2014, + "bitrate": 1246460, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925900&uid=2&player=api&name=DVDA%20-%20Shatter%20Proof-.opus", + "size": 31395225, + "mbid": "c34a9565-a2a3-41f8-a292-80058b1a6670", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925901", + "title": "Living a Lie, Living a Lie", + "name": "Living a Lie, Living a Lie", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/128 - Living a Lie, Living a Lie.flac", + "track": 28, + "playlisttrack": 52, + "time": 28, + "year": 2014, + "bitrate": 1219161, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925901&uid=2&player=api&name=DVDA%20-%20Living%20a%20Lie-%20Living%20a%20Lie.opus", + "size": 4267066, + "mbid": "3913d049-fea0-4456-b506-71782cb538d4", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925902", + "title": "Jacking it in San Diego", + "name": "Jacking it in San Diego", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/124 - Jacking it in San Diego.flac", + "track": 24, + "playlisttrack": 53, + "time": 108, + "year": 2014, + "bitrate": 801657, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925902&uid=2&player=api&name=DVDA%20-%20Jacking%20it%20in%20San%20Diego.opus", + "size": 10897311, + "mbid": "412ef7d8-08b7-46da-a80b-e308f3270d76", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925903", + "title": "Shpadoinkle (Finale)", + "name": "Shpadoinkle (Finale)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/163 - Shpadoinkle (Finale).flac", + "track": 63, + "playlisttrack": 54, + "time": 39, + "year": 2014, + "bitrate": 1294158, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925903&uid=2&player=api&name=DVDA%20-%20Shpadoinkle%20-Finale-.opus", + "size": 6314739, + "mbid": "8a216e3c-f35c-4ada-8b19-69853561942b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925904", + "title": "I'm So Ronery (Bonus Track)", + "name": "I'm So Ronery (Bonus Track)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/172 - I'm So Ronery (Bonus Track).flac", + "track": 72, + "playlisttrack": 55, + "time": 115, + "year": 2014, + "bitrate": 771369, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925904&uid=2&player=api&name=DVDA%20-%20I-m%20So%20Ronery%20-Bonus%20Track-.opus", + "size": 11160926, + "mbid": "5286c9a3-aa96-452f-913a-7e971d3355d6", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925905", + "title": "Old People Entertainment", + "name": "Old People Entertainment", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/126 - Old People Entertainment.flac", + "track": 26, + "playlisttrack": 56, + "time": 26, + "year": 2014, + "bitrate": 1201117, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925905&uid=2&player=api&name=DVDA%20-%20Old%20People%20Entertainment.opus", + "size": 3903632, + "mbid": "38cdfc82-adeb-4351-99d9-981a368fd07e", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925906", + "title": "America, Fuck Yeah", + "name": "America, Fuck Yeah", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [ + { + "id": "43", + "name": "Soundtrack" + } + ], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/103 - America, Fuck Yeah.flac", + "track": 3, + "playlisttrack": 57, + "time": 129, + "year": 2014, + "bitrate": 941420, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925906&uid=2&player=api&name=DVDA%20-%20America-%20Fuck%20Yeah.opus", + "size": 15241025, + "mbid": "9742f00f-6467-429e-982b-28e01cd652b5", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [ + { + "name": "Soundtrack" + } + ] + }, + { + "id": "925907", + "title": "Twin Brothers In Love", + "name": "Twin Brothers In Love", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/150 - Twin Brothers In Love.flac", + "track": 50, + "playlisttrack": 58, + "time": 156, + "year": 2014, + "bitrate": 1033330, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925907&uid=2&player=api&name=DVDA%20-%20Twin%20Brothers%20In%20Love.opus", + "size": 20208810, + "mbid": "7436c523-a58c-41b2-bc2a-fbb3da8bb30c", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925908", + "title": "The End of an Act", + "name": "The End of an Act", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/108 - The End of an Act.flac", + "track": 8, + "playlisttrack": 59, + "time": 142, + "year": 2014, + "bitrate": 817622, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925908&uid=2&player=api&name=DVDA%20-%20The%20End%20of%20an%20Act.opus", + "size": 14595733, + "mbid": "9eef840a-5982-456c-a5d9-8b3572fb8866", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925909", + "title": "North Korean Melody (Bonus Track)", + "name": "North Korean Melody (Bonus Track)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/170 - North Korean Melody (Bonus Track).flac", + "track": 70, + "playlisttrack": 60, + "time": 104, + "year": 2014, + "bitrate": 679319, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925909&uid=2&player=api&name=DVDA%20-%20North%20Korean%20Melody%20-Bonus%20Track-.opus", + "size": 8908238, + "mbid": "0a5921e2-979c-4c9c-8ab2-e6a3b392304c", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925910", + "title": "What Would Brian Boitano Do?", + "name": "What Would Brian Boitano Do?", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/105 - What Would Brian Boitano Do?.flac", + "track": 5, + "playlisttrack": 61, + "time": 134, + "year": 2014, + "bitrate": 1027902, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925910&uid=2&player=api&name=DVDA%20-%20What%20Would%20Brian%20Boitano%20Do-.opus", + "size": 17329184, + "mbid": "cb2d46cf-7043-4f67-8da3-2468bc9425a0", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925911", + "title": "You're Not Like The Others (Reprise)", + "name": "You're Not Like The Others (Reprise)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/141 - You're Not Like The Others (Reprise).flac", + "track": 41, + "playlisttrack": 62, + "time": 42, + "year": 2014, + "bitrate": 1474487, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925911&uid=2&player=api&name=DVDA%20-%20You-re%20Not%20Like%20The%20Others%20-Reprise-.opus", + "size": 7842506, + "mbid": "e0124194-9fca-44f4-bfde-5afac823bd9b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925912", + "title": "Mr. Hankey The Christmas Poo", + "name": "Mr. Hankey The Christmas Poo", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/125 - Mr. Hankey The Christmas Poo.flac", + "track": 25, + "playlisttrack": 63, + "time": 137, + "year": 2014, + "bitrate": 1542991, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925912&uid=2&player=api&name=DVDA%20-%20Mr.%20Hankey%20The%20Christmas%20Poo.opus", + "size": 26452699, + "mbid": "71f01041-d22b-4eeb-98c6-77f3e47325d0", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925913", + "title": "Warts On Your Dick", + "name": "Warts On Your Dick", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/116 - Warts On Your Dick.flac", + "track": 16, + "playlisttrack": 64, + "time": 81, + "year": 2014, + "bitrate": 552778, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925913&uid=2&player=api&name=DVDA%20-%20Warts%20On%20Your%20Dick.opus", + "size": 5599078, + "mbid": "fc8cc89b-2ad6-4491-bbb7-43be7b817414", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925914", + "title": "Chewbacca (Short Studio Version)", + "name": "Chewbacca (Short Studio Version)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/176 - Chewbacca (Short Studio Version).flac", + "track": 76, + "playlisttrack": 65, + "time": 30, + "year": 2014, + "bitrate": 1371467, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925914&uid=2&player=api&name=DVDA%20-%20Chewbacca%20-Short%20Studio%20Version-.opus", + "size": 5282149, + "mbid": "8bdce68c-25e3-46fc-b8c2-53b9e9015bae", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": 3, + "rating": 3, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925915", + "title": "America, Fuck Yeah [Bummer Remix]", + "name": "America, Fuck Yeah [Bummer Remix]", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/107 - America, Fuck Yeah [Bummer Remix].flac", + "track": 7, + "playlisttrack": 66, + "time": 57, + "year": 2014, + "bitrate": 705973, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925915&uid=2&player=api&name=DVDA%20-%20America-%20Fuck%20Yeah%20-Bummer%20Remix-.opus", + "size": 5062259, + "mbid": "f5926cdc-98e1-4e0e-919e-14bdbdfda06a", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925916", + "title": "Dog Dance", + "name": "Dog Dance", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/127 - Dog Dance.flac", + "track": 27, + "playlisttrack": 67, + "time": 14, + "year": 2014, + "bitrate": 1144898, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925916&uid=2&player=api&name=DVDA%20-%20Dog%20Dance.opus", + "size": 2054580, + "mbid": "19eebdea-f32c-479b-9127-d70adf1bf906", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925917", + "title": "That's All I'm Askin' For (Reprise)", + "name": "That's All I'm Askin' For (Reprise)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/161 - That's All I'm Askin' For (Reprise).flac", + "track": 61, + "playlisttrack": 68, + "time": 39, + "year": 2014, + "bitrate": 1409405, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925917&uid=2&player=api&name=DVDA%20-%20That-s%20All%20I-m%20Askin-%20For%20-Reprise-.opus", + "size": 6932304, + "mbid": "c0ded555-7670-41a9-976d-539e589dacae", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925918", + "title": "Yepper (Reprise)", + "name": "Yepper (Reprise)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/138 - Yepper (Reprise).flac", + "track": 38, + "playlisttrack": 69, + "time": 82, + "year": 2014, + "bitrate": 1319598, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925918&uid=2&player=api&name=DVDA%20-%20Yepper%20-Reprise-.opus", + "size": 13525887, + "mbid": "da3a87c7-f31c-4753-aaa5-a04bea621939", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925919", + "title": "Saul of the Mole Men Intro", + "name": "Saul of the Mole Men Intro", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/133 - Saul of the Mole Men Intro.flac", + "track": 33, + "playlisttrack": 70, + "time": 39, + "year": 2014, + "bitrate": 797019, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925919&uid=2&player=api&name=DVDA%20-%20Saul%20of%20the%20Mole%20Men%20Intro.opus", + "size": 3958713, + "mbid": "0eaca447-ce1f-47a2-9f11-af156eaf17b0", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925920", + "title": "That's All I'm Askin' For", + "name": "That's All I'm Askin' For", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/155 - That's All I'm Askin' For.flac", + "track": 55, + "playlisttrack": 71, + "time": 164, + "year": 2014, + "bitrate": 1418018, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925920&uid=2&player=api&name=DVDA%20-%20That-s%20All%20I-m%20Askin-%20For.opus", + "size": 29102694, + "mbid": "58ef706e-c76d-41db-a243-0ceef77702ba", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925921", + "title": "Now You're A Man (Live)", + "name": "Now You're A Man (Live)", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/173 - Now You're A Man (Live).flac", + "track": 73, + "playlisttrack": 72, + "time": 210, + "year": 2014, + "bitrate": 843267, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925921&uid=2&player=api&name=DVDA%20-%20Now%20You-re%20A%20Man%20-Live-.opus", + "size": 22179663, + "mbid": "cab56a59-0a12-4419-b10e-aed25a568870", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925922", + "title": "Hang The Bastard", + "name": "Hang The Bastard", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/162 - Hang The Bastard.flac", + "track": 62, + "playlisttrack": 73, + "time": 190, + "year": 2014, + "bitrate": 1360741, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925922&uid=2&player=api&name=DVDA%20-%20Hang%20The%20Bastard.opus", + "size": 32339319, + "mbid": "e2830104-8151-4910-a37f-224929759c43", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925923", + "title": "That's My Bush", + "name": "That's My Bush", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/151 - That's My Bush.flac", + "track": 51, + "playlisttrack": 74, + "time": 30, + "year": 2014, + "bitrate": 715699, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925923&uid=2&player=api&name=DVDA%20-%20That-s%20My%20Bush.opus", + "size": 2687072, + "mbid": "99a69b56-9fd9-4a2f-b4b6-afda895125e2", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925924", + "title": "Shpadoinkle", + "name": "Shpadoinkle", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/153 - Shpadoinkle.flac", + "track": 53, + "playlisttrack": 75, + "time": 107, + "year": 2014, + "bitrate": 1344616, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925924&uid=2&player=api&name=DVDA%20-%20Shpadoinkle.opus", + "size": 18002812, + "mbid": "828bc937-80bc-4155-935b-9d6cdfcdb535", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "925925", + "title": "You're Not Like The Others", + "name": "You're Not Like The Others", + "artist": { + "id": "17616", + "name": "DVDA" + }, + "album": { + "id": "74903", + "name": "DVDA - The Album" + }, + "tag": [], + "filename": "\/mnt\/music\/DVDA\/(2014) DVDA - The Album\/139 - You're Not Like The Others.flac", + "track": 39, + "playlisttrack": 76, + "time": 143, + "year": 2014, + "bitrate": 1570518, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=925925&uid=2&player=api&name=DVDA%20-%20You-re%20Not%20Like%20The%20Others.opus", + "size": 28139801, + "mbid": "476fbc0c-1b28-4088-b12f-a9d881f908c0", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=74903&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "Visit http:\/\/kennytweek.bandcamp.com", + "license": "CC BY<\/a>", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + } +] \ No newline at end of file diff --git a/docs/json-responses/licenses.json b/docs/json-responses/licenses.json index 204edfc1..25417338 100644 --- a/docs/json-responses/licenses.json +++ b/docs/json-responses/licenses.json @@ -1,88 +1,176 @@ -{ - "license": [ - { - "id": "1", - "name": "0 - default", - "description": null, - "external_link": "" - }, - { - "id": "14", - "name": "C Reaction", - "description": null, - "external_link": "http:\/\/morne.free.fr\/Necktar7\/creaction.htm" - }, - { - "id": "2", - "name": "CC BY", - "description": null, - "external_link": "https:\/\/creativecommons.org\/licenses\/by\/3.0\/" - }, - { - "id": "3", - "name": "CC BY NC", - "description": null, - "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc\/3.0\/" - }, - { - "id": "4", - "name": "CC BY NC ND", - "description": null, - "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/" - }, - { - "id": "5", - "name": "CC BY NC SA", - "description": null, - "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/" - }, - { - "id": "6", - "name": "CC BY ND", - "description": null, - "external_link": "https:\/\/creativecommons.org\/licenses\/by-nd\/3.0\/" - }, - { - "id": "7", - "name": "CC BY SA", - "description": null, - "external_link": "https:\/\/creativecommons.org\/licenses\/by-sa\/3.0\/" - }, - { - "id": "13", - "name": "FMPL", - "description": null, - "external_link": "http:\/\/www.fmpl.org\/fmpl.html" - }, - { - "id": "11", - "name": "Gnu GPL Art", - "description": null, - "external_link": "http:\/\/gnuart.org\/english\/gnugpl.html" - }, - { - "id": "10", - "name": "Green OpenMusic", - "description": null, - "external_link": "http:\/\/openmusic.linuxtag.org\/green.html" - }, - { - "id": "8", - "name": "Licence Art Libre", - "description": null, - "external_link": "http:\/\/artlibre.org\/licence\/lal\/" - }, - { - "id": "12", - "name": "WTFPL", - "description": null, - "external_link": "https:\/\/en.wikipedia.org\/wiki\/WTFPL" - }, - { - "id": "9", - "name": "Yellow OpenMusic", - "description": null, - "external_link": "http:\/\/openmusic.linuxtag.org\/yellow.html" - } - ] -} \ No newline at end of file +[ + { + "id": "15", + "name": "0 - default", + "description": null, + "external_link": "" + }, + { + "id": "16", + "name": "0 - default", + "description": null, + "external_link": "" + }, + { + "id": "29", + "name": "C Reaction", + "description": null, + "external_link": "http:\/\/morne.free.fr\/Necktar7\/creaction.htm" + }, + { + "id": "14", + "name": "C Reaction", + "description": null, + "external_link": "http:\/\/morne.free.fr\/Necktar7\/creaction.htm" + }, + { + "id": "17", + "name": "CC BY", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by\/3.0\/" + }, + { + "id": "2", + "name": "CC BY", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by\/3.0\/" + }, + { + "id": "18", + "name": "CC BY NC", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc\/3.0\/" + }, + { + "id": "3", + "name": "CC BY NC", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc\/3.0\/" + }, + { + "id": "19", + "name": "CC BY NC ND", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/" + }, + { + "id": "4", + "name": "CC BY NC ND", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/" + }, + { + "id": "20", + "name": "CC BY NC SA", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/" + }, + { + "id": "5", + "name": "CC BY NC SA", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/" + }, + { + "id": "21", + "name": "CC BY ND", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-nd\/3.0\/" + }, + { + "id": "6", + "name": "CC BY ND", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-nd\/3.0\/" + }, + { + "id": "22", + "name": "CC BY SA", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-sa\/3.0\/" + }, + { + "id": "7", + "name": "CC BY SA", + "description": null, + "external_link": "https:\/\/creativecommons.org\/licenses\/by-sa\/3.0\/" + }, + { + "id": "28", + "name": "FMPL", + "description": null, + "external_link": "http:\/\/www.fmpl.org\/fmpl.html" + }, + { + "id": "13", + "name": "FMPL", + "description": null, + "external_link": "http:\/\/www.fmpl.org\/fmpl.html" + }, + { + "id": "11", + "name": "Gnu GPL Art", + "description": null, + "external_link": "http:\/\/gnuart.org\/english\/gnugpl.html" + }, + { + "id": "26", + "name": "Gnu GPL Art", + "description": null, + "external_link": "http:\/\/gnuart.org\/english\/gnugpl.html" + }, + { + "id": "10", + "name": "Green OpenMusic", + "description": null, + "external_link": "http:\/\/openmusic.linuxtag.org\/green.html" + }, + { + "id": "25", + "name": "Green OpenMusic", + "description": null, + "external_link": "http:\/\/openmusic.linuxtag.org\/green.html" + }, + { + "id": "8", + "name": "Licence Art Libre", + "description": null, + "external_link": "http:\/\/artlibre.org\/licence\/lal\/" + }, + { + "id": "23", + "name": "Licence Art Libre", + "description": null, + "external_link": "http:\/\/artlibre.org\/licence\/lal\/" + }, + { + "id": "12", + "name": "WTFPL", + "description": null, + "external_link": "https:\/\/en.wikipedia.org\/wiki\/WTFPL" + }, + { + "id": "27", + "name": "WTFPL", + "description": null, + "external_link": "https:\/\/en.wikipedia.org\/wiki\/WTFPL" + }, + { + "id": "24", + "name": "Yellow OpenMusic", + "description": null, + "external_link": "http:\/\/openmusic.linuxtag.org\/yellow.html" + }, + { + "id": "9", + "name": "Yellow OpenMusic", + "description": null, + "external_link": "http:\/\/openmusic.linuxtag.org\/yellow.html" + }, + { + "id": "1", + "name": "_default", + "description": null, + "external_link": "" + } +] \ No newline at end of file diff --git a/docs/json-responses/localplay (status).json b/docs/json-responses/localplay (status).json deleted file mode 100644 index 5fb516c1..00000000 --- a/docs/json-responses/localplay (status).json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "localplay": { - "command": { - "status": { - "state": "stop", - "volume": "0", - "repeat": "0", - "random": "0", - "track": 1, - "track_title": null - } - } - } -} \ No newline at end of file diff --git a/docs/json-responses/localplay.json b/docs/json-responses/localplay.json deleted file mode 100644 index 4d92610c..00000000 --- a/docs/json-responses/localplay.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "localplay": { - "command": { - "stop": true - } - } -} \ No newline at end of file diff --git a/docs/json-responses/ping (no auth).json b/docs/json-responses/ping (no auth).json deleted file mode 100644 index f4cf8aab..00000000 --- a/docs/json-responses/ping (no auth).json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "server": "develop", - "version": "5.0.0", - "compatible": "350001" -} \ No newline at end of file diff --git a/docs/json-responses/ping.json b/docs/json-responses/ping.json index 744da103..905f060d 100644 --- a/docs/json-responses/ping.json +++ b/docs/json-responses/ping.json @@ -1,26 +1,6 @@ { - "session_expire": "2021-08-03T11:07:31+10:00", - "server": "develop", - "version": "5.0.0", - "compatible": "350001", - "auth": "cfj3f237d563f479f5223k23189dbb34", - "api": "5.0.0", - "update": "2021-07-21T12:51:36+10:00", - "add": "2021-08-03T10:04:14+10:00", - "clean": "2021-08-03T10:05:54+10:00", - "songs": 75, - "albums": 9, - "artists": 17, - "genres": 7, - "playlists": 2, - "searches": 17, - "users": 8, - "catalogs": 4, - "videos": 2, - "podcasts": 2, - "podcast_episodes": 13, - "shares": 2, - "licenses": 14, - "live_streams": 3, - "labels": 3 + "session_expire": "2020-07-28T17:02:29+10:00", + "server": "4.2.0-develop", + "version": "420000", + "compatible": "350001" } \ No newline at end of file diff --git a/docs/json-responses/playlist.json b/docs/json-responses/playlist.json index 4771ba05..95ca7807 100644 --- a/docs/json-responses/playlist.json +++ b/docs/json-responses/playlist.json @@ -1,12 +1,9 @@ -{ - "id": "65", - "name": "documentation", - "owner": "user", - "items": "3", - "type": "public", - "art": "https:\/\/music.com.au\/image.php?object_id=65&object_type=playlist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "" -} \ No newline at end of file +[ + { + "id": "2093", + "name": "documentation", + "owner": "user", + "items": 0, + "type": "public" + } +] \ No newline at end of file diff --git a/docs/json-responses/playlist_add_song (error).json b/docs/json-responses/playlist_add_song (error).json index 05d17818..72a0b21a 100644 --- a/docs/json-responses/playlist_add_song (error).json +++ b/docs/json-responses/playlist_add_song (error).json @@ -1,8 +1,6 @@ { "error": { - "errorCode": "4710", - "errorAction": "playlist_add_song", - "errorType": "duplicate", - "errorMessage": "Bad Request: 54" + "code": "400", + "message": "Can't add a duplicate item when check is enabled" } } \ No newline at end of file diff --git a/docs/json-responses/playlist_add_song.json b/docs/json-responses/playlist_add_song.json index 1023ff09..c39b1542 100644 --- a/docs/json-responses/playlist_add_song.json +++ b/docs/json-responses/playlist_add_song.json @@ -1,3 +1,3 @@ { "success": "song added to playlist" -} \ No newline at end of file +} diff --git a/docs/json-responses/playlist_create.json b/docs/json-responses/playlist_create.json index 230444d6..ef1293c1 100644 --- a/docs/json-responses/playlist_create.json +++ b/docs/json-responses/playlist_create.json @@ -1,12 +1,9 @@ -{ - "id": "65", - "name": "rename", - "owner": "user", - "items": 0, - "type": "private", - "art": "https:\/\/music.com.au\/image.php?object_id=65&object_type=playlist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "" -} \ No newline at end of file +[ + { + "id": "2093", + "name": "rename", + "owner": "user", + "items": 0, + "type": "private" + } +] \ No newline at end of file diff --git a/docs/json-responses/playlist_generate (id).json b/docs/json-responses/playlist_generate (id).json index e6be2264..e6a1c4f0 100644 --- a/docs/json-responses/playlist_generate (id).json +++ b/docs/json-responses/playlist_generate (id).json @@ -1,6 +1,222 @@ [ - 60, - 129, - 112, - 74 + { + "id": "772543", + "title": "Fog", + "name": "Fog", + "artist": { + "id": "10335", + "name": "Kristin Hersh" + }, + "album": { + "id": "60805", + "name": "Sky Motel" + }, + "tag": [ + { + "id": "6", + "name": "Rock" + } + ], + "filename": "\/mnt\/music\/Kristin Hersh\/(1999) Sky Motel [CAD 9008 CD]\/103 - Fog.mp3", + "track": 3, + "playlisttrack": 1, + "time": 96, + "year": 1999, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=772543&uid=2&player=api&name=Kristin%20Hersh%20-%20Fog.mp3", + "size": 3967320, + "mbid": "27acb34d-ce7a-4c19-b5bd-c6437019478c", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=60805&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "4AD; Shock Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-7.370000", + "replaygain_track_peak": "0.891000", + "genre": [ + { + "name": "Rock" + } + ] + }, + { + "id": "151361", + "title": "A100", + "name": "A100", + "artist": { + "id": "2445", + "name": "Billy Corgan" + }, + "album": { + "id": "34143", + "name": "Paradiso, Amsterdam, NL" + }, + "tag": [ + { + "id": "666", + "name": "Bootleg" + } + ], + "filename": "\/mnt\/files-music\/boots\/Billy Corgan\/2005-06-09 - Paradiso, Amsterdam, NL\/09 - A100.flac", + "track": 9, + "playlisttrack": 2, + "time": 293, + "year": 2005, + "bitrate": 729446, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=151361&uid=2&player=api&name=Billy%20Corgan%20-%20A100.opus", + "size": 26721540, + "mbid": "", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=34143&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 6, + "composer": "", + "channels": null, + "comment": "", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [ + { + "name": "Bootleg" + } + ] + }, + { + "id": "10411", + "title": "Whisper of Rain", + "name": "Whisper of Rain", + "artist": { + "id": "362", + "name": "Pokrov Music" + }, + "album": { + "id": "43640", + "name": "Never Forget" + }, + "tag": [ + { + "id": "7", + "name": "Synthpop" + } + ], + "filename": "\/mnt\/music\/Pokrov Music\/(2009) Never Forget\/103 - Whisper of Rain.mp3", + "track": 3, + "playlisttrack": 3, + "time": 259, + "year": 2009, + "bitrate": 219783, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=10411&uid=2&player=api&name=Pokrov%20Music%20-%20Whisper%20of%20Rain.mp3", + "size": 7143513, + "mbid": "", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=43640&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "", + "language": "English", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [ + { + "name": "Synthpop" + } + ] + }, + { + "id": "801913", + "title": "Business Ideas", + "name": "Business Ideas", + "artist": { + "id": "30", + "name": "Dennis Miller" + }, + "album": { + "id": "10457", + "name": "America 180" + }, + "tag": [ + { + "id": "5", + "name": "Comedy" + } + ], + "filename": "\/mnt\/music\/Dennis Miller\/(2014) America 180\/117 - Business Ideas.mp3", + "track": 17, + "playlisttrack": 4, + "time": 82, + "year": 2014, + "bitrate": 176773, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=801913&uid=2&player=api&name=Dennis%20Miller%20-%20Business%20Ideas.mp3", + "size": 1882116, + "mbid": "", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=10457&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "In America 180, Dennis Miller examines the current state of our Union. From the antics of those running Washington, to the blunders of President Obama''s healthcare initiative, to our wild efforts to save the planet one light bulb at a time, his take on today''s America is both hysterical and painfully right on target. Dennis Miller: America 180 was taped at the Barclay Theatre in Irvine, California.", + "publisher": "New Wave Dynamics", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-8.540000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Comedy" + } + ] + } ] \ No newline at end of file diff --git a/docs/json-responses/playlist_generate (index).json b/docs/json-responses/playlist_generate (index).json index d2d41e9b..c352ab47 100644 --- a/docs/json-responses/playlist_generate (index).json +++ b/docs/json-responses/playlist_generate (index).json @@ -1,221 +1,222 @@ -{ - "song": [ - { - "id": "103", - "title": "In The Seven Woods (Instrumental Re-Recording)", - "name": "In The Seven Woods (Instrumental Re-Recording)", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/07InTheSevenWoods_InstrumentalReRecording.ogg", - "genre": [], - "playlisttrack": 1, - "time": 452, - "year": 1996, - "bitrate": 138338, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=103&uid=4&player=api&name=CARN-N%20-%20In%20The%20Seven%20Woods%20-Instrumental%20Re-Recording-.ogg", - "size": 7826238, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-12.210000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null +[ + { + "id": "184033", + "title": "Pete Shore", + "name": "Pete Shore", + "artist": { + "id": "9151", + "name": "Boss Hog" + }, + "album": { + "id": "57496", + "name": "Cold Hands" + }, + "tag": [ + { + "id": "60", + "name": "Punk Rock" + } + ], + "filename": "\/mnt\/music\/Boss Hog\/(1990) Cold Hands [ARR 89192-2]\/106 - Pete Shore.mp3", + "track": 6, + "playlisttrack": 1, + "time": 189, + "year": 1990, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=184033&uid=2&player=api&name=Boss%20Hog%20-%20Pete%20Shore.mp3", + "size": 7955604, + "mbid": "4664872f-9e47-4eae-bfa8-cad33ddf9ee4", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=57496&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Amphetamine Reptile Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-2.050000", + "replaygain_track_peak": "0.624000", + "genre": [ + { + "name": "Punk Rock" + } + ] + }, + { + "id": "809216", + "title": "Running for You", + "name": "Running for You", + "artist": { + "id": "11588", + "name": "Model1" }, - { - "id": "60", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/04-Synthetic_-_BrownSmokeYSBM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 304, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=60&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.wma", - "size": 792375, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null + "album": { + "id": "63245", + "name": "The Vocoders Strikes Back" + }, + "tag": [ + { + "id": "7", + "name": "Synthpop" + } + ], + "filename": "\/mnt\/music\/Model1\/(2016) The Vocoders Strikes Back [RAZ 023]\/111 - Running for You.mp3", + "track": 11, + "playlisttrack": 2, + "time": 348, + "year": 2016, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=809216&uid=2&player=api&name=Model1%20-%20Running%20for%20You.mp3", + "size": 14001216, + "mbid": "6068dee5-4835-4027-9971-77ee55a3f4d0", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=63245&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "ms", + "publisher": "Razgrom Music", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-8.450000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Synthpop" + } + ] + }, + { + "id": "19594", + "title": "You've Got the Love", + "name": "You've Got the Love", + "artist": { + "id": "698", + "name": "Florence + the Machine" + }, + "album": { + "id": "35848", + "name": "Between Two Lungs" + }, + "tag": [ + { + "id": "16", + "name": "Alternative" + } + ], + "filename": "\/mnt\/music\/Florence + the Machine\/(2010) Between Two Lungs\/113 - You've Got the Love.mp3", + "track": 13, + "playlisttrack": 3, + "time": 168, + "year": 2010, + "bitrate": 200112, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=19594&uid=2&player=api&name=Florence%20-%20the%20Machine%20-%20You-ve%20Got%20the%20Love.mp3", + "size": 4231463, + "mbid": "261847b5-befc-440a-a4a9-7f17e168f29a", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=35848&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Island; \u3082\u3057\u3082\u3057", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.040000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Alternative" + } + ] + }, + { + "id": "882739", + "title": "Hells Home", + "name": "Hells Home", + "artist": { + "id": "15471", + "name": "Cabaret Voltaire \/ Tecnoville" }, - { - "id": "80", - "title": "\u0425\u0438\u043a\u043a\u0438 \u043d\u0430\u0439\u0434\u0438 \u0441\u0432\u043e\u044e \u0422\u044f\u043d", - "name": "\u0425\u0438\u043a\u043a\u0438 \u043d\u0430\u0439\u0434\u0438 \u0441\u0432\u043e\u044e \u0422\u044f\u043d", - "artist": { - "id": "12", - "name": "\u041a-\u0410-\u041b-\u041b-\u041e-\u0412-\u042b-\u0419- \u0421-\u0422-\u0415-\u0420-\u0416-\u0415-\u041d-\u042c" - }, - "album": { - "id": "6", - "name": "\u0425\u0438\u043a\u043a\u0438 \u041d\u0430\u0439\u0434\u0438 \u0421\u0432\u043e\u044e \u0422\u044f\u043d (Single)" - }, - "albumartist": { - "id": "12", - "name": "\u041a-\u0410-\u041b-\u041b-\u041e-\u0412-\u042b-\u0419- \u0421-\u0422-\u0415-\u0420-\u0416-\u0415-\u041d-\u042c" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/\u041a-\u0410-\u041b-\u041b-\u041e-\u0412-\u042b-\u0419- \u0421-\u0422-\u0415-\u0420-\u0416-\u0415-\u041d-\u042c\/\u0425\u0438\u043a\u043a\u0438 \u041d\u0430\u0439\u0434\u0438 \u0421\u0432\u043e\u044e \u0422\u044f\u043d (Single)\/01 - \u0425\u0438\u043a\u043a\u0438 \u043d\u0430\u0439\u0434\u0438 \u0441\u0432\u043e\u044e \u0422\u044f\u043d.wav", - "genre": [], - "playlisttrack": 3, - "time": 300, - "year": 0, - "bitrate": 1411200, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=80&uid=4&player=api&name=-%20-%20-%20-%20-%20-%20-.wav", - "size": 53026998, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-21.750000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null + "album": { + "id": "70011", + "name": "The Covenant, the Sword and the Arm of the Lord" }, - { - "id": "110", - "title": "I wanna walk through the fire", - "name": "I wanna walk through the fire", - "artist": { - "id": "23", - "name": "Manic Notion" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 1, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/01ManicNotion-IWannaWalkThroughTheFire.m4a", - "genre": [], - "playlisttrack": 4, - "time": 197, - "year": 2012, - "bitrate": 267320, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=110&uid=4&player=api&name=Manic%20Notion%20-%20I%20wanna%20walk%20through%20the%20fire.m4a", - "size": 6651911, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-5.150000", - "replaygain_track_peak": "0.989000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + "tag": [ + { + "id": "55", + "name": "Electro" + } + ], + "filename": "\/mnt\/music\/Cabaret Voltaire\/(1985) The Covenant, the Sword and the Arm of the Lord [CVCD3]\/103 - Hells Home.mp3", + "track": 3, + "playlisttrack": 4, + "time": 308, + "year": 1985, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=882739&uid=2&player=api&name=Cabaret%20Voltaire%20-%20Tecnoville%20-%20Hells%20Home.mp3", + "size": 12382711, + "mbid": "4690c426-06b3-4ab8-8f0f-c7af1bbcfd50", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=70011&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Virgin", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-5.490000", + "replaygain_track_peak": "0.822000", + "genre": [ + { + "name": "Electro" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/playlist_generate (song).json b/docs/json-responses/playlist_generate (song).json index 51d1c398..bcfe5e52 100644 --- a/docs/json-responses/playlist_generate (song).json +++ b/docs/json-responses/playlist_generate (song).json @@ -1,235 +1,250 @@ -{ - "song": [ - { - "id": "129", - "title": "The Hunt", - "name": "The Hunt", - "artist": { - "id": "36", - "name": "Comfort Fit" - }, - "album": { - "id": "21", - "name": "Forget and Remember" - }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 16, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/16 - The Hunt.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 1, - "time": 226, - "year": 2005, - "bitrate": 224425, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=129&uid=4&player=api&name=Comfort%20Fit%20-%20The%20Hunt.mp3", - "size": 6373874, - "mbid": "8d22ccfd-38e9-42ca-9664-a236302ab8bf", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-16-comfort_fit-the_hunt\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null +[ + { + "id": "911946", + "title": "He Won't Fight", + "name": "He Won't Fight", + "artist": { + "id": "16795", + "name": "Indoor Voices" }, - { - "id": "115", - "title": "Are we going Crazy", - "name": "Are we going Crazy", - "artist": { - "id": "27", - "name": "Chi.Otic" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" + "album": { + "id": "73444", + "name": "Animal" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "19", - "name": "Various Artists" + { + "id": "422", + "name": "Shoegaze" + } + ], + "filename": "\/mnt\/music\/Indoor Voices\/(2020) Animal\/101 - He Won't Fight.mp3", + "track": 1, + "playlisttrack": 1, + "time": 285, + "year": 2020, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=911946&uid=2&player=api&name=Indoor%20Voices%20-%20He%20Won-t%20Fight.mp3", + "size": 11530583, + "mbid": "7e54910d-b9b6-41e3-a581-0e28a615a10a", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=73444&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Not On Label (Indoor Voices Self-Released)", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-7.060000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/07Chi.otic-AreWeGoingCrazy.wma", - "genre": [], - "playlisttrack": 2, - "time": 433, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=115&uid=4&player=api&name=Chi.Otic%20-%20Are%20we%20going%20Crazy.wma", - "size": 1776580, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null + { + "name": "Shoegaze" + } + ] + }, + { + "id": "39963", + "title": "When Death Had No Name", + "name": "When Death Had No Name", + "artist": { + "id": "1379", + "name": "Danzig" + }, + "album": { + "id": "49257", + "name": "The Power of the Dark Side" }, - { - "id": "94", - "title": "Strangers Query", - "name": "Strangers Query", - "artist": { - "id": "14", - "name": "Nofi\/found." + "tag": [ + { + "id": "6", + "name": "Rock" }, - "album": { - "id": "8", - "name": "Nofi Devices" + { + "id": "22", + "name": "Pop" }, - "albumartist": { - "id": "14", - "name": "Nofi\/found." + { + "id": "64", + "name": "Heavy Metal" }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Nofi_found\/Nofi Devices LP\/07_Strangers_Query.mp3", - "genre": [ - { - "id": "5", - "name": "Electronica" - }, - { - "id": "6", - "name": "Dance" - } - ], - "playlisttrack": 3, - "time": 279, - "year": 0, - "bitrate": 192000, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=94&uid=4&player=api&name=Nofi-found.%20-%20Strangers%20Query.mp3", - "size": 6719700, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=8&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "Jeffrey Melton", - "channels": null, - "comment": "8A114B0B+332232+11+150+3703+28283+76364+107382+132131+156082+177051+217892+239975+285087", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-3.800000", - "replaygain_track_peak": "0.966000", - "r128_album_gain": null, - "r128_track_gain": null - }, - { - "id": "117", - "title": "Remember Something I Forgot", - "name": "Remember Something I Forgot", - "artist": { - "id": "36", - "name": "Comfort Fit" + { + "id": "156", + "name": "Alternative Metal" + } + ], + "filename": "\/mnt\/music\/Danzig\/(1995) The Power of the Dark Side\/107 - When Death Had No Name.mp3", + "track": 7, + "playlisttrack": 2, + "time": 298, + "year": 1995, + "bitrate": 192000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=39963&uid=2&player=api&name=Danzig%20-%20When%20Death%20Had%20No%20Name.mp3", + "size": 7176403, + "mbid": "bb01a973-5622-4cdb-9717-b6a452bd9f27", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=49257&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-8.330000", + "replaygain_track_peak": "0.989000", + "genre": [ + { + "name": "Rock" }, - "album": { - "id": "21", - "name": "Forget and Remember" + { + "name": "Pop" }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" + { + "name": "Heavy Metal" }, - "disk": 1, - "track": 11, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/11 - Remember Something I Forgot.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 4, - "time": 163, - "year": 2005, - "bitrate": 235109, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=117&uid=4&player=api&name=Comfort%20Fit%20-%20Remember%20Something%20I%20Forgot.mp3", - "size": 4816734, - "mbid": "ba784e10-e268-4c44-9c82-091167162c27", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-11-comfort_fit-remember_something_i_forgot\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + { + "name": "Alternative Metal" + } + ] + }, + { + "id": "799251", + "title": "My Sacrifice", + "name": "My Sacrifice", + "artist": { + "id": "11230", + "name": "Aeon Zen" + }, + "album": { + "id": "62509", + "name": "The Face of the Unknown" + }, + "tag": [ + { + "id": "71", + "name": "Progressive Metal" + } + ], + "filename": "\/mnt\/music\/Aeon Zen\/(2010) The Face of the Unknown\/108 - My Sacrifice.mp3", + "track": 8, + "playlisttrack": 3, + "time": 311, + "year": 2010, + "bitrate": 320024, + "rate": 48000, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=799251&uid=2&player=api&name=Aeon%20Zen%20-%20My%20Sacrifice.mp3", + "size": 12769152, + "mbid": "d9326de8-ae3d-44c2-a65d-7a980c6e307d", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=62509&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Time Divide Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.870000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Progressive Metal" + } + ] + }, + { + "id": "9564", + "title": "The 4th Knife", + "name": "The 4th Knife", + "artist": { + "id": "333", + "name": "Diva Destruction" + }, + "album": { + "id": "49107", + "name": "Run Cold" + }, + "tag": [ + { + "id": "1403", + "name": "Goth Rock" + } + ], + "filename": "\/mnt\/music\/Diva Destruction\/(2006) Run Cold\/103 - The 4th Knife.mp3", + "track": 3, + "playlisttrack": 4, + "time": 237, + "year": 2006, + "bitrate": 229142, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=9564&uid=2&player=api&name=Diva%20Destruction%20-%20The%204th%20Knife.mp3", + "size": 6811636, + "mbid": "cea78438-4580-4d0e-b6c6-c71562d7502f", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=49107&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Debra Fogarty", + "channels": null, + "comment": "Lb:AliceIn C:aiw143", + "publisher": "Alice in...", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.220000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Goth Rock" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/playlist_songs.json b/docs/json-responses/playlist_songs.json index e5c155bc..96c7d38a 100644 --- a/docs/json-responses/playlist_songs.json +++ b/docs/json-responses/playlist_songs.json @@ -1,120 +1,195 @@ -{ - "song": [ - { - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null +[ + { + "id": "802686", + "title": "Chapter", + "name": "Chapter", + "artist": { + "id": "11350", + "name": "NOFX, Jeff Alulis" }, - { - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 2, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + "album": { + "id": "44850", + "name": "NOFX: The Hepatitis Bathtub and Other Stories" + }, + "tag": [], + "filename": "\/mnt\/music\/NOFX\/(2016) NOFX: The Hepatitis Bathtub and Other Stories\/1027 - Chapter.mp3", + "track": 27, + "playlisttrack": 1, + "time": 752, + "year": 2016, + "bitrate": 97179, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=802686&uid=2&player=api&name=NOFX-%20Jeff%20Alulis%20-%20Chapter.mp3", + "size": 9229718, + "mbid": "", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=44850&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "NOFX, Jello Biafra, Tommy Chong", + "channels": null, + "comment": "Available as an audiobook for the first time, read by band members 'Fat Mike' Burkett, Eric Melvin, Erik 'Smelly' Sandin, and Aaron 'El Hefe' Abeyta along with special guest narrator musician and comedian Tommy Chong. In addition, the audiobook features exclusive, previously unreleased tracks, 'Bouncy' (a NOFX instrumental), 'La Pieta' (Fat Mike piano & vocal song about his mother), and 'Young Drunk & Stupid' (live NOFX song from an Idaho basement gig in 1986) NOFX: The Hepatitis Bathtub and Other Stories is the first tell-all autobiography from one of the world's most influential and controversial punk bands. Fans and non-fans alike will be shocked by the stories of murder, suicide, addiction, counterfeiting, riots, bondage, terminal illness, the Yakuza, and drinking pee. Told from the perspective of each of the band's members, this audiobook looks back at more than 30 years of comedy, tragedy, and completely inexplicable success.", + "publisher": "", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "802687", + "title": "Chapter", + "name": "Chapter", + "artist": { + "id": "11350", + "name": "NOFX, Jeff Alulis" + }, + "album": { + "id": "44850", + "name": "NOFX: The Hepatitis Bathtub and Other Stories" + }, + "tag": [], + "filename": "\/mnt\/music\/NOFX\/(2016) NOFX: The Hepatitis Bathtub and Other Stories\/1050 - Chapter.mp3", + "track": 50, + "playlisttrack": 2, + "time": 275, + "year": 2016, + "bitrate": 97730, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=802687&uid=2&player=api&name=NOFX-%20Jeff%20Alulis%20-%20Chapter.mp3", + "size": 3455996, + "mbid": "", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=44850&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "NOFX, Jello Biafra, Tommy Chong", + "channels": null, + "comment": "Available as an audiobook for the first time, read by band members 'Fat Mike' Burkett, Eric Melvin, Erik 'Smelly' Sandin, and Aaron 'El Hefe' Abeyta along with special guest narrator musician and comedian Tommy Chong. In addition, the audiobook features exclusive, previously unreleased tracks, 'Bouncy' (a NOFX instrumental), 'La Pieta' (Fat Mike piano & vocal song about his mother), and 'Young Drunk & Stupid' (live NOFX song from an Idaho basement gig in 1986) NOFX: The Hepatitis Bathtub and Other Stories is the first tell-all autobiography from one of the world's most influential and controversial punk bands. Fans and non-fans alike will be shocked by the stories of murder, suicide, addiction, counterfeiting, riots, bondage, terminal illness, the Yakuza, and drinking pee. Told from the perspective of each of the band's members, this audiobook looks back at more than 30 years of comedy, tragedy, and completely inexplicable success.", + "publisher": "", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + }, + { + "id": "802685", + "title": "Chapter", + "name": "Chapter", + "artist": { + "id": "11350", + "name": "NOFX, Jeff Alulis" + }, + "album": { + "id": "44850", + "name": "NOFX: The Hepatitis Bathtub and Other Stories" + }, + "tag": [ + { + "id": "1310", + "name": "Audiobook" + } + ], + "filename": "\/mnt\/music\/NOFX\/(2016) NOFX: The Hepatitis Bathtub and Other Stories\/1048 - Chapter.mp3", + "track": 48, + "playlisttrack": 3, + "time": 210, + "year": 2016, + "bitrate": 99212, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=802685&uid=2&player=api&name=NOFX-%20Jeff%20Alulis%20-%20Chapter.mp3", + "size": 2701132, + "mbid": null, + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=44850&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "NOFX, Jello Biafra, Tommy Chong", + "channels": null, + "comment": "Available as an audiobook for the first time, read by band members 'Fat Mike' Burkett, Eric Melvin, Erik 'Smelly' Sandin, and Aaron 'El Hefe' Abeyta along with special guest narrator musician and comedian Tommy Chong. In addition, the audiobook features exclusive, previously unreleased tracks, 'Bouncy' (a NOFX instrumental), 'La Pieta' (Fat Mike piano & vocal song about his mother), and 'Young Drunk & Stupid' (live NOFX song from an Idaho basement gig in 1986) NOFX: The Hepatitis Bathtub and Other Stories is the first tell-all autobiography from one of the world's most influential and controversial punk bands. Fans and non-fans alike will be shocked by the stories of murder, suicide, addiction, counterfeiting, riots, bondage, terminal illness, the Yakuza, and drinking pee. Told from the perspective of each of the band's members, this audiobook looks back at more than 30 years of comedy, tragedy, and completely inexplicable success.", + "publisher": "", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [ + { + "name": "Audiobook" + } + ] + }, + { + "id": "802684", + "title": "Chapter", + "name": "Chapter", + "artist": { + "id": "11350", + "name": "NOFX, Jeff Alulis" + }, + "album": { + "id": "44850", + "name": "NOFX: The Hepatitis Bathtub and Other Stories" + }, + "tag": [], + "filename": "\/mnt\/music\/NOFX\/(2016) NOFX: The Hepatitis Bathtub and Other Stories\/1033 - Chapter.mp3", + "track": 33, + "playlisttrack": 4, + "time": 348, + "year": 2016, + "bitrate": 96823, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=802684&uid=2&player=api&name=NOFX-%20Jeff%20Alulis%20-%20Chapter.mp3", + "size": 4314312, + "mbid": "", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=44850&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "NOFX, Jello Biafra, Tommy Chong", + "channels": null, + "comment": "Available as an audiobook for the first time, read by band members 'Fat Mike' Burkett, Eric Melvin, Erik 'Smelly' Sandin, and Aaron 'El Hefe' Abeyta along with special guest narrator musician and comedian Tommy Chong. In addition, the audiobook features exclusive, previously unreleased tracks, 'Bouncy' (a NOFX instrumental), 'La Pieta' (Fat Mike piano & vocal song about his mother), and 'Young Drunk & Stupid' (live NOFX song from an Idaho basement gig in 1986) NOFX: The Hepatitis Bathtub and Other Stories is the first tell-all autobiography from one of the world's most influential and controversial punk bands. Fans and non-fans alike will be shocked by the stories of murder, suicide, addiction, counterfeiting, riots, bondage, terminal illness, the Yakuza, and drinking pee. Told from the perspective of each of the band's members, this audiobook looks back at more than 30 years of comedy, tragedy, and completely inexplicable success.", + "publisher": "", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [] + } +] \ No newline at end of file diff --git a/docs/json-responses/playlists.json b/docs/json-responses/playlists.json index 2c8c272b..7de49b9d 100644 --- a/docs/json-responses/playlists.json +++ b/docs/json-responses/playlists.json @@ -1,28 +1,30 @@ -{ - "playlist": [ - { - "id": "3", - "name": "random - admin - private (admin)", - "owner": "admin", - "items": "43", - "type": "private", - "art": "https:\/\/music.com.au\/image.php?object_id=3&object_type=playlist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "" - }, - { - "id": "2", - "name": "random - admin - public (admin)", - "owner": "admin", - "items": "43", - "type": "public", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=playlist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": null, - "rating": null, - "averagerating": "" - } - ] -} \ No newline at end of file +[ + { + "id": "2002", + "name": "dewaardradio", + "owner": "System", + "items": 12694, + "type": "private" + }, + { + "id": "2069", + "name": "Hudson", + "owner": "user", + "items": 23, + "type": "public" + }, + { + "id": "1994", + "name": "nyssa mixed", + "owner": "nyssa", + "items": 3112, + "type": "private" + }, + { + "id": "19", + "name": "nyssaRadio", + "owner": "nyssa", + "items": 4456, + "type": "private" + } +] \ No newline at end of file diff --git a/docs/json-responses/podcast (include episodes).json b/docs/json-responses/podcast (include episodes).json index 2e2ba027..915f8220 100644 --- a/docs/json-responses/podcast (include episodes).json +++ b/docs/json-responses/podcast (include episodes).json @@ -1,280 +1,1801 @@ -{ - "id": "1", - "name": "60-Second Science", - "description": "Tune in every weekday for quick reports and commentaries on the world of science\u2014it'll just take a minute", - "language": "en-us", - "copyright": "False", - "feed_url": "http:\/\/rss.sciam.com\/sciam\/60secsciencepodcast", - "generator": "", - "website": "https:\/\/www.scientificamerican.com\/podcast\/60-second-science\/", - "build_date": "1970-01-01T10:00:00+10:00", - "sync_date": "2021-08-20T11:08:30+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=1", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [ - { - "id": "135", - "title": "The Incredible, Reanimated 24,000-Year-Old Rotifer", - "name": "The Incredible, Reanimated 24,000-Year-Old Rotifer", - "description": "The last time this tiny wheel animalcule was moving around, woolly mammoths roamed the earth.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=EI6kC4Uuf7k:1D8ECiIxgHk:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/EI6kC4Uuf7k\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/EI6kC4Uuf7k\/", - "pubdate": "2021-08-17T23:00:00+10:00", - "state": "Completed", - "filelength": "00:05:38", - "filesize": "5.66 MB", - "filename": "60-Second Science - The Incredible, Reanimated 24,000-Year-Old Rotifer.mp3", - "mime": "audio\/mpeg", - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=135", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=135&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20The%20Incredible-%20Reanimated%2024-000-Year-Old%20Rotifer.mp3", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "136", - "title": "Astronomers Find an Unexpected Bumper Crop of Black Holes", - "name": "Astronomers Find an Unexpected Bumper Crop of Black Holes", - "description": "In trying to explain the spectacular star trails of the star cluster Palomar 5, astronomers stumbled on a very large trove of black holes.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=VUajjnt6734:J8pSbd94Yeo:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/VUajjnt6734\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Space & Physics", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/VUajjnt6734\/", - "pubdate": "2021-08-13T00:00:00+10:00", - "state": "Pending", - "filelength": "00:03:24", - "filesize": "0 B", - "filename": "60-Second Science - Astronomers Find an Unexpected Bumper Crop of Black Holes.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=136", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=136&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Astronomers%20Find%20an%20Unexpected%20Bumper%20Crop%20of%20Black%20Holes.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "137", - "title": "Inside Millions of Invisible Droplets, Potential Superbug Killers Grow", - "name": "Inside Millions of Invisible Droplets, Potential Superbug Killers Grow", - "description": "New research has created microscopic antibiotic factories in droplets that measure a trillionth of liter in volume.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=2zrOPpKMzgc:Hy9BvZ5xmFo:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/2zrOPpKMzgc\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/2zrOPpKMzgc\/", - "pubdate": "2021-08-10T22:00:00+10:00", - "state": "Pending", - "filelength": "00:06:34", - "filesize": "0 B", - "filename": "60-Second Science - Inside Millions of Invisible Droplets, Potential Superbug Killers Grow.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=137", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=137&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Inside%20Millions%20of%20Invisible%20Droplets-%20Potential%20Superbug%20Killers%20Grow.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "138", - "title": "The Secret behind Songbirds' Magnetic Migratory Sense", - "name": "The Secret behind Songbirds' Magnetic Migratory Sense", - "description": "A molecule found in the retinas of European robins seems to be able to sense weak magnetic fields, such as that of Earth, after it is exposed to light.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=ZY769WpgVxQ:OhvpLpYtKxA:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/ZY769WpgVxQ\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/ZY769WpgVxQ\/", - "pubdate": "2021-08-05T00:00:00+10:00", - "state": "Pending", - "filelength": "00:02:54", - "filesize": "0 B", - "filename": "60-Second Science - The Secret behind Songbirds' Magnetic Migratory Sense.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=138", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=138&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20The%20Secret%20behind%20Songbirds-%20Magnetic%20Migratory%20Sense.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "93", - "title": "COVID, Quickly, Episode 12: Masking Up Again and Why People Refuse Shots", - "name": "COVID, Quickly, Episode 12: Masking Up Again and Why People Refuse Shots", - "description": "Today we bring you a new episode in our podcast series COVID, Quickly. Every two weeks, Scientific American’s senior health editors Tanya Lewis and Josh Fischman catch you up on the...<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=Jyx10yeCC4w:4dxFuClQTT0:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=Jyx10yeCC4w:4dxFuClQTT0:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/Jyx10yeCC4w\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/Jyx10yeCC4w\/", - "pubdate": "2021-07-31T03:00:00+10:00", - "state": "Completed", - "filelength": "00:06:18", - "filesize": "6.28 MB", - "filename": "60-Second Science - COVID, Quickly, Episode 12: Masking Up Again and Why People Refuse Shots.mp3", - "mime": "audio\/mpeg", - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=93", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=93&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20COVID-%20Quickly-%20Episode%2012-%20Masking%20Up%20Again%20and%20Why%20People%20Refuse%20Shots.mp3", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "94", - "title": "The Kavli Prize Presents: Understanding Touch [Sponsored]", - "name": "The Kavli Prize Presents: Understanding Touch [Sponsored]", - "description": "Ardem Patapoutian shared the Kavli Prize in Neuroscience in 2020 for answering a basic question: How does touch actually work?<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=UbHjr2YNB_c:TLKeymYoepg:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UbHjr2YNB_c:TLKeymYoepg:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/UbHjr2YNB_c\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/UbHjr2YNB_c\/", - "pubdate": "2021-07-23T04:00:00+10:00", - "state": "Pending", - "filelength": "00:05:46", - "filesize": "0 B", - "filename": "60-Second Science - The Kavli Prize Presents: Understanding Touch [Sponsored].", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=94", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=94&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20The%20Kavli%20Prize%20Presents-%20Understanding%20Touch%20-Sponsored-.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "95", - "title": "Moths Have an Acoustic Invisibility Cloak to Stay under Bats' Radar", - "name": "Moths Have an Acoustic Invisibility Cloak to Stay under Bats' Radar", - "description": "New research finds they fly around on noise-cancelling wings<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=UHImHfeFNNY:YbBf23xXc9Y:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=UHImHfeFNNY:YbBf23xXc9Y:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/UHImHfeFNNY\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Evolution", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/UHImHfeFNNY\/", - "pubdate": "2021-07-21T22:00:00+10:00", - "state": "Pending", - "filelength": "00:02:45", - "filesize": "0 B", - "filename": "60-Second Science - Moths Have an Acoustic Invisibility Cloak to Stay under Bats' Radar.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=95", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=95&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Moths%20Have%20an%20Acoustic%20Invisibility%20Cloak%20to%20Stay%20under%20Bats-%20Radar.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "96", - "title": "COVID, Quickly, Episode 11: Vaccine Booster Shots, and Reopening Offices Safely", - "name": "COVID, Quickly, Episode 11: Vaccine Booster Shots, and Reopening Offices Safely", - "description": "Today we bring you a new episode in our podcast series: COVID, Quickly. Every two weeks, Scientific American’s senior health editors Tanya Lewis and Josh...<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=R97BXjeb_Ls:8mq9cZvxdGE:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R97BXjeb_Ls:8mq9cZvxdGE:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/R97BXjeb_Ls\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/R97BXjeb_Ls\/", - "pubdate": "2021-07-17T03:00:00+10:00", - "state": "Pending", - "filelength": "00:05:33", - "filesize": "0 B", - "filename": "60-Second Science - COVID, Quickly, Episode 11: Vaccine Booster Shots, and Reopening Offices Safely.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=96", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=96&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20COVID-%20Quickly-%20Episode%2011-%20Vaccine%20Booster%20Shots-%20and%20Reopening%20Offices%20Safely.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "97", - "title": "Your Brain Does Something Amazing between Bouts of Intense Learning", - "name": "Your Brain Does Something Amazing between Bouts of Intense Learning", - "description": "New research shows that lightning-quick neural rehearsal can supercharge learning and memory.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=CmfbTZjHifo:H0G3SKLnQ-o:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=CmfbTZjHifo:H0G3SKLnQ-o:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/CmfbTZjHifo\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/CmfbTZjHifo\/", - "pubdate": "2021-07-07T22:00:00+10:00", - "state": "Pending", - "filelength": "00:04:02", - "filesize": "0 B", - "filename": "60-Second Science - Your Brain Does Something Amazing between Bouts of Intense Learning.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=97", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=97&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Your%20Brain%20Does%20Something%20Amazing%20between%20Bouts%20of%20Intense%20Learning.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "98", - "title": "COVID, Quickly, Episode 10: Long Haulers, Delta Woes and Barbershop Shots", - "name": "COVID, Quickly, Episode 10: Long Haulers, Delta Woes and Barbershop Shots", - "description": "Today we bring you a new episode in our podcast series: COVID, Quickly. Every two weeks, Scientific American’s senior health editors Tanya Lewis and Josh...<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=R-H1FpQu__E:J83fBQLBgOs:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=R-H1FpQu__E:J83fBQLBgOs:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/R-H1FpQu__E\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Health", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/R-H1FpQu__E\/", - "pubdate": "2021-07-02T06:00:00+10:00", - "state": "Pending", - "filelength": "00:07:00", - "filesize": "0 B", - "filename": "60-Second Science - COVID, Quickly, Episode 10: Long Haulers, Delta Woes and Barbershop Shots.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=98", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=98&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20COVID-%20Quickly-%20Episode%2010-%20Long%20Haulers-%20Delta%20Woes%20and%20Barbershop%20Shots.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - } - ] -} \ No newline at end of file +[ + { + "id": 10, + "name": "AI: The \"C\" Team", + "description": "Acquisitions Incorporated serves up locally-sourced adventure from convenient franchise locations across Faer\u00fbn. Their adventures began in 2007 with a podcast of three friends playing D&D, and inexplicably progressed to live games on-stage before thousands of audience members at PAX.", + "language": "en-us", + "copyright": "Copyright (c) 1998-2018 Penny Arcade, Inc.", + "generator": "", + "website": "http:\/\/www.acq-inc.com\/", + "build_date": "2018\/03\/22 01:10PM", + "sync_date": "2020\/04\/15 05:12PM", + "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=10", + "podcast_episode": [ + { + "id": "6394", + "name": "s4 ep12 - The Collections Agency, Part Five", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-collections-agency-part-five\/the-collections-agency-part-five.mp3", + "pubdate": "2020\/04\/09 01:10PM", + "state": "Completed", + "filelength": "00:35:50", + "filesize": "145.79 MB", + "filename": "AI: The \"C\" Team - s4 ep12 - The Collections Agency, Part Five.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6394" + }, + { + "id": "6393", + "name": "Table Talk s4 ep12 - The Collections Agency, Part Five", + "description": "Table talk for episode 12, season 4: The Collections Agency, Part Five", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-collections-agency-part-five\/table-talk-the-collections-agency-part-five.mp3", + "pubdate": "2020\/04\/09 01:10PM", + "state": "Completed", + "filelength": "00:32:32", + "filesize": "35.74 MB", + "filename": "AI: The \"C\" Team - Table Talk s4 ep12 - The Collections Agency, Part Five.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6393" + }, + { + "id": "6396", + "name": "s4 ep11 - The Collections Agency, Part Four", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-collections-agency-part-four\/the-collections-agency-part-four.mp3", + "pubdate": "2020\/04\/02 01:13PM", + "state": "Completed", + "filelength": "00:34:16", + "filesize": "176.15 MB", + "filename": "AI: The \"C\" Team - s4 ep11 - The Collections Agency, Part Four.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6396" + }, + { + "id": "6395", + "name": "Table Talk s4 ep11 - The Collections Agency, Part Four", + "description": "Table talk for episode 11, season 4: The Collections Agency, Part Four", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-collections-agency-part-four\/table-talk-the-collections-agency-part-four.mp3", + "pubdate": "2020\/04\/02 01:13PM", + "state": "Completed", + "filelength": "00:34:08", + "filesize": "38.5 MB", + "filename": "AI: The \"C\" Team - Table Talk s4 ep11 - The Collections Agency, Part Four.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6395" + }, + { + "id": "6398", + "name": "s4 ep10 - The Collections Agency, Part Three", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-collections-agency-part-three\/the-collections-agency-part-three.mp3", + "pubdate": "2020\/03\/26 01:05PM", + "state": "Pending", + "filelength": "00:00:00", + "filesize": "0 B", + "filename": "AI: The \"C\" Team - s4 ep10 - The Collections Agency, Part Three.", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6398" + }, + { + "id": "6397", + "name": "Table Talk s4 ep10 - The Collections Agency, Part Three", + "description": "Table talk for episode 10, season 4: The Collections Agency, Part Three", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-collections-agency-part-three\/table-talk-the-collections-agency-part-three.mp3", + "pubdate": "2020\/03\/26 01:05PM", + "state": "Pending", + "filelength": "00:00:00", + "filesize": "0 B", + "filename": "AI: The \"C\" Team - Table Talk s4 ep10 - The Collections Agency, Part Three.", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6397" + }, + { + "id": "6345", + "name": "s4 ep1 - Call of Cthulhu Special, Part One", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/call-of-cthulhu-special-part-one\/call-of-cthulhu-special-part-one.mp3", + "pubdate": "2020\/01\/20 11:01AM", + "state": "Completed", + "filelength": "00:00:00", + "filesize": "0 B", + "filename": "AI: The \"C\" Team - s4 ep1 - Call of Cthulhu Special, Part One.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6345" + }, + { + "id": "6238", + "name": "Table Talk s3 ep26 - Crucible, Part Two", + "description": "Table talk for episode 26, season 3: Crucible, Part Two", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-crucible-part-two\/table-talk-crucible-part-two.mp3", + "pubdate": "2019\/08\/15 01:56PM", + "state": "Completed", + "filelength": "00:32:32", + "filesize": "26.73 MB", + "filename": "AI: The \"C\" Team - Table Talk s3 ep26 - Crucible, Part Two.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6238" + }, + { + "id": "6239", + "name": "s3 ep26 - Crucible, Part Two", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/crucible-part-two\/crucible-part-two.mp3", + "pubdate": "2019\/08\/15 01:56PM", + "state": "Completed", + "filelength": "00:35:55", + "filesize": "192.88 MB", + "filename": "AI: The \"C\" Team - s3 ep26 - Crucible, Part Two.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6239" + }, + { + "id": "6186", + "name": "Table Talk s3 ep16 - The Velvet Cloak, Part Three", + "description": "Table talk for episode 16, season 3: The Velvet Cloak, Part Three", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-velvet-cloak-part-three\/table-talk-the-velvet-cloak-part-three.mp3", + "pubdate": "2019\/05\/30 01:55PM", + "state": "Completed", + "filelength": "00:13:58", + "filesize": "26.53 MB", + "filename": "AI: The \"C\" Team - Table Talk s3 ep16 - The Velvet Cloak, Part Three.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6186" + }, + { + "id": "6187", + "name": "s3 ep16 - The Velvet Cloak, Part Three", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-velvet-cloak-part-thre\/the-velvet-cloak-part-thre.mp3", + "pubdate": "2019\/05\/30 01:55PM", + "state": "Completed", + "filelength": "00:31:55", + "filesize": "193.48 MB", + "filename": "AI: The \"C\" Team - s3 ep16 - The Velvet Cloak, Part Three.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6187" + }, + { + "id": "6152", + "name": "Table Talk s3 ep14 - The Velvet Cloak, Part One", + "description": "Table talk for episode 14, season 3: The Velvet Cloak, Part One", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-velvet-cloak-part-one\/table-talk-the-velvet-cloak-part-one.mp3", + "pubdate": "2019\/05\/16 01:07PM", + "state": "Completed", + "filelength": "00:32:16", + "filesize": "34.98 MB", + "filename": "AI: The \"C\" Team - Table Talk s3 ep14 - The Velvet Cloak, Part One.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6152" + }, + { + "id": "6153", + "name": "s3 ep14 - The Velvet Cloak, Part One", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-velvet-cloak-part-one\/the-velvet-cloak-part-one.mp3", + "pubdate": "2019\/05\/16 01:07PM", + "state": "Completed", + "filelength": "00:32:17", + "filesize": "187.22 MB", + "filename": "AI: The \"C\" Team - s3 ep14 - The Velvet Cloak, Part One.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6153" + }, + { + "id": "6155", + "name": "s3 ep13 - Arcana, Part Thirteen", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/arcana-part-thirteen\/arcana-part-thirteen.mp3", + "pubdate": "2019\/04\/25 01:09PM", + "state": "Completed", + "filelength": "00:32:37", + "filesize": "193.71 MB", + "filename": "AI: The \"C\" Team - s3 ep13 - Arcana, Part Thirteen.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6155" + }, + { + "id": "6154", + "name": "Table Talk s3 ep13 - Arcana, Part Thirteen", + "description": "Table talk for episode 13, season 3: Arcana, Part Thirteen", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-arcana-part-thirteen\/table-talk-arcana-part-thirteen.mp3", + "pubdate": "2019\/04\/25 01:09PM", + "state": "Completed", + "filelength": "00:32:37", + "filesize": "26.88 MB", + "filename": "AI: The \"C\" Team - Table Talk s3 ep13 - Arcana, Part Thirteen.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6154" + }, + { + "id": "6142", + "name": "Table Talk s3 ep11 - Arcana, Part Eleven", + "description": "Table talk for episode 11, season 3: Arcana, Part Eleven", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-arcana-part-eleven\/table-talk-arcana-part-eleven.mp3", + "pubdate": "2019\/04\/11 03:38PM", + "state": "Completed", + "filelength": "00:33:54", + "filesize": "29.96 MB", + "filename": "AI: The \"C\" Team - Table Talk s3 ep11 - Arcana, Part Eleven.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6142" + }, + { + "id": "6143", + "name": "s3 ep11 - Arcana, Part Eleven", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/arcana-part-eleven\/arcana-part-eleven.mp3", + "pubdate": "2019\/04\/11 03:38PM", + "state": "Completed", + "filelength": "00:33:53", + "filesize": "192.71 MB", + "filename": "AI: The \"C\" Team - s3 ep11 - Arcana, Part Eleven.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6143" + }, + { + "id": "5326", + "name": "Table Talk s3 ep3 - Arcana, Part Three", + "description": "Table talk for episode 3, season 3: Arcana, Part Three", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-arcana-part-three\/table-talk-arcana-part-three.mp3", + "pubdate": "2019\/02\/08 02:27PM", + "state": "Completed", + "filelength": "00:32:10", + "filesize": "20.77 MB", + "filename": "AI: The \"C\" Team - Table Talk s3 ep3 - Arcana, Part Three.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5326" + }, + { + "id": "5327", + "name": "s3 ep3 - Arcana, Part Three", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/arcana-part-three\/arcana-part-three.mp3", + "pubdate": "2019\/02\/08 02:27PM", + "state": "Completed", + "filelength": "00:32:11", + "filesize": "129.35 MB", + "filename": "AI: The \"C\" Team - s3 ep3 - Arcana, Part Three.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5327" + }, + { + "id": "5293", + "name": "s2 ep39 - Table Talk: Holiday Special, S2 Recap", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-holiday-special-s2-recap\/table-talk-holiday-special-s2-recap.mp3", + "pubdate": "2018\/12\/14 08:13AM", + "state": "Completed", + "filelength": "00:16:50", + "filesize": "76.47 MB", + "filename": "AI: The \"C\" Team - s2 ep39 - Table Talk: Holiday Special, S2 Recap.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5293" + }, + { + "id": "5290", + "name": "s2 ep38 - Waffles Inc: A K’thrissmas Story, Part Two", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/waffles-inc-a-kthrissmas-story-part-two\/waffles-inc-a-kthrissmas-story-part-two.mp3", + "pubdate": "2018\/12\/11 06:00AM", + "state": "Completed", + "filelength": "00:16:49", + "filesize": "39.27 MB", + "filename": "AI: The \"C\" Team - s2 ep38 - Waffles Inc: A K’thrissmas Story, Part Two.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5290" + }, + { + "id": "5286", + "name": "s2 ep37 - Waffles Inc: A K’thrissmas Story, Part One", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/waffles-inc-a-kthrissmas-story-part-one\/waffles-inc-a-kthrissmas-story-part-one.mp3", + "pubdate": "2018\/12\/06 10:00AM", + "state": "Completed", + "filelength": "00:14:10", + "filesize": "36.68 MB", + "filename": "AI: The \"C\" Team - s2 ep37 - Waffles Inc: A K’thrissmas Story, Part One.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5286" + }, + { + "id": "5189", + "name": "s2 ep26 - Waffles Inc, Finale", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/waffles-inc-finale\/waffles-inc-finale.mp3", + "pubdate": "2018\/07\/21 08:02AM", + "state": "Completed", + "filelength": "00:15:21", + "filesize": "230.57 MB", + "filename": "AI: The \"C\" Team - s2 ep26 - Waffles Inc, Finale.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5189" + }, + { + "id": "5190", + "name": "s2 ep26 - Table Talk: Waffles Inc", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-waffles-inc\/table-talk-waffles-inc.mp3", + "pubdate": "2018\/07\/21 08:01AM", + "state": "Completed", + "filelength": "00:32:03", + "filesize": "76.17 MB", + "filename": "AI: The \"C\" Team - s2 ep26 - Table Talk: Waffles Inc.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5190" + }, + { + "id": "5191", + "name": "s2 ep26 - Waffles Inc, Part Four", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/waffles-inc-part-four\/waffles-inc-part-four.mp3", + "pubdate": "2018\/07\/21 08:00AM", + "state": "Completed", + "filelength": "00:31:58", + "filesize": "101.21 MB", + "filename": "AI: The \"C\" Team - s2 ep26 - Waffles Inc, Part Four.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5191" + }, + { + "id": "5192", + "name": "s2 ep26 - Waffles Inc, Part Three", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/waffles-inc-part-three\/waffles-inc-part-three.mp3", + "pubdate": "2018\/07\/21 07:59AM", + "state": "Completed", + "filelength": "00:31:51", + "filesize": "116.21 MB", + "filename": "AI: The \"C\" Team - s2 ep26 - Waffles Inc, Part Three.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5192" + }, + { + "id": "5193", + "name": "s2 ep26 - Waffles Inc, Part Two", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/waffles-inc-part-two\/waffles-inc-part-two.mp3", + "pubdate": "2018\/07\/21 07:58AM", + "state": "Completed", + "filelength": "00:32:16", + "filesize": "105.16 MB", + "filename": "AI: The \"C\" Team - s2 ep26 - Waffles Inc, Part Two.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5193" + }, + { + "id": "5194", + "name": "s2 ep26 - Waffles Inc, Part One", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/waffles-inc-part-one\/waffles-inc-part-one.mp3", + "pubdate": "2018\/07\/21 07:57AM", + "state": "Completed", + "filelength": "00:31:57", + "filesize": "110.33 MB", + "filename": "AI: The \"C\" Team - s2 ep26 - Waffles Inc, Part One.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5194" + }, + { + "id": "5161", + "name": "Table Talk s2 ep18 - Promise, Part Seven", + "description": "Table talk for episode 18, season 2: Promise, Part Seven", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-promise-part-seven\/table-talk-promise-part-seven.mp3", + "pubdate": "2018\/06\/07 12:55PM", + "state": "Completed", + "filelength": "00:36:41", + "filesize": "28.19 MB", + "filename": "AI: The \"C\" Team - Table Talk s2 ep18 - Promise, Part Seven.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5161" + }, + { + "id": "5162", + "name": "s2 ep18 - Promise, Part Seven", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/promise-part-seven\/promise-part-seven.mp3", + "pubdate": "2018\/06\/07 12:55PM", + "state": "Completed", + "filelength": "00:36:41", + "filesize": "195.53 MB", + "filename": "AI: The \"C\" Team - s2 ep18 - Promise, Part Seven.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5162" + }, + { + "id": "5090", + "name": "s2 ep12 - Table Talk: Plans Within Plans", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans\/table-talk-plans-within-plans.mp3", + "pubdate": "2018\/04\/12 09:00AM", + "state": "Completed", + "filelength": "00:17:20", + "filesize": "61.36 MB", + "filename": "AI: The \"C\" Team - s2 ep12 - Table Talk: Plans Within Plans.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5090" + }, + { + "id": "5084", + "name": "Table Talk s2 ep11 - Plans Within Plans, Part Ten", + "description": "Table talk for episode 11, season 2: Plans Within Plans, Part Ten", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-ten\/table-talk-plans-within-plans-part-ten.mp3", + "pubdate": "2018\/03\/29 04:53PM", + "state": "Completed", + "filelength": "00:35:08", + "filesize": "14.22 MB", + "filename": "AI: The \"C\" Team - Table Talk s2 ep11 - Plans Within Plans, Part Ten.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5084" + }, + { + "id": "5083", + "name": "s2 ep11 - Plans Within Plans, Part Ten", + "description": "Their allies returned to them at last, The \"C\" Team press onwards to the shocking conclusion of their current adventure ", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-ten\/plans-within-plans-part-ten.mp3", + "pubdate": "2018\/03\/29 04:53PM", + "state": "Completed", + "filelength": "00:35:16", + "filesize": "232.14 MB", + "filename": "AI: The \"C\" Team - s2 ep11 - Plans Within Plans, Part Ten.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=5083" + }, + { + "id": "2294", + "name": "Table Talk: Plans Within Plans, Part Nine", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-nine\/table-talk-plans-within-plans-part-nine.mp3", + "pubdate": "2018\/03\/22 01:10PM", + "state": "Completed", + "filelength": "00:32:15", + "filesize": "32.16 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part Nine.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=2294" + }, + { + "id": "2295", + "name": "Plans Within Plans, Part Nine", + "description": "After suffering a devastating loss, Rosie and Walnut must struggle through strange territory and battle a terrifying foe.", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-nine\/plans-within-plans-part-nine.mp3", + "pubdate": "2018\/03\/22 01:05PM", + "state": "Completed", + "filelength": "00:32:16", + "filesize": "191.06 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part Nine.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=2295" + }, + { + "id": "2296", + "name": "Table Talk: Plans Within Plans, Part Eight", + "description": "The \"C\" Team ruminate on the events of this week's episode", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-eight\/table-talk-plans-within-plans-part-eight.mp3", + "pubdate": "2018\/03\/15 01:19PM", + "state": "Completed", + "filelength": "00:33:39", + "filesize": "18.04 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part Eight.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=2296" + }, + { + "id": "2297", + "name": "Plans Within Plans, Part Eight", + "description": "In the fallen house of Rah'uuthli, The \"C\" Team take devastating losses.", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-eight\/plans-within-plans-part-eight.mp3", + "pubdate": "2018\/03\/15 01:12PM", + "state": "Completed", + "filelength": "00:33:39", + "filesize": "197.86 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part Eight.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=2297" + }, + { + "id": "2298", + "name": "Table Talk: Plans Within Plans, Part Seven S2 Ep8", + "description": "The \"C\" Team ruminate on the events of this week's episode", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-seven-s2-ep8\/table-talk-plans-within-plans-part-seven-s2-ep8.mp3", + "pubdate": "2018\/03\/08 05:22PM", + "state": "Completed", + "filelength": "00:32:35", + "filesize": "29.49 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part Seven S2 Ep8.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=2298" + }, + { + "id": "2299", + "name": "Plans Within Plans, Part Seven S2 Ep8", + "description": "Shocking events give our heroes a new perspective on Taes-T. K'thriss finally faces the consequences of his escape from the Underdark", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-seven-s2-ep8\/plans-within-plans-part-seven-s2-ep8.mp3", + "pubdate": "2018\/03\/08 05:19PM", + "state": "Completed", + "filelength": "00:33:22", + "filesize": "196.17 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part Seven S2 Ep8.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=2299" + }, + { + "id": "2300", + "name": "Table Talk: Plans Within Plans, Part Six S2 Ep7", + "description": "The \"C\" Team ruminate on the events of this week's episode", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-six-s2-ep7\/table-talk-plans-within-plans-part-six-s2-ep7.mp3", + "pubdate": "2018\/03\/01 02:29PM", + "state": "Completed", + "filelength": "00:35:09", + "filesize": "31.17 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part Six S2 Ep7.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=2300" + }, + { + "id": "2301", + "name": "Plans Within Plans, Part Six S2 Ep7", + "description": "On the outskirts of Guallidurth, our heroes are joined by Strix (Holly Conrad), a Tiefling sorceror who comprehensively fails to make friends with the local drow...", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-six-s2-ep7\/plans-within-plans-part-six-s2-ep7.mp3", + "pubdate": "2018\/03\/01 02:22PM", + "state": "Completed", + "filelength": "00:35:10", + "filesize": "196.61 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part Six S2 Ep7.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=2301" + }, + { + "id": "1024", + "name": "Table Talk: Plans Within Plans, Part Five S2 Ep6", + "description": "Table Talk: Plans Within Plans, Part Five S2 Ep6", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-five-s2-ep6\/table-talk-plans-within-plans-part-five-s2-ep6.mp3", + "pubdate": "2018\/02\/22 02:18PM", + "state": "Completed", + "filelength": "00:32:32", + "filesize": "31.51 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part Five S2 Ep6.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1024" + }, + { + "id": "1025", + "name": "Plans Within Plans, Part Five S2 Ep6", + "description": "Plans Within Plans, Part Five S2 Ep6", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-five-s2-ep6\/plans-within-plans-part-five-s2-ep6.mp3", + "pubdate": "2018\/02\/22 02:12PM", + "state": "Completed", + "filelength": "00:32:32", + "filesize": "192.66 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part Five S2 Ep6.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1025" + }, + { + "id": "1026", + "name": "Table Talk: Plans Within Plans, Part Four S2 Ep5", + "description": "Table Talk: Plans Within Plans, Part Four S2 Ep5", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-four-s2-ep5\/table-talk-plans-within-plans-part-four-s2-ep5.mp3", + "pubdate": "2018\/02\/15 05:02PM", + "state": "Completed", + "filelength": "00:32:13", + "filesize": "28.65 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part Four S2 Ep5.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1026" + }, + { + "id": "1027", + "name": "Plans Within Plans, Part Four S2 Ep5", + "description": "Plans Within Plans, Part Four S2 Ep5", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-four-s2-ep5\/plans-within-plans-part-four-s2-ep5.mp3", + "pubdate": "2018\/02\/15 04:55PM", + "state": "Completed", + "filelength": "00:32:17", + "filesize": "194.6 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part Four S2 Ep5.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1027" + }, + { + "id": "1028", + "name": "Table Talk: Plans Within Plans, Part Three S2 Ep4", + "description": "Table Talk: Plans Within Plans, Part Three S2 Ep4", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-three-s2-ep4\/table-talk-plans-within-plans-part-three-s2-ep4.mp3", + "pubdate": "2018\/02\/08 05:41PM", + "state": "Completed", + "filelength": "00:32:19", + "filesize": "31.94 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part Three S2 Ep4.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1028" + }, + { + "id": "1029", + "name": "Plans Within Plans, Part Three S2 Ep4", + "description": "Plans Within Plans, Part Three S2 Ep4", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-three-s2-ep4\/plans-within-plans-part-three-s2-ep4.mp3", + "pubdate": "2018\/02\/08 05:33PM", + "state": "Completed", + "filelength": "00:32:23", + "filesize": "195.94 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part Three S2 Ep4.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1029" + }, + { + "id": "1030", + "name": "Table Talk: Plans Within Plans, Part Two S2 Ep3", + "description": "Table Talk: Plans Within Plans, Part Two S2 Ep3", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-two-s2-ep3\/table-talk-plans-within-plans-part-two-s2-ep3.mp3", + "pubdate": "2018\/02\/01 02:00PM", + "state": "Completed", + "filelength": "00:33:47", + "filesize": "32.6 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part Two S2 Ep3.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1030" + }, + { + "id": "1031", + "name": "Plans Within Plans, Part Two S2 Ep3", + "description": "Plans Within Plans, Part Two S2 Ep3", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-two-s2-ep3\/plans-within-plans-part-two-s2-ep3.mp3", + "pubdate": "2018\/02\/01 01:30PM", + "state": "Completed", + "filelength": "00:33:44", + "filesize": "185.34 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part Two S2 Ep3.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1031" + }, + { + "id": "1032", + "name": "Table Talk: Plans Within Plans, Part One S2 Ep2", + "description": "Table Talk: Plans Within Plans, Part One S2 Ep2", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-plans-within-plans-part-one-s2-ep2\/table-talk-plans-within-plans-part-one-s2-ep2.mp3", + "pubdate": "2018\/01\/25 05:05PM", + "state": "Completed", + "filelength": "00:28:23", + "filesize": "31.42 MB", + "filename": "AI: The \"C\" Team - Table Talk: Plans Within Plans, Part One S2 Ep2.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1032" + }, + { + "id": "1033", + "name": "Plans Within Plans, Part One S2 Ep2", + "description": "Plans Within Plans, Part One S2 Ep2", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/plans-within-plans-part-one-s2-ep2\/plans-within-plans-part-one-s2-ep2.mp3", + "pubdate": "2018\/01\/25 05:03PM", + "state": "Completed", + "filelength": "00:28:22", + "filesize": "192.6 MB", + "filename": "AI: The \"C\" Team - Plans Within Plans, Part One S2 Ep2.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1033" + }, + { + "id": "1034", + "name": "The Handfasting of Walnut & Brahma, S2 Premiere", + "description": "The Handfasting of Walnut & Brahma, S2 Premiere", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-handfasting-of-walnut-brahma-s2-premiere\/the-handfasting-of-walnut-brahma-s2-premiere.mp3", + "pubdate": "2018\/01\/15 11:05AM", + "state": "Completed", + "filelength": "00:35:44", + "filesize": "219.76 MB", + "filename": "AI: The \"C\" Team - The Handfasting of Walnut & Brahma, S2 Premiere.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1034" + }, + { + "id": "1035", + "name": "Table Talk: Holiday Special, S1 Recap", + "description": "Table Talk: Holiday Special, S1 Recap", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-holiday-special-s1-recap\/table-talk-holiday-special-s1-recap.mp3", + "pubdate": "2017\/12\/08 01:56PM", + "state": "Completed", + "filelength": "00:30:10", + "filesize": "110.3 MB", + "filename": "AI: The \"C\" Team - Table Talk: Holiday Special, S1 Recap.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1035" + }, + { + "id": "1036", + "name": "Night of a Thousand Hours, PAX Unplugged Christmas Special", + "description": "Night of a Thousand Hours, PAX Unplugged Christmas Special", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/night-of-a-thousand-hours-pax-unplugged-christmas-special\/night-of-a-thousand-hours-pax-unplugged-christmas-special.mp3", + "pubdate": "2017\/11\/20 07:15AM", + "state": "Completed", + "filelength": "00:12:25", + "filesize": "191.25 MB", + "filename": "AI: The \"C\" Team - Night of a Thousand Hours, PAX Unplugged Christmas Special.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1036" + }, + { + "id": "1037", + "name": "Table Talk: Dran Incorporated, Part Three S1 Ep33", + "description": "Table Talk: Dran Incorporated, Part Three S1 Ep33", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-dran-incorporated-part-three-s1-ep33\/table-talk-dran-incorporated-part-three-s1-ep33.mp3", + "pubdate": "2017\/11\/10 03:10PM", + "state": "Completed", + "filelength": "00:35:38", + "filesize": "29.98 MB", + "filename": "AI: The \"C\" Team - Table Talk: Dran Incorporated, Part Three S1 Ep33.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1037" + }, + { + "id": "1038", + "name": "Dran Incorporated, Part Three S1 Ep33", + "description": "Dran Incorporated, Part Three S1 Ep33", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/dran-incorporated-part-three-s1-ep33\/dran-incorporated-part-three-s1-ep33.mp3", + "pubdate": "2017\/11\/10 02:30PM", + "state": "Completed", + "filelength": "00:35:42", + "filesize": "200.66 MB", + "filename": "AI: The \"C\" Team - Dran Incorporated, Part Three S1 Ep33.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1038" + }, + { + "id": "1039", + "name": "Table Talk: Dran Incorporated, Part Two S1 Ep32", + "description": "Table Talk: Dran Incorporated, Part Two S1 Ep32", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-dran-incorporated-part-two-s1-ep32\/table-talk-dran-incorporated-part-two-s1-ep32.mp3", + "pubdate": "2017\/11\/03 03:29PM", + "state": "Completed", + "filelength": "00:32:17", + "filesize": "29.77 MB", + "filename": "AI: The \"C\" Team - Table Talk: Dran Incorporated, Part Two S1 Ep32.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1039" + }, + { + "id": "1040", + "name": "Dran Incorporated, Part Two S1 Ep32", + "description": "Dran Incorporated, Part Two S1 Ep32", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/dran-incorporated-part-two-s1-ep32\/dran-incorporated-part-two-s1-ep32.mp3", + "pubdate": "2017\/11\/03 03:26PM", + "state": "Completed", + "filelength": "00:32:18", + "filesize": "191.7 MB", + "filename": "AI: The \"C\" Team - Dran Incorporated, Part Two S1 Ep32.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1040" + }, + { + "id": "1041", + "name": "TwitchCon Halloween Special", + "description": "TwitchCon Halloween Special", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/twitchcon-halloween-special\/twitchcon-halloween-special.mp3", + "pubdate": "2017\/10\/22 12:45PM", + "state": "Completed", + "filelength": "00:18:47", + "filesize": "123.3 MB", + "filename": "AI: The \"C\" Team - TwitchCon Halloween Special.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1041" + }, + { + "id": "1042", + "name": "Table Talk: Dran Incorporated, Part One S1 Ep31", + "description": "Table Talk: Dran Incorporated, Part One S1 Ep31", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-dran-incorporated-part-one-s1-ep31\/table-talk-dran-incorporated-part-one-s1-ep31.mp3", + "pubdate": "2017\/10\/20 03:20PM", + "state": "Completed", + "filelength": "00:32:09", + "filesize": "72.84 MB", + "filename": "AI: The \"C\" Team - Table Talk: Dran Incorporated, Part One S1 Ep31.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1042" + }, + { + "id": "1043", + "name": "Dran Incorporated, Part One S1 Ep31", + "description": "Dran Incorporated, Part One S1 Ep31", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/dran-incorporated-part-one-s1-ep31\/dran-incorporated-part-one-s1-ep31.mp3", + "pubdate": "2017\/10\/20 03:16PM", + "state": "Completed", + "filelength": "00:32:12", + "filesize": "141.85 MB", + "filename": "AI: The \"C\" Team - Dran Incorporated, Part One S1 Ep31.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1043" + }, + { + "id": "1044", + "name": "Table Talk: Paterfamilias, Part Four S1 Ep30", + "description": "Table Talk: Paterfamilias, Part Four S1 Ep30", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-paterfamilias-part-four-s1-ep30\/table-talk-paterfamilias-part-four-s1-ep30.mp3", + "pubdate": "2017\/10\/13 04:07PM", + "state": "Completed", + "filelength": "00:34:15", + "filesize": "27.35 MB", + "filename": "AI: The \"C\" Team - Table Talk: Paterfamilias, Part Four S1 Ep30.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1044" + }, + { + "id": "1045", + "name": "Paterfamilias, Part Four S1 Ep30", + "description": "Paterfamilias, Part Four S1 Ep30", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/paterfamilias-part-four-s1-ep30\/paterfamilias-part-four-s1-ep30.mp3", + "pubdate": "2017\/10\/13 04:03PM", + "state": "Completed", + "filelength": "00:34:16", + "filesize": "197.69 MB", + "filename": "AI: The \"C\" Team - Paterfamilias, Part Four S1 Ep30.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1045" + }, + { + "id": "1046", + "name": "Table Talk: Paterfamilias, Part Three S1 Ep29", + "description": "Table Talk: Paterfamilias, Part Three S1 Ep29", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-paterfamilias-part-three-s1-ep29\/table-talk-paterfamilias-part-three-s1-ep29.mp3", + "pubdate": "2017\/10\/06 03:11PM", + "state": "Completed", + "filelength": "00:32:28", + "filesize": "25.53 MB", + "filename": "AI: The \"C\" Team - Table Talk: Paterfamilias, Part Three S1 Ep29.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1046" + }, + { + "id": "1047", + "name": "Paterfamilias, Part Three S1 Ep29", + "description": "Paterfamilias, Part Three S1 Ep29", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/paterfamilias-part-three-s1-ep29\/paterfamilias-part-three-s1-ep29.mp3", + "pubdate": "2017\/10\/06 03:09PM", + "state": "Completed", + "filelength": "00:32:36", + "filesize": "200 MB", + "filename": "AI: The \"C\" Team - Paterfamilias, Part Three S1 Ep29.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1047" + }, + { + "id": "1048", + "name": "Table Talk: Paterfamilias, Part Two S1 Ep28", + "description": "Table Talk: Paterfamilias, Part Two S1 Ep28", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-paterfamilias-part-two-s1-ep28\/table-talk-paterfamilias-part-two-s1-ep28.mp3", + "pubdate": "2017\/09\/29 03:23PM", + "state": "Completed", + "filelength": "00:35:41", + "filesize": "24.78 MB", + "filename": "AI: The \"C\" Team - Table Talk: Paterfamilias, Part Two S1 Ep28.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1048" + }, + { + "id": "1049", + "name": "Paterfamilias, Part Two S1 Ep28", + "description": "Paterfamilias, Part Two S1 Ep28", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/paterfamilias-part-two-s1-ep28\/paterfamilias-part-two-s1-ep28.mp3", + "pubdate": "2017\/09\/29 03:21PM", + "state": "Completed", + "filelength": "00:35:41", + "filesize": "198.75 MB", + "filename": "AI: The \"C\" Team - Paterfamilias, Part Two S1 Ep28.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1049" + }, + { + "id": "1050", + "name": "Table Talk: Paterfamilias, Part One S1 Ep27", + "description": "Table Talk: Paterfamilias, Part One S1 Ep27", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-paterfamilias-part-one-s1-ep27\/table-talk-paterfamilias-part-one-s1-ep27.mp3", + "pubdate": "2017\/09\/22 03:59PM", + "state": "Completed", + "filelength": "00:33:23", + "filesize": "28.56 MB", + "filename": "AI: The \"C\" Team - Table Talk: Paterfamilias, Part One S1 Ep27.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1050" + }, + { + "id": "1051", + "name": "Paterfamilias, Part One S1 Ep27", + "description": "Paterfamilias, Part One S1 Ep27", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/paterfamilias-part-one-s1-ep27\/paterfamilias-part-one-s1-ep27.mp3", + "pubdate": "2017\/09\/22 03:31PM", + "state": "Completed", + "filelength": "00:33:24", + "filesize": "194.85 MB", + "filename": "AI: The \"C\" Team - Paterfamilias, Part One S1 Ep27.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1051" + }, + { + "id": "1052", + "name": "Table Talk: Anchors Aweigh, Part Four S1 Ep26", + "description": "Table Talk: Anchors Aweigh, Part Four S1 Ep26", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-anchors-aweigh-part-four-s1-ep26\/table-talk-anchors-aweigh-part-four-s1-ep26.mp3", + "pubdate": "2017\/09\/15 03:10PM", + "state": "Completed", + "filelength": "00:31:53", + "filesize": "27.89 MB", + "filename": "AI: The \"C\" Team - Table Talk: Anchors Aweigh, Part Four S1 Ep26.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1052" + }, + { + "id": "1053", + "name": "Anchors Aweigh, Part Four S1 Ep26", + "description": "Anchors Aweigh, Part Four S1 Ep26", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/anchors-aweigh-part-four-s1-ep26\/anchors-aweigh-part-four-s1-ep26.mp3", + "pubdate": "2017\/09\/15 03:08PM", + "state": "Completed", + "filelength": "00:31:57", + "filesize": "196.99 MB", + "filename": "AI: The \"C\" Team - Anchors Aweigh, Part Four S1 Ep26.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1053" + }, + { + "id": "1054", + "name": "Table Talk: Anchors Aweigh, Part Three S1 Ep25", + "description": "Table Talk: Anchors Aweigh, Part Three S1 Ep25", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-anchors-aweigh-part-three-s1-ep25\/table-talk-anchors-aweigh-part-three-s1-ep25.mp3", + "pubdate": "2017\/09\/08 03:03PM", + "state": "Completed", + "filelength": "00:31:47", + "filesize": "29.62 MB", + "filename": "AI: The \"C\" Team - Table Talk: Anchors Aweigh, Part Three S1 Ep25.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1054" + }, + { + "id": "1055", + "name": "Anchors Aweigh, Part Three S1 Ep25", + "description": "Anchors Aweigh, Part Three S1 Ep25", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/anchors-aweigh-part-three-s1-ep25\/anchors-aweigh-part-three-s1-ep25.mp3", + "pubdate": "2017\/09\/08 03:00PM", + "state": "Completed", + "filelength": "00:31:48", + "filesize": "197.87 MB", + "filename": "AI: The \"C\" Team - Anchors Aweigh, Part Three S1 Ep25.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1055" + }, + { + "id": "1056", + "name": "Table Talk: Anchors Aweigh, Part Two S1 Ep24", + "description": "Table Talk: Anchors Aweigh, Part Two S1 Ep24", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-anchors-aweigh-part-two-s1-ep24\/table-talk-anchors-aweigh-part-two-s1-ep24.mp3", + "pubdate": "2017\/08\/25 03:42PM", + "state": "Completed", + "filelength": "00:34:19", + "filesize": "30.87 MB", + "filename": "AI: The \"C\" Team - Table Talk: Anchors Aweigh, Part Two S1 Ep24.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1056" + }, + { + "id": "1057", + "name": "Anchors Aweigh, Part Two S1 Ep24", + "description": "Anchors Aweigh, Part Two S1 Ep24", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/anchors-aweigh-part-two-s1-ep24\/anchors-aweigh-part-two-s1-ep24.mp3", + "pubdate": "2017\/08\/25 03:36PM", + "state": "Completed", + "filelength": "00:34:18", + "filesize": "192.73 MB", + "filename": "AI: The \"C\" Team - Anchors Aweigh, Part Two S1 Ep24.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1057" + }, + { + "id": "1058", + "name": "Table Talk: Anchors Aweigh, Part One S1 Ep23", + "description": "Table Talk: Anchors Aweigh, Part One S1 Ep23", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-anchors-aweigh-part-one-s1-ep23\/table-talk-anchors-aweigh-part-one-s1-ep23.mp3", + "pubdate": "2017\/08\/18 12:33PM", + "state": "Completed", + "filelength": "00:30:59", + "filesize": "29.54 MB", + "filename": "AI: The \"C\" Team - Table Talk: Anchors Aweigh, Part One S1 Ep23.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1058" + }, + { + "id": "1059", + "name": "Anchors Aweigh, Part One S1 Ep23", + "description": "Anchors Aweigh, Part One S1 Ep23", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/anchors-aweigh-part-one-s1-ep23\/anchors-aweigh-part-one-s1-ep23.mp3", + "pubdate": "2017\/08\/18 12:28PM", + "state": "Completed", + "filelength": "00:30:56", + "filesize": "197.17 MB", + "filename": "AI: The \"C\" Team - Anchors Aweigh, Part One S1 Ep23.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1059" + }, + { + "id": "1060", + "name": "Table Talk: Last Stone’s Day, Part Three S1 Ep22", + "description": "Table Talk: Last Stone’s Day, Part Three S1 Ep22", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-last-stones-day-part-three-s1-ep22\/table-talk-last-stones-day-part-three-s1-ep22.mp3", + "pubdate": "2017\/08\/11 03:12PM", + "state": "Completed", + "filelength": "00:31:54", + "filesize": "33.51 MB", + "filename": "AI: The \"C\" Team - Table Talk: Last Stone’s Day, Part Three S1 Ep22.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1060" + }, + { + "id": "1061", + "name": "Last Stone’s Day, Part Three S1 Ep22", + "description": "Last Stone’s Day, Part Three S1 Ep22", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/last-stones-day-part-three-s1-ep22\/last-stones-day-part-three-s1-ep22.mp3", + "pubdate": "2017\/08\/11 03:02PM", + "state": "Completed", + "filelength": "00:31:48", + "filesize": "195.27 MB", + "filename": "AI: The \"C\" Team - Last Stone’s Day, Part Three S1 Ep22.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1061" + }, + { + "id": "1062", + "name": "Table Talk: Last Stone’s Day, Part Two S1 Ep21", + "description": "Table Talk: Last Stone’s Day, Part Two S1 Ep21", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-last-stones-day-part-two-s1-ep21\/table-talk-last-stones-day-part-two-s1-ep21.mp3", + "pubdate": "2017\/08\/04 03:57PM", + "state": "Completed", + "filelength": "00:35:57", + "filesize": "27.92 MB", + "filename": "AI: The \"C\" Team - Table Talk: Last Stone’s Day, Part Two S1 Ep21.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1062" + }, + { + "id": "1063", + "name": "Last Stone’s Day, Part Two S1 Ep21", + "description": "Last Stone’s Day, Part Two S1 Ep21", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/last-stones-day-part-two-s1-ep21\/last-stones-day-part-two-s1-ep21.mp3", + "pubdate": "2017\/08\/04 03:53PM", + "state": "Completed", + "filelength": "00:35:55", + "filesize": "202.45 MB", + "filename": "AI: The \"C\" Team - Last Stone’s Day, Part Two S1 Ep21.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1063" + }, + { + "id": "1064", + "name": "Table Talk: Last Stone’s Day, Part One S1 Ep20", + "description": "Table Talk: Last Stone’s Day, Part One S1 Ep20", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-last-stones-day-part-one-s1-ep20\/table-talk-last-stones-day-part-one-s1-ep20.mp3", + "pubdate": "2017\/07\/28 01:41PM", + "state": "Completed", + "filelength": "00:32:22", + "filesize": "29.87 MB", + "filename": "AI: The \"C\" Team - Table Talk: Last Stone’s Day, Part One S1 Ep20.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1064" + }, + { + "id": "1065", + "name": "Last Stone’s Day, Part One S1 Ep20", + "description": "Last Stone’s Day, Part One S1 Ep20", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/last-stones-day-part-one-s1-ep20\/last-stones-day-part-one-s1-ep20.mp3", + "pubdate": "2017\/07\/28 01:40PM", + "state": "Completed", + "filelength": "00:32:20", + "filesize": "195.8 MB", + "filename": "AI: The \"C\" Team - Last Stone’s Day, Part One S1 Ep20.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1065" + }, + { + "id": "1066", + "name": "Table Talk: The House Wins, Part Four S1 Ep19", + "description": "Table Talk: The House Wins, Part Four S1 Ep19", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-house-wins-part-four-s1-ep19\/table-talk-the-house-wins-part-four-s1-ep19.mp3", + "pubdate": "2017\/07\/21 01:41PM", + "state": "Completed", + "filelength": "00:31:56", + "filesize": "22.6 MB", + "filename": "AI: The \"C\" Team - Table Talk: The House Wins, Part Four S1 Ep19.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1066" + }, + { + "id": "1067", + "name": "The House Wins, Part Four S1 Ep19", + "description": "The House Wins, Part Four S1 Ep19", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-house-wins-part-four-s1-ep19\/the-house-wins-part-four-s1-ep19.mp3", + "pubdate": "2017\/07\/21 01:38PM", + "state": "Completed", + "filelength": "00:31:56", + "filesize": "155.81 MB", + "filename": "AI: The \"C\" Team - The House Wins, Part Four S1 Ep19.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1067" + }, + { + "id": "1068", + "name": "Table Talk: Jimterlude S1 Ep18", + "description": "Table Talk: Jimterlude S1 Ep18", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-jimterlude-s1-ep18\/table-talk-jimterlude-s1-ep18.mp3", + "pubdate": "2017\/07\/14 02:43PM", + "state": "Completed", + "filelength": "00:31:44", + "filesize": "50.06 MB", + "filename": "AI: The \"C\" Team - Table Talk: Jimterlude S1 Ep18.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1068" + }, + { + "id": "1069", + "name": "Jimterlude S1 Ep18", + "description": "Jimterlude S1 Ep18", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/jimterlude-s1-ep18\/jimterlude-s1-ep18.mp3", + "pubdate": "2017\/07\/14 02:40PM", + "state": "Completed", + "filelength": "00:31:43", + "filesize": "180.2 MB", + "filename": "AI: The \"C\" Team - Jimterlude S1 Ep18.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1069" + }, + { + "id": "1070", + "name": "Table Talk: The House Wins, Part Three S1 Ep17", + "description": "Table Talk: The House Wins, Part Three S1 Ep17", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-house-wins-part-three-s1-ep17\/table-talk-the-house-wins-part-three-s1-ep17.mp3", + "pubdate": "2017\/07\/07 12:21PM", + "state": "Completed", + "filelength": "00:32:07", + "filesize": "29.71 MB", + "filename": "AI: The \"C\" Team - Table Talk: The House Wins, Part Three S1 Ep17.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1070" + }, + { + "id": "1071", + "name": "The House Wins, Part Three S1 Ep17", + "description": "The House Wins, Part Three S1 Ep17", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-house-wins-part-three-ep17\/the-house-wins-part-three-ep17.mp3", + "pubdate": "2017\/07\/07 12:16PM", + "state": "Completed", + "filelength": "00:32:00", + "filesize": "197.43 MB", + "filename": "AI: The \"C\" Team - The House Wins, Part Three S1 Ep17.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1071" + }, + { + "id": "1072", + "name": "Table Talk: The House Wins, Part Two S1 Ep16", + "description": "Table Talk: The House Wins, Part Two S1 Ep16", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-house-wins-part-two-s1-ep16\/table-talk-the-house-wins-part-two-s1-ep16.mp3", + "pubdate": "2017\/06\/30 03:37PM", + "state": "Completed", + "filelength": "00:30:58", + "filesize": "29.95 MB", + "filename": "AI: The \"C\" Team - Table Talk: The House Wins, Part Two S1 Ep16.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1072" + }, + { + "id": "1073", + "name": "The House Wins, Part Two S1 Ep16", + "description": "The House Wins, Part Two S1 Ep16", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-house-wins-part-two-ep16\/the-house-wins-part-two-ep16.mp3", + "pubdate": "2017\/06\/30 03:16PM", + "state": "Completed", + "filelength": "00:30:55", + "filesize": "196.56 MB", + "filename": "AI: The \"C\" Team - The House Wins, Part Two S1 Ep16.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1073" + }, + { + "id": "1074", + "name": "Table Talk: The House Wins, Part One S1 Ep15", + "description": "Table Talk: The House Wins, Part One S1 Ep15", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-the-house-wins-part-one-s1-ep15\/table-talk-the-house-wins-part-one-s1-ep15.mp3", + "pubdate": "2017\/06\/23 03:30PM", + "state": "Completed", + "filelength": "00:30:44", + "filesize": "29.43 MB", + "filename": "AI: The \"C\" Team - Table Talk: The House Wins, Part One S1 Ep15.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1074" + }, + { + "id": "1075", + "name": "The House Wins, Part One S1 Ep15", + "description": "The House Wins, Part One S1 Ep15", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-house-wins-part-one-s1-ep15\/the-house-wins-part-one-s1-ep15.mp3", + "pubdate": "2017\/06\/23 03:13PM", + "state": "Completed", + "filelength": "00:30:43", + "filesize": "198.7 MB", + "filename": "AI: The \"C\" Team - The House Wins, Part One S1 Ep15.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1075" + }, + { + "id": "1076", + "name": "Table Talk: Homecoming, Part Six S1 Ep14", + "description": "Table Talk: Homecoming, Part Six S1 Ep14", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-homecoming-part-six-s1-ep14\/table-talk-homecoming-part-six-s1-ep14.mp3", + "pubdate": "2017\/06\/16 03:19PM", + "state": "Completed", + "filelength": "00:31:41", + "filesize": "29.85 MB", + "filename": "AI: The \"C\" Team - Table Talk: Homecoming, Part Six S1 Ep14.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1076" + }, + { + "id": "1077", + "name": "Homecoming, Part Six S1 Ep14", + "description": "Homecoming, Part Six S1 Ep14", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/homecoming-part-six-s1-ep14\/homecoming-part-six-s1-ep14.mp3", + "pubdate": "2017\/06\/16 03:03PM", + "state": "Completed", + "filelength": "00:30:59", + "filesize": "194.75 MB", + "filename": "AI: The \"C\" Team - Homecoming, Part Six S1 Ep14.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1077" + }, + { + "id": "1078", + "name": "Table Talk: Homecoming, Part Five S1 Ep13", + "description": "Table Talk: Homecoming, Part Five S1 Ep13", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-homecoming-part-five-s5-ep13\/table-talk-homecoming-part-five-s5-ep13.mp3", + "pubdate": "2017\/06\/09 02:00PM", + "state": "Completed", + "filelength": "00:31:54", + "filesize": "23.31 MB", + "filename": "AI: The \"C\" Team - Table Talk: Homecoming, Part Five S1 Ep13.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1078" + }, + { + "id": "1079", + "name": "Homecoming, Part Five S1 Ep13", + "description": "Homecoming, Part Five S1 Ep13", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/homecoming-part-five-s1-ep13\/homecoming-part-five-s1-ep13.mp3", + "pubdate": "2017\/06\/09 01:53PM", + "state": "Completed", + "filelength": "00:31:52", + "filesize": "203.36 MB", + "filename": "AI: The \"C\" Team - Homecoming, Part Five S1 Ep13.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1079" + }, + { + "id": "1080", + "name": "Table Talk: Homecoming, Part Four S1 Ep12", + "description": "Table Talk: Homecoming, Part Four S1 Ep12", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-homecoming-part-four-s1-ep12\/table-talk-homecoming-part-four-s1-ep12.mp3", + "pubdate": "2017\/06\/02 12:25PM", + "state": "Completed", + "filelength": "00:32:23", + "filesize": "28.59 MB", + "filename": "AI: The \"C\" Team - Table Talk: Homecoming, Part Four S1 Ep12.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1080" + }, + { + "id": "1081", + "name": "Homecoming, Part Four S1 Ep12", + "description": "Homecoming, Part Four S1 Ep12", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/homecoming-part-four-s1-ep12\/homecoming-part-four-s1-ep12.mp3", + "pubdate": "2017\/06\/02 12:20PM", + "state": "Completed", + "filelength": "00:32:25", + "filesize": "194.17 MB", + "filename": "AI: The \"C\" Team - Homecoming, Part Four S1 Ep12.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1081" + }, + { + "id": "1082", + "name": "Table Talk: Homecoming, Part Three S1 Ep11", + "description": "Table Talk: Homecoming, Part Three S1 Ep11", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-homecoming-part-three-s1-ep11\/table-talk-homecoming-part-three-s1-ep11.mp3", + "pubdate": "2017\/05\/26 12:59PM", + "state": "Completed", + "filelength": "00:15:02", + "filesize": "36.48 MB", + "filename": "AI: The \"C\" Team - Table Talk: Homecoming, Part Three S1 Ep11.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1082" + }, + { + "id": "1083", + "name": "Homecoming, Part Three S1 Ep11", + "description": "Homecoming, Part Three S1 Ep11", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/homecoming-part-three-s1-ep11\/homecoming-part-three-s1-ep11.mp3", + "pubdate": "2017\/05\/26 12:51PM", + "state": "Completed", + "filelength": "00:15:04", + "filesize": "203.87 MB", + "filename": "AI: The \"C\" Team - Homecoming, Part Three S1 Ep11.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1083" + }, + { + "id": "1084", + "name": "Table Talk: Homecoming, Part Two S1 Ep10", + "description": "Table Talk: Homecoming, Part Two S1 Ep10", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-homecoming-part-two-s1-ep10\/table-talk-homecoming-part-two-s1-ep10.mp3", + "pubdate": "2017\/05\/19 01:08PM", + "state": "Completed", + "filelength": "00:30:42", + "filesize": "30.8 MB", + "filename": "AI: The \"C\" Team - Table Talk: Homecoming, Part Two S1 Ep10.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1084" + }, + { + "id": "1085", + "name": "Homecoming, Part Two S1 Ep10", + "description": "Homecoming, Part Two S1 Ep10", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/homecoming-part-two-s1-ep10\/homecoming-part-two-s1-ep10.mp3", + "pubdate": "2017\/05\/19 01:05PM", + "state": "Completed", + "filelength": "00:30:49", + "filesize": "210.16 MB", + "filename": "AI: The \"C\" Team - Homecoming, Part Two S1 Ep10.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1085" + }, + { + "id": "1086", + "name": "Table Talk: Homecoming, Part One S1 Ep9", + "description": "Table Talk: Homecoming, Part One S1 Ep9", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-homecoming-part-one-s1-ep9\/table-talk-homecoming-part-one-s1-ep9.mp3", + "pubdate": "2017\/05\/12 01:03PM", + "state": "Completed", + "filelength": "00:30:52", + "filesize": "35.11 MB", + "filename": "AI: The \"C\" Team - Table Talk: Homecoming, Part One S1 Ep9.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1086" + }, + { + "id": "1087", + "name": "Homecoming, Part One S1 Ep9", + "description": "Homecoming, Part One S1 Ep9", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/homecoming-part-one-s1-ep9\/homecoming-part-one-s1-ep9.mp3", + "pubdate": "2017\/05\/12 01:00PM", + "state": "Completed", + "filelength": "00:30:49", + "filesize": "204.77 MB", + "filename": "AI: The \"C\" Team - Homecoming, Part One S1 Ep9.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1087" + }, + { + "id": "1088", + "name": "Table Talk: Doomgate Inn, Part Three S1 Ep8", + "description": "Table Talk: Doomgate Inn, Part Three S1 Ep8", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-doomgate-inn-part-three-s1-ep8\/table-talk-doomgate-inn-part-three-s1-ep8.mp3", + "pubdate": "2017\/05\/05 12:10PM", + "state": "Completed", + "filelength": "00:10:38", + "filesize": "36.05 MB", + "filename": "AI: The \"C\" Team - Table Talk: Doomgate Inn, Part Three S1 Ep8.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1088" + }, + { + "id": "1089", + "name": "Doomgate Inn, Part Three S1 Ep8", + "description": "Doomgate Inn, Part Three S1 Ep8", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/doomgate-inn-part-three-s1-ep8\/doomgate-inn-part-three-s1-ep8.mp3", + "pubdate": "2017\/05\/05 12:05PM", + "state": "Completed", + "filelength": "00:06:49", + "filesize": "201.03 MB", + "filename": "AI: The \"C\" Team - Doomgate Inn, Part Three S1 Ep8.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1089" + }, + { + "id": "1090", + "name": "Table Talk: Doomgate Inn, Part Two S1 Ep7", + "description": "Table Talk: Doomgate Inn, Part Two S1 Ep7", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-doomgate-inn-part-two-s1-ep7\/table-talk-doomgate-inn-part-two-s1-ep7.mp3", + "pubdate": "2017\/04\/28 01:03PM", + "state": "Completed", + "filelength": "00:20:32", + "filesize": "31.98 MB", + "filename": "AI: The \"C\" Team - Table Talk: Doomgate Inn, Part Two S1 Ep7.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1090" + }, + { + "id": "1091", + "name": "Doomgate Inn, Part Two S1 Ep7", + "description": "Doomgate Inn, Part Two S1 Ep7", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/doomgate-inn-part-two-s1-ep7\/doomgate-inn-part-two-s1-ep7.mp3", + "pubdate": "2017\/04\/28 12:53PM", + "state": "Completed", + "filelength": "00:19:16", + "filesize": "208.1 MB", + "filename": "AI: The \"C\" Team - Doomgate Inn, Part Two S1 Ep7.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1091" + }, + { + "id": "1092", + "name": "Table Talk: Doomgate Inn, Part One S1 Ep6", + "description": "Table Talk: Doomgate Inn, Part One S1 Ep6", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-doomgate-inn-part-one-s1-ep6\/table-talk-doomgate-inn-part-one-s1-ep6.mp3", + "pubdate": "2017\/04\/21 12:12PM", + "state": "Completed", + "filelength": "00:37:11", + "filesize": "32.74 MB", + "filename": "AI: The \"C\" Team - Table Talk: Doomgate Inn, Part One S1 Ep6.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1092" + }, + { + "id": "1093", + "name": "Doomgate Inn, Part One S1 Ep6", + "description": "Doomgate Inn, Part One S1 Ep6", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/doomgate-inn-part-one-s1-ep6\/doomgate-inn-part-one-s1-ep6.mp3", + "pubdate": "2017\/04\/21 12:07PM", + "state": "Completed", + "filelength": "00:37:11", + "filesize": "207.78 MB", + "filename": "AI: The \"C\" Team - Doomgate Inn, Part One S1 Ep6.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1093" + }, + { + "id": "1094", + "name": "Table Talk: Dungeons & Wagons, Part Two S1 Ep5", + "description": "Table Talk: Dungeons & Wagons, Part Two S1 Ep5", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-dungeons-wagons-part-two-s1-ep5\/table-talk-dungeons-wagons-part-two-s1-ep5.mp3", + "pubdate": "2017\/04\/14 12:20PM", + "state": "Completed", + "filelength": "00:18:38", + "filesize": "29.73 MB", + "filename": "AI: The \"C\" Team - Table Talk: Dungeons & Wagons, Part Two S1 Ep5.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1094" + }, + { + "id": "1095", + "name": "Dungeons & Wagons, Part Two S1 Ep5", + "description": "Dungeons & Wagons, Part Two S1 Ep5", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/dungeons-wagons-part-two-s1-ep5\/dungeons-wagons-part-two-s1-ep5.mp3", + "pubdate": "2017\/04\/14 12:08PM", + "state": "Completed", + "filelength": "00:37:10", + "filesize": "207.73 MB", + "filename": "AI: The \"C\" Team - Dungeons & Wagons, Part Two S1 Ep5.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1095" + }, + { + "id": "1096", + "name": "Table Talk: Dungeons & Wagons, Part One S1 Ep4", + "description": "Table Talk: Dungeons & Wagons, Part One S1 Ep4", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-dungeons-wagons-s1-ep4\/table-talk-dungeons-wagons-s1-ep4.mp3", + "pubdate": "2017\/04\/07 01:02PM", + "state": "Completed", + "filelength": "00:00:25", + "filesize": "24.41 MB", + "filename": "AI: The \"C\" Team - Table Talk: Dungeons & Wagons, Part One S1 Ep4.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1096" + }, + { + "id": "1097", + "name": "Dungeons & Wagons, Part One S1 Ep4", + "description": "Dungeons & Wagons, Part One S1 Ep4", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/dungeons-wagons-pt-1-s1-ep4\/dungeons-wagons-pt-1-s1-ep4.mp3", + "pubdate": "2017\/04\/07 12:15PM", + "state": "Completed", + "filelength": "02:31:26", + "filesize": "207.99 MB", + "filename": "AI: The \"C\" Team - Dungeons & Wagons, Part One S1 Ep4.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1097" + }, + { + "id": "1098", + "name": "Table Talk: In Good Standing S1 Ep3", + "description": "Table Talk: In Good Standing S1 Ep3", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-in-good-standing-s1-ep3\/table-talk-in-good-standing-s1-ep3.mp3", + "pubdate": "2017\/04\/01 11:19AM", + "state": "Completed", + "filelength": "00:10:47", + "filesize": "25.99 MB", + "filename": "AI: The \"C\" Team - Table Talk: In Good Standing S1 Ep3.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1098" + }, + { + "id": "1099", + "name": "In Good Standing S1 Ep3", + "description": "In Good Standing S1 Ep3", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/in-good-standing-s1-ep3\/in-good-standing-s1-ep3.mp3", + "pubdate": "2017\/04\/01 10:22AM", + "state": "Completed", + "filelength": "00:08:21", + "filesize": "189.75 MB", + "filename": "AI: The \"C\" Team - In Good Standing S1 Ep3.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1099" + }, + { + "id": "1100", + "name": "The Test Market S1 Ep2", + "description": "The Test Market S1 Ep2", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-test-market-s1-ep2\/the-test-market-s1-ep2.mp3", + "pubdate": "2017\/03\/25 11:05AM", + "state": "Completed", + "filelength": "00:03:58", + "filesize": "225.74 MB", + "filename": "AI: The \"C\" Team - The Test Market S1 Ep2.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1100" + }, + { + "id": "1101", + "name": "Franchise Opportunities Available S1 Ep1", + "description": "Franchise Opportunities Available S1 Ep1", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/ai-the-c-team-franchise-opportunities-available-s1-ep1\/ai-the-c-team-franchise-opportunities-available-s1-ep1.mp3", + "pubdate": "2017\/03\/17 12:29PM", + "state": "Completed", + "filelength": "00:32:25", + "filesize": "208.35 MB", + "filename": "AI: The \"C\" Team - Franchise Opportunities Available S1 Ep1.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1101" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/podcast.json b/docs/json-responses/podcast.json index b4aae5ff..a153a56e 100644 --- a/docs/json-responses/podcast.json +++ b/docs/json-responses/podcast.json @@ -1,19 +1,15 @@ -{ - "id": "1", - "name": "60-Second Science", - "description": "Tune in every weekday for quick reports and commentaries on the world of science\u2014it'll just take a minute", - "language": "en-us", - "copyright": "False", - "feed_url": "http:\/\/rss.sciam.com\/sciam\/60secsciencepodcast", - "generator": "", - "website": "https:\/\/www.scientificamerican.com\/podcast\/60-second-science\/", - "build_date": "1970-01-01T10:00:00+10:00", - "sync_date": "2021-08-20T11:08:30+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=1", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [] -} \ No newline at end of file +[ + { + "id": 10, + "name": "AI: The \"C\" Team", + "description": "Acquisitions Incorporated serves up locally-sourced adventure from convenient franchise locations across Faer\u00fbn. Their adventures began in 2007 with a podcast of three friends playing D&D, and inexplicably progressed to live games on-stage before thousands of audience members at PAX.", + "language": "en-us", + "copyright": "Copyright (c) 1998-2018 Penny Arcade, Inc.", + "generator": "", + "website": "http:\/\/www.acq-inc.com\/", + "build_date": "2018\/03\/22 01:10PM", + "sync_date": "2020\/04\/15 05:12PM", + "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=10", + "podcast_episode": [] + } +] \ No newline at end of file diff --git a/docs/json-responses/podcast_create.json b/docs/json-responses/podcast_create.json deleted file mode 100644 index 8ade370c..00000000 --- a/docs/json-responses/podcast_create.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "6", - "name": "Trace", - "description": "\n \n An investigative podcast hosted by ABC journalist Rachael Brown, Trace examines the fractures in Australia's criminal justice system, and the decades-long ripples they have caused.\n \n ", - "language": "en-AU", - "copyright": "Copyright 2021, Australian Broadcasting Corporation. All Rights Reserved.", - "feed_url": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/feed\/8597522\/podcast.xml", - "generator": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/", - "build_date": "2021-08-13T01:00:00+10:00", - "sync_date": "2021-08-20T10:51:24+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=6", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [] -} \ No newline at end of file diff --git a/docs/json-responses/podcast_delete (error).json b/docs/json-responses/podcast_delete (error).json deleted file mode 100644 index 65f25099..00000000 --- a/docs/json-responses/podcast_delete (error).json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "error": { - "code": "404", - "message": "podcast 58 was not found" - } -} \ No newline at end of file diff --git a/docs/json-responses/podcast_delete.json b/docs/json-responses/podcast_delete.json deleted file mode 100644 index 2877a479..00000000 --- a/docs/json-responses/podcast_delete.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "errorCode": "4704", - "errorAction": "podcast_delete", - "errorType": "filter", - "errorMessage": "Not Found: 3" - } -} \ No newline at end of file diff --git a/docs/json-responses/podcast_edit.json b/docs/json-responses/podcast_edit.json deleted file mode 100644 index 57dadacf..00000000 --- a/docs/json-responses/podcast_edit.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "success": "podcast 1 updated" -} \ No newline at end of file diff --git a/docs/json-responses/podcast_episode.json b/docs/json-responses/podcast_episode.json index 83e6809f..39c1a4ea 100644 --- a/docs/json-responses/podcast_episode.json +++ b/docs/json-responses/podcast_episode.json @@ -1,8 +1,17 @@ -{ - "error": { - "errorCode": "4704", - "errorAction": "podcast_episode", - "errorType": "filter", - "errorMessage": "Not Found: 47" +[ + { + "id": 6394, + "name": "s4 ep12 - The Collections Agency, Part Five", + "description": "", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-collections-agency-part-five\/the-collections-agency-part-five.mp3", + "pubdate": "2020\/04\/09 01:10PM", + "state": "Completed", + "filelength": "00:35:50", + "filesize": "145.79 MB", + "filename": "AI: The \"C\" Team - s4 ep12 - The Collections Agency, Part Five.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=6394" } -} \ No newline at end of file +] \ No newline at end of file diff --git a/docs/json-responses/podcast_episode_delete.json b/docs/json-responses/podcast_episode_delete.json deleted file mode 100644 index 94695e44..00000000 --- a/docs/json-responses/podcast_episode_delete.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "success": { "message": "podcast_episode 41040 deleted" } -} \ No newline at end of file diff --git a/docs/json-responses/podcast_episodes.json b/docs/json-responses/podcast_episodes.json index 62b2ab0d..fa4f8c84 100644 --- a/docs/json-responses/podcast_episodes.json +++ b/docs/json-responses/podcast_episodes.json @@ -1,108 +1,62 @@ -{ - "podcast_episode": [ - { - "id": "135", - "title": "The Incredible, Reanimated 24,000-Year-Old Rotifer", - "name": "The Incredible, Reanimated 24,000-Year-Old Rotifer", - "description": "The last time this tiny wheel animalcule was moving around, woolly mammoths roamed the earth.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=EI6kC4Uuf7k:1D8ECiIxgHk:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=EI6kC4Uuf7k:1D8ECiIxgHk:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/EI6kC4Uuf7k\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/EI6kC4Uuf7k\/", - "pubdate": "2021-08-17T23:00:00+10:00", - "state": "Completed", - "filelength": "00:05:38", - "filesize": "5.66 MB", - "filename": "60-Second Science - The Incredible, Reanimated 24,000-Year-Old Rotifer.mp3", - "mime": "audio\/mpeg", - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=135", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=135&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20The%20Incredible-%20Reanimated%2024-000-Year-Old%20Rotifer.mp3", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "136", - "title": "Astronomers Find an Unexpected Bumper Crop of Black Holes", - "name": "Astronomers Find an Unexpected Bumper Crop of Black Holes", - "description": "In trying to explain the spectacular star trails of the star cluster Palomar 5, astronomers stumbled on a very large trove of black holes.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=VUajjnt6734:J8pSbd94Yeo:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=VUajjnt6734:J8pSbd94Yeo:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/VUajjnt6734\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Space & Physics", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/VUajjnt6734\/", - "pubdate": "2021-08-13T00:00:00+10:00", - "state": "Pending", - "filelength": "00:03:24", - "filesize": "0 B", - "filename": "60-Second Science - Astronomers Find an Unexpected Bumper Crop of Black Holes.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=136", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=136&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Astronomers%20Find%20an%20Unexpected%20Bumper%20Crop%20of%20Black%20Holes.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "137", - "title": "Inside Millions of Invisible Droplets, Potential Superbug Killers Grow", - "name": "Inside Millions of Invisible Droplets, Potential Superbug Killers Grow", - "description": "New research has created microscopic antibiotic factories in droplets that measure a trillionth of liter in volume.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=2zrOPpKMzgc:Hy9BvZ5xmFo:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=2zrOPpKMzgc:Hy9BvZ5xmFo:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/2zrOPpKMzgc\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/2zrOPpKMzgc\/", - "pubdate": "2021-08-10T22:00:00+10:00", - "state": "Pending", - "filelength": "00:06:34", - "filesize": "0 B", - "filename": "60-Second Science - Inside Millions of Invisible Droplets, Potential Superbug Killers Grow.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=137", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=137&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20Inside%20Millions%20of%20Invisible%20Droplets-%20Potential%20Superbug%20Killers%20Grow.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - }, - { - "id": "138", - "title": "The Secret behind Songbirds' Magnetic Migratory Sense", - "name": "The Secret behind Songbirds' Magnetic Migratory Sense", - "description": "A molecule found in the retinas of European robins seems to be able to sense weak magnetic fields, such as that of Earth, after it is exposed to light.<br\/>\n<br\/>\n-- Read more on ScientificAmerican.com<div class=\"feedflare\">\n<a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:yIl2AUoC8zA\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=yIl2AUoC8zA\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:qj6IDK7rITs\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=qj6IDK7rITs\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:l6gmwiTKsz0\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=l6gmwiTKsz0\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:gIN9vFwOqvQ\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?i=ZY769WpgVxQ:OhvpLpYtKxA:gIN9vFwOqvQ\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:ZC7T4KBF6Nw\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=ZC7T4KBF6Nw\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:I9og5sOYxJI\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=I9og5sOYxJI\" border=\"0\"><\/img><\/a> <a href=\"http:\/\/rss.sciam.com\/~ff\/sciam\/60secsciencepodcast?a=ZY769WpgVxQ:OhvpLpYtKxA:xQlvkV3S7Ew\"><img src=\"http:\/\/feeds.feedburner.com\/~ff\/sciam\/60secsciencepodcast?d=xQlvkV3S7Ew\" border=\"0\"><\/img><\/a>\n<\/div><img src=\"http:\/\/feeds.feedburner.com\/~r\/sciam\/60secsciencepodcast\/~4\/ZY769WpgVxQ\" height=\"1\" width=\"1\" alt=\"\"\/>", - "category": "Biology", - "author": "", - "author_full": "", - "website": "http:\/\/rss.sciam.com\/~r\/sciam\/60secsciencepodcast\/~3\/ZY769WpgVxQ\/", - "pubdate": "2021-08-05T00:00:00+10:00", - "state": "Pending", - "filelength": "00:02:54", - "filesize": "0 B", - "filename": "60-Second Science - The Secret behind Songbirds' Magnetic Migratory Sense.", - "mime": null, - "public_url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=138", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=podcast_episode&oid=138&uid=4&format=raw&player=api&name=60-Second%20Science%20-%20The%20Secret%20behind%20Songbirds-%20Magnetic%20Migratory%20Sense.", - "catalog": "3", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 0, - "played": "0" - } - ] -} \ No newline at end of file +[ + { + "id": "1098", + "name": "Table Talk: In Good Standing S1 Ep3", + "description": "Table Talk: In Good Standing S1 Ep3", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/table-talk-in-good-standing-s1-ep3\/table-talk-in-good-standing-s1-ep3.mp3", + "pubdate": "2017\/04\/01 11:19AM", + "state": "Completed", + "filelength": "00:10:47", + "filesize": "25.99 MB", + "filename": "AI: The \"C\" Team - Table Talk: In Good Standing S1 Ep3.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1098" + }, + { + "id": "1099", + "name": "In Good Standing S1 Ep3", + "description": "In Good Standing S1 Ep3", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/in-good-standing-s1-ep3\/in-good-standing-s1-ep3.mp3", + "pubdate": "2017\/04\/01 10:22AM", + "state": "Completed", + "filelength": "00:08:21", + "filesize": "189.75 MB", + "filename": "AI: The \"C\" Team - In Good Standing S1 Ep3.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1099" + }, + { + "id": "1100", + "name": "The Test Market S1 Ep2", + "description": "The Test Market S1 Ep2", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/the-test-market-s1-ep2\/the-test-market-s1-ep2.mp3", + "pubdate": "2017\/03\/25 11:05AM", + "state": "Completed", + "filelength": "00:03:58", + "filesize": "225.74 MB", + "filename": "AI: The \"C\" Team - The Test Market S1 Ep2.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1100" + }, + { + "id": "1101", + "name": "Franchise Opportunities Available S1 Ep1", + "description": "Franchise Opportunities Available S1 Ep1", + "category": "", + "author": "", + "author_full": "", + "website": "http:\/\/www.acq-inc.com\/listen\/cteam\/ai-the-c-team-franchise-opportunities-available-s1-ep1\/ai-the-c-team-franchise-opportunities-available-s1-ep1.mp3", + "pubdate": "2017\/03\/17 12:29PM", + "state": "Completed", + "filelength": "00:32:25", + "filesize": "208.35 MB", + "filename": "AI: The \"C\" Team - Franchise Opportunities Available S1 Ep1.mp3", + "url": "https:\/\/music.com.au\/podcast_episode.php?action=show&podcast_episode=1101" + } +] \ No newline at end of file diff --git a/docs/json-responses/podcasts.json b/docs/json-responses/podcasts.json index 1790a184..66fa1fa6 100644 --- a/docs/json-responses/podcasts.json +++ b/docs/json-responses/podcasts.json @@ -1,61 +1,54 @@ -{ - "podcast": [ - { - "id": "1", - "name": "60-Second Science", - "description": "Tune in every weekday for quick reports and commentaries on the world of science\u2014it'll just take a minute", - "language": "en-us", - "copyright": "False", - "feed_url": "http:\/\/rss.sciam.com\/sciam\/60secsciencepodcast", - "generator": "", - "website": "https:\/\/www.scientificamerican.com\/podcast\/60-second-science\/", - "build_date": "1970-01-01T10:00:00+10:00", - "sync_date": "2021-08-20T11:08:30+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=1", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [] - }, - { - "id": "2", - "name": "Plays Well with Others", - "description": "From Creative Commons, a podcast about the art and science of collaboration. With a focus on the tools, techniques, and mechanics of collaboration, we explore how today's most interesting collaborators are making new things, solving old problems, and getting things done \u2014 together. Hosted by Creative Commons CEO Ryan Merkley. ", - "language": "en", - "copyright": "Creative Commons", - "feed_url": "https:\/\/anchor.fm\/s\/90932e8\/podcast\/rss", - "generator": "Anchor Podcasts", - "website": "playswellwithothers.org", - "build_date": "2021-02-23T14:18:58+10:00", - "sync_date": "2021-04-01T17:03:54+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=2", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [] - }, - { - "id": "6", - "name": "Trace", - "description": "\n \n An investigative podcast hosted by ABC journalist Rachael Brown, Trace examines the fractures in Australia's criminal justice system, and the decades-long ripples they have caused.\n \n ", - "language": "en-AU", - "copyright": "Copyright 2021, Australian Broadcasting Corporation. All Rights Reserved.", - "feed_url": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/feed\/8597522\/podcast.xml", - "generator": "", - "website": "https:\/\/www.abc.net.au\/radio\/programs\/trace\/", - "build_date": "2021-08-13T01:00:00+10:00", - "sync_date": "2021-08-20T10:51:24+10:00", - "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=6", - "art": "https:\/\/music.com.au\/image.php?object_id=6&object_type=podcast&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg?v=8", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "podcast_episode": [] - } - ] -} \ No newline at end of file +[ + { + "id": "10", + "name": "AI: The \"C\" Team", + "description": "Acquisitions Incorporated serves up locally-sourced adventure from convenient franchise locations across Faer\u00fbn. Their adventures began in 2007 with a podcast of three friends playing D&D, and inexplicably progressed to live games on-stage before thousands of audience members at PAX.", + "language": "en-us", + "copyright": "Copyright (c) 1998-2018 Penny Arcade, Inc.", + "generator": "", + "website": "http:\/\/www.acq-inc.com\/", + "build_date": "2018\/03\/22 01:10PM", + "sync_date": "2020\/04\/15 05:12PM", + "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=10", + "podcast_episode": [] + }, + { + "id": "15", + "name": "Brute Force", + "description": "Brute Force is a real-play comedic RPG podcast blended with in-character narration. We play a campaign of FATE Core (we started with World of Darkness) set in the high fantasy world of Eorith. The adventurers are a party of monsters tasked with saving a world that barely tolerates their existence.", + "language": "en-US", + "copyright": "© 2016 All rights reserved", + "generator": "https:\/\/wordpress.org\/?v=4.9.3", + "website": "https:\/\/geeklyinc.com\/category\/brute-force\/", + "build_date": "2018\/03\/27 07:15PM", + "sync_date": "2020\/03\/24 04:38AM", + "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=15", + "podcast_episode": [] + }, + { + "id": "16", + "name": "Cthulhu & Friends", + "description": "", + "language": "en-US", + "copyright": "Cthulhu & Friends Podcast", + "generator": "https:\/\/wordpress.org\/?v=4.9.3", + "website": "https:\/\/geeklyinc.com\/category\/caf-podcast\/", + "build_date": "2018\/03\/29 06:15PM", + "sync_date": "2020\/03\/24 04:38AM", + "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=16", + "podcast_episode": [] + }, + { + "id": "25", + "name": "Devin Townsend Podcast", + "description": "A podcast in which musician Devin Townsend rambles on about a bunch of things with a tendency to repeat certain words and say 'uhhh' a lot.", + "language": "en", + "copyright": "Devin Townsend", + "generator": "Anchor Podcasts", + "website": "https:\/\/www.hevydevy.com\/", + "build_date": "2020\/04\/12 12:07PM", + "sync_date": "2020\/04\/12 12:09PM", + "public_url": "https:\/\/music.com.au\/podcast.php?action=show&podcast=25", + "podcast_episode": [] + } +] \ No newline at end of file diff --git a/docs/json-responses/rate.json b/docs/json-responses/rate.json index 996a256e..60dd5d6d 100644 --- a/docs/json-responses/rate.json +++ b/docs/json-responses/rate.json @@ -1,3 +1,3 @@ { - "success": "rating set to 0 for 93" + "success": "rating set to 0 for 164527" } \ No newline at end of file diff --git a/docs/json-responses/record_play.json b/docs/json-responses/record_play.json index b02dd4da..33385b27 100644 --- a/docs/json-responses/record_play.json +++ b/docs/json-responses/record_play.json @@ -1,3 +1,3 @@ { - "success": "successfully recorded play: 93 for: user" + "success": "successfully recorded play: 77371" } \ No newline at end of file diff --git a/docs/json-responses/scrobble (error).json b/docs/json-responses/scrobble (error).json index 49c8ea1a..f2e9344b 100644 --- a/docs/json-responses/scrobble (error).json +++ b/docs/json-responses/scrobble (error).json @@ -1,8 +1,6 @@ { "error": { - "errorCode": "4704", - "errorAction": "scrobble", - "errorType": "song", - "errorMessage": "Not Found" + "code": "401", + "message": "Failed to scrobble: No item found!" } } \ No newline at end of file diff --git a/docs/json-responses/scrobble.json b/docs/json-responses/scrobble.json index fbaec94f..2c5d0888 100644 --- a/docs/json-responses/scrobble.json +++ b/docs/json-responses/scrobble.json @@ -1,3 +1,3 @@ { - "success": "successfully scrobbled: 83" + "success": "successfully scrobbled: 77371" } \ No newline at end of file diff --git a/docs/json-responses/search_songs.json b/docs/json-responses/search_songs.json index 6ce98850..191e9070 100644 --- a/docs/json-responses/search_songs.json +++ b/docs/json-responses/search_songs.json @@ -1,3 +1,126 @@ -{ - "song": [] -} \ No newline at end of file +[ + { + "id": "802560", + "title": "Baker Street", + "name": "Baker Street", + "artist": { + "id": "254", + "name": "Foo Fighters" + }, + "album": { + "id": "71644", + "name": "My Hero" + }, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "22", + "name": "Pop" + }, + { + "id": "33", + "name": "Alternative Rock" + } + ], + "filename": "\/mnt\/music\/Foo Fighters\/(1998) My Hero (single) [CDCL 796]\/102 - Baker Street.mp3", + "track": 2, + "playlisttrack": 1, + "time": 339, + "year": 1998, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=802560&uid=2&player=api&name=Foo%20Fighters%20-%20Baker%20Street.mp3", + "size": 13650833, + "mbid": "57497521-16ac-4870-8fe0-4f486652d8ef", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=71644&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Gerry Rafferty", + "channels": null, + "comment": "", + "publisher": "Capitol Records", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-7.200000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" + }, + { + "name": "Pop" + }, + { + "name": "Alternative Rock" + } + ] + }, + { + "id": "862539", + "title": "Baker Street", + "name": "Baker Street", + "artist": { + "id": "9919", + "name": "Jonathan Coulton" + }, + "album": { + "id": "71541", + "name": "Some Guys" + }, + "tag": [ + { + "id": "35", + "name": "Indie" + } + ], + "filename": "\/mnt\/music\/Jonathan Coulton\/(2019) Some Guys\/107 - Baker Street.flac", + "track": 7, + "playlisttrack": 2, + "time": 365, + "year": 2019, + "bitrate": 967923, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/x-flac", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=862539&uid=2&player=api&name=Jonathan%20Coulton%20-%20Baker%20Street.opus", + "size": 44226050, + "mbid": "81e4816b-8132-41ff-b753-12fa7e067f16", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=71541&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "Gerry Rafferty", + "channels": null, + "comment": "", + "publisher": "", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "0.000000", + "replaygain_track_peak": "0.000000", + "genre": [ + { + "name": "Indie" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/share.json b/docs/json-responses/share.json index 3d0b2d0b..64f12529 100644 --- a/docs/json-responses/share.json +++ b/docs/json-responses/share.json @@ -1,17 +1,19 @@ -{ - "id": "1", - "name": "Creeping Lawler 2", - "owner": "user", - "allow_stream": 1, - "allow_download": 0, - "creation_date": "1614129641", - "lastvisit_date": "1614129643", - "object_type": "album", - "object_id": "9", - "expire_days": 0, - "max_counter": 0, - "counter": 1, - "secret": "zWUTlFER", - "public_url": "https:\/\/music.com.au\/share.php?id=1&secret=zWUTlFER", - "description": "Creeping Lawler 2 (Warfare 3.0)" -} \ No newline at end of file +[ + { + "id": 106, + "name": "Greatest Hits", + "owner": "user", + "allow_stream": "1", + "allow_download": "1", + "creation_date": "2020\/04\/28 11:14AM", + "lastvisit_date": "", + "object_type": "album", + "object_id": "16604", + "expire_days": "7", + "max_counter": "0", + "counter": "0", + "secret": "84NuNX50", + "public_url": "https:\/\/music.com.au\/share.php?id=106&secret=84NuNX50", + "description": "Greatest Hits (The Cure)" + } +] \ No newline at end of file diff --git a/docs/json-responses/share_create.json b/docs/json-responses/share_create.json index 4cc72738..f3726ec4 100644 --- a/docs/json-responses/share_create.json +++ b/docs/json-responses/share_create.json @@ -1,17 +1,19 @@ -{ - "id": "11", - "name": "Red&GreenSmoke", - "owner": "user", - "allow_stream": 1, - "allow_download": 1, - "creation_date": "1629422499", - "lastvisit_date": "0", - "object_type": "song", - "object_id": "54", - "expire_days": 0, - "max_counter": 0, - "counter": 0, - "secret": "QChQIyVu", - "public_url": "https:\/\/music.com.au\/share.php?id=11&secret=QChQIyVu", - "description": "Red&GreenSmoke" -} \ No newline at end of file +[ + { + "id": "108", + "name": "Greatest Hits", + "owner": "user", + "allow_stream": "1", + "allow_download": "1", + "creation_date": "2020\/04\/30 02:25PM", + "lastvisit_date": "", + "object_type": "album", + "object_id": "16604", + "expire_days": "7", + "max_counter": "0", + "counter": "0", + "secret": "GSZlncWC", + "public_url": "https:\/\/music.com.au\/share.php?id=108&secret=GSZlncWC", + "description": "Greatest Hits (The Cure)" + } +] \ No newline at end of file diff --git a/docs/json-responses/share_delete.json b/docs/json-responses/share_delete.json index b3321419..7177b78b 100644 --- a/docs/json-responses/share_delete.json +++ b/docs/json-responses/share_delete.json @@ -1,3 +1,3 @@ { - "success": "share 7 deleted" + "success": "share 108 deleted" } \ No newline at end of file diff --git a/docs/json-responses/share_edit.json b/docs/json-responses/share_edit.json deleted file mode 100644 index a1164f78..00000000 --- a/docs/json-responses/share_edit.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "success": "share 7 updated" -} \ No newline at end of file diff --git a/docs/json-responses/shares.json b/docs/json-responses/shares.json index a54a2cdf..1a7ad09d 100644 --- a/docs/json-responses/shares.json +++ b/docs/json-responses/shares.json @@ -1,38 +1,36 @@ -{ - "share": [ - { - "id": "1", - "name": "Creeping Lawler 2", - "owner": "user", - "allow_stream": 1, - "allow_download": 0, - "creation_date": "1614129641", - "lastvisit_date": "1614129643", - "object_type": "album", - "object_id": "9", - "expire_days": 0, - "max_counter": 0, - "counter": 1, - "secret": "zWUTlFER", - "public_url": "https:\/\/music.com.au\/share.php?id=1&secret=zWUTlFER", - "description": "Creeping Lawler 2 (Warfare 3.0)" - }, - { - "id": "2", - "name": "Inominavel (live.v.01)", - "owner": "demo", - "allow_stream": 1, - "allow_download": 0, - "creation_date": "1614129672", - "lastvisit_date": "0", - "object_type": "album", - "object_id": "18", - "expire_days": 0, - "max_counter": 0, - "counter": 0, - "secret": "qq6SPPmy", - "public_url": "https:\/\/music.com.au\/share.php?id=2&secret=qq6SPPmy", - "description": "Buried in Nausea (Various Artists)" - } - ] -} \ No newline at end of file +[ + { + "id": "105", + "name": "Exitus ...Bis Ganz Europa F\u00e4llt", + "owner": "user", + "allow_stream": "1", + "allow_download": "1", + "creation_date": "2020\/04\/28 11:13AM", + "lastvisit_date": "2020\/04\/28 11:13AM", + "object_type": "album", + "object_id": "73208", + "expire_days": "7", + "max_counter": "0", + "counter": "1", + "secret": "QDe4QnG6", + "public_url": "https:\/\/music.com.au\/share.php?id=105&secret=QDe4QnG6", + "description": "Exitus ...Bis Ganz Europa F\u00e4llt (Sleipnir & Nemesis)" + }, + { + "id": "106", + "name": "Greatest Hits", + "owner": "user", + "allow_stream": "1", + "allow_download": "1", + "creation_date": "2020\/04\/28 11:14AM", + "lastvisit_date": "", + "object_type": "album", + "object_id": "16604", + "expire_days": "7", + "max_counter": "0", + "counter": "0", + "secret": "84NuNX50", + "public_url": "https:\/\/music.com.au\/share.php?id=106&secret=84NuNX50", + "description": "Greatest Hits (The Cure)" + } +] \ No newline at end of file diff --git a/docs/json-responses/song.json b/docs/json-responses/song.json index 358bd0cd..5a408512 100644 --- a/docs/json-responses/song.json +++ b/docs/json-responses/song.json @@ -1,58 +1,57 @@ -{ - "id": "54", - "title": "Red&GreenSmoke", - "name": "Red&GreenSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007(1)\/05-Synthetic_-_RedGreenSmokePM20k44khM_64kb.mp3", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 400, - "year": 2007, - "bitrate": 64000, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=54&uid=4&player=api&name=Synthetic%20-%20Red-GreenSmoke.mp3", - "size": 3209468, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 1, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-2.880000", - "replaygain_track_peak": "0.977000", - "r128_album_gain": null, - "r128_track_gain": null -} \ No newline at end of file +[ + { + "id": "953", + "title": "Wishmaster", + "name": "Wishmaster", + "artist": { + "id": "55", + "name": "Nightwish" + }, + "album": { + "id": "48753", + "name": "Wishmaster" + }, + "tag": [ + { + "id": "20", + "name": "Metal" + } + ], + "filename": "\/mnt\/music\/Nightwish\/(2000) Wishmaster\/106 - Wishmaster.mp3", + "track": 6, + "playlisttrack": 1, + "time": 264, + "year": 2000, + "bitrate": 281749, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=953&uid=2&player=api&name=Nightwish%20-%20Wishmaster.mp3", + "size": 9379030, + "mbid": "d5332837-05a6-475c-8e7a-4a00bc621acc", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=48753&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": 3, + "rating": 3, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Tuomas Holopainen", + "channels": null, + "comment": "", + "publisher": "Drakkar Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.440000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Metal" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/song_delete.json b/docs/json-responses/song_delete.json deleted file mode 100644 index c009ebc0..00000000 --- a/docs/json-responses/song_delete.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "success": { "message": "song 310 deleted" } -} \ No newline at end of file diff --git a/docs/json-responses/songs.json b/docs/json-responses/songs.json index 24ba9828..a7e9365c 100644 --- a/docs/json-responses/songs.json +++ b/docs/json-responses/songs.json @@ -1,235 +1,306 @@ -{ - "song": [ - { - "id": "115", - "title": "Are we going Crazy", - "name": "Are we going Crazy", - "artist": { - "id": "27", - "name": "Chi.Otic" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 7, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/07Chi.otic-AreWeGoingCrazy.wma", - "genre": [], - "playlisttrack": 1, - "time": 433, - "year": 2012, - "bitrate": 32582, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=115&uid=4&player=api&name=Chi.Otic%20-%20Are%20we%20going%20Crazy.wma", - "size": 1776580, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null +[ + { + "id": "164215", + "title": "!", + "name": "!", + "artist": { + "id": "8526", + "name": "Hellyeah" }, - { - "id": "107", - "title": "Arrest Me", - "name": "Arrest Me", - "artist": { + "album": { + "id": "56038", + "name": "Unden!able" + }, + "tag": [ + { "id": "20", - "name": "R\/B" - }, - "album": { - "id": "12", - "name": "Buried in Nausea" - }, - "albumartist": { - "id": "19", - "name": "Various Artists" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Various Artists\/Buried In Nausea\/09R_b-ArrestMe.m4a", - "genre": [ - { - "id": "7", - "name": "Punk" - } - ], - "playlisttrack": 2, - "time": 96, - "year": 2012, - "bitrate": 252864, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mp4", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=107&uid=4&player=api&name=R-B%20-%20Arrest%20Me.m4a", - "size": 3091727, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=12&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "", - "license": null, - "publisher": "", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-1.350000", - "replaygain_track_peak": "0.881000", - "r128_album_gain": null, - "r128_track_gain": null + "name": "Metal" + }, + { + "id": "37", + "name": "Hard Rock" + } + ], + "filename": "\/mnt\/music\/Hellyeah\/(2016) Unden!able [ESM 171-2]\/101 - !.mp3", + "track": 1, + "playlisttrack": 1, + "time": 79, + "year": 2016, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=164215&uid=2&player=api&name=Hellyeah%20-%20-.mp3", + "size": 3184944, + "mbid": "42bb2b7a-bf67-4cc4-8610-25399d56474b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=56038&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Eleven Seven Music", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-6.920000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Metal" + }, + { + "name": "Hard Rock" + } + ] + }, + { + "id": "41252", + "title": "! (The Song Formerly Known As)", + "name": "! (The Song Formerly Known As)", + "artist": { + "id": "1464", + "name": "Regurgitator" }, - { - "id": "118", - "title": "As Pure as Possible", - "name": "As Pure as Possible", - "artist": { - "id": "36", - "name": "Comfort Fit" + "album": { + "id": "50272", + "name": "Unit" + }, + "tag": [ + { + "id": "16", + "name": "Alternative" + } + ], + "filename": "\/mnt\/music\/Regurgitator\/(1997) Unit\/103 - ! (The Song Formerly Known As).mp3", + "track": 3, + "playlisttrack": 2, + "time": 208, + "year": 1997, + "bitrate": 160000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=41252&uid=2&player=api&name=Regurgitator%20-%20-%20-The%20Song%20Formerly%20Known%20As-.mp3", + "size": 4198110, + "mbid": "5e14ee48-6337-4a70-8992-1ed74dddb945", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=50272&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": 3, + "rating": 3, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Warner Music Australia", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-10.460000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Alternative" + } + ] + }, + { + "id": "84148", + "title": "! (The Song Formerly Known As)", + "name": "! (The Song Formerly Known As)", + "artist": { + "id": "1464", + "name": "Regurgitator" + }, + "album": { + "id": "32856", + "name": "Triple J: Hottest 100, Volume 6" + }, + "tag": [ + { + "id": "3", + "name": "Punk" }, - "album": { - "id": "21", - "name": "Forget and Remember" + { + "id": "4", + "name": "Electronic" }, - "albumartist": { - "id": "36", - "name": "Comfort Fit" - }, - "disk": 1, - "track": 9, - "filename": "\/mnt\/files-music\/ampache-test\/upload\/user\/Comfort Fit\/Forget And Remember\/9 - As Pure as Possible.mp3", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "playlisttrack": 3, - "time": 128, - "year": 2005, - "bitrate": 234690, - "rate": 44100, - "mode": "vbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=118&uid=4&player=api&name=Comfort%20Fit%20-%20As%20Pure%20as%20Possible.mp3", - "size": 3789410, - "mbid": "7a3d740d-5546-4900-88af-b97b42c3344e", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 4, - "composer": "", - "channels": null, - "comment": "URL: http:\/\/freemusicarchive.org\/music\/Comfort_Fit\/Forget_And_Remember\/tdrlp02-09-comfort_fit-as_pure_as_possible\r\nComments: http:\/\/freemusicarchive.org\/\r\nCurator: WFMU\r\nCopyright: Attribution-Noncommercial-No Derivative Works 3.0 Germany: http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/de\/", - "license": null, - "publisher": "Tokyo Dawn Records", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null + { + "id": "6", + "name": "Rock" + }, + { + "id": "7", + "name": "Synthpop" + }, + { + "id": "22", + "name": "Pop" + }, + { + "id": "37", + "name": "Hard Rock" + }, + { + "id": "184", + "name": "Parody" + }, + { + "id": "615", + "name": "Big Beat" + }, + { + "id": "1409", + "name": "Hip Hop" + } + ], + "filename": "\/mnt\/music\/Various Artists\/(1999) Triple J: Hottest 100, Volume 6\/212 - ! (The Song Formerly Known As).mp3", + "track": 12, + "playlisttrack": 3, + "time": 207, + "year": 1999, + "bitrate": 160000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=84148&uid=2&player=api&name=Regurgitator%20-%20-%20-The%20Song%20Formerly%20Known%20As-.mp3", + "size": 4149473, + "mbid": "5e14ee48-6337-4a70-8992-1ed74dddb945", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=32856&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "EMI Music Australia; Triple J", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-8.090000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Punk" + }, + { + "name": "Electronic" + }, + { + "name": "Rock" + }, + { + "name": "Synthpop" + }, + { + "name": "Pop" + }, + { + "name": "Hard Rock" + }, + { + "name": "Parody" + }, + { + "name": "Big Beat" + }, + { + "name": "Hip Hop" + } + ] + }, + { + "id": "776781", + "title": "! (The Song Formerly Known As)", + "name": "! (The Song Formerly Known As)", + "artist": { + "id": "1464", + "name": "Regurgitator" + }, + "album": { + "id": "41794", + "name": "Recovery" }, - { - "id": "85", - "title": "Beq Ultra Fat", - "name": "Beq Ultra Fat", - "artist": { - "id": "14", - "name": "Nofi\/found." - }, - "album": { - "id": "8", - "name": "Nofi Devices" - }, - "albumartist": { - "id": "14", - "name": "Nofi\/found." - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Nofi_found\/Nofi Devices LP\/04_Beq_Ultra_Fat.mp3", - "genre": [ - { - "id": "5", - "name": "Electronica" - }, - { - "id": "6", - "name": "Dance" - } - ], - "playlisttrack": 4, - "time": 413, - "year": 0, - "bitrate": 192000, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=85&uid=4&player=api&name=Nofi-found.%20-%20Beq%20Ultra%20Fat.mp3", - "size": 9935896, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=8&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "Jeffrey Melton", - "channels": null, - "comment": "8A114B0B+332232+11+150+3703+28283+76364+107382+132131+156082+177051+217892+239975+285087", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "0.940000", - "replaygain_track_peak": "0.989000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + "tag": [ + { + "id": "4", + "name": "Electronic" + }, + { + "id": "6", + "name": "Rock" + }, + { + "id": "33", + "name": "Alternative Rock" + }, + { + "id": "36", + "name": "Indie Rock" + } + ], + "filename": "\/mnt\/music\/Various Artists\/(2016) Recovery [5715567]\/101 - Regurgitator - ! (The Song Formerly Known As).mp3", + "track": 1, + "playlisttrack": 4, + "time": 204, + "year": 2016, + "bitrate": 320040, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=776781&uid=2&player=api&name=Regurgitator%20-%20-%20-The%20Song%20Formerly%20Known%20As-.mp3", + "size": 8186819, + "mbid": "5e14ee48-6337-4a70-8992-1ed74dddb945", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=41794&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "ABC Music", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-7.290000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Electronic" + }, + { + "name": "Rock" + }, + { + "name": "Alternative Rock" + }, + { + "name": "Indie Rock" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/stats (album).json b/docs/json-responses/stats (album).json index 95f75160..67d45484 100644 --- a/docs/json-responses/stats (album).json +++ b/docs/json-responses/stats (album).json @@ -1,56 +1,59 @@ -{ - "album": [ - { - "id": "2", - "name": "Colorsmoke EP", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "time": 4568, - "year": 2007, - "tracks": [], - "songcount": 12, - "diskcount": 1, - "type": null, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": null +[ + { + "id": "49748", + "name": "Chapter One", + "artist": { + "id": "932", + "name": "Black Heaven" + }, + "year": 2001, + "tracks": 12, + "disk": 1, + "tag": [], + "art": "https:\/\/music.com.au\/image.php?object_id=49748&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "c62a2624-c2ad-46fa-8bd7-b8b7bf9a015b" + }, + { + "id": "72877", + "name": "Apple Venus, Volume 1", + "artist": { + "id": "5710", + "name": "XTC" }, - { - "id": "21", - "name": "Forget and Remember", - "artist": { - "id": "36", - "name": "Comfort Fit" + "year": 1999, + "tracks": 11, + "disk": 1, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "47", + "name": "Pop Rock" + }, + { + "id": "122", + "name": "Art Rock" + }, + { + "id": "1875", + "name": "Chamber Pop" }, - "time": 4248, - "year": 2005, - "tracks": [], - "songcount": 20, - "diskcount": 1, - "type": "album", - "genre": [ - { - "id": "8", - "name": "Hip-Hop" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=21&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "6e1d48f7-717c-416e-af35-5d2454a13af2" - } - ] -} \ No newline at end of file + { + "id": "1897", + "name": "Art Pop" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=72877&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "ea9190fe-d7d9-4b82-a200-5e9874b61090" + } +] \ No newline at end of file diff --git a/docs/json-responses/stats (artist).json b/docs/json-responses/stats (artist).json index 55158e7f..ed5c1a69 100644 --- a/docs/json-responses/stats (artist).json +++ b/docs/json-responses/stats (artist).json @@ -1,47 +1,47 @@ -{ - "artist": [ - { - "id": "19", - "name": "Various Artists", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 0, - "genre": [], - "art": "https:\/\/music.com.au\/image.php?object_id=19&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "mbid": "", - "summary": "Warning! Deleting this artist may remove other artists and scrobbles from your library - please handle with caution! Note: You can view albums tagged as 'Various Artists' in your library here. \n\nThe term Various Artists is used in the record industry when numerous singers and musicians collaborate on a song or collection of songs. Most often on Last.fm, compilation album tracks appear under the name of Various Artists erroneously because the individual artist is not listed in the album's ID3 information. ", - "time": 1437, - "yearformed": 0, - "placeformed": "" - }, - { - "id": "2", - "name": "Synthetic", - "albums": [], - "albumcount": 1, - "songs": [], - "songcount": 12, - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 1, - "preciserating": 5, - "rating": 5, - "averagerating": 3, - "mbid": "1", - "summary": "Synthetic was formed in the late 90's by Steve Engler (formerly of Primitive Modern, Twitch Revolt & Domestic Violence), Synthetic is an eclectic act. Influences range from Aphex Twin to Frank Zappa and everything in between. Currently has 3 remixes on Bush-of-ghosts.com under artist names: AAASYNTHETIC and STEVEEDENVER. Has several remixes on RealWorldRemixed.com (Peter Gabriel's Label). Also is he represented on mp3unsigned.com as Synthetic. Synthetic has completed 5 LPs and 8-10 EPs. ", - "time": 4568, - "yearformed": 0, - "placeformed": "" - } - ] -} \ No newline at end of file +[ + { + "id": "2298", + "name": "The Cops", + "albums": 3, + "songs": 32, + "tag": [ + { + "id": "6", + "name": "Rock" + }, + { + "id": "16", + "name": "Alternative" + }, + { + "id": "47", + "name": "Pop Rock" + } + ], + "art": "https:\/\/music.com.au\/image.php?object_id=2298&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 1, + "preciserating": 5, + "rating": 5, + "averagerating": null, + "mbid": "4035f854-00f1-43c7-b90b-41b0b541f8ee", + "summary": "There are at least two artists with this name.\n\n1. The Cops are a post-punk band from Seattle, Washington that formed in late 2003 with Michael Jaworski on lead vocals and guitar, John Randolph on guitar and David Weeks on drums. Seattle label Mt. Fuji Records released their debut EP Why Kids Go Wrong in March of 2005, and followed up to release the critically acclaimed full-length Get Good or Stay Bad in November of 2005. Former Supersuckers and Hater bassist ", + "yearformed": "0", + "placeformed": "" + }, + { + "id": "10297", + "name": "Sinneth soul", + "albums": 5, + "songs": 34, + "tag": [], + "art": "https:\/\/music.com.au\/image.php?object_id=10297&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "mbid": "6746a0f3-f20c-44ef-8f74-b52727199887", + "summary": " ", + "yearformed": "0", + "placeformed": "" + } +] \ No newline at end of file diff --git a/docs/json-responses/stats (song).json b/docs/json-responses/stats (song).json index b758dbc1..763ae39a 100644 --- a/docs/json-responses/stats (song).json +++ b/docs/json-responses/stats (song).json @@ -1,119 +1,119 @@ -{ - "song": [ - { - "id": "102", - "title": "Moremque Sinistrum Sacrorum", - "name": "Moremque Sinistrum Sacrorum", - "artist": { - "id": "16", - "name": "CARN\u00daN" - }, - "album": { - "id": "10", - "name": "CARN\u00daN - MALKUTH (Demo 1996)" - }, - "albumartist": { - "id": "16", - "name": "CARN\u00daN" - }, - "disk": 1, - "track": 5, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Carn\u00fan\/Malkuth (Demo1996)\/05MoremqueSinistrumSacrorum.ogg", - "genre": [], - "playlisttrack": 1, - "time": 164, - "year": 1996, - "bitrate": 106647, - "rate": 44100, - "mode": "vbr", - "mime": "application\/ogg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=102&uid=4&player=api&name=CARN-N%20-%20Moremque%20Sinistrum%20Sacrorum.ogg", - "size": 2202971, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=10&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": 3, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Visit http:\/\/irish-metal.bandcamp.com;http:\/\/archive.org\/details\/Carnn_-_Malkuth_Demo1996", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-7.480000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null +[ + { + "id": "89603", + "title": "Run Over by a Truck", + "name": "Run Over by a Truck", + "artist": { + "id": "5385", + "name": "Weezer" }, - { - "id": "87", - "title": "Wonders of Nando", - "name": "Wonders of Nando", - "artist": { - "id": "14", - "name": "Nofi\/found." - }, - "album": { - "id": "8", - "name": "Nofi Devices" + "album": { + "id": "16046", + "name": "Raditude" + }, + "tag": [ + { + "id": "6", + "name": "Rock" }, - "albumartist": { - "id": "14", - "name": "Nofi\/found." + { + "id": "33", + "name": "Alternative Rock" + } + ], + "filename": "\/mnt\/music\/Weezer\/(2009) Raditude [B0013511-72; B0013511-72]\/202 - Weezer - Run Over by a Truck.mp3", + "track": 2, + "playlisttrack": 1, + "time": 213, + "year": 2009, + "bitrate": 271154, + "rate": 44100, + "mode": "vbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=89603&uid=2&player=api&name=Weezer%20-%20Run%20Over%20by%20a%20Truck.mp3", + "size": 7878367, + "mbid": "654b7f2c-144a-457e-9369-a7a512da5355", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=16046&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "album Latn Interscope Record", + "publisher": "DGC Records; Interscope Records", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-9.690000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Rock" }, - "disk": 1, - "track": 6, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Nofi_found\/Nofi Devices LP\/06_Wonders_of_Nando.mp3", - "genre": [ - { - "id": "5", - "name": "Electronica" - }, - { - "id": "6", - "name": "Dance" - } - ], - "playlisttrack": 2, - "time": 319, - "year": 0, - "bitrate": 192000, - "rate": 44100, - "mode": "cbr", - "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=87&uid=4&player=api&name=Nofi-found.%20-%20Wonders%20of%20Nando.mp3", - "size": 7673901, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=8&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "Jeffrey Melton", - "channels": null, - "comment": "8A114B0B+332232+11+150+3703+28283+76364+107382+132131+156082+177051+217892+239975+285087", - "license": null, - "publisher": "archive.org", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": "-1.440000", - "replaygain_track_peak": "1.000000", - "r128_album_gain": null, - "r128_track_gain": null - } - ] -} \ No newline at end of file + { + "name": "Alternative Rock" + } + ] + }, + { + "id": "781760", + "title": "The Forest Whispers My Name", + "name": "The Forest Whispers My Name", + "artist": { + "id": "10542", + "name": "Willow Wisp" + }, + "album": { + "id": "57687", + "name": "Covered in Filth: A Tribute to Cradle of Filth" + }, + "tag": [ + { + "id": "20", + "name": "Metal" + } + ], + "filename": "\/mnt\/music\/Various Artists\/(2003) Covered in Filth: A Tribute to Cradle of Filth [CDM ZEB 29]\/112 - Willow Wisp - The Forest Whispers My Name.mp3", + "track": 12, + "playlisttrack": 2, + "time": 266, + "year": 2003, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=781760&uid=2&player=api&name=Willow%20Wisp%20-%20The%20Forest%20Whispers%20My%20Name.mp3", + "size": 10798479, + "mbid": "9e87a893-bb45-4cc4-9e14-da6a4d2027a1", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=57687&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 1, + "catalog": 2, + "composer": "Robin Eaglestone", + "channels": null, + "comment": "", + "publisher": "Zebra", + "language": "eng", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-11.160000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Metal" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/system_preferences.json b/docs/json-responses/system_preferences.json deleted file mode 100644 index cf7fcd5a..00000000 --- a/docs/json-responses/system_preferences.json +++ /dev/null @@ -1,1104 +0,0 @@ -{ - "preference": [ - { - "id": "123", - "name": "ajax_load", - "level": "25", - "description": "Ajax page load", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": null - }, - { - "id": "140", - "name": "notify_email", - "level": "25", - "description": "Allow E-mail notifications", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": null - }, - { - "id": "220", - "name": "user_start_page", - "level": "25", - "description": "Default logon page", - "value": "default", - "type": "special", - "category": "interface", - "subcategory": null - }, - { - "id": "110", - "name": "demo_clear_sessions", - "level": "25", - "description": "Democratic - Clear votes for expired user sessions", - "value": "0", - "type": "boolean", - "category": "playlist", - "subcategory": null - }, - { - "id": "101", - "name": "stream_beautiful_url", - "level": "100", - "description": "Enable URL Rewriting", - "value": "1", - "type": "boolean", - "category": "streaming", - "subcategory": null - }, - { - "id": "24", - "name": "force_http_play", - "level": "100", - "description": "Force HTTP playback regardless of port", - "value": "0", - "type": "boolean", - "category": "system", - "subcategory": null - }, - { - "id": "31", - "name": "lang", - "level": "100", - "description": "Language", - "value": "en_GB", - "type": "special", - "category": "interface", - "subcategory": null - }, - { - "id": "23", - "name": "lock_songs", - "level": "100", - "description": "Lock Songs", - "value": "0", - "type": "boolean", - "category": "system", - "subcategory": null - }, - { - "id": "218", - "name": "unique_playlist", - "level": "25", - "description": "Only add unique items to playlists", - "value": "1", - "type": "boolean", - "category": "playlist", - "subcategory": null - }, - { - "id": "29", - "name": "play_type", - "level": "25", - "description": "Playback Type", - "value": "web_player", - "type": "special", - "category": "streaming", - "subcategory": null - }, - { - "id": "53", - "name": "playlist_method", - "level": "5", - "description": "Playlist Method", - "value": "default", - "type": "string", - "category": "playlist", - "subcategory": null - }, - { - "id": "32", - "name": "playlist_type", - "level": "100", - "description": "Playlist Type", - "value": "m3u", - "type": "special", - "category": "playlist", - "subcategory": null - }, - { - "id": "111", - "name": "show_donate", - "level": "25", - "description": "Show donate button in footer", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": null - }, - { - "id": "119", - "name": "daap_pass", - "level": "100", - "description": "DAAP backend password", - "value": "5145162", - "type": "string", - "category": "system", - "subcategory": "backend" - }, - { - "id": "118", - "name": "daap_backend", - "level": "100", - "description": "Use DAAP backend", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "backend" - }, - { - "id": "86", - "name": "subsonic_backend", - "level": "100", - "description": "Use Subsonic backend", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "backend" - }, - { - "id": "120", - "name": "upnp_backend", - "level": "100", - "description": "Use UPnP backend", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "backend" - }, - { - "id": "139", - "name": "webdav_backend", - "level": "100", - "description": "Use WebDAV backend", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "backend" - }, - { - "id": "231", - "name": "bitly_api_key", - "level": "75", - "description": "Bit.ly API key", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "bit.ly" - }, - { - "id": "230", - "name": "bitly_username", - "level": "75", - "description": "Bit.ly Username", - "value": "ampadmin", - "type": "string", - "category": "plugins", - "subcategory": "bit.ly" - }, - { - "id": "214", - "name": "cron_cache", - "level": "25", - "description": "Cache computed SQL data (eg. media hits stats) using a cron", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "catalog" - }, - { - "id": "148", - "name": "catalog_check_duplicate", - "level": "100", - "description": "Check library item at import time and don't import duplicates", - "value": "0", - "type": "boolean", - "category": "system", - "subcategory": "catalog" - }, - { - "id": "213", - "name": "custom_datetime", - "level": "25", - "description": "Custom datetime", - "value": "y\/MM\/dd KK:mma", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "138", - "name": "custom_text_footer", - "level": "75", - "description": "Custom text footer", - "value": "", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "137", - "name": "custom_favicon", - "level": "75", - "description": "Custom URL - Favicon", - "value": "", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "275", - "name": "custom_login_background", - "level": "75", - "description": "Custom URL - Login page background", - "value": "art\/background.png", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "136", - "name": "custom_login_logo", - "level": "75", - "description": "Custom URL - Login page logo", - "value": "", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "129", - "name": "custom_logo", - "level": "25", - "description": "Custom URL - Logo", - "value": "", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "22", - "name": "site_title", - "level": "100", - "description": "Website Title", - "value": "Ampache :: develop", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "176", - "name": "discogs_api_key", - "level": "75", - "description": "Discogs consumer key", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "discogs" - }, - { - "id": "177", - "name": "discogs_secret_api_key", - "level": "75", - "description": "Discogs secret", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "discogs" - }, - { - "id": "45", - "name": "allow_democratic_playback", - "level": "100", - "description": "Allow Democratic Play", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "feature" - }, - { - "id": "1", - "name": "download", - "level": "100", - "description": "Allow Downloads", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "feature" - }, - { - "id": "133", - "name": "geolocation", - "level": "25", - "description": "Allow Geolocation", - "value": "0", - "type": "integer", - "category": "options", - "subcategory": "feature" - }, - { - "id": "102", - "name": "share", - "level": "100", - "description": "Allow Share", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "feature" - }, - { - "id": "44", - "name": "allow_stream_playback", - "level": "100", - "description": "Allow Streaming", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "feature" - }, - { - "id": "121", - "name": "allow_video", - "level": "75", - "description": "Allow Video Features", - "value": "1", - "type": "integer", - "category": "options", - "subcategory": "feature" - }, - { - "id": "82", - "name": "now_playing_per_user", - "level": "50", - "description": "Now Playing filtered per user", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "home" - }, - { - "id": "242", - "name": "of_the_moment", - "level": "25", - "description": "Set the amount of items Album\/Video of the Moment will display", - "value": "4", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "125", - "name": "home_moment_albums", - "level": "25", - "description": "Show Albums of the Moment", - "value": "1", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "128", - "name": "home_now_playing", - "level": "25", - "description": "Show Now Playing", - "value": "1", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "127", - "name": "home_recently_played", - "level": "25", - "description": "Show Recently Played", - "value": "1", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "126", - "name": "home_moment_videos", - "level": "25", - "description": "Show Videos of the Moment", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "83", - "name": "album_sort", - "level": "25", - "description": "Album - Default sort", - "value": "year_desc", - "type": "string", - "category": "interface", - "subcategory": "library" - }, - { - "id": "108", - "name": "album_group", - "level": "25", - "description": "Album - Group multiple disks", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "122", - "name": "album_release_type", - "level": "25", - "description": "Album - Group per release type", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "130", - "name": "album_release_type_sort", - "level": "25", - "description": "Album - Group per release type Sort", - "value": "album,ep,live,single,compilation", - "type": "string", - "category": "interface", - "subcategory": "library" - }, - { - "id": "146", - "name": "libitem_contextmenu", - "level": "5", - "description": "Library item context menu", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "84", - "name": "show_played_times", - "level": "25", - "description": "Show # played", - "value": "1", - "type": "string", - "category": "interface", - "subcategory": "library" - }, - { - "id": "212", - "name": "show_skipped_times", - "level": "25", - "description": "Show # skipped", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "149", - "name": "browse_filter", - "level": "25", - "description": "Show filter box on browse", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "46", - "name": "allow_localplay_playback", - "level": "100", - "description": "Allow Localplay Play", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "localplay" - }, - { - "id": "40", - "name": "localplay_level", - "level": "100", - "description": "Localplay Access", - "value": "100", - "type": "special", - "category": "options", - "subcategory": "localplay" - }, - { - "id": "41", - "name": "localplay_controller", - "level": "100", - "description": "Localplay Type", - "value": "mpd", - "type": "special", - "category": "options", - "subcategory": "localplay" - }, - { - "id": "143", - "name": "disabled_custom_metadata_fields_input", - "level": "100", - "description": "Custom metadata - Define field list", - "value": "", - "type": "string", - "category": "system", - "subcategory": "metadata" - }, - { - "id": "142", - "name": "disabled_custom_metadata_fields", - "level": "100", - "description": "Custom metadata - Disable these fields", - "value": "Array", - "type": "string", - "category": "system", - "subcategory": "metadata" - }, - { - "id": "131", - "name": "browser_notify", - "level": "25", - "description": "Web Player browser notifications", - "value": "1", - "type": "integer", - "category": "interface", - "subcategory": "notification" - }, - { - "id": "132", - "name": "browser_notify_timeout", - "level": "25", - "description": "Web Player browser notifications timeout (seconds)", - "value": "10", - "type": "integer", - "category": "interface", - "subcategory": "notification" - }, - { - "id": "253", - "name": "paypal_currency_code", - "level": "25", - "description": "PayPal Currency Code", - "value": "USD", - "type": "string", - "category": "plugins", - "subcategory": "paypal" - }, - { - "id": "252", - "name": "paypal_business", - "level": "25", - "description": "PayPal ID", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "paypal" - }, - { - "id": "235", - "name": "personalfav_playlist", - "level": "25", - "description": "Favorite Playlist ID", - "value": "", - "type": "integer", - "category": "plugins", - "subcategory": "personal favorites" - }, - { - "id": "236", - "name": "personalfav_smartlist", - "level": "25", - "description": "Favorite Smartlist ID", - "value": "", - "type": "integer", - "category": "plugins", - "subcategory": "personal favorites" - }, - { - "id": "234", - "name": "personalfav_display", - "level": "25", - "description": "Personal favorites on the homepage", - "value": "0", - "type": "boolean", - "category": "plugins", - "subcategory": "personal favorites" - }, - { - "id": "104", - "name": "slideshow_time", - "level": "25", - "description": "Artist slideshow inactivity time", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "player" - }, - { - "id": "88", - "name": "webplayer_flash", - "level": "25", - "description": "Authorize Flash Web Player", - "value": "1", - "type": "boolean", - "category": "streaming", - "subcategory": "player" - }, - { - "id": "89", - "name": "webplayer_html5", - "level": "25", - "description": "Authorize HTML5 Web Player", - "value": "1", - "type": "boolean", - "category": "streaming", - "subcategory": "player" - }, - { - "id": "134", - "name": "webplayer_aurora", - "level": "25", - "description": "Authorize JavaScript decoder (Aurora.js) in Web Player", - "value": "0", - "type": "boolean", - "category": "streaming", - "subcategory": "player" - }, - { - "id": "100", - "name": "webplayer_pausetabs", - "level": "25", - "description": "Auto-pause betweens tabs", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "player" - }, - { - "id": "105", - "name": "broadcast_by_default", - "level": "25", - "description": "Broadcast web player by default", - "value": "0", - "type": "boolean", - "category": "streaming", - "subcategory": "player" - }, - { - "id": "99", - "name": "webplayer_confirmclose", - "level": "25", - "description": "Confirmation when closing current playing window", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "player" - }, - { - "id": "124", - "name": "direct_play_limit", - "level": "25", - "description": "Limit direct play to maximum media count", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "player" - }, - { - "id": "85", - "name": "song_page_title", - "level": "25", - "description": "Show current song in Web player page title", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "player" - }, - { - "id": "69", - "name": "show_lyrics", - "level": "5", - "description": "Show Lyrics", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "player" - }, - { - "id": "145", - "name": "podcast_new_download", - "level": "100", - "description": "# episodes to download when new episodes are available", - "value": "0", - "type": "integer", - "category": "system", - "subcategory": "podcast" - }, - { - "id": "144", - "name": "podcast_keep", - "level": "100", - "description": "# latest episodes to keep", - "value": "0", - "type": "integer", - "category": "system", - "subcategory": "podcast" - }, - { - "id": "90", - "name": "allow_personal_info_now", - "level": "25", - "description": "Share Now Playing information", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "privacy" - }, - { - "id": "91", - "name": "allow_personal_info_recent", - "level": "25", - "description": "Share Recently Played information", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "privacy" - }, - { - "id": "93", - "name": "allow_personal_info_agent", - "level": "25", - "description": "Share Recently Played information - Allow access to streaming agent", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "privacy" - }, - { - "id": "92", - "name": "allow_personal_info_time", - "level": "25", - "description": "Share Recently Played information - Allow access to streaming date\/time", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "privacy" - }, - { - "id": "106", - "name": "concerts_limit_future", - "level": "25", - "description": "Limit number of future events", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "107", - "name": "concerts_limit_past", - "level": "25", - "description": "Limit number of past events", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "51", - "name": "offset_limit", - "level": "5", - "description": "Offset Limit", - "value": "50", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "4", - "name": "popular_threshold", - "level": "25", - "description": "Popular Threshold", - "value": "12", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "47", - "name": "stats_threshold", - "level": "75", - "description": "Statistics Day Threshold", - "value": "20", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "269", - "name": "ratingmatch_star1_rule", - "level": "25", - "description": "Match rule for 1 Star ($play,$skip)", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "ratingmatch" - }, - { - "id": "270", - "name": "ratingmatch_star2_rule", - "level": "25", - "description": "Match rule for 2 Stars", - "value": "1,10", - "type": "string", - "category": "plugins", - "subcategory": "ratingmatch" - }, - { - "id": "271", - "name": "ratingmatch_star3_rule", - "level": "25", - "description": "Match rule for 3 Stars", - "value": "20,0", - "type": "string", - "category": "plugins", - "subcategory": "ratingmatch" - }, - { - "id": "272", - "name": "ratingmatch_star4_rule", - "level": "25", - "description": "Match rule for 4 Stars", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "ratingmatch" - }, - { - "id": "273", - "name": "ratingmatch_star5_rule", - "level": "25", - "description": "Match rule for 5 Stars", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "ratingmatch" - }, - { - "id": "274", - "name": "ratingmatch_flag_rule", - "level": "25", - "description": "Match rule for Flags", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "ratingmatch" - }, - { - "id": "267", - "name": "ratingmatch_stars", - "level": "25", - "description": "Minimum star rating to match", - "value": "3", - "type": "integer", - "category": "plugins", - "subcategory": "ratingmatch" - }, - { - "id": "268", - "name": "ratingmatch_flags", - "level": "25", - "description": "When you love a track, flag the album and artist", - "value": "1", - "type": "boolean", - "category": "plugins", - "subcategory": "ratingmatch" - }, - { - "id": "103", - "name": "share_expire", - "level": "100", - "description": "Share links default expiration days (0=never)", - "value": "7", - "type": "integer", - "category": "system", - "subcategory": "share" - }, - { - "id": "94", - "name": "ui_fixed", - "level": "25", - "description": "Fix header position on compatible themes", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "theme" - }, - { - "id": "33", - "name": "theme_name", - "level": "5", - "description": "Theme", - "value": "reborn", - "type": "special", - "category": "interface", - "subcategory": "theme" - }, - { - "id": "141", - "name": "theme_color", - "level": "5", - "description": "Theme color", - "value": "dark", - "type": "special", - "category": "interface", - "subcategory": "theme" - }, - { - "id": "109", - "name": "topmenu", - "level": "25", - "description": "Top menu", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "theme" - }, - { - "id": "223", - "name": "tmdb_api_key", - "level": "75", - "description": "TMDb API key", - "value": "", - "type": "string", - "category": "plugins", - "subcategory": "tmdb" - }, - { - "id": "55", - "name": "transcode", - "level": "25", - "description": "Allow Transcoding", - "value": "default", - "type": "string", - "category": "streaming", - "subcategory": "transcoding" - }, - { - "id": "52", - "name": "rate_limit", - "level": "100", - "description": "Rate Limit", - "value": "16384", - "type": "integer", - "category": "streaming", - "subcategory": "transcoding" - }, - { - "id": "19", - "name": "transcode_bitrate", - "level": "25", - "description": "Transcode Bitrate", - "value": "192", - "type": "string", - "category": "streaming", - "subcategory": "transcoding" - }, - { - "id": "222", - "name": "tvdb_api_key", - "level": "75", - "description": "TVDb API key", - "value": "ecd0f0e981813c7fe7495239d77d6004", - "type": "string", - "category": "plugins", - "subcategory": "tvdb" - }, - { - "id": "95", - "name": "autoupdate", - "level": "25", - "description": "Check for Ampache updates automatically", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "update" - }, - { - "id": "113", - "name": "allow_upload", - "level": "25", - "description": "Allow user uploads", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "upload" - }, - { - "id": "117", - "name": "upload_allow_edit", - "level": "75", - "description": "Allow users to edit uploaded songs", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "upload" - }, - { - "id": "135", - "name": "upload_allow_remove", - "level": "75", - "description": "Allow users to remove uploaded songs", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "upload" - }, - { - "id": "114", - "name": "upload_subdir", - "level": "75", - "description": "Create a subdirectory per user", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "upload" - }, - { - "id": "112", - "name": "upload_catalog", - "level": "75", - "description": "Destination catalog", - "value": "21", - "type": "integer", - "category": "system", - "subcategory": "upload" - }, - { - "id": "116", - "name": "upload_script", - "level": "75", - "description": "Post-upload script (current directory = upload target directory)", - "value": "", - "type": "string", - "category": "system", - "subcategory": "upload" - }, - { - "id": "147", - "name": "upload_catalog_pattern", - "level": "100", - "description": "Rename uploaded file according to catalog pattern", - "value": "1", - "type": "boolean", - "category": "system", - "subcategory": "upload" - } - ] -} diff --git a/docs/json-responses/system_update.json b/docs/json-responses/system_update.json deleted file mode 100644 index 14289f4c..00000000 --- a/docs/json-responses/system_update.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "success": "No update available" -} \ No newline at end of file diff --git a/docs/json-responses/tag_songs.json b/docs/json-responses/tag_songs.json index d3b203d3..2d59d985 100644 --- a/docs/json-responses/tag_songs.json +++ b/docs/json-responses/tag_songs.json @@ -26,7 +26,7 @@ "rate": 44100, "mode": "cbr", "mime": "audio\/mpeg", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=836449&uid=2&player=api&name=Pathology%20-%20Opposing%20Globalization.mp3", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=836449&uid=2&player=api&name=Pathology%20-%20Opposing%20Globalization.mp3", "size": 7476664, "mbid": "39ec1463-8f59-4c21-86b6-6fb250fb093a", "album_mbid": null, diff --git a/docs/json-responses/timeline.json b/docs/json-responses/timeline.json index bd4c7717..d841d6ae 100644 --- a/docs/json-responses/timeline.json +++ b/docs/json-responses/timeline.json @@ -1,114 +1,134 @@ { - "activity": [ + "timeline": [ { - "id": "212", - "date": "1627949322", + "id": "167388", + "data": "1595916340", "object_type": "song", - "object_id": "93", - "action": "userflag", - "user": { - "id": "4", - "username": "user" - } + "object_id": "77371", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "211", - "date": "1627949320", - "object_type": "playlist", - "object_id": "2", - "action": "userflag", - "user": { - "id": "4", - "username": "user" - } + "id": "167385", + "data": "1595916253", + "object_type": "song", + "object_id": "44648", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "209", - "date": "1627948526", - "object_type": "user", - "object_id": "10", - "action": "follow", - "user": { - "id": "4", - "username": "user" - } + "id": "167372", + "data": "1595914553", + "object_type": "song", + "object_id": "94770", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "208", - "date": "1627948523", + "id": "167371", + "data": "1595914371", "object_type": "song", - "object_id": "93", - "action": "userflag", - "user": { - "id": "4", - "username": "user" - } + "object_id": "67568", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "207", - "date": "1627948521", - "object_type": "playlist", - "object_id": "2", - "action": "userflag", - "user": { - "id": "4", - "username": "user" - } + "id": "167370", + "data": "1595914100", + "object_type": "song", + "object_id": "19851", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "206", - "date": "1627948509", - "object_type": "user", - "object_id": "10", - "action": "follow", - "user": { - "id": "4", - "username": "user" - } + "id": "167369", + "data": "1595913831", + "object_type": "song", + "object_id": "864164", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "205", - "date": "1627948501", + "id": "167368", + "data": "1595913486", "object_type": "song", - "object_id": "93", - "action": "userflag", - "user": { - "id": "4", - "username": "user" - } + "object_id": "13373", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "204", - "date": "1627948498", - "object_type": "playlist", - "object_id": "2", - "action": "userflag", - "user": { - "id": "4", - "username": "user" - } + "id": "167367", + "data": "1595913244", + "object_type": "song", + "object_id": "68840", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "199", - "date": "1626919787", + "id": "167366", + "data": "1595913013", "object_type": "song", - "object_id": "131", - "action": "upload", - "user": { - "id": "4", - "username": "user" - } + "object_id": "107346", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] }, { - "id": "196", - "date": "1626919787", + "id": "167365", + "data": "1595912775", "object_type": "song", - "object_id": "128", - "action": "upload", - "user": { - "id": "4", - "username": "user" - } + "object_id": "787588", + "action": "play", + "user": [ + { + "id": "2", + "username": "user" + } + ] } ] } \ No newline at end of file diff --git a/docs/json-responses/toggle_follow.json b/docs/json-responses/toggle_follow.json index 5a45bd4c..2a0629e5 100644 --- a/docs/json-responses/toggle_follow.json +++ b/docs/json-responses/toggle_follow.json @@ -1,3 +1,3 @@ { - "success": "follow toggled for: 10" + "success": "follow toggled for: 4" } \ No newline at end of file diff --git a/docs/json-responses/update_art.json b/docs/json-responses/update_art.json index 80558f08..1dddb99c 100644 --- a/docs/json-responses/update_art.json +++ b/docs/json-responses/update_art.json @@ -1,4 +1,3 @@ { - "success": "Gathered new art for: 26 (artist)", - "art": "https:\/\/music.com.au\/image.php?object_id=26&object_type=artist&auth=eeb9f1b6056246a7d563f479f518bb34" + "success": "Gathered new art for: 2298 (artist)" } \ No newline at end of file diff --git a/docs/json-responses/update_artist_info.json b/docs/json-responses/update_artist_info.json index b4db0723..7c24f060 100644 --- a/docs/json-responses/update_artist_info.json +++ b/docs/json-responses/update_artist_info.json @@ -1,3 +1,3 @@ { - "success": "Updated artist info: 26" + "success": "Updated artist info: 2298" } \ No newline at end of file diff --git a/docs/json-responses/update_from_tags.json b/docs/json-responses/update_from_tags.json index aeb6a0ab..3a26dd64 100644 --- a/docs/json-responses/update_from_tags.json +++ b/docs/json-responses/update_from_tags.json @@ -1,3 +1,3 @@ { - "success": "Updated tags for: 6 (album)" + "success": "Updated tags for: 54130 (album)" } \ No newline at end of file diff --git a/docs/json-responses/update_podcast.json b/docs/json-responses/update_podcast.json index c5390ac0..f1a88ea7 100644 --- a/docs/json-responses/update_podcast.json +++ b/docs/json-responses/update_podcast.json @@ -1,3 +1,3 @@ { - "success": "Synced episodes for podcast: 1" + "success": "Synced episodes for podcast: 10" } \ No newline at end of file diff --git a/docs/json-responses/url_to_song.json b/docs/json-responses/url_to_song.json index 750e89d7..18a501dc 100644 --- a/docs/json-responses/url_to_song.json +++ b/docs/json-responses/url_to_song.json @@ -1,58 +1,64 @@ -{ - "id": "60", - "title": "BrownSmoke", - "name": "BrownSmoke", - "artist": { - "id": "2", - "name": "Synthetic" - }, - "album": { - "id": "2", - "name": "Colorsmoke EP" - }, - "albumartist": { - "id": "2", - "name": "Synthetic" - }, - "disk": 1, - "track": 4, - "filename": "\/mnt\/files-music\/ampache-test\/music\/Synthetic\/Synthetic_-_Colorsmoke_EP-20k217-2007\/04-Synthetic_-_BrownSmokeYSBM20k22khS.wma", - "genre": [ - { - "id": "1", - "name": "Electronic" - } - ], - "playlisttrack": 1, - "time": 304, - "year": 2007, - "bitrate": 20627, - "rate": 22050, - "mode": "cbr", - "mime": "audio\/x-ms-wma", - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=song&oid=60&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.wma", - "size": 792375, - "mbid": "", - "album_mbid": null, - "artist_mbid": null, - "albumartist_mbid": null, - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": null, - "playcount": 0, - "catalog": 1, - "composer": "", - "channels": null, - "comment": "Made with Sony ACID 5", - "license": null, - "publisher": "20kbps rec.", - "language": "", - "replaygain_album_gain": null, - "replaygain_album_peak": null, - "replaygain_track_gain": null, - "replaygain_track_peak": null, - "r128_album_gain": null, - "r128_track_gain": null -} \ No newline at end of file +[ + { + "id": "164215", + "title": "!", + "name": "!", + "artist": { + "id": "8526", + "name": "Hellyeah" + }, + "album": { + "id": "56038", + "name": "Unden!able" + }, + "tag": [ + { + "id": "20", + "name": "Metal" + }, + { + "id": "37", + "name": "Hard Rock" + } + ], + "filename": "\/mnt\/music\/Hellyeah\/(2016) Unden!able [ESM 171-2]\/101 - !.mp3", + "track": 1, + "playlisttrack": 1, + "time": 79, + "year": 2016, + "bitrate": 320000, + "rate": 44100, + "mode": "cbr", + "mime": "audio\/mpeg", + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=164215&uid=2&player=api&name=Hellyeah%20-%20-.mp3", + "size": 3184944, + "mbid": "42bb2b7a-bf67-4cc4-8610-25399d56474b", + "album_mbid": null, + "artist_mbid": null, + "albumartist_mbid": null, + "art": "https:\/\/music.com.au\/image.php?object_id=56038&object_type=album&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.jpg", + "flag": 0, + "preciserating": null, + "rating": null, + "averagerating": null, + "playcount": 0, + "catalog": 2, + "composer": "", + "channels": null, + "comment": "", + "publisher": "Eleven Seven Music", + "language": "", + "replaygain_album_gain": "0.000000", + "replaygain_album_peak": "0.000000", + "replaygain_track_gain": "-6.920000", + "replaygain_track_peak": "1.000000", + "genre": [ + { + "name": "Metal" + }, + { + "name": "Hard Rock" + } + ] + } +] \ No newline at end of file diff --git a/docs/json-responses/user (disabled).json b/docs/json-responses/user (disabled).json index ce705ddd..5a84ae6f 100644 --- a/docs/json-responses/user (disabled).json +++ b/docs/json-responses/user (disabled).json @@ -1,15 +1,17 @@ { - "id": "59", - "username": "temp_user", - "auth": null, - "email": "email@gmail.com", - "access": 25, - "fullname_public": 0, - "validation": null, - "disabled": 1, - "create_date": 1627949313, - "last_seen": 0, - "website": null, - "state": null, - "city": null + "user": { + "id": "128", + "username": "temp_user", + "auth": null, + "email": "email@gmail.com", + "access": "25", + "fullname_public": "0", + "validation": null, + "disabled": "1", + "create_date": "1595916210", + "last_seen": "0", + "website": null, + "state": null, + "city": null + } } \ No newline at end of file diff --git a/docs/json-responses/user (error).json b/docs/json-responses/user (error).json index cfb60e4f..7c7f8e33 100644 --- a/docs/json-responses/user (error).json +++ b/docs/json-responses/user (error).json @@ -1,8 +1,17 @@ { - "error": { - "errorCode": "4704", - "errorAction": "user", - "errorType": "username", - "errorMessage": "Not Found: missing_user" + "user": { + "id": "", + "username": null, + "auth": null, + "email": null, + "access": "", + "fullname_public": "", + "validation": null, + "disabled": "", + "create_date": null, + "last_seen": null, + "website": null, + "state": null, + "city": null } } \ No newline at end of file diff --git a/docs/json-responses/user.json b/docs/json-responses/user.json index 4cec20c6..b2a57506 100644 --- a/docs/json-responses/user.json +++ b/docs/json-responses/user.json @@ -1,15 +1,17 @@ { - "id": "3", - "username": "demo", - "auth": "eeb9f1b6056246a7d563f479f518bb34", - "email": "demo@gmail.com", - "access": 25, - "fullname_public": 0, - "validation": null, - "disabled": 0, - "create_date": 1613964067, - "last_seen": 1626919678, - "website": null, - "state": null, - "city": null + "user": { + "id": "2", + "username": "user", + "auth": "cfj3f237d563f479f5223k23189dbb34", + "email": "me@lachlandewaard.org", + "access": "100", + "fullname_public": "0", + "validation": null, + "disabled": "0", + "create_date": "1108290000", + "last_seen": "1595916200", + "website": "", + "state": null, + "city": null + } } \ No newline at end of file diff --git a/docs/json-responses/user_preferences.json b/docs/json-responses/user_preferences.json deleted file mode 100644 index db4d74a6..00000000 --- a/docs/json-responses/user_preferences.json +++ /dev/null @@ -1,764 +0,0 @@ -{ - "preferences": [ - { - "id": "123", - "name": "ajax_load", - "level": "25", - "description": "Ajax page load", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": null - }, - { - "id": "140", - "name": "notify_email", - "level": "25", - "description": "Allow E-mail notifications", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": null - }, - { - "id": "220", - "name": "user_start_page", - "level": "25", - "description": "Default logon page", - "value": "default", - "type": "special", - "category": "interface", - "subcategory": null - }, - { - "id": "110", - "name": "demo_clear_sessions", - "level": "25", - "description": "Democratic - Clear votes for expired user sessions", - "value": "0", - "type": "boolean", - "category": "playlist", - "subcategory": null - }, - { - "id": "101", - "name": "stream_beautiful_url", - "level": "100", - "description": "Enable URL Rewriting", - "value": "1", - "type": "boolean", - "category": "streaming", - "subcategory": null - }, - { - "id": "31", - "name": "lang", - "level": "100", - "description": "Language", - "value": "en_GB", - "type": "special", - "category": "interface", - "subcategory": null - }, - { - "id": "218", - "name": "unique_playlist", - "level": "25", - "description": "Only add unique items to playlists", - "value": "1", - "type": "boolean", - "category": "playlist", - "subcategory": null - }, - { - "id": "29", - "name": "play_type", - "level": "25", - "description": "Playback Type", - "value": "web_player", - "type": "special", - "category": "streaming", - "subcategory": null - }, - { - "id": "53", - "name": "playlist_method", - "level": "5", - "description": "Playlist Method", - "value": "default", - "type": "string", - "category": "playlist", - "subcategory": null - }, - { - "id": "32", - "name": "playlist_type", - "level": "100", - "description": "Playlist Type", - "value": "m3u", - "type": "special", - "category": "playlist", - "subcategory": null - }, - { - "id": "111", - "name": "show_donate", - "level": "25", - "description": "Show donate button in footer", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": null - }, - { - "id": "231", - "name": "bitly_api_key", - "level": "75", - "description": "Bit.ly API key", - "value": "geswrg0f0edfghdgthsrgsg4342454", - "type": "string", - "category": "plugins", - "subcategory": "bit.ly" - }, - { - "id": "230", - "name": "bitly_username", - "level": "75", - "description": "Bit.ly Username", - "value": "ampadmin", - "type": "string", - "category": "plugins", - "subcategory": "bit.ly" - }, - { - "id": "213", - "name": "custom_datetime", - "level": "25", - "description": "Custom datetime", - "value": "y\/MM\/dd KK:mma", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "138", - "name": "custom_text_footer", - "level": "75", - "description": "Custom text footer", - "value": "", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "137", - "name": "custom_favicon", - "level": "75", - "description": "Custom URL - Favicon", - "value": "", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "136", - "name": "custom_login_logo", - "level": "75", - "description": "Custom URL - Login page logo", - "value": "", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "129", - "name": "custom_logo", - "level": "25", - "description": "Custom URL - Logo", - "value": "", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "22", - "name": "site_title", - "level": "100", - "description": "Website Title", - "value": "Ampache :: develop", - "type": "string", - "category": "interface", - "subcategory": "custom" - }, - { - "id": "176", - "name": "discogs_api_key", - "level": "75", - "description": "Discogs consumer key", - "value": "geswrg0f0edfghdgthsrgsg4342454", - "type": "string", - "category": "plugins", - "subcategory": "discogs" - }, - { - "id": "177", - "name": "discogs_secret_api_key", - "level": "75", - "description": "Discogs secret", - "value": "geswrg0f0edfghdgthsrgsg4342454", - "type": "string", - "category": "plugins", - "subcategory": "discogs" - }, - { - "id": "45", - "name": "allow_democratic_playback", - "level": "100", - "description": "Allow Democratic Play", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "feature" - }, - { - "id": "1", - "name": "download", - "level": "100", - "description": "Allow Downloads", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "feature" - }, - { - "id": "133", - "name": "geolocation", - "level": "25", - "description": "Allow Geolocation", - "value": "0", - "type": "integer", - "category": "options", - "subcategory": "feature" - }, - { - "id": "102", - "name": "share", - "level": "100", - "description": "Allow Share", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "feature" - }, - { - "id": "44", - "name": "allow_stream_playback", - "level": "100", - "description": "Allow Streaming", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "feature" - }, - { - "id": "121", - "name": "allow_video", - "level": "75", - "description": "Allow Video Features", - "value": "0", - "type": "integer", - "category": "options", - "subcategory": "feature" - }, - { - "id": "82", - "name": "now_playing_per_user", - "level": "50", - "description": "Now Playing filtered per user", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "home" - }, - { - "id": "125", - "name": "home_moment_albums", - "level": "25", - "description": "Show Albums of the Moment", - "value": "1", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "128", - "name": "home_now_playing", - "level": "25", - "description": "Show Now Playing", - "value": "1", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "127", - "name": "home_recently_played", - "level": "25", - "description": "Show Recently Played", - "value": "1", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "126", - "name": "home_moment_videos", - "level": "25", - "description": "Show Videos of the Moment", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "home" - }, - { - "id": "83", - "name": "album_sort", - "level": "25", - "description": "Album - Default sort", - "value": "year_desc", - "type": "string", - "category": "interface", - "subcategory": "library" - }, - { - "id": "108", - "name": "album_group", - "level": "25", - "description": "Album - Group multiple disks", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "122", - "name": "album_release_type", - "level": "25", - "description": "Album - Group per release type", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "130", - "name": "album_release_type_sort", - "level": "25", - "description": "Album - Group per release type Sort", - "value": "album,ep,live,single,compilation", - "type": "string", - "category": "interface", - "subcategory": "library" - }, - { - "id": "146", - "name": "libitem_contextmenu", - "level": "5", - "description": "Library item context menu", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "84", - "name": "show_played_times", - "level": "25", - "description": "Show # played", - "value": "1", - "type": "string", - "category": "interface", - "subcategory": "library" - }, - { - "id": "212", - "name": "show_skipped_times", - "level": "25", - "description": "Show # skipped", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "149", - "name": "browse_filter", - "level": "25", - "description": "Show filter box on browse", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "library" - }, - { - "id": "46", - "name": "allow_localplay_playback", - "level": "100", - "description": "Allow Localplay Play", - "value": "1", - "type": "boolean", - "category": "options", - "subcategory": "localplay" - }, - { - "id": "40", - "name": "localplay_level", - "level": "100", - "description": "Localplay Access", - "value": "100", - "type": "special", - "category": "options", - "subcategory": "localplay" - }, - { - "id": "41", - "name": "localplay_controller", - "level": "100", - "description": "Localplay Type", - "value": "mpd", - "type": "special", - "category": "options", - "subcategory": "localplay" - }, - { - "id": "131", - "name": "browser_notify", - "level": "25", - "description": "Web Player browser notifications", - "value": "1", - "type": "integer", - "category": "interface", - "subcategory": "notification" - }, - { - "id": "132", - "name": "browser_notify_timeout", - "level": "25", - "description": "Web Player browser notifications timeout (seconds)", - "value": "10", - "type": "integer", - "category": "interface", - "subcategory": "notification" - }, - { - "id": "235", - "name": "personalfav_playlist", - "level": "25", - "description": "Favorite Playlist ID", - "value": "", - "type": "integer", - "category": "plugins", - "subcategory": "personal favorites" - }, - { - "id": "236", - "name": "personalfav_smartlist", - "level": "25", - "description": "Favorite Smartlist ID", - "value": "", - "type": "integer", - "category": "plugins", - "subcategory": "personal favorites" - }, - { - "id": "234", - "name": "personalfav_display", - "level": "25", - "description": "Personal favorites on the homepage", - "value": "0", - "type": "boolean", - "category": "plugins", - "subcategory": "personal favorites" - }, - { - "id": "104", - "name": "slideshow_time", - "level": "25", - "description": "Artist slideshow inactivity time", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "player" - }, - { - "id": "88", - "name": "webplayer_flash", - "level": "25", - "description": "Authorize Flash Web Player", - "value": "1", - "type": "boolean", - "category": "streaming", - "subcategory": "player" - }, - { - "id": "89", - "name": "webplayer_html5", - "level": "25", - "description": "Authorize HTML5 Web Player", - "value": "1", - "type": "boolean", - "category": "streaming", - "subcategory": "player" - }, - { - "id": "134", - "name": "webplayer_aurora", - "level": "25", - "description": "Authorize JavaScript decoder (Aurora.js) in Web Player", - "value": "0", - "type": "boolean", - "category": "streaming", - "subcategory": "player" - }, - { - "id": "100", - "name": "webplayer_pausetabs", - "level": "25", - "description": "Auto-pause betweens tabs", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "player" - }, - { - "id": "105", - "name": "broadcast_by_default", - "level": "25", - "description": "Broadcast web player by default", - "value": "0", - "type": "boolean", - "category": "streaming", - "subcategory": "player" - }, - { - "id": "99", - "name": "webplayer_confirmclose", - "level": "25", - "description": "Confirmation when closing current playing window", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "player" - }, - { - "id": "124", - "name": "direct_play_limit", - "level": "25", - "description": "Limit direct play to maximum media count", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "player" - }, - { - "id": "85", - "name": "song_page_title", - "level": "25", - "description": "Show current song in Web player page title", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "player" - }, - { - "id": "69", - "name": "show_lyrics", - "level": "5", - "description": "Show Lyrics", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "player" - }, - { - "id": "90", - "name": "allow_personal_info_now", - "level": "25", - "description": "Share Now Playing information", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "privacy" - }, - { - "id": "91", - "name": "allow_personal_info_recent", - "level": "25", - "description": "Share Recently Played information", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "privacy" - }, - { - "id": "93", - "name": "allow_personal_info_agent", - "level": "25", - "description": "Share Recently Played information - Allow access to streaming agent", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "privacy" - }, - { - "id": "92", - "name": "allow_personal_info_time", - "level": "25", - "description": "Share Recently Played information - Allow access to streaming date\/time", - "value": "1", - "type": "boolean", - "category": "interface", - "subcategory": "privacy" - }, - { - "id": "106", - "name": "concerts_limit_future", - "level": "25", - "description": "Limit number of future events", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "107", - "name": "concerts_limit_past", - "level": "25", - "description": "Limit number of past events", - "value": "0", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "51", - "name": "offset_limit", - "level": "5", - "description": "Offset Limit", - "value": "50", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "4", - "name": "popular_threshold", - "level": "25", - "description": "Popular Threshold", - "value": "12", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "47", - "name": "stats_threshold", - "level": "75", - "description": "Statistics Day Threshold", - "value": "20", - "type": "integer", - "category": "interface", - "subcategory": "query" - }, - { - "id": "94", - "name": "ui_fixed", - "level": "25", - "description": "Fix header position on compatible themes", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "theme" - }, - { - "id": "33", - "name": "theme_name", - "level": "5", - "description": "Theme", - "value": "reborn", - "type": "special", - "category": "interface", - "subcategory": "theme" - }, - { - "id": "141", - "name": "theme_color", - "level": "5", - "description": "Theme color", - "value": "dark", - "type": "special", - "category": "interface", - "subcategory": "theme" - }, - { - "id": "109", - "name": "topmenu", - "level": "25", - "description": "Top menu", - "value": "0", - "type": "boolean", - "category": "interface", - "subcategory": "theme" - }, - { - "id": "223", - "name": "tmdb_api_key", - "level": "75", - "description": "TMDb API key", - "value": "geswrg0f0edfghdgthsrgsg4342454", - "type": "string", - "category": "plugins", - "subcategory": "tmdb" - }, - { - "id": "55", - "name": "transcode", - "level": "25", - "description": "Allow Transcoding", - "value": "default", - "type": "string", - "category": "streaming", - "subcategory": "transcoding" - }, - { - "id": "52", - "name": "rate_limit", - "level": "100", - "description": "Rate Limit", - "value": "16384", - "type": "integer", - "category": "streaming", - "subcategory": "transcoding" - }, - { - "id": "19", - "name": "transcode_bitrate", - "level": "25", - "description": "Transcode Bitrate", - "value": "192", - "type": "string", - "category": "streaming", - "subcategory": "transcoding" - }, - { - "id": "222", - "name": "tvdb_api_key", - "level": "75", - "description": "TVDb API key", - "value": "geswrg0f0edfghdgthsrgsg4342454", - "type": "string", - "category": "plugins", - "subcategory": "tvdb" - } - ] -} \ No newline at end of file diff --git a/docs/json-responses/users.json b/docs/json-responses/users.json deleted file mode 100644 index e91f657f..00000000 --- a/docs/json-responses/users.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "user": [ - { - "id": "1", - "username": "user" - }, - { - "id": "4", - "username": "generic" - }, - { - "id": "10", - "username": "glen" - }, - { - "id": "21", - "username": "shaun" - }, - { - "id": "22", - "username": "jake" - } - ] - } -] \ No newline at end of file diff --git a/docs/json-responses/video.json b/docs/json-responses/video.json index 1ba193d8..51a4bc45 100644 --- a/docs/json-responses/video.json +++ b/docs/json-responses/video.json @@ -1,16 +1,11 @@ -{ - "id": "1", - "title": "SPACE Magic Fly (1977) - https:\/\/archive.org\/details\/SPACE_Magic_Fly_1977", - "mime": "video\/mp4", - "resolution": "640x480", - "size": 20084777, - "genre": [], - "time": 193, - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=video&oid=1&uid=4&player=api&name=SPACE%20%20%20Magic%20Fly%20-1977-%20-%20https-archive.org-details-SPACE-Magic-Fly-1977.mp4", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=video&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 3 -} \ No newline at end of file +[ + { + "id": "1263", + "title": "Blaze Control", + "mime": "video\/x-matroska", + "resolution": "640x480", + "size": 5685786, + "tag": [], + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=video&oid=1263&uid=2&player=api&name=Blaze%20Control.webm" + } +] \ No newline at end of file diff --git a/docs/json-responses/videos.json b/docs/json-responses/videos.json index 390477f2..9f591972 100644 --- a/docs/json-responses/videos.json +++ b/docs/json-responses/videos.json @@ -1,36 +1,38 @@ -{ - "video": [ - { - "id": "2", - "title": "Magic Fly", - "mime": "video\/ogg", - "resolution": "400x300", - "size": 14950742, - "genre": [], - "time": 0, - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=video&oid=2&uid=4&player=api&name=Magic%20Fly.ogv", - "art": "https:\/\/music.com.au\/image.php?object_id=2&object_type=video&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 1 - }, - { - "id": "1", - "title": "SPACE Magic Fly (1977) - https:\/\/archive.org\/details\/SPACE_Magic_Fly_1977", - "mime": "video\/mp4", - "resolution": "640x480", - "size": 20084777, - "genre": [], - "time": 193, - "url": "https:\/\/music.com.au\/play\/index.php?ssid=cfj3f237d563f479f5223k23189dbb34&type=video&oid=1&uid=4&player=api&name=SPACE%20%20%20Magic%20Fly%20-1977-%20-%20https-archive.org-details-SPACE-Magic-Fly-1977.mp4", - "art": "https:\/\/music.com.au\/image.php?object_id=1&object_type=video&auth=eeb9f1b6056246a7d563f479f518bb34&name=art.png", - "flag": 0, - "preciserating": null, - "rating": null, - "averagerating": "", - "playcount": 3 - } - ] -} \ No newline at end of file +[ + { + "id": "1263", + "title": "Blaze Control", + "mime": "video\/x-matroska", + "resolution": "640x480", + "size": 5685786, + "tag": [], + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=video&oid=1263&uid=2&player=api&name=Blaze%20Control.webm" + }, + { + "id": "1258", + "title": "Futurama", + "mime": "video\/x-matroska", + "resolution": "960x720", + "size": 201563070, + "tag": [], + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=video&oid=1258&uid=2&player=api&name=Futurama.webm" + }, + { + "id": "1260", + "title": "Futurama", + "mime": "video\/x-matroska", + "resolution": "960x720", + "size": 215266908, + "tag": [], + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=video&oid=1260&uid=2&player=api&name=Futurama.webm" + }, + { + "id": "1262", + "title": "Hear.Life.Spoken", + "mime": "video\/x-matroska", + "resolution": "1920x1080", + "size": 124125138, + "tag": [], + "url": "https:\/\/music.com.au\/play\/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=video&oid=1262&uid=2&player=api&name=Hear.Life.Spoken.webm" + } +] \ No newline at end of file diff --git a/docs/xml-responses/advanced_search (album).xml b/docs/xml-responses/advanced_search (album).xml index 2e53b156..1a26408c 100644 --- a/docs/xml-responses/advanced_search (album).xml +++ b/docs/xml-responses/advanced_search (album).xml @@ -1,21 +1,62 @@ - + - 9 - - - - - 2007 - - 12 - 1 - - - - 1 - 5 - 5 - 3 - - +4 + + + + 2000 + 8 + 1 + + + + 0 + + + + + + + + + 1983 + 4 + 1 + + 1 + 5 + 5 + + + + + + + 2010 + 19 + 9 + + + + + + 1 + 5 + 5 + + + + + + + 2016 + 10 + 1 + + 0 + + + + + diff --git a/docs/xml-responses/advanced_search (artist).xml b/docs/xml-responses/advanced_search (artist).xml index 0aaa5c80..b657a404 100644 --- a/docs/xml-responses/advanced_search (artist).xml +++ b/docs/xml-responses/advanced_search (artist).xml @@ -1,39 +1,97 @@ - + - 17 - - - - 1 - - 9 - - 0 - - - 5 - - - - 0 - - - - - - - 1 - - 12 - - 1 - 5 - 5 - 3 - - - - 0 - - +4 + + + + + + + + + 2 + 25 + + 0 + + + + + + 0 + + + + + + + + + + + + + + + 25 + 231 + + 1 + 5 + 5 + + + + 0 + + + + + + + + + + + + 3 + 31 + + 0 + + + + + + 0 + + + + + + + + + + + 6 + 45 + + 0 + + + + + + 0 + + diff --git a/docs/xml-responses/advanced_search (song).xml b/docs/xml-responses/advanced_search (song).xml index 7d87fee1..77dce095 100644 --- a/docs/xml-responses/advanced_search (song).xml +++ b/docs/xml-responses/advanced_search (song).xml @@ -1,92 +1,168 @@ - + - 75 - - <![CDATA[Dance with the Devil]]> - - - - - - 3 - - 1 - - 2012 - 32582 - 44100 - - - - 483444 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Don't Show This Message Again]]> - - - - - - 12 - - - 2 - - 2005 - 232690 - 44100 - - - - 5755191 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - +4 + + <![CDATA[Baker Street]]> + + + + + + + + 2 + 1 + + 1998 + 320000 + 44100 + + + + 13650833 + + + + + + 1 + 5 + 5 + + 1 + 2 + + + + + + eng + 0.000000 + 0.000000 + -7.200000 + 1.000000 + + + + + + <![CDATA[Coma (original version)]]> + + + + + + 4 + 2 + + 1998 + 250659 + 44100 + + + + 12778055 + + + + + + 1 + 5 + 5 + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + -5.670000 + 0.977000 + + + + <![CDATA[Crush]]> + + + + + + 5 + 3 + + 2010 + 320000 + 44100 + + + + 10357155 + + + + + + 1 + 5 + 5 + + 1 + 2 + + + + + + eng + 0.000000 + 0.000000 + -11.120000 + 1.000000 + + + + <![CDATA[Fasten Your Seatbelt]]> + + + + + + 4 + 4 + + 2007 + 320000 + 44100 + + + + 15937872 + + + + + + 1 + 5 + 5 + + 1 + 2 + + + + + + eng + 0.000000 + 0.000000 + -9.080000 + 1.000000 + + diff --git a/docs/xml-responses/album (with include).xml b/docs/xml-responses/album (with include).xml deleted file mode 100644 index 61fe050b..00000000 --- a/docs/xml-responses/album (with include).xml +++ /dev/null @@ -1,401 +0,0 @@ - - - 9 - - - - - 2012 - - - <![CDATA[I wanna walk through the fire]]> - - - - - - 1 - - 1 - - 2012 - 267320 - 44100 - - - - 6651911 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.150000 - 0.989000 - - - - - <![CDATA[He is the Master of War]]> - - - - - - 2 - - 2 - - 2012 - 256245 - 44100 - - - - 7535126 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -10.740000 - 1.035000 - - - - - <![CDATA[Dance with the Devil]]> - - - - - - 3 - - 3 - - 2012 - 32582 - 44100 - - - - 483444 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Representin]]> - - - - - - 4 - - 4 - - 2012 - 123814 - 44100 - - - - 3628327 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 1.910000 - 0.851000 - - - - - <![CDATA[The art of free expression]]> - - - - - - 5 - - 5 - - 2012 - 32582 - 44100 - - - - 460498 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[I've been down this road before]]> - - - - - - 6 - - 6 - - 2012 - 32582 - 44100 - - - - 1035322 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Are we going Crazy]]> - - - - - - 7 - - 7 - - 2012 - 32582 - 44100 - - - - 1776580 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Personal Truth]]> - - - - - - 8 - - 8 - - 2012 - 179860 - 44100 - - - - 4693165 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -8.270000 - 0.881000 - - - - - <![CDATA[Arrest Me]]> - - - - - - 9 - - - 9 - - 2012 - 252864 - 44100 - - - - 3091727 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -1.350000 - 0.881000 - - - - - 9 - 1 - compilation - - - 0 - - - - - - diff --git a/docs/xml-responses/album.xml b/docs/xml-responses/album.xml index 160d64d1..3604b442 100644 --- a/docs/xml-responses/album.xml +++ b/docs/xml-responses/album.xml @@ -1,21 +1,18 @@ - + - 9 - - - - - 2012 - - 9 - 1 - compilation - - - 0 - - - - - +1 + + + + 2010 + 8 + 1 + + + 0 + + + + + diff --git a/docs/xml-responses/album_songs.xml b/docs/xml-responses/album_songs.xml index 30ebd6bd..86d3cdbd 100644 --- a/docs/xml-responses/album_songs.xml +++ b/docs/xml-responses/album_songs.xml @@ -1,172 +1,164 @@ - + - 75 - - <![CDATA[I wanna walk through the fire]]> - - - - - - 1 - - 1 - - 2012 - 267320 - 44100 - - - - 6651911 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.150000 - 0.989000 - - - - - <![CDATA[He is the Master of War]]> - - - - - - 2 - - 2 - - 2012 - 256245 - 44100 - - - - 7535126 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -10.740000 - 1.035000 - - - - - <![CDATA[Dance with the Devil]]> - - - - - - 3 - - 3 - - 2012 - 32582 - 44100 - - - - 483444 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Representin]]> - - - - - - 4 - - 4 - - 2012 - 123814 - 44100 - - - - 3628327 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 1.910000 - 0.851000 - - - +4 + + <![CDATA[Polar Bear]]> + + + + + + 1 + 1 + + 2010 + 320000 + 48000 + + + + 9697600 + + + + + + 0 + + + + 1 + 2 + + + + + + eng + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + + <![CDATA[Potions (Deliverance mix)]]> + + + + + + 2 + 2 + + 2010 + 320000 + 48000 + + + + 11112640 + + + + + + 0 + + + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + + <![CDATA[The Humbling River (Nagual del Judith mix)]]> + + + + + + 3 + 3 + + 2010 + 320000 + 48000 + + + + 11753920 + + + + + + 0 + + + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + + <![CDATA[Vagina Mine (Alive @ Club Nokia)]]> + + + + + + 4 + 4 + + 2010 + 320000 + 48000 + + + + 12323200 + + + + + + 0 + + + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + diff --git a/docs/xml-responses/albums (with include).xml b/docs/xml-responses/albums (with include).xml deleted file mode 100644 index 61fe050b..00000000 --- a/docs/xml-responses/albums (with include).xml +++ /dev/null @@ -1,401 +0,0 @@ - - - 9 - - - - - 2012 - - - <![CDATA[I wanna walk through the fire]]> - - - - - - 1 - - 1 - - 2012 - 267320 - 44100 - - - - 6651911 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.150000 - 0.989000 - - - - - <![CDATA[He is the Master of War]]> - - - - - - 2 - - 2 - - 2012 - 256245 - 44100 - - - - 7535126 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -10.740000 - 1.035000 - - - - - <![CDATA[Dance with the Devil]]> - - - - - - 3 - - 3 - - 2012 - 32582 - 44100 - - - - 483444 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Representin]]> - - - - - - 4 - - 4 - - 2012 - 123814 - 44100 - - - - 3628327 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 1.910000 - 0.851000 - - - - - <![CDATA[The art of free expression]]> - - - - - - 5 - - 5 - - 2012 - 32582 - 44100 - - - - 460498 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[I've been down this road before]]> - - - - - - 6 - - 6 - - 2012 - 32582 - 44100 - - - - 1035322 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Are we going Crazy]]> - - - - - - 7 - - 7 - - 2012 - 32582 - 44100 - - - - 1776580 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Personal Truth]]> - - - - - - 8 - - 8 - - 2012 - 179860 - 44100 - - - - 4693165 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -8.270000 - 0.881000 - - - - - <![CDATA[Arrest Me]]> - - - - - - 9 - - - 9 - - 2012 - 252864 - 44100 - - - - 3091727 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -1.350000 - 0.881000 - - - - - 9 - 1 - compilation - - - 0 - - - - - - diff --git a/docs/xml-responses/albums.xml b/docs/xml-responses/albums.xml index 160d64d1..3604b442 100644 --- a/docs/xml-responses/albums.xml +++ b/docs/xml-responses/albums.xml @@ -1,21 +1,18 @@ - + - 9 - - - - - 2012 - - 9 - 1 - compilation - - - 0 - - - - - +1 + + + + 2010 + 8 + 1 + + + 0 + + + + + diff --git a/docs/xml-responses/artist (with include albums).xml b/docs/xml-responses/artist (with include albums).xml deleted file mode 100644 index 54a581f3..00000000 --- a/docs/xml-responses/artist (with include albums).xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 17 - - - - - - - - - 2007 - - 12 - 1 - - - - 1 - 5 - 5 - 3 - - - - 1 - - 12 - - 1 - 5 - 5 - 3 - - - - 0 - - - diff --git a/docs/xml-responses/artist (with include songs).xml b/docs/xml-responses/artist (with include songs).xml deleted file mode 100644 index 36eb8d57..00000000 --- a/docs/xml-responses/artist (with include songs).xml +++ /dev/null @@ -1,539 +0,0 @@ - - - 17 - - - - - 1 - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 1 - - 2007 - 20627 - 22050 - - - - 1298295 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 2 - - 2007 - 64000 - 22050 - - - - 4010069 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.110000 - 1.000000 - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 3 - - 2007 - 20627 - 22050 - - - - 754935 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 4 - - 2007 - 64000 - 22050 - - - - 2325568 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 2.750000 - 0.716000 - - - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - - - 5 - - 2007 - 64000 - 22050 - - - - 3131519 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.130000 - 1.000000 - - - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - - - 6 - - 2007 - 20627 - 22050 - - - - 1014135 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[BrownSmoke]]> - - - - - - 4 - - - 7 - - 2007 - 20627 - 22050 - - - - 792375 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[BrownSmoke]]> - - - - - - 4 - - - 8 - - 2007 - 64000 - 22050 - - - - 2441886 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 0.960000 - 0.912000 - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 9 - - 2007 - 20627 - 44100 - - - - 1044851 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 10 - - 2007 - 20627 - 22050 - - - - 1041065 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 11 - - 2007 - 64000 - 22050 - - - - 3209886 - - - - - - 0 - - - - 1 - 1 - - - - - - - - - -4.060000 - 1.000000 - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 12 - - 2007 - 64000 - 22050 - - - - 3209468 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - -2.880000 - 0.977000 - - - - - 12 - - 1 - 5 - 5 - 3 - - - - 0 - - - diff --git a/docs/xml-responses/artist (with include songs,albums).xml b/docs/xml-responses/artist (with include songs,albums).xml deleted file mode 100644 index d641a4c9..00000000 --- a/docs/xml-responses/artist (with include songs,albums).xml +++ /dev/null @@ -1,557 +0,0 @@ - - - 17 - - - - - - - - - 2007 - - 12 - 1 - - - - 1 - 5 - 5 - 3 - - - - 1 - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 1 - - 2007 - 20627 - 22050 - - - - 1298295 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 2 - - 2007 - 64000 - 22050 - - - - 4010069 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.110000 - 1.000000 - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 3 - - 2007 - 20627 - 22050 - - - - 754935 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 4 - - 2007 - 64000 - 22050 - - - - 2325568 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 2.750000 - 0.716000 - - - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - - - 5 - - 2007 - 64000 - 22050 - - - - 3131519 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.130000 - 1.000000 - - - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - - - 6 - - 2007 - 20627 - 22050 - - - - 1014135 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[BrownSmoke]]> - - - - - - 4 - - - 7 - - 2007 - 20627 - 22050 - - - - 792375 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[BrownSmoke]]> - - - - - - 4 - - - 8 - - 2007 - 64000 - 22050 - - - - 2441886 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 0.960000 - 0.912000 - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 9 - - 2007 - 20627 - 44100 - - - - 1044851 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 10 - - 2007 - 20627 - 22050 - - - - 1041065 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 11 - - 2007 - 64000 - 22050 - - - - 3209886 - - - - - - 0 - - - - 1 - 1 - - - - - - - - - -4.060000 - 1.000000 - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 12 - - 2007 - 64000 - 22050 - - - - 3209468 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - -2.880000 - 0.977000 - - - - - 12 - - 1 - 5 - 5 - 3 - - - - 0 - - - diff --git a/docs/xml-responses/artist (with include).xml b/docs/xml-responses/artist (with include).xml deleted file mode 100644 index 40186375..00000000 --- a/docs/xml-responses/artist (with include).xml +++ /dev/null @@ -1,83 +0,0 @@ - - - 17 - - - - - - - - - 2012 - - 7 - 1 - - - 0 - - - - - - - 1 - - - <![CDATA[Arrest Me]]> - - - - - - 10 - - - 1 - - 2012 - 252864 - 44100 - - - - 3089501 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - diff --git a/docs/xml-responses/artist.xml b/docs/xml-responses/artist.xml index 6840c643..6dc1722a 100644 --- a/docs/xml-responses/artist.xml +++ b/docs/xml-responses/artist.xml @@ -1,22 +1,19 @@ - + - 17 - - - - - 1 - - 12 - - 1 - 5 - 5 - 3 - - - - 0 - - +1 + + + + 1 + 18 + + 0 + + + + + + 0 + + diff --git a/docs/xml-responses/artist_albums.xml b/docs/xml-responses/artist_albums.xml index 2e53b156..e84ff43c 100644 --- a/docs/xml-responses/artist_albums.xml +++ b/docs/xml-responses/artist_albums.xml @@ -1,21 +1,17 @@ - + - 9 - - - - - 2007 - - 12 - 1 - - - - 1 - 5 - 5 - 3 - - +1 + + + + 2018 + 18 + 1 + + 0 + + + + + diff --git a/docs/xml-responses/artist_songs.xml b/docs/xml-responses/artist_songs.xml index 2b5f44cb..5ae5cd8c 100644 --- a/docs/xml-responses/artist_songs.xml +++ b/docs/xml-responses/artist_songs.xml @@ -1,176 +1,164 @@ - + - 75 - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 1 - - 2007 - 20627 - 22050 - - - - 1298295 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 2 - - 2007 - 64000 - 22050 - - - - 4010069 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.110000 - 1.000000 - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 3 - - 2007 - 20627 - 22050 - - - - 754935 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 4 - - 2007 - 64000 - 22050 - - - - 2325568 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 2.750000 - 0.716000 - - - +4 + + <![CDATA[Alles auf Anfang]]> + + + + + + 1 + 1 + + 2018 + 320038 + 44100 + + + + 8781742 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -11.100000 + 0.977000 + + + + <![CDATA[Hallo Leben]]> + + + + + + 2 + 2 + + 2018 + 320036 + 44100 + + + + 9147456 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -12.350000 + 0.989000 + + + + <![CDATA[Zeiten ändern dich]]> + + + + + + 3 + 3 + + 2018 + 320032 + 44100 + + + + 10167276 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -11.310000 + 0.944000 + + + + <![CDATA[Ein Licht für dich]]> + + + + + + 4 + 4 + + 2018 + 320041 + 44100 + + + + 8134950 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -11.470000 + 0.977000 + + diff --git a/docs/xml-responses/artists (with include albums).xml b/docs/xml-responses/artists (with include albums).xml deleted file mode 100644 index 8ea2b245..00000000 --- a/docs/xml-responses/artists (with include albums).xml +++ /dev/null @@ -1,144 +0,0 @@ - - - 17 - - - - - - - - 1996 - - 9 - 1 - - - 0 - - - 5 - - - - 1 - - 9 - - 0 - - - 5 - - - - 0 - - - - - - - - - - 2012 - - 9 - 1 - compilation - - - 0 - - - - - - - 0 - - 1 - - 0 - - - - - - - 0 - - - - - - - - - - 2012 - - 9 - 1 - compilation - - - 0 - - - - - - - 0 - - 1 - - 0 - - - - - - - 0 - - - - - - - - - - - 2005 - - 20 - 1 - album - - - 0 - - - - - - - 1 - - 20 - - 0 - - - - - - - 0 - - - diff --git a/docs/xml-responses/artists (with include songs).xml b/docs/xml-responses/artists (with include songs).xml deleted file mode 100644 index 44db3ed4..00000000 --- a/docs/xml-responses/artists (with include songs).xml +++ /dev/null @@ -1,1459 +0,0 @@ - - - 17 - - - - 1 - - - <![CDATA[Malkuth - Intro]]> - - - - - - 1 - - 1 - - 1996 - 80962 - 44100 - - - - 930226 - - - - - - 0 - - - 2 - 1 - 1 - - - - - - - - - 1.980000 - 0.861000 - - - - - <![CDATA[The Prophecies Of The Horned One]]> - - - - - - 2 - - 2 - - 1996 - 89965 - 44100 - - - - 4265791 - - - - - - 0 - - - 5 - 0 - 1 - - - - - - - - - -10.510000 - 1.000000 - - - - - <![CDATA[In The Seven Woods]]> - - - - - - 3 - - 3 - - 1996 - 84423 - 44100 - - - - 4444403 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -9.700000 - 1.000000 - - - - - <![CDATA[The Infernal Serpent]]> - - - - - - 4 - - 4 - - 1996 - 100053 - 44100 - - - - 5066698 - - - - - - 0 - - - 4 - 0 - 1 - - - - - - - - - -11.260000 - 1.000000 - - - - - <![CDATA[Moremque Sinistrum Sacrorum]]> - - - - - - 5 - - 5 - - 1996 - 106647 - 44100 - - - - 2202971 - - - - - - 0 - - - 3 - 0 - 1 - - - - - - - - - -7.480000 - 1.000000 - - - - - <![CDATA[The Prophecies Of The Horned One (Instrumental Re-Recording)]]> - - - - - - 6 - - 6 - - 1996 - 143788 - 44100 - - - - 7696008 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.660000 - 1.000000 - - - - - <![CDATA[In The Seven Woods (Instrumental Re-Recording)]]> - - - - - - 7 - - 7 - - 1996 - 138338 - 44100 - - - - 7826238 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.210000 - 1.000000 - - - - - <![CDATA[The Infernal Serpent (Instrumental Re-Recording)]]> - - - - - - 8 - - 8 - - 1996 - 139453 - 44100 - - - - 9722091 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.240000 - 1.000000 - - - - - <![CDATA[Rehearsal Tape (1996)]]> - - - - - - 9 - - 9 - - 1996 - 66912 - 44100 - - - - 8219821 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -9.560000 - 1.000000 - - - - - 9 - - 0 - - - 5 - - - - 0 - - - - - - 0 - - - <![CDATA[Are we going Crazy]]> - - - - - - 7 - - 1 - - 2012 - 32582 - 44100 - - - - 1776580 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - - - - 0 - - - <![CDATA[Dance with the Devil]]> - - - - - - 3 - - 1 - - 2012 - 32582 - 44100 - - - - 483444 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - - - - - 1 - - - <![CDATA[Can I Help U?]]> - - - - - - 1 - - - 1 - - 2005 - 216839 - 44100 - - - - 2811819 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Planetary Picknick]]> - - - - - - 2 - - - 2 - - 2005 - 238812 - 44100 - - - - 10715592 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Sorry]]> - - - - - - 3 - - - 3 - - 2005 - 239161 - 44100 - - - - 6018213 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Freeze the Cut]]> - - - - - - 4 - - - 4 - - 2005 - 246979 - 44100 - - - - 5216305 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Take a Look]]> - - - - - - 5 - - - 5 - - 2005 - 243729 - 44100 - - - - 7018987 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[True Form]]> - - - - - - 6 - - - 6 - - 2005 - 243031 - 44100 - - - - 5848663 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Thursday Is Thursty]]> - - - - - - 7 - - - 7 - - 2005 - 225219 - 44100 - - - - 2607497 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Whenever You Wanna Call Me]]> - - - - - - 8 - - - 8 - - 2005 - 250322 - 44100 - - - - 5897286 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[As Pure as Possible]]> - - - - - - 9 - - - 9 - - 2005 - 234690 - 44100 - - - - 3789410 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[She Knows Me Now]]> - - - - - - 10 - - - 10 - - 2005 - 217167 - 44100 - - - - 5690938 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Remember Something I Forgot]]> - - - - - - 11 - - - 11 - - 2005 - 235109 - 44100 - - - - 4816734 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Don't Show This Message Again]]> - - - - - - 12 - - - 12 - - 2005 - 232690 - 44100 - - - - 5755191 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Kurz Vor Danach Ganz '05]]> - - - - - - 13 - - - 13 - - 2005 - 230429 - 44100 - - - - 7136353 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Emotional Draft]]> - - - - - - 14 - - - 14 - - 2005 - 235925 - 44100 - - - - 11216864 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Hairy Crushed Nuts]]> - - - - - - 15 - - - 15 - - 2005 - 248806 - 44100 - - - - 8328099 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[The Hunt]]> - - - - - - 16 - - - 16 - - 2005 - 224425 - 44100 - - - - 6373874 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Something to Do]]> - - - - - - 17 - - - 17 - - 2005 - 246373 - 44100 - - - - 8072761 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Go on, Take It Further]]> - - - - - - 18 - - - 18 - - 2005 - 206742 - 44100 - - - - 1795861 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Swabian Sound System]]> - - - - - - 19 - - - 19 - - 2005 - 244202 - 44100 - - - - 8594721 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Miles of Smiles]]> - - - - - - 20 - - - 20 - - 2005 - 247925 - 44100 - - - - 9028758 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - 20 - - 0 - - - - - - - 0 - - - diff --git a/docs/xml-responses/artists (with include songs,albums).xml b/docs/xml-responses/artists (with include songs,albums).xml deleted file mode 100644 index 1baca30d..00000000 --- a/docs/xml-responses/artists (with include songs,albums).xml +++ /dev/null @@ -1,1530 +0,0 @@ - - - 17 - - - - - - - - 1996 - - 9 - 1 - - - 0 - - - 5 - - - - 1 - - - <![CDATA[Malkuth - Intro]]> - - - - - - 1 - - 1 - - 1996 - 80962 - 44100 - - - - 930226 - - - - - - 0 - - - 2 - 1 - 1 - - - - - - - - - 1.980000 - 0.861000 - - - - - <![CDATA[The Prophecies Of The Horned One]]> - - - - - - 2 - - 2 - - 1996 - 89965 - 44100 - - - - 4265791 - - - - - - 0 - - - 5 - 0 - 1 - - - - - - - - - -10.510000 - 1.000000 - - - - - <![CDATA[In The Seven Woods]]> - - - - - - 3 - - 3 - - 1996 - 84423 - 44100 - - - - 4444403 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -9.700000 - 1.000000 - - - - - <![CDATA[The Infernal Serpent]]> - - - - - - 4 - - 4 - - 1996 - 100053 - 44100 - - - - 5066698 - - - - - - 0 - - - 4 - 0 - 1 - - - - - - - - - -11.260000 - 1.000000 - - - - - <![CDATA[Moremque Sinistrum Sacrorum]]> - - - - - - 5 - - 5 - - 1996 - 106647 - 44100 - - - - 2202971 - - - - - - 0 - - - 3 - 0 - 1 - - - - - - - - - -7.480000 - 1.000000 - - - - - <![CDATA[The Prophecies Of The Horned One (Instrumental Re-Recording)]]> - - - - - - 6 - - 6 - - 1996 - 143788 - 44100 - - - - 7696008 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.660000 - 1.000000 - - - - - <![CDATA[In The Seven Woods (Instrumental Re-Recording)]]> - - - - - - 7 - - 7 - - 1996 - 138338 - 44100 - - - - 7826238 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.210000 - 1.000000 - - - - - <![CDATA[The Infernal Serpent (Instrumental Re-Recording)]]> - - - - - - 8 - - 8 - - 1996 - 139453 - 44100 - - - - 9722091 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.240000 - 1.000000 - - - - - <![CDATA[Rehearsal Tape (1996)]]> - - - - - - 9 - - 9 - - 1996 - 66912 - 44100 - - - - 8219821 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -9.560000 - 1.000000 - - - - - 9 - - 0 - - - 5 - - - - 0 - - - - - - - - - - 2012 - - 9 - 1 - compilation - - - 0 - - - - - - - 0 - - - <![CDATA[Are we going Crazy]]> - - - - - - 7 - - 1 - - 2012 - 32582 - 44100 - - - - 1776580 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - - - - - - - - 2012 - - 9 - 1 - compilation - - - 0 - - - - - - - 0 - - - <![CDATA[Dance with the Devil]]> - - - - - - 3 - - 1 - - 2012 - 32582 - 44100 - - - - 483444 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - - - - - - - - - 2005 - - 20 - 1 - album - - - 0 - - - - - - - 1 - - - <![CDATA[Can I Help U?]]> - - - - - - 1 - - - 1 - - 2005 - 216839 - 44100 - - - - 2811819 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Planetary Picknick]]> - - - - - - 2 - - - 2 - - 2005 - 238812 - 44100 - - - - 10715592 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Sorry]]> - - - - - - 3 - - - 3 - - 2005 - 239161 - 44100 - - - - 6018213 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Freeze the Cut]]> - - - - - - 4 - - - 4 - - 2005 - 246979 - 44100 - - - - 5216305 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Take a Look]]> - - - - - - 5 - - - 5 - - 2005 - 243729 - 44100 - - - - 7018987 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[True Form]]> - - - - - - 6 - - - 6 - - 2005 - 243031 - 44100 - - - - 5848663 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Thursday Is Thursty]]> - - - - - - 7 - - - 7 - - 2005 - 225219 - 44100 - - - - 2607497 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Whenever You Wanna Call Me]]> - - - - - - 8 - - - 8 - - 2005 - 250322 - 44100 - - - - 5897286 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[As Pure as Possible]]> - - - - - - 9 - - - 9 - - 2005 - 234690 - 44100 - - - - 3789410 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[She Knows Me Now]]> - - - - - - 10 - - - 10 - - 2005 - 217167 - 44100 - - - - 5690938 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Remember Something I Forgot]]> - - - - - - 11 - - - 11 - - 2005 - 235109 - 44100 - - - - 4816734 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Don't Show This Message Again]]> - - - - - - 12 - - - 12 - - 2005 - 232690 - 44100 - - - - 5755191 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Kurz Vor Danach Ganz '05]]> - - - - - - 13 - - - 13 - - 2005 - 230429 - 44100 - - - - 7136353 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Emotional Draft]]> - - - - - - 14 - - - 14 - - 2005 - 235925 - 44100 - - - - 11216864 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Hairy Crushed Nuts]]> - - - - - - 15 - - - 15 - - 2005 - 248806 - 44100 - - - - 8328099 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[The Hunt]]> - - - - - - 16 - - - 16 - - 2005 - 224425 - 44100 - - - - 6373874 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Something to Do]]> - - - - - - 17 - - - 17 - - 2005 - 246373 - 44100 - - - - 8072761 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Go on, Take It Further]]> - - - - - - 18 - - - 18 - - 2005 - 206742 - 44100 - - - - 1795861 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Swabian Sound System]]> - - - - - - 19 - - - 19 - - 2005 - 244202 - 44100 - - - - 8594721 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Miles of Smiles]]> - - - - - - 20 - - - 20 - - 2005 - 247925 - 44100 - - - - 9028758 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - 20 - - 0 - - - - - - - 0 - - - diff --git a/docs/xml-responses/artists (with include).xml b/docs/xml-responses/artists (with include).xml deleted file mode 100644 index 421f7f76..00000000 --- a/docs/xml-responses/artists (with include).xml +++ /dev/null @@ -1,790 +0,0 @@ - - - 17 - - - - - - - - 1996 - - 9 - 1 - - 0 - - - - - - - 1 - - - <![CDATA[Malkuth - Intro]]> - - - - - - 1 - - 1 - - 1996 - 96000 - 44100 - - - - 923291 - - - - - - 0 - - - - 1 - 1 - - - - - - - - - - - - - - - <![CDATA[The Prophecies Of The Horned One]]> - - - - - - 2 - - 2 - - 1996 - 88847 - 44100 - - - - 4237971 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[In The Seven Woods]]> - - - - - - 3 - - 3 - - 1996 - 83804 - 44100 - - - - 4414576 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[The Infernal Serpent]]> - - - - - - 4 - - 4 - - 1996 - 99043 - 44100 - - - - 5034384 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Moremque Sinistrum Sacrorum]]> - - - - - - 5 - - 5 - - 1996 - 96000 - 44100 - - - - 2188900 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[The Prophecies Of The Horned One (Instrumental Re-Recording)]]> - - - - - - 6 - - 6 - - 1996 - 96000 - 44100 - - - - 7651772 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[In The Seven Woods (Instrumental Re-Recording)]]> - - - - - - 7 - - 7 - - 1996 - 96000 - 44100 - - - - 7780518 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[The Infernal Serpent (Instrumental Re-Recording)]]> - - - - - - 8 - - 8 - - 1996 - 138607 - 44100 - - - - 9665824 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Rehearsal Tape (1996)]]> - - - - - - 9 - - 9 - - 1996 - 66434 - 44100 - - - - 8160295 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 9 - - 0 - - - - - - - 0 - - - - - - - - - - 2012 - - 7 - 1 - - - 0 - - - - - - - 1 - - - <![CDATA[Are we going Crazy]]> - - - - - - 7 - - 1 - - 2012 - 32582 - 44100 - - - - 1776580 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - - - - - - - - - 2011 - - 4 - 1 - - - 0 - - - - - - - 1 - - - <![CDATA[Sensorisk Deprivation]]> - - - - - - 1 - - - 1 - - 2011 - 385726 - 44100 - - - - 39463403 - - - - - - 0 - - - - 1 - 1 - - - - - - - - - - - - - - - <![CDATA[Vanvett]]> - - - - - - 2 - - - 2 - - 2011 - 371757 - 44100 - - - - 38379313 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Galenskap]]> - - - - - - 3 - - - 3 - - 2011 - 389585 - 44100 - - - - 48620903 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Vansinne]]> - - - - - - 4 - - - 4 - - 2011 - 713079 - 44100 - - - - 70173300 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 4 - - 0 - - - - - - - 0 - - - - - - - - - - 2012 - - 7 - 1 - - - 0 - - - - - - - 1 - - - <![CDATA[I wanna walk through the fire]]> - - - - - - 1 - - 1 - - 2012 - 267320 - 44100 - - - - 6648489 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - diff --git a/docs/xml-responses/artists.xml b/docs/xml-responses/artists.xml index 64a75cf3..1436b416 100644 --- a/docs/xml-responses/artists.xml +++ b/docs/xml-responses/artists.xml @@ -1,73 +1,91 @@ - + - 17 - - - - 1 - - 9 - - 0 - - - 5 - - - - 0 - - - - - - 0 - - 1 - - 0 - - - - - - - 0 - - - - - - 0 - - 1 - - 0 - - - - - - - 0 - - - - - - - 1 - - 20 - - 0 - - - - - - - 0 - - +4 + + + + 1 + 1 + + 0 + + + + + + 0 + + + + + + + + 1 + 15 + + 0 + 4 + 4 + + + + 0 + + + + + + + + + + 20 + 249 + + 0 + 4 + 4 + + + + 0 + + + + + + + + + + + + + + + 22 + 296 + + 0 + 4 + 4 + + + + 0 + + diff --git a/docs/xml-responses/catalog.xml b/docs/xml-responses/catalog.xml deleted file mode 100644 index 5b29f796..00000000 --- a/docs/xml-responses/catalog.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - 4 - - - - - 1 - 1627949046 - 1627949154 - 1626835896 - - - - - diff --git a/docs/xml-responses/catalog_action (error).xml b/docs/xml-responses/catalog_action (error).xml index 6dfa826d..3ef24efd 100644 --- a/docs/xml-responses/catalog_action (error).xml +++ b/docs/xml-responses/catalog_action (error).xml @@ -1,8 +1,4 @@ - + - - - - - + diff --git a/docs/xml-responses/catalog_action.xml b/docs/xml-responses/catalog_action.xml index 98b823eb..8a7c9510 100644 --- a/docs/xml-responses/catalog_action.xml +++ b/docs/xml-responses/catalog_action.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/catalog_file.xml b/docs/xml-responses/catalog_file.xml deleted file mode 100644 index ba938f33..00000000 --- a/docs/xml-responses/catalog_file.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/xml-responses/catalogs.xml b/docs/xml-responses/catalogs.xml deleted file mode 100644 index 78b23b05..00000000 --- a/docs/xml-responses/catalogs.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4 - - - - - 1 - 1627949046 - 1627949154 - 1626835896 - - - - - - - - - 1 - 1617260634 - 1617260599 - 0 - - - - - - - - - 1 - 1617260634 - 1617260634 - 0 - - - - - - - - - 1 - 1627949054 - 1627949144 - 0 - - - - - diff --git a/docs/xml-responses/deleted_podcast_episodes.xml b/docs/xml-responses/deleted_podcast_episodes.xml deleted file mode 100644 index f0d5f3c8..00000000 --- a/docs/xml-responses/deleted_podcast_episodes.xml +++ /dev/null @@ -1,500 +0,0 @@ - - 1617170872 - 1627948508 - <![CDATA[COVID, Quickly, Episode 3: Vaccine Inequality--plus Your Body the Variant Fighter]]> - - 3 - 0 - 0 - 1 - - - 1617170872 - 1627948508 - <![CDATA[Using Dragonflies as Contamination Detectors]]> - - 3 - 0 - 0 - 1 - - - 1617170872 - 1627948508 - <![CDATA[Smartphones Can Hear the Shape of Your Door Keys]]> - - 3 - 0 - 0 - 1 - - - 1617170872 - 1627948508 - <![CDATA[Chimpanzees Show Altruism while Gathering around the Juice Fountain]]> - - 3 - 0 - 0 - 1 - - - 1617170872 - 1627948508 - <![CDATA[Podcast Feed Drop: Introducing Powered by Audio [Sponsored]]]> - - 3 - 0 - 0 - 1 - - - 1617170872 - 1627948508 - <![CDATA[COVID, Quickly, Episode 2: Lessons from a Pandemic Year]]> - - 3 - 0 - 0 - 1 - - - 1617170872 - 1627948508 - <![CDATA[That Mouse in Your House--It's Smarter, Thanks to You]]> - - 3 - 0 - 0 - 1 - - - 1617170872 - 1627948508 - <![CDATA[Kangaroos with Puppy Dog Eyes]]> - - 3 - 0 - 0 - 1 - - - 1617170872 - 1627948508 - <![CDATA[COVID, Quickly, Episode 1: Vaccines, Variants and Diabetes]]> - - 3 - 0 - 0 - 1 - - - 1617260601 - 1627948508 - <![CDATA[Imperiled Freshwater Turtles Are Eating Plastics--Science Is Just Revealing the Threat]]> - - 3 - 0 - 0 - 1 - - - 1627948502 - 1627949127 - <![CDATA[S2 BONUS — The Price]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[S2 08 | End game]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[S2 07 | Reckoning]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[S2 06 | Whatever it takes]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[S2 05 | Glittering prize]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[S2 04 | Rubicon]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[S2 03 | The darkest night]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[S2 02 | One of the crew]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[S2 01 | Nicola]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627949127 - <![CDATA[INTRODUCING Trace season 2 - The Informer]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948502 - <![CDATA[S1 07 | Hope]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948502 - <![CDATA[S1 06 | Limbo]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948502 - <![CDATA[S1 05 | Wait]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948503 - <![CDATA[S1 04 | DNA]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948503 - <![CDATA[S1 03 | Sins]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948503 - <![CDATA[BONUS | How your leads are helping the investigation]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948503 - <![CDATA[S1 02 | Confessions]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948503 - <![CDATA[S1 01 | Bookshop murder]]> - - 3 - 0 - 0 - 5 - - - 1627948502 - 1627948503 - <![CDATA[S1 | Preview]]> - - 3 - 0 - 0 - 5 - - - 1627948504 - 1627948508 - <![CDATA[A 'Universal' Coronavirus Vaccine to Prevent the Next Pandemic]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[COVID, Quickly, Episode 8: The Pandemic's True Death Toll and the Big Lab-Leak Debate]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[Puppies Understand You Even at a Young Age, Most Adorable Study of the Year Confirms]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[New 3-D-Printed Material Is Tough, Flexible--and Alive]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[Bats on Helium Reveal an Innate Sense of the Speed of Sound]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[The Dirty Secret behind Some of the World's Earliest Microscopes]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[COVID, Quickly, Episode 7: The Coming Pandemic Grief Wave, and Mask Whiplash]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[Math and Sleuthing Help to Explain Epidemics of the Past]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[Who Laps Whom on the Walking Track--Tyrannosaurus rex or You? Science Has a New Answer]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[Artificial Light Keeps Mosquitoes Biting Late into the Night]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[COVID, Quickly, Episode 6: The Real Reason for India's Surge and Mask Liftoff]]> - - 3 - 0 - 0 - 1 - - - 1627948504 - 1627948508 - <![CDATA[Male Lyrebirds Lie to Get Sex]]> - - 3 - 0 - 0 - 1 - - - 1627949324 - 1627949324 - <![CDATA[S1 07 | Hope]]> - - 3 - 0 - 0 - 6 - - - 1627949324 - 1627949324 - <![CDATA[S1 06 | Limbo]]> - - 3 - 0 - 0 - 6 - - - 1627949324 - 1627949324 - <![CDATA[S1 05 | Wait]]> - - 3 - 0 - 0 - 6 - - - 1627949324 - 1627949324 - <![CDATA[S1 04 | DNA]]> - - 3 - 0 - 0 - 6 - - - 1627949324 - 1627949324 - <![CDATA[S1 03 | Sins]]> - - 3 - 0 - 0 - 6 - - - 1627949324 - 1627949324 - <![CDATA[BONUS | How your leads are helping the investigation]]> - - 3 - 0 - 0 - 6 - - - 1627949324 - 1627949324 - <![CDATA[S1 02 | Confessions]]> - - 3 - 0 - 0 - 6 - - - 1627949324 - 1627949324 - <![CDATA[S1 01 | Bookshop murder]]> - - 3 - 0 - 0 - 6 - - - 1627949324 - 1627949324 - <![CDATA[S1 | Preview]]> - - 3 - 0 - 0 - 6 - \ No newline at end of file diff --git a/docs/xml-responses/deleted_songs.xml b/docs/xml-responses/deleted_songs.xml deleted file mode 100644 index 5bdeccdd..00000000 --- a/docs/xml-responses/deleted_songs.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/xml-responses/deleted_videos.xml b/docs/xml-responses/deleted_videos.xml deleted file mode 100644 index 5bdeccdd..00000000 --- a/docs/xml-responses/deleted_videos.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/xml-responses/democratic (play).xml b/docs/xml-responses/democratic (play).xml deleted file mode 100644 index a80f02a5..00000000 --- a/docs/xml-responses/democratic (play).xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/xml-responses/democratic (playlist).xml.xml b/docs/xml-responses/democratic (playlist).xml.xml deleted file mode 100644 index ee5b6830..00000000 --- a/docs/xml-responses/democratic (playlist).xml.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - <![CDATA[Two Souls (Fisherman & Hawkins remix)]]> - - - - - - 13 - - - - 14165432 - - - - - 0 - - diff --git a/docs/xml-responses/democratic (vote).xml.xml b/docs/xml-responses/democratic (vote).xml.xml deleted file mode 100644 index e0dff949..00000000 --- a/docs/xml-responses/democratic (vote).xml.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/docs/xml-responses/error-4700.xml b/docs/xml-responses/error-4700.xml deleted file mode 100644 index 01bc4cfe..00000000 --- a/docs/xml-responses/error-4700.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/error-4701.xml b/docs/xml-responses/error-4701.xml deleted file mode 100644 index 9c9c579a..00000000 --- a/docs/xml-responses/error-4701.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/error-4703.xml b/docs/xml-responses/error-4703.xml deleted file mode 100644 index 53dfb178..00000000 --- a/docs/xml-responses/error-4703.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/error-4704.xml b/docs/xml-responses/error-4704.xml deleted file mode 100644 index 5d2edaf3..00000000 --- a/docs/xml-responses/error-4704.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/error-4705.xml b/docs/xml-responses/error-4705.xml deleted file mode 100644 index e8595286..00000000 --- a/docs/xml-responses/error-4705.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/error-4706.xml b/docs/xml-responses/error-4706.xml deleted file mode 100644 index 4fd991db..00000000 --- a/docs/xml-responses/error-4706.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/error-4710.xml b/docs/xml-responses/error-4710.xml deleted file mode 100644 index 57e44b28..00000000 --- a/docs/xml-responses/error-4710.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/error-4742.xml b/docs/xml-responses/error-4742.xml deleted file mode 100644 index 548a7f83..00000000 --- a/docs/xml-responses/error-4742.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/flag.xml b/docs/xml-responses/flag.xml index 223d5672..ccad888e 100644 --- a/docs/xml-responses/flag.xml +++ b/docs/xml-responses/flag.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/followers.xml b/docs/xml-responses/followers.xml index c2a21471..07b2c810 100644 --- a/docs/xml-responses/followers.xml +++ b/docs/xml-responses/followers.xml @@ -1,6 +1,14 @@ - + - - - + + + + + + + + + + + diff --git a/docs/xml-responses/following.xml b/docs/xml-responses/following.xml index 77e00117..9eabfa9c 100644 --- a/docs/xml-responses/following.xml +++ b/docs/xml-responses/following.xml @@ -1,9 +1,29 @@ - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/friends_timeline.xml b/docs/xml-responses/friends_timeline.xml index 8a107bf4..bcbe3cb6 100644 --- a/docs/xml-responses/friends_timeline.xml +++ b/docs/xml-responses/friends_timeline.xml @@ -1,40 +1,41 @@ - - 1614055275 - - 1 + + + 1595916087 + + 77371 - - + + - - 1614055252 + + 1595373969 - 79 + 886242 - - + + - - 1614055014 + + 1595373920 - 76 + 886249 - - + + - - 1614054865 - - 1 - - - + + 1595373814 + + 175079 + + + - + diff --git a/docs/xml-responses/genre.xml b/docs/xml-responses/genre.xml deleted file mode 100644 index eed8ab8d..00000000 --- a/docs/xml-responses/genre.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - 7 - - - 1 - 1 - 4 - 0 - 0 - 0 - - diff --git a/docs/xml-responses/genre_albums.xml b/docs/xml-responses/genre_albums.xml deleted file mode 100644 index e3269a4d..00000000 --- a/docs/xml-responses/genre_albums.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 9 - - - - - 2011 - - 4 - 1 - - - - 0 - - - - - - diff --git a/docs/xml-responses/genre_artists.xml b/docs/xml-responses/genre_artists.xml deleted file mode 100644 index 3d0bc0d9..00000000 --- a/docs/xml-responses/genre_artists.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - 17 - - - - - 1 - - 4 - - 0 - - - - - - - 0 - - - diff --git a/docs/xml-responses/genre_songs.xml b/docs/xml-responses/genre_songs.xml deleted file mode 100644 index 6f53ed76..00000000 --- a/docs/xml-responses/genre_songs.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - 75 - - <![CDATA[Galenskap]]> - - - - - - 3 - - - 1 - - 2011 - 389683 - 44100 - - - - 48633049 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.330000 - 0.977000 - - - - diff --git a/docs/xml-responses/genres.xml b/docs/xml-responses/genres.xml deleted file mode 100644 index d73a4a11..00000000 --- a/docs/xml-responses/genres.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 7 - - - 1 - 1 - 11 - 0 - 0 - 0 - - - - 1 - 1 - 4 - 0 - 0 - 0 - - diff --git a/docs/xml-responses/get_indexes (album with include).xml b/docs/xml-responses/get_indexes (album with include).xml deleted file mode 100644 index 4275e5e3..00000000 --- a/docs/xml-responses/get_indexes (album with include).xml +++ /dev/null @@ -1,1431 +0,0 @@ - - - 9 - - - - - 2012 - - - <![CDATA[I wanna walk through the fire]]> - - - - - - 1 - - 1 - - 2012 - 267320 - 44100 - - - - 6651911 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.150000 - 0.989000 - - - - - <![CDATA[He is the Master of War]]> - - - - - - 2 - - 2 - - 2012 - 256245 - 44100 - - - - 7535126 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -10.740000 - 1.035000 - - - - - <![CDATA[Dance with the Devil]]> - - - - - - 3 - - 3 - - 2012 - 32582 - 44100 - - - - 483444 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Representin]]> - - - - - - 4 - - 4 - - 2012 - 123814 - 44100 - - - - 3628327 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 1.910000 - 0.851000 - - - - - <![CDATA[The art of free expression]]> - - - - - - 5 - - 5 - - 2012 - 32582 - 44100 - - - - 460498 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[I've been down this road before]]> - - - - - - 6 - - 6 - - 2012 - 32582 - 44100 - - - - 1035322 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Are we going Crazy]]> - - - - - - 7 - - 7 - - 2012 - 32582 - 44100 - - - - 1776580 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Personal Truth]]> - - - - - - 8 - - 8 - - 2012 - 179860 - 44100 - - - - 4693165 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -8.270000 - 0.881000 - - - - - <![CDATA[Arrest Me]]> - - - - - - 9 - - - 9 - - 2012 - 252864 - 44100 - - - - 3091727 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -1.350000 - 0.881000 - - - - - 9 - 1 - compilation - - - 0 - - - - - - - - - - 1996 - - - <![CDATA[Malkuth - Intro]]> - - - - - - 1 - - 1 - - 1996 - 80962 - 44100 - - - - 930226 - - - - - - 0 - - - 2 - 1 - 1 - - - - - - - - - 1.980000 - 0.861000 - - - - - <![CDATA[The Prophecies Of The Horned One]]> - - - - - - 2 - - 2 - - 1996 - 89965 - 44100 - - - - 4265791 - - - - - - 0 - - - 5 - 0 - 1 - - - - - - - - - -10.510000 - 1.000000 - - - - - <![CDATA[In The Seven Woods]]> - - - - - - 3 - - 3 - - 1996 - 84423 - 44100 - - - - 4444403 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -9.700000 - 1.000000 - - - - - <![CDATA[The Infernal Serpent]]> - - - - - - 4 - - 4 - - 1996 - 100053 - 44100 - - - - 5066698 - - - - - - 0 - - - 4 - 0 - 1 - - - - - - - - - -11.260000 - 1.000000 - - - - - <![CDATA[Moremque Sinistrum Sacrorum]]> - - - - - - 5 - - 5 - - 1996 - 106647 - 44100 - - - - 2202971 - - - - - - 0 - - - 3 - 0 - 1 - - - - - - - - - -7.480000 - 1.000000 - - - - - <![CDATA[The Prophecies Of The Horned One (Instrumental Re-Recording)]]> - - - - - - 6 - - 6 - - 1996 - 143788 - 44100 - - - - 7696008 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.660000 - 1.000000 - - - - - <![CDATA[In The Seven Woods (Instrumental Re-Recording)]]> - - - - - - 7 - - 7 - - 1996 - 138338 - 44100 - - - - 7826238 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.210000 - 1.000000 - - - - - <![CDATA[The Infernal Serpent (Instrumental Re-Recording)]]> - - - - - - 8 - - 8 - - 1996 - 139453 - 44100 - - - - 9722091 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.240000 - 1.000000 - - - - - <![CDATA[Rehearsal Tape (1996)]]> - - - - - - 9 - - 9 - - 1996 - 66912 - 44100 - - - - 8219821 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -9.560000 - 1.000000 - - - - - 9 - 1 - - - 0 - - - 5 - - - - - - - 2007 - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 1 - - 2007 - 64000 - 22050 - - - - 4010069 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.110000 - 1.000000 - - - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 2 - - 2007 - 20627 - 22050 - - - - 1298295 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 3 - - 2007 - 64000 - 22050 - - - - 2325568 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 2.750000 - 0.716000 - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 4 - - 2007 - 20627 - 22050 - - - - 754935 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - - - 5 - - 2007 - 64000 - 22050 - - - - 3131519 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.130000 - 1.000000 - - - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - - - 6 - - 2007 - 20627 - 22050 - - - - 1014135 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[BrownSmoke]]> - - - - - - 4 - - - 7 - - 2007 - 64000 - 22050 - - - - 2441886 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 0.960000 - 0.912000 - - - - - <![CDATA[BrownSmoke]]> - - - - - - 4 - - - 8 - - 2007 - 20627 - 22050 - - - - 792375 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 9 - - 2007 - 64000 - 22050 - - - - 3209468 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - -2.880000 - 0.977000 - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 10 - - 2007 - 64000 - 22050 - - - - 3209886 - - - - - - 0 - - - - 1 - 1 - - - - - - - - - -4.060000 - 1.000000 - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 11 - - 2007 - 20627 - 44100 - - - - 1044851 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 12 - - 2007 - 20627 - 22050 - - - - 1041065 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 12 - 1 - - - - 1 - 5 - 5 - 3 - - - - - - - 0 - - - <![CDATA[Creeping Lawler 2]]> - - - - - - 1 - - 1 - - 0 - 1411200 - 44100 - - - - 52345628 - - - - - - 0 - - - - 3 - 1 - - - - - - - - - -4.310000 - 0.989000 - - - - - <![CDATA[Creeping Lawler 2]]> - - - - - - 1 - - 2 - - 0 - 177349 - 44100 - - - - 6652448 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -4.320000 - 0.977000 - - - - - 2 - 1 - - - 0 - 3 - 3 - 3 - - - diff --git a/docs/xml-responses/get_indexes (album).xml b/docs/xml-responses/get_indexes (album).xml index cf5c2139..161191b4 100644 --- a/docs/xml-responses/get_indexes (album).xml +++ b/docs/xml-responses/get_indexes (album).xml @@ -1,20 +1,20 @@ - + - 9 - - - - - - - - - - - - - - - - +4 + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/get_indexes (artist with include).xml b/docs/xml-responses/get_indexes (artist with include).xml deleted file mode 100644 index 1baca30d..00000000 --- a/docs/xml-responses/get_indexes (artist with include).xml +++ /dev/null @@ -1,1530 +0,0 @@ - - - 17 - - - - - - - - 1996 - - 9 - 1 - - - 0 - - - 5 - - - - 1 - - - <![CDATA[Malkuth - Intro]]> - - - - - - 1 - - 1 - - 1996 - 80962 - 44100 - - - - 930226 - - - - - - 0 - - - 2 - 1 - 1 - - - - - - - - - 1.980000 - 0.861000 - - - - - <![CDATA[The Prophecies Of The Horned One]]> - - - - - - 2 - - 2 - - 1996 - 89965 - 44100 - - - - 4265791 - - - - - - 0 - - - 5 - 0 - 1 - - - - - - - - - -10.510000 - 1.000000 - - - - - <![CDATA[In The Seven Woods]]> - - - - - - 3 - - 3 - - 1996 - 84423 - 44100 - - - - 4444403 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -9.700000 - 1.000000 - - - - - <![CDATA[The Infernal Serpent]]> - - - - - - 4 - - 4 - - 1996 - 100053 - 44100 - - - - 5066698 - - - - - - 0 - - - 4 - 0 - 1 - - - - - - - - - -11.260000 - 1.000000 - - - - - <![CDATA[Moremque Sinistrum Sacrorum]]> - - - - - - 5 - - 5 - - 1996 - 106647 - 44100 - - - - 2202971 - - - - - - 0 - - - 3 - 0 - 1 - - - - - - - - - -7.480000 - 1.000000 - - - - - <![CDATA[The Prophecies Of The Horned One (Instrumental Re-Recording)]]> - - - - - - 6 - - 6 - - 1996 - 143788 - 44100 - - - - 7696008 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.660000 - 1.000000 - - - - - <![CDATA[In The Seven Woods (Instrumental Re-Recording)]]> - - - - - - 7 - - 7 - - 1996 - 138338 - 44100 - - - - 7826238 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.210000 - 1.000000 - - - - - <![CDATA[The Infernal Serpent (Instrumental Re-Recording)]]> - - - - - - 8 - - 8 - - 1996 - 139453 - 44100 - - - - 9722091 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -12.240000 - 1.000000 - - - - - <![CDATA[Rehearsal Tape (1996)]]> - - - - - - 9 - - 9 - - 1996 - 66912 - 44100 - - - - 8219821 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -9.560000 - 1.000000 - - - - - 9 - - 0 - - - 5 - - - - 0 - - - - - - - - - - 2012 - - 9 - 1 - compilation - - - 0 - - - - - - - 0 - - - <![CDATA[Are we going Crazy]]> - - - - - - 7 - - 1 - - 2012 - 32582 - 44100 - - - - 1776580 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - - - - - - - - 2012 - - 9 - 1 - compilation - - - 0 - - - - - - - 0 - - - <![CDATA[Dance with the Devil]]> - - - - - - 3 - - 1 - - 2012 - 32582 - 44100 - - - - 483444 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - 1 - - 0 - - - - - - - 0 - - - - - - - - - - - 2005 - - 20 - 1 - album - - - 0 - - - - - - - 1 - - - <![CDATA[Can I Help U?]]> - - - - - - 1 - - - 1 - - 2005 - 216839 - 44100 - - - - 2811819 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Planetary Picknick]]> - - - - - - 2 - - - 2 - - 2005 - 238812 - 44100 - - - - 10715592 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Sorry]]> - - - - - - 3 - - - 3 - - 2005 - 239161 - 44100 - - - - 6018213 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Freeze the Cut]]> - - - - - - 4 - - - 4 - - 2005 - 246979 - 44100 - - - - 5216305 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Take a Look]]> - - - - - - 5 - - - 5 - - 2005 - 243729 - 44100 - - - - 7018987 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[True Form]]> - - - - - - 6 - - - 6 - - 2005 - 243031 - 44100 - - - - 5848663 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Thursday Is Thursty]]> - - - - - - 7 - - - 7 - - 2005 - 225219 - 44100 - - - - 2607497 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Whenever You Wanna Call Me]]> - - - - - - 8 - - - 8 - - 2005 - 250322 - 44100 - - - - 5897286 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[As Pure as Possible]]> - - - - - - 9 - - - 9 - - 2005 - 234690 - 44100 - - - - 3789410 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[She Knows Me Now]]> - - - - - - 10 - - - 10 - - 2005 - 217167 - 44100 - - - - 5690938 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Remember Something I Forgot]]> - - - - - - 11 - - - 11 - - 2005 - 235109 - 44100 - - - - 4816734 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Don't Show This Message Again]]> - - - - - - 12 - - - 12 - - 2005 - 232690 - 44100 - - - - 5755191 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Kurz Vor Danach Ganz '05]]> - - - - - - 13 - - - 13 - - 2005 - 230429 - 44100 - - - - 7136353 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Emotional Draft]]> - - - - - - 14 - - - 14 - - 2005 - 235925 - 44100 - - - - 11216864 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Hairy Crushed Nuts]]> - - - - - - 15 - - - 15 - - 2005 - 248806 - 44100 - - - - 8328099 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[The Hunt]]> - - - - - - 16 - - - 16 - - 2005 - 224425 - 44100 - - - - 6373874 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Something to Do]]> - - - - - - 17 - - - 17 - - 2005 - 246373 - 44100 - - - - 8072761 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Go on, Take It Further]]> - - - - - - 18 - - - 18 - - 2005 - 206742 - 44100 - - - - 1795861 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Swabian Sound System]]> - - - - - - 19 - - - 19 - - 2005 - 244202 - 44100 - - - - 8594721 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Miles of Smiles]]> - - - - - - 20 - - - 20 - - 2005 - 247925 - 44100 - - - - 9028758 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - 20 - - 0 - - - - - - - 0 - - - diff --git a/docs/xml-responses/get_indexes (artist).xml b/docs/xml-responses/get_indexes (artist).xml index 088eeba7..92028e10 100644 --- a/docs/xml-responses/get_indexes (artist).xml +++ b/docs/xml-responses/get_indexes (artist).xml @@ -1,20 +1,22 @@ - + - 17 - - - - - - - - - - - - - - - - +4 + + + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/get_indexes (playlist with include).xml b/docs/xml-responses/get_indexes (playlist with include).xml deleted file mode 100644 index bc939f17..00000000 --- a/docs/xml-responses/get_indexes (playlist with include).xml +++ /dev/null @@ -1,53 +0,0 @@ - - - 19 - - - - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40 - 41 - 42 - 43 - - diff --git a/docs/xml-responses/get_indexes (playlist).xml b/docs/xml-responses/get_indexes (playlist).xml index 6a5aa4e6..691cf290 100644 --- a/docs/xml-responses/get_indexes (playlist).xml +++ b/docs/xml-responses/get_indexes (playlist).xml @@ -1,16 +1,20301 @@ - + - 19 - - - - - - - - - - - - +4 + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + 2955 + 2956 + 2957 + 2958 + 2959 + 2960 + 2961 + 2962 + 2963 + 2964 + 2965 + 2966 + 2967 + 2968 + 2969 + 2970 + 2971 + 2972 + 2973 + 2974 + 2975 + 2976 + 2977 + 2978 + 2979 + 2980 + 2981 + 2982 + 2983 + 2984 + 2985 + 2986 + 2987 + 2988 + 2989 + 2990 + 2991 + 2992 + 2993 + 2994 + 2995 + 2996 + 2997 + 2998 + 2999 + 3000 + 3001 + 3002 + 3003 + 3004 + 3005 + 3006 + 3007 + 3008 + 3009 + 3010 + 3011 + 3012 + 3013 + 3014 + 3015 + 3016 + 3017 + 3018 + 3019 + 3020 + 3021 + 3022 + 3023 + 3024 + 3025 + 3026 + 3027 + 3028 + 3029 + 3030 + 3031 + 3032 + 3033 + 3034 + 3035 + 3036 + 3037 + 3038 + 3039 + 3040 + 3041 + 3042 + 3043 + 3044 + 3045 + 3046 + 3047 + 3048 + 3049 + 3050 + 3051 + 3052 + 3053 + 3054 + 3055 + 3056 + 3057 + 3058 + 3059 + 3060 + 3061 + 3062 + 3063 + 3064 + 3065 + 3066 + 3067 + 3068 + 3069 + 3070 + 3071 + 3072 + 3073 + 3074 + 3075 + 3076 + 3077 + 3078 + 3079 + 3080 + 3081 + 3082 + 3083 + 3084 + 3085 + 3086 + 3087 + 3088 + 3089 + 3090 + 3091 + 3092 + 3093 + 3094 + 3095 + 3096 + 3097 + 3098 + 3099 + 3100 + 3101 + 3102 + 3103 + 3104 + 3105 + 3106 + 3107 + 3108 + 3109 + 3110 + 3111 + 3112 + 3113 + 3114 + 3115 + 3116 + 3117 + 3118 + 3119 + 3120 + 3121 + 3122 + 3123 + 3124 + 3125 + 3126 + 3127 + 3128 + 3129 + 3130 + 3131 + 3132 + 3133 + 3134 + 3135 + 3136 + 3137 + 3138 + 3139 + 3140 + 3141 + 3142 + 3143 + 3144 + 3145 + 3146 + 3147 + 3148 + 3149 + 3150 + 3151 + 3152 + 3153 + 3154 + 3155 + 3156 + 3157 + 3158 + 3159 + 3160 + 3161 + 3162 + 3163 + 3164 + 3165 + 3166 + 3167 + 3168 + 3169 + 3170 + 3171 + 3172 + 3173 + 3174 + 3175 + 3176 + 3177 + 3178 + 3179 + 3180 + 3181 + 3182 + 3183 + 3184 + 3185 + 3186 + 3187 + 3188 + 3189 + 3190 + 3191 + 3192 + 3193 + 3194 + 3195 + 3196 + 3197 + 3198 + 3199 + 3200 + 3201 + 3202 + 3203 + 3204 + 3205 + 3206 + 3207 + 3208 + 3209 + 3210 + 3211 + 3212 + 3213 + 3214 + 3215 + 3216 + 3217 + 3218 + 3219 + 3220 + 3221 + 3222 + 3223 + 3224 + 3225 + 3226 + 3227 + 3228 + 3229 + 3230 + 3231 + 3232 + 3233 + 3234 + 3235 + 3236 + 3237 + 3238 + 3239 + 3240 + 3241 + 3242 + 3243 + 3244 + 3245 + 3246 + 3247 + 3248 + 3249 + 3250 + 3251 + 3252 + 3253 + 3254 + 3255 + 3256 + 3257 + 3258 + 3259 + 3260 + 3261 + 3262 + 3263 + 3264 + 3265 + 3266 + 3267 + 3268 + 3269 + 3270 + 3271 + 3272 + 3273 + 3274 + 3275 + 3276 + 3277 + 3278 + 3279 + 3280 + 3281 + 3282 + 3283 + 3284 + 3285 + 3286 + 3287 + 3288 + 3289 + 3290 + 3291 + 3292 + 3293 + 3294 + 3295 + 3296 + 3297 + 3298 + 3299 + 3300 + 3301 + 3302 + 3303 + 3304 + 3305 + 3306 + 3307 + 3308 + 3309 + 3310 + 3311 + 3312 + 3313 + 3314 + 3315 + 3316 + 3317 + 3318 + 3319 + 3320 + 3321 + 3322 + 3323 + 3324 + 3325 + 3326 + 3327 + 3328 + 3329 + 3330 + 3331 + 3332 + 3333 + 3334 + 3335 + 3336 + 3337 + 3338 + 3339 + 3340 + 3341 + 3342 + 3343 + 3344 + 3345 + 3346 + 3347 + 3348 + 3349 + 3350 + 3351 + 3352 + 3353 + 3354 + 3355 + 3356 + 3357 + 3358 + 3359 + 3360 + 3361 + 3362 + 3363 + 3364 + 3365 + 3366 + 3367 + 3368 + 3369 + 3370 + 3371 + 3372 + 3373 + 3374 + 3375 + 3376 + 3377 + 3378 + 3379 + 3380 + 3381 + 3382 + 3383 + 3384 + 3385 + 3386 + 3387 + 3388 + 3389 + 3390 + 3391 + 3392 + 3393 + 3394 + 3395 + 3396 + 3397 + 3398 + 3399 + 3400 + 3401 + 3402 + 3403 + 3404 + 3405 + 3406 + 3407 + 3408 + 3409 + 3410 + 3411 + 3412 + 3413 + 3414 + 3415 + 3416 + 3417 + 3418 + 3419 + 3420 + 3421 + 3422 + 3423 + 3424 + 3425 + 3426 + 3427 + 3428 + 3429 + 3430 + 3431 + 3432 + 3433 + 3434 + 3435 + 3436 + 3437 + 3438 + 3439 + 3440 + 3441 + 3442 + 3443 + 3444 + 3445 + 3446 + 3447 + 3448 + 3449 + 3450 + 3451 + 3452 + 3453 + 3454 + 3455 + 3456 + 3457 + 3458 + 3459 + 3460 + 3461 + 3462 + 3463 + 3464 + 3465 + 3466 + 3467 + 3468 + 3469 + 3470 + 3471 + 3472 + 3473 + 3474 + 3475 + 3476 + 3477 + 3478 + 3479 + 3480 + 3481 + 3482 + 3483 + 3484 + 3485 + 3486 + 3487 + 3488 + 3489 + 3490 + 3491 + 3492 + 3493 + 3494 + 3495 + 3496 + 3497 + 3498 + 3499 + 3500 + 3501 + 3502 + 3503 + 3504 + 3505 + 3506 + 3507 + 3508 + 3509 + 3510 + 3511 + 3512 + 3513 + 3514 + 3515 + 3516 + 3517 + 3518 + 3519 + 3520 + 3521 + 3522 + 3523 + 3524 + 3525 + 3526 + 3527 + 3528 + 3529 + 3530 + 3531 + 3532 + 3533 + 3534 + 3535 + 3536 + 3537 + 3538 + 3539 + 3540 + 3541 + 3542 + 3543 + 3544 + 3545 + 3546 + 3547 + 3548 + 3549 + 3550 + 3551 + 3552 + 3553 + 3554 + 3555 + 3556 + 3557 + 3558 + 3559 + 3560 + 3561 + 3562 + 3563 + 3564 + 3565 + 3566 + 3567 + 3568 + 3569 + 3570 + 3571 + 3572 + 3573 + 3574 + 3575 + 3576 + 3577 + 3578 + 3579 + 3580 + 3581 + 3582 + 3583 + 3584 + 3585 + 3586 + 3587 + 3588 + 3589 + 3590 + 3591 + 3592 + 3593 + 3594 + 3595 + 3596 + 3597 + 3598 + 3599 + 3600 + 3601 + 3602 + 3603 + 3604 + 3605 + 3606 + 3607 + 3608 + 3609 + 3610 + 3611 + 3612 + 3613 + 3614 + 3615 + 3616 + 3617 + 3618 + 3619 + 3620 + 3621 + 3622 + 3623 + 3624 + 3625 + 3626 + 3627 + 3628 + 3629 + 3630 + 3631 + 3632 + 3633 + 3634 + 3635 + 3636 + 3637 + 3638 + 3639 + 3640 + 3641 + 3642 + 3643 + 3644 + 3645 + 3646 + 3647 + 3648 + 3649 + 3650 + 3651 + 3652 + 3653 + 3654 + 3655 + 3656 + 3657 + 3658 + 3659 + 3660 + 3661 + 3662 + 3663 + 3664 + 3665 + 3666 + 3667 + 3668 + 3669 + 3670 + 3671 + 3672 + 3673 + 3674 + 3675 + 3676 + 3677 + 3678 + 3679 + 3680 + 3681 + 3682 + 3683 + 3684 + 3685 + 3686 + 3687 + 3688 + 3689 + 3690 + 3691 + 3692 + 3693 + 3694 + 3695 + 3696 + 3697 + 3698 + 3699 + 3700 + 3701 + 3702 + 3703 + 3704 + 3705 + 3706 + 3707 + 3708 + 3709 + 3710 + 3711 + 3712 + 3713 + 3714 + 3715 + 3716 + 3717 + 3718 + 3719 + 3720 + 3721 + 3722 + 3723 + 3724 + 3725 + 3726 + 3727 + 3728 + 3729 + 3730 + 3731 + 3732 + 3733 + 3734 + 3735 + 3736 + 3737 + 3738 + 3739 + 3740 + 3741 + 3742 + 3743 + 3744 + 3745 + 3746 + 3747 + 3748 + 3749 + 3750 + 3751 + 3752 + 3753 + 3754 + 3755 + 3756 + 3757 + 3758 + 3759 + 3760 + 3761 + 3762 + 3763 + 3764 + 3765 + 3766 + 3767 + 3768 + 3769 + 3770 + 3771 + 3772 + 3773 + 3774 + 3775 + 3776 + 3777 + 3778 + 3779 + 3780 + 3781 + 3782 + 3783 + 3784 + 3785 + 3786 + 3787 + 3788 + 3789 + 3790 + 3791 + 3792 + 3793 + 3794 + 3795 + 3796 + 3797 + 3798 + 3799 + 3800 + 3801 + 3802 + 3803 + 3804 + 3805 + 3806 + 3807 + 3808 + 3809 + 3810 + 3811 + 3812 + 3813 + 3814 + 3815 + 3816 + 3817 + 3818 + 3819 + 3820 + 3821 + 3822 + 3823 + 3824 + 3825 + 3826 + 3827 + 3828 + 3829 + 3830 + 3831 + 3832 + 3833 + 3834 + 3835 + 3836 + 3837 + 3838 + 3839 + 3840 + 3841 + 3842 + 3843 + 3844 + 3845 + 3846 + 3847 + 3848 + 3849 + 3850 + 3851 + 3852 + 3853 + 3854 + 3855 + 3856 + 3857 + 3858 + 3859 + 3860 + 3861 + 3862 + 3863 + 3864 + 3865 + 3866 + 3867 + 3868 + 3869 + 3870 + 3871 + 3872 + 3873 + 3874 + 3875 + 3876 + 3877 + 3878 + 3879 + 3880 + 3881 + 3882 + 3883 + 3884 + 3885 + 3886 + 3887 + 3888 + 3889 + 3890 + 3891 + 3892 + 3893 + 3894 + 3895 + 3896 + 3897 + 3898 + 3899 + 3900 + 3901 + 3902 + 3903 + 3904 + 3905 + 3906 + 3907 + 3908 + 3909 + 3910 + 3911 + 3912 + 3913 + 3914 + 3915 + 3916 + 3917 + 3918 + 3919 + 3920 + 3921 + 3922 + 3923 + 3924 + 3925 + 3926 + 3927 + 3928 + 3929 + 3930 + 3931 + 3932 + 3933 + 3934 + 3935 + 3936 + 3937 + 3938 + 3939 + 3940 + 3941 + 3942 + 3943 + 3944 + 3945 + 3946 + 3947 + 3948 + 3949 + 3950 + 3951 + 3952 + 3953 + 3954 + 3955 + 3956 + 3957 + 3958 + 3959 + 3960 + 3961 + 3962 + 3963 + 3964 + 3965 + 3966 + 3967 + 3968 + 3969 + 3970 + 3971 + 3972 + 3973 + 3974 + 3975 + 3976 + 3977 + 3978 + 3979 + 3980 + 3981 + 3982 + 3983 + 3984 + 3985 + 3986 + 3987 + 3988 + 3989 + 3990 + 3991 + 3992 + 3993 + 3994 + 3995 + 3996 + 3997 + 3998 + 3999 + 4000 + 4001 + 4002 + 4003 + 4004 + 4005 + 4006 + 4007 + 4008 + 4009 + 4010 + 4011 + 4012 + 4013 + 4014 + 4015 + 4016 + 4017 + 4018 + 4019 + 4020 + 4021 + 4022 + 4023 + 4024 + 4025 + 4026 + 4027 + 4028 + 4029 + 4030 + 4031 + 4032 + 4033 + 4034 + 4035 + 4036 + 4037 + 4038 + 4039 + 4040 + 4041 + 4042 + 4043 + 4044 + 4045 + 4046 + 4047 + 4048 + 4049 + 4050 + 4051 + 4052 + 4053 + 4054 + 4055 + 4056 + 4057 + 4058 + 4059 + 4060 + 4061 + 4062 + 4063 + 4064 + 4065 + 4066 + 4067 + 4068 + 4069 + 4070 + 4071 + 4072 + 4073 + 4074 + 4075 + 4076 + 4077 + 4078 + 4079 + 4080 + 4081 + 4082 + 4083 + 4084 + 4085 + 4086 + 4087 + 4088 + 4089 + 4090 + 4091 + 4092 + 4093 + 4094 + 4095 + 4096 + 4097 + 4098 + 4099 + 4100 + 4101 + 4102 + 4103 + 4104 + 4105 + 4106 + 4107 + 4108 + 4109 + 4110 + 4111 + 4112 + 4113 + 4114 + 4115 + 4116 + 4117 + 4118 + 4119 + 4120 + 4121 + 4122 + 4123 + 4124 + 4125 + 4126 + 4127 + 4128 + 4129 + 4130 + 4131 + 4132 + 4133 + 4134 + 4135 + 4136 + 4137 + 4138 + 4139 + 4140 + 4141 + 4142 + 4143 + 4144 + 4145 + 4146 + 4147 + 4148 + 4149 + 4150 + 4151 + 4152 + 4153 + 4154 + 4155 + 4156 + 4157 + 4158 + 4159 + 4160 + 4161 + 4162 + 4163 + 4164 + 4165 + 4166 + 4167 + 4168 + 4169 + 4170 + 4171 + 4172 + 4173 + 4174 + 4175 + 4176 + 4177 + 4178 + 4179 + 4180 + 4181 + 4182 + 4183 + 4184 + 4185 + 4186 + 4187 + 4188 + 4189 + 4190 + 4191 + 4192 + 4193 + 4194 + 4195 + 4196 + 4197 + 4198 + 4199 + 4200 + 4201 + 4202 + 4203 + 4204 + 4205 + 4206 + 4207 + 4208 + 4209 + 4210 + 4211 + 4212 + 4213 + 4214 + 4215 + 4216 + 4217 + 4218 + 4219 + 4220 + 4221 + 4222 + 4223 + 4224 + 4225 + 4226 + 4227 + 4228 + 4229 + 4230 + 4231 + 4232 + 4233 + 4234 + 4235 + 4236 + 4237 + 4238 + 4239 + 4240 + 4241 + 4242 + 4243 + 4244 + 4245 + 4246 + 4247 + 4248 + 4249 + 4250 + 4251 + 4252 + 4253 + 4254 + 4255 + 4256 + 4257 + 4258 + 4259 + 4260 + 4261 + 4262 + 4263 + 4264 + 4265 + 4266 + 4267 + 4268 + 4269 + 4270 + 4271 + 4272 + 4273 + 4274 + 4275 + 4276 + 4277 + 4278 + 4279 + 4280 + 4281 + 4282 + 4283 + 4284 + 4285 + 4286 + 4287 + 4288 + 4289 + 4290 + 4291 + 4292 + 4293 + 4294 + 4295 + 4296 + 4297 + 4298 + 4299 + 4300 + 4301 + 4302 + 4303 + 4304 + 4305 + 4306 + 4307 + 4308 + 4309 + 4310 + 4311 + 4312 + 4313 + 4314 + 4315 + 4316 + 4317 + 4318 + 4319 + 4320 + 4321 + 4322 + 4323 + 4324 + 4325 + 4326 + 4327 + 4328 + 4329 + 4330 + 4331 + 4332 + 4333 + 4334 + 4335 + 4336 + 4337 + 4338 + 4339 + 4340 + 4341 + 4342 + 4343 + 4344 + 4345 + 4346 + 4347 + 4348 + 4349 + 4350 + 4351 + 4352 + 4353 + 4354 + 4355 + 4356 + 4357 + 4358 + 4359 + 4360 + 4361 + 4362 + 4363 + 4364 + 4365 + 4366 + 4367 + 4368 + 4369 + 4370 + 4371 + 4372 + 4373 + 4374 + 4375 + 4376 + 4377 + 4378 + 4379 + 4380 + 4381 + 4382 + 4383 + 4384 + 4385 + 4386 + 4387 + 4388 + 4389 + 4390 + 4391 + 4392 + 4393 + 4394 + 4395 + 4396 + 4397 + 4398 + 4399 + 4400 + 4401 + 4402 + 4403 + 4404 + 4405 + 4406 + 4407 + 4408 + 4409 + 4410 + 4411 + 4412 + 4413 + 4414 + 4415 + 4416 + 4417 + 4418 + 4419 + 4420 + 4421 + 4422 + 4423 + 4424 + 4425 + 4426 + 4427 + 4428 + 4429 + 4430 + 4431 + 4432 + 4433 + 4434 + 4435 + 4436 + 4437 + 4438 + 4439 + 4440 + 4441 + 4442 + 4443 + 4444 + 4445 + 4446 + 4447 + 4448 + 4449 + 4450 + 4451 + 4452 + 4453 + 4454 + 4455 + 4456 + 4457 + 4458 + 4459 + 4460 + 4461 + 4462 + 4463 + 4464 + 4465 + 4466 + 4467 + 4468 + 4469 + 4470 + 4471 + 4472 + 4473 + 4474 + 4475 + 4476 + 4477 + 4478 + 4479 + 4480 + 4481 + 4482 + 4483 + 4484 + 4485 + 4486 + 4487 + 4488 + 4489 + 4490 + 4491 + 4492 + 4493 + 4494 + 4495 + 4496 + 4497 + 4498 + 4499 + 4500 + 4501 + 4502 + 4503 + 4504 + 4505 + 4506 + 4507 + 4508 + 4509 + 4510 + 4511 + 4512 + 4513 + 4514 + 4515 + 4516 + 4517 + 4518 + 4519 + 4520 + 4521 + 4522 + 4523 + 4524 + 4525 + 4526 + 4527 + 4528 + 4529 + 4530 + 4531 + 4532 + 4533 + 4534 + 4535 + 4536 + 4537 + 4538 + 4539 + 4540 + 4541 + 4542 + 4543 + 4544 + 4545 + 4546 + 4547 + 4548 + 4549 + 4550 + 4551 + 4552 + 4553 + 4554 + 4555 + 4556 + 4557 + 4558 + 4559 + 4560 + 4561 + 4562 + 4563 + 4564 + 4565 + 4566 + 4567 + 4568 + 4569 + 4570 + 4571 + 4572 + 4573 + 4574 + 4575 + 4576 + 4577 + 4578 + 4579 + 4580 + 4581 + 4582 + 4583 + 4584 + 4585 + 4586 + 4587 + 4588 + 4589 + 4590 + 4591 + 4592 + 4593 + 4594 + 4595 + 4596 + 4597 + 4598 + 4599 + 4600 + 4601 + 4602 + 4603 + 4604 + 4605 + 4606 + 4607 + 4608 + 4609 + 4610 + 4611 + 4612 + 4613 + 4614 + 4615 + 4616 + 4617 + 4618 + 4619 + 4620 + 4621 + 4622 + 4623 + 4624 + 4625 + 4626 + 4627 + 4628 + 4629 + 4630 + 4631 + 4632 + 4633 + 4634 + 4635 + 4636 + 4637 + 4638 + 4639 + 4640 + 4641 + 4642 + 4643 + 4644 + 4645 + 4646 + 4647 + 4648 + 4649 + 4650 + 4651 + 4652 + 4653 + 4654 + 4655 + 4656 + 4657 + 4658 + 4659 + 4660 + 4661 + 4662 + 4663 + 4664 + 4665 + 4666 + 4667 + 4668 + 4669 + 4670 + 4671 + 4672 + 4673 + 4674 + 4675 + 4676 + 4677 + 4678 + 4679 + 4680 + 4681 + 4682 + 4683 + 4684 + 4685 + 4686 + 4687 + 4688 + 4689 + 4690 + 4691 + 4692 + 4693 + 4694 + 4695 + 4696 + 4697 + 4698 + 4699 + 4700 + 4701 + 4702 + 4703 + 4704 + 4705 + 4706 + 4707 + 4708 + 4709 + 4710 + 4711 + 4712 + 4713 + 4714 + 4715 + 4716 + 4717 + 4718 + 4719 + 4720 + 4721 + 4722 + 4723 + 4724 + 4725 + 4726 + 4727 + 4728 + 4729 + 4730 + 4731 + 4732 + 4733 + 4734 + 4735 + 4736 + 4737 + 4738 + 4739 + 4740 + 4741 + 4742 + 4743 + 4744 + 4745 + 4746 + 4747 + 4748 + 4749 + 4750 + 4751 + 4752 + 4753 + 4754 + 4755 + 4756 + 4757 + 4758 + 4759 + 4760 + 4761 + 4762 + 4763 + 4764 + 4765 + 4766 + 4767 + 4768 + 4769 + 4770 + 4771 + 4772 + 4773 + 4774 + 4775 + 4776 + 4777 + 4778 + 4779 + 4780 + 4781 + 4782 + 4783 + 4784 + 4785 + 4786 + 4787 + 4788 + 4789 + 4790 + 4791 + 4792 + 4793 + 4794 + 4795 + 4796 + 4797 + 4798 + 4799 + 4800 + 4801 + 4802 + 4803 + 4804 + 4805 + 4806 + 4807 + 4808 + 4809 + 4810 + 4811 + 4812 + 4813 + 4814 + 4815 + 4816 + 4817 + 4818 + 4819 + 4820 + 4821 + 4822 + 4823 + 4824 + 4825 + 4826 + 4827 + 4828 + 4829 + 4830 + 4831 + 4832 + 4833 + 4834 + 4835 + 4836 + 4837 + 4838 + 4839 + 4840 + 4841 + 4842 + 4843 + 4844 + 4845 + 4846 + 4847 + 4848 + 4849 + 4850 + 4851 + 4852 + 4853 + 4854 + 4855 + 4856 + 4857 + 4858 + 4859 + 4860 + 4861 + 4862 + 4863 + 4864 + 4865 + 4866 + 4867 + 4868 + 4869 + 4870 + 4871 + 4872 + 4873 + 4874 + 4875 + 4876 + 4877 + 4878 + 4879 + 4880 + 4881 + 4882 + 4883 + 4884 + 4885 + 4886 + 4887 + 4888 + 4889 + 4890 + 4891 + 4892 + 4893 + 4894 + 4895 + 4896 + 4897 + 4898 + 4899 + 4900 + 4901 + 4902 + 4903 + 4904 + 4905 + 4906 + 4907 + 4908 + 4909 + 4910 + 4911 + 4912 + 4913 + 4914 + 4915 + 4916 + 4917 + 4918 + 4919 + 4920 + 4921 + 4922 + 4923 + 4924 + 4925 + 4926 + 4927 + 4928 + 4929 + 4930 + 4931 + 4932 + 4933 + 4934 + 4935 + 4936 + 4937 + 4938 + 4939 + 4940 + 4941 + 4942 + 4943 + 4944 + 4945 + 4946 + 4947 + 4948 + 4949 + 4950 + 4951 + 4952 + 4953 + 4954 + 4955 + 4956 + 4957 + 4958 + 4959 + 4960 + 4961 + 4962 + 4963 + 4964 + 4965 + 4966 + 4967 + 4968 + 4969 + 4970 + 4971 + 4972 + 4973 + 4974 + 4975 + 4976 + 4977 + 4978 + 4979 + 4980 + 4981 + 4982 + 4983 + 4984 + 4985 + 4986 + 4987 + 4988 + 4989 + 4990 + 4991 + 4992 + 4993 + 4994 + 4995 + 4996 + 4997 + 4998 + 4999 + 5000 + 5001 + 5002 + 5003 + 5004 + 5005 + 5006 + 5007 + 5008 + 5009 + 5010 + 5011 + 5012 + 5013 + 5014 + 5015 + 5016 + 5017 + 5018 + 5019 + 5020 + 5021 + 5022 + 5023 + 5024 + 5025 + 5026 + 5027 + 5028 + 5029 + 5030 + 5031 + 5032 + 5033 + 5034 + 5035 + 5036 + 5037 + 5038 + 5039 + 5040 + 5041 + 5042 + 5043 + 5044 + 5045 + 5046 + 5047 + 5048 + 5049 + 5050 + 5051 + 5052 + 5053 + 5054 + 5055 + 5056 + 5057 + 5058 + 5059 + 5060 + 5061 + 5062 + 5063 + 5064 + 5065 + 5066 + 5067 + 5068 + 5069 + 5070 + 5071 + 5072 + 5073 + 5074 + 5075 + 5076 + 5077 + 5078 + 5079 + 5080 + 5081 + 5082 + 5083 + 5084 + 5085 + 5086 + 5087 + 5088 + 5089 + 5090 + 5091 + 5092 + 5093 + 5094 + 5095 + 5096 + 5097 + 5098 + 5099 + 5100 + 5101 + 5102 + 5103 + 5104 + 5105 + 5106 + 5107 + 5108 + 5109 + 5110 + 5111 + 5112 + 5113 + 5114 + 5115 + 5116 + 5117 + 5118 + 5119 + 5120 + 5121 + 5122 + 5123 + 5124 + 5125 + 5126 + 5127 + 5128 + 5129 + 5130 + 5131 + 5132 + 5133 + 5134 + 5135 + 5136 + 5137 + 5138 + 5139 + 5140 + 5141 + 5142 + 5143 + 5144 + 5145 + 5146 + 5147 + 5148 + 5149 + 5150 + 5151 + 5152 + 5153 + 5154 + 5155 + 5156 + 5157 + 5158 + 5159 + 5160 + 5161 + 5162 + 5163 + 5164 + 5165 + 5166 + 5167 + 5168 + 5169 + 5170 + 5171 + 5172 + 5173 + 5174 + 5175 + 5176 + 5177 + 5178 + 5179 + 5180 + 5181 + 5182 + 5183 + 5184 + 5185 + 5186 + 5187 + 5188 + 5189 + 5190 + 5191 + 5192 + 5193 + 5194 + 5195 + 5196 + 5197 + 5198 + 5199 + 5200 + 5201 + 5202 + 5203 + 5204 + 5205 + 5206 + 5207 + 5208 + 5209 + 5210 + 5211 + 5212 + 5213 + 5214 + 5215 + 5216 + 5217 + 5218 + 5219 + 5220 + 5221 + 5222 + 5223 + 5224 + 5225 + 5226 + 5227 + 5228 + 5229 + 5230 + 5231 + 5232 + 5233 + 5234 + 5235 + 5236 + 5237 + 5238 + 5239 + 5240 + 5241 + 5242 + 5243 + 5244 + 5245 + 5246 + 5247 + 5248 + 5249 + 5250 + 5251 + 5252 + 5253 + 5254 + 5255 + 5256 + 5257 + 5258 + 5259 + 5260 + 5261 + 5262 + 5263 + 5264 + 5265 + 5266 + 5267 + 5268 + 5269 + 5270 + 5271 + 5272 + 5273 + 5274 + 5275 + 5276 + 5277 + 5278 + 5279 + 5280 + 5281 + 5282 + 5283 + 5284 + 5285 + 5286 + 5287 + 5288 + 5289 + 5290 + 5291 + 5292 + 5293 + 5294 + 5295 + 5296 + 5297 + 5298 + 5299 + 5300 + 5301 + 5302 + 5303 + 5304 + 5305 + 5306 + 5307 + 5308 + 5309 + 5310 + 5311 + 5312 + 5313 + 5314 + 5315 + 5316 + 5317 + 5318 + 5319 + 5320 + 5321 + 5322 + 5323 + 5324 + 5325 + 5326 + 5327 + 5328 + 5329 + 5330 + 5331 + 5332 + 5333 + 5334 + 5335 + 5336 + 5337 + 5338 + 5339 + 5340 + 5341 + 5342 + 5343 + 5344 + 5345 + 5346 + 5347 + 5348 + 5349 + 5350 + 5351 + 5352 + 5353 + 5354 + 5355 + 5356 + 5357 + 5358 + 5359 + 5360 + 5361 + 5362 + 5363 + 5364 + 5365 + 5366 + 5367 + 5368 + 5369 + 5370 + 5371 + 5372 + 5373 + 5374 + 5375 + 5376 + 5377 + 5378 + 5379 + 5380 + 5381 + 5382 + 5383 + 5384 + 5385 + 5386 + 5387 + 5388 + 5389 + 5390 + 5391 + 5392 + 5393 + 5394 + 5395 + 5396 + 5397 + 5398 + 5399 + 5400 + 5401 + 5402 + 5403 + 5404 + 5405 + 5406 + 5407 + 5408 + 5409 + 5410 + 5411 + 5412 + 5413 + 5414 + 5415 + 5416 + 5417 + 5418 + 5419 + 5420 + 5421 + 5422 + 5423 + 5424 + 5425 + 5426 + 5427 + 5428 + 5429 + 5430 + 5431 + 5432 + 5433 + 5434 + 5435 + 5436 + 5437 + 5438 + 5439 + 5440 + 5441 + 5442 + 5443 + 5444 + 5445 + 5446 + 5447 + 5448 + 5449 + 5450 + 5451 + 5452 + 5453 + 5454 + 5455 + 5456 + 5457 + 5458 + 5459 + 5460 + 5461 + 5462 + 5463 + 5464 + 5465 + 5466 + 5467 + 5468 + 5469 + 5470 + 5471 + 5472 + 5473 + 5474 + 5475 + 5476 + 5477 + 5478 + 5479 + 5480 + 5481 + 5482 + 5483 + 5484 + 5485 + 5486 + 5487 + 5488 + 5489 + 5490 + 5491 + 5492 + 5493 + 5494 + 5495 + 5496 + 5497 + 5498 + 5499 + 5500 + 5501 + 5502 + 5503 + 5504 + 5505 + 5506 + 5507 + 5508 + 5509 + 5510 + 5511 + 5512 + 5513 + 5514 + 5515 + 5516 + 5517 + 5518 + 5519 + 5520 + 5521 + 5522 + 5523 + 5524 + 5525 + 5526 + 5527 + 5528 + 5529 + 5530 + 5531 + 5532 + 5533 + 5534 + 5535 + 5536 + 5537 + 5538 + 5539 + 5540 + 5541 + 5542 + 5543 + 5544 + 5545 + 5546 + 5547 + 5548 + 5549 + 5550 + 5551 + 5552 + 5553 + 5554 + 5555 + 5556 + 5557 + 5558 + 5559 + 5560 + 5561 + 5562 + 5563 + 5564 + 5565 + 5566 + 5567 + 5568 + 5569 + 5570 + 5571 + 5572 + 5573 + 5574 + 5575 + 5576 + 5577 + 5578 + 5579 + 5580 + 5581 + 5582 + 5583 + 5584 + 5585 + 5586 + 5587 + 5588 + 5589 + 5590 + 5591 + 5592 + 5593 + 5594 + 5595 + 5596 + 5597 + 5598 + 5599 + 5600 + 5601 + 5602 + 5603 + 5604 + 5605 + 5606 + 5607 + 5608 + 5609 + 5610 + 5611 + 5612 + 5613 + 5614 + 5615 + 5616 + 5617 + 5618 + 5619 + 5620 + 5621 + 5622 + 5623 + 5624 + 5625 + 5626 + 5627 + 5628 + 5629 + 5630 + 5631 + 5632 + 5633 + 5634 + 5635 + 5636 + 5637 + 5638 + 5639 + 5640 + 5641 + 5642 + 5643 + 5644 + 5645 + 5646 + 5647 + 5648 + 5649 + 5650 + 5651 + 5652 + 5653 + 5654 + 5655 + 5656 + 5657 + 5658 + 5659 + 5660 + 5661 + 5662 + 5663 + 5664 + 5665 + 5666 + 5667 + 5668 + 5669 + 5670 + 5671 + 5672 + 5673 + 5674 + 5675 + 5676 + 5677 + 5678 + 5679 + 5680 + 5681 + 5682 + 5683 + 5684 + 5685 + 5686 + 5687 + 5688 + 5689 + 5690 + 5691 + 5692 + 5693 + 5694 + 5695 + 5696 + 5697 + 5698 + 5699 + 5700 + 5701 + 5702 + 5703 + 5704 + 5705 + 5706 + 5707 + 5708 + 5709 + 5710 + 5711 + 5712 + 5713 + 5714 + 5715 + 5716 + 5717 + 5718 + 5719 + 5720 + 5721 + 5722 + 5723 + 5724 + 5725 + 5726 + 5727 + 5728 + 5729 + 5730 + 5731 + 5732 + 5733 + 5734 + 5735 + 5736 + 5737 + 5738 + 5739 + 5740 + 5741 + 5742 + 5743 + 5744 + 5745 + 5746 + 5747 + 5748 + 5749 + 5750 + 5751 + 5752 + 5753 + 5754 + 5755 + 5756 + 5757 + 5758 + 5759 + 5760 + 5761 + 5762 + 5763 + 5764 + 5765 + 5766 + 5767 + 5768 + 5769 + 5770 + 5771 + 5772 + 5773 + 5774 + 5775 + 5776 + 5777 + 5778 + 5779 + 5780 + 5781 + 5782 + 5783 + 5784 + 5785 + 5786 + 5787 + 5788 + 5789 + 5790 + 5791 + 5792 + 5793 + 5794 + 5795 + 5796 + 5797 + 5798 + 5799 + 5800 + 5801 + 5802 + 5803 + 5804 + 5805 + 5806 + 5807 + 5808 + 5809 + 5810 + 5811 + 5812 + 5813 + 5814 + 5815 + 5816 + 5817 + 5818 + 5819 + 5820 + 5821 + 5822 + 5823 + 5824 + 5825 + 5826 + 5827 + 5828 + 5829 + 5830 + 5831 + 5832 + 5833 + 5834 + 5835 + 5836 + 5837 + 5838 + 5839 + 5840 + 5841 + 5842 + 5843 + 5844 + 5845 + 5846 + 5847 + 5848 + 5849 + 5850 + 5851 + 5852 + 5853 + 5854 + 5855 + 5856 + 5857 + 5858 + 5859 + 5860 + 5861 + 5862 + 5863 + 5864 + 5865 + 5866 + 5867 + 5868 + 5869 + 5870 + 5871 + 5872 + 5873 + 5874 + 5875 + 5876 + 5877 + 5878 + 5879 + 5880 + 5881 + 5882 + 5883 + 5884 + 5885 + 5886 + 5887 + 5888 + 5889 + 5890 + 5891 + 5892 + 5893 + 5894 + 5895 + 5896 + 5897 + 5898 + 5899 + 5900 + 5901 + 5902 + 5903 + 5904 + 5905 + 5906 + 5907 + 5908 + 5909 + 5910 + 5911 + 5912 + 5913 + 5914 + 5915 + 5916 + 5917 + 5918 + 5919 + 5920 + 5921 + 5922 + 5923 + 5924 + 5925 + 5926 + 5927 + 5928 + 5929 + 5930 + 5931 + 5932 + 5933 + 5934 + 5935 + 5936 + 5937 + 5938 + 5939 + 5940 + 5941 + 5942 + 5943 + 5944 + 5945 + 5946 + 5947 + 5948 + 5949 + 5950 + 5951 + 5952 + 5953 + 5954 + 5955 + 5956 + 5957 + 5958 + 5959 + 5960 + 5961 + 5962 + 5963 + 5964 + 5965 + 5966 + 5967 + 5968 + 5969 + 5970 + 5971 + 5972 + 5973 + 5974 + 5975 + 5976 + 5977 + 5978 + 5979 + 5980 + 5981 + 5982 + 5983 + 5984 + 5985 + 5986 + 5987 + 5988 + 5989 + 5990 + 5991 + 5992 + 5993 + 5994 + 5995 + 5996 + 5997 + 5998 + 5999 + 6000 + 6001 + 6002 + 6003 + 6004 + 6005 + 6006 + 6007 + 6008 + 6009 + 6010 + 6011 + 6012 + 6013 + 6014 + 6015 + 6016 + 6017 + 6018 + 6019 + 6020 + 6021 + 6022 + 6023 + 6024 + 6025 + 6026 + 6027 + 6028 + 6029 + 6030 + 6031 + 6032 + 6033 + 6034 + 6035 + 6036 + 6037 + 6038 + 6039 + 6040 + 6041 + 6042 + 6043 + 6044 + 6045 + 6046 + 6047 + 6048 + 6049 + 6050 + 6051 + 6052 + 6053 + 6054 + 6055 + 6056 + 6057 + 6058 + 6059 + 6060 + 6061 + 6062 + 6063 + 6064 + 6065 + 6066 + 6067 + 6068 + 6069 + 6070 + 6071 + 6072 + 6073 + 6074 + 6075 + 6076 + 6077 + 6078 + 6079 + 6080 + 6081 + 6082 + 6083 + 6084 + 6085 + 6086 + 6087 + 6088 + 6089 + 6090 + 6091 + 6092 + 6093 + 6094 + 6095 + 6096 + 6097 + 6098 + 6099 + 6100 + 6101 + 6102 + 6103 + 6104 + 6105 + 6106 + 6107 + 6108 + 6109 + 6110 + 6111 + 6112 + 6113 + 6114 + 6115 + 6116 + 6117 + 6118 + 6119 + 6120 + 6121 + 6122 + 6123 + 6124 + 6125 + 6126 + 6127 + 6128 + 6129 + 6130 + 6131 + 6132 + 6133 + 6134 + 6135 + 6136 + 6137 + 6138 + 6139 + 6140 + 6141 + 6142 + 6143 + 6144 + 6145 + 6146 + 6147 + 6148 + 6149 + 6150 + 6151 + 6152 + 6153 + 6154 + 6155 + 6156 + 6157 + 6158 + 6159 + 6160 + 6161 + 6162 + 6163 + 6164 + 6165 + 6166 + 6167 + 6168 + 6169 + 6170 + 6171 + 6172 + 6173 + 6174 + 6175 + 6176 + 6177 + 6178 + 6179 + 6180 + 6181 + 6182 + 6183 + 6184 + 6185 + 6186 + 6187 + 6188 + 6189 + 6190 + 6191 + 6192 + 6193 + 6194 + 6195 + 6196 + 6197 + 6198 + 6199 + 6200 + 6201 + 6202 + 6203 + 6204 + 6205 + 6206 + 6207 + 6208 + 6209 + 6210 + 6211 + 6212 + 6213 + 6214 + 6215 + 6216 + 6217 + 6218 + 6219 + 6220 + 6221 + 6222 + 6223 + 6224 + 6225 + 6226 + 6227 + 6228 + 6229 + 6230 + 6231 + 6232 + 6233 + 6234 + 6235 + 6236 + 6237 + 6238 + 6239 + 6240 + 6241 + 6242 + 6243 + 6244 + 6245 + 6246 + 6247 + 6248 + 6249 + 6250 + 6251 + 6252 + 6253 + 6254 + 6255 + 6256 + 6257 + 6258 + 6259 + 6260 + 6261 + 6262 + 6263 + 6264 + 6265 + 6266 + 6267 + 6268 + 6269 + 6270 + 6271 + 6272 + 6273 + 6274 + 6275 + 6276 + 6277 + 6278 + 6279 + 6280 + 6281 + 6282 + 6283 + 6284 + 6285 + 6286 + 6287 + 6288 + 6289 + 6290 + 6291 + 6292 + 6293 + 6294 + 6295 + 6296 + 6297 + 6298 + 6299 + 6300 + 6301 + 6302 + 6303 + 6304 + 6305 + 6306 + 6307 + 6308 + 6309 + 6310 + 6311 + 6312 + 6313 + 6314 + 6315 + 6316 + 6317 + 6318 + 6319 + 6320 + 6321 + 6322 + 6323 + 6324 + 6325 + 6326 + 6327 + 6328 + 6329 + 6330 + 6331 + 6332 + 6333 + 6334 + 6335 + 6336 + 6337 + 6338 + 6339 + 6340 + 6341 + 6342 + 6343 + 6344 + 6345 + 6346 + 6347 + 6348 + 6349 + 6350 + 6351 + 6352 + 6353 + 6354 + 6355 + 6356 + 6357 + 6358 + 6359 + 6360 + 6361 + 6362 + 6363 + 6364 + 6365 + 6366 + 6367 + 6368 + 6369 + 6370 + 6371 + 6372 + 6373 + 6374 + 6375 + 6376 + 6377 + 6378 + 6379 + 6380 + 6381 + 6382 + 6383 + 6384 + 6385 + 6386 + 6387 + 6388 + 6389 + 6390 + 6391 + 6392 + 6393 + 6394 + 6395 + 6396 + 6397 + 6398 + 6399 + 6400 + 6401 + 6402 + 6403 + 6404 + 6405 + 6406 + 6407 + 6408 + 6409 + 6410 + 6411 + 6412 + 6413 + 6414 + 6415 + 6416 + 6417 + 6418 + 6419 + 6420 + 6421 + 6422 + 6423 + 6424 + 6425 + 6426 + 6427 + 6428 + 6429 + 6430 + 6431 + 6432 + 6433 + 6434 + 6435 + 6436 + 6437 + 6438 + 6439 + 6440 + 6441 + 6442 + 6443 + 6444 + 6445 + 6446 + 6447 + 6448 + 6449 + 6450 + 6451 + 6452 + 6453 + 6454 + 6455 + 6456 + 6457 + 6458 + 6459 + 6460 + 6461 + 6462 + 6463 + 6464 + 6465 + 6466 + 6467 + 6468 + 6469 + 6470 + 6471 + 6472 + 6473 + 6474 + 6475 + 6476 + 6477 + 6478 + 6479 + 6480 + 6481 + 6482 + 6483 + 6484 + 6485 + 6486 + 6487 + 6488 + 6489 + 6490 + 6491 + 6492 + 6493 + 6494 + 6495 + 6496 + 6497 + 6498 + 6499 + 6500 + 6501 + 6502 + 6503 + 6504 + 6505 + 6506 + 6507 + 6508 + 6509 + 6510 + 6511 + 6512 + 6513 + 6514 + 6515 + 6516 + 6517 + 6518 + 6519 + 6520 + 6521 + 6522 + 6523 + 6524 + 6525 + 6526 + 6527 + 6528 + 6529 + 6530 + 6531 + 6532 + 6533 + 6534 + 6535 + 6536 + 6537 + 6538 + 6539 + 6540 + 6541 + 6542 + 6543 + 6544 + 6545 + 6546 + 6547 + 6548 + 6549 + 6550 + 6551 + 6552 + 6553 + 6554 + 6555 + 6556 + 6557 + 6558 + 6559 + 6560 + 6561 + 6562 + 6563 + 6564 + 6565 + 6566 + 6567 + 6568 + 6569 + 6570 + 6571 + 6572 + 6573 + 6574 + 6575 + 6576 + 6577 + 6578 + 6579 + 6580 + 6581 + 6582 + 6583 + 6584 + 6585 + 6586 + 6587 + 6588 + 6589 + 6590 + 6591 + 6592 + 6593 + 6594 + 6595 + 6596 + 6597 + 6598 + 6599 + 6600 + 6601 + 6602 + 6603 + 6604 + 6605 + 6606 + 6607 + 6608 + 6609 + 6610 + 6611 + 6612 + 6613 + 6614 + 6615 + 6616 + 6617 + 6618 + 6619 + 6620 + 6621 + 6622 + 6623 + 6624 + 6625 + 6626 + 6627 + 6628 + 6629 + 6630 + 6631 + 6632 + 6633 + 6634 + 6635 + 6636 + 6637 + 6638 + 6639 + 6640 + 6641 + 6642 + 6643 + 6644 + 6645 + 6646 + 6647 + 6648 + 6649 + 6650 + 6651 + 6652 + 6653 + 6654 + 6655 + 6656 + 6657 + 6658 + 6659 + 6660 + 6661 + 6662 + 6663 + 6664 + 6665 + 6666 + 6667 + 6668 + 6669 + 6670 + 6671 + 6672 + 6673 + 6674 + 6675 + 6676 + 6677 + 6678 + 6679 + 6680 + 6681 + 6682 + 6683 + 6684 + 6685 + 6686 + 6687 + 6688 + 6689 + 6690 + 6691 + 6692 + 6693 + 6694 + 6695 + 6696 + 6697 + 6698 + 6699 + 6700 + 6701 + 6702 + 6703 + 6704 + 6705 + 6706 + 6707 + 6708 + 6709 + 6710 + 6711 + 6712 + 6713 + 6714 + 6715 + 6716 + 6717 + 6718 + 6719 + 6720 + 6721 + 6722 + 6723 + 6724 + 6725 + 6726 + 6727 + 6728 + 6729 + 6730 + 6731 + 6732 + 6733 + 6734 + 6735 + 6736 + 6737 + 6738 + 6739 + 6740 + 6741 + 6742 + 6743 + 6744 + 6745 + 6746 + 6747 + 6748 + 6749 + 6750 + 6751 + 6752 + 6753 + 6754 + 6755 + 6756 + 6757 + 6758 + 6759 + 6760 + 6761 + 6762 + 6763 + 6764 + 6765 + 6766 + 6767 + 6768 + 6769 + 6770 + 6771 + 6772 + 6773 + 6774 + 6775 + 6776 + 6777 + 6778 + 6779 + 6780 + 6781 + 6782 + 6783 + 6784 + 6785 + 6786 + 6787 + 6788 + 6789 + 6790 + 6791 + 6792 + 6793 + 6794 + 6795 + 6796 + 6797 + 6798 + 6799 + 6800 + 6801 + 6802 + 6803 + 6804 + 6805 + 6806 + 6807 + 6808 + 6809 + 6810 + 6811 + 6812 + 6813 + 6814 + 6815 + 6816 + 6817 + 6818 + 6819 + 6820 + 6821 + 6822 + 6823 + 6824 + 6825 + 6826 + 6827 + 6828 + 6829 + 6830 + 6831 + 6832 + 6833 + 6834 + 6835 + 6836 + 6837 + 6838 + 6839 + 6840 + 6841 + 6842 + 6843 + 6844 + 6845 + 6846 + 6847 + 6848 + 6849 + 6850 + 6851 + 6852 + 6853 + 6854 + 6855 + 6856 + 6857 + 6858 + 6859 + 6860 + 6861 + 6862 + 6863 + 6864 + 6865 + 6866 + 6867 + 6868 + 6869 + 6870 + 6871 + 6872 + 6873 + 6874 + 6875 + 6876 + 6877 + 6878 + 6879 + 6880 + 6881 + 6882 + 6883 + 6884 + 6885 + 6886 + 6887 + 6888 + 6889 + 6890 + 6891 + 6892 + 6893 + 6894 + 6895 + 6896 + 6897 + 6898 + 6899 + 6900 + 6901 + 6902 + 6903 + 6904 + 6905 + 6906 + 6907 + 6908 + 6909 + 6910 + 6911 + 6912 + 6913 + 6914 + 6915 + 6916 + 6917 + 6918 + 6919 + 6920 + 6921 + 6922 + 6923 + 6924 + 6925 + 6926 + 6927 + 6928 + 6929 + 6930 + 6931 + 6932 + 6933 + 6934 + 6935 + 6936 + 6937 + 6938 + 6939 + 6940 + 6941 + 6942 + 6943 + 6944 + 6945 + 6946 + 6947 + 6948 + 6949 + 6950 + 6951 + 6952 + 6953 + 6954 + 6955 + 6956 + 6957 + 6958 + 6959 + 6960 + 6961 + 6962 + 6963 + 6964 + 6965 + 6966 + 6967 + 6968 + 6969 + 6970 + 6971 + 6972 + 6973 + 6974 + 6975 + 6976 + 6977 + 6978 + 6979 + 6980 + 6981 + 6982 + 6983 + 6984 + 6985 + 6986 + 6987 + 6988 + 6989 + 6990 + 6991 + 6992 + 6993 + 6994 + 6995 + 6996 + 6997 + 6998 + 6999 + 7000 + 7001 + 7002 + 7003 + 7004 + 7005 + 7006 + 7007 + 7008 + 7009 + 7010 + 7011 + 7012 + 7013 + 7014 + 7015 + 7016 + 7017 + 7018 + 7019 + 7020 + 7021 + 7022 + 7023 + 7024 + 7025 + 7026 + 7027 + 7028 + 7029 + 7030 + 7031 + 7032 + 7033 + 7034 + 7035 + 7036 + 7037 + 7038 + 7039 + 7040 + 7041 + 7042 + 7043 + 7044 + 7045 + 7046 + 7047 + 7048 + 7049 + 7050 + 7051 + 7052 + 7053 + 7054 + 7055 + 7056 + 7057 + 7058 + 7059 + 7060 + 7061 + 7062 + 7063 + 7064 + 7065 + 7066 + 7067 + 7068 + 7069 + 7070 + 7071 + 7072 + 7073 + 7074 + 7075 + 7076 + 7077 + 7078 + 7079 + 7080 + 7081 + 7082 + 7083 + 7084 + 7085 + 7086 + 7087 + 7088 + 7089 + 7090 + 7091 + 7092 + 7093 + 7094 + 7095 + 7096 + 7097 + 7098 + 7099 + 7100 + 7101 + 7102 + 7103 + 7104 + 7105 + 7106 + 7107 + 7108 + 7109 + 7110 + 7111 + 7112 + 7113 + 7114 + 7115 + 7116 + 7117 + 7118 + 7119 + 7120 + 7121 + 7122 + 7123 + 7124 + 7125 + 7126 + 7127 + 7128 + 7129 + 7130 + 7131 + 7132 + 7133 + 7134 + 7135 + 7136 + 7137 + 7138 + 7139 + 7140 + 7141 + 7142 + 7143 + 7144 + 7145 + 7146 + 7147 + 7148 + 7149 + 7150 + 7151 + 7152 + 7153 + 7154 + 7155 + 7156 + 7157 + 7158 + 7159 + 7160 + 7161 + 7162 + 7163 + 7164 + 7165 + 7166 + 7167 + 7168 + 7169 + 7170 + 7171 + 7172 + 7173 + 7174 + 7175 + 7176 + 7177 + 7178 + 7179 + 7180 + 7181 + 7182 + 7183 + 7184 + 7185 + 7186 + 7187 + 7188 + 7189 + 7190 + 7191 + 7192 + 7193 + 7194 + 7195 + 7196 + 7197 + 7198 + 7199 + 7200 + 7201 + 7202 + 7203 + 7204 + 7205 + 7206 + 7207 + 7208 + 7209 + 7210 + 7211 + 7212 + 7213 + 7214 + 7215 + 7216 + 7217 + 7218 + 7219 + 7220 + 7221 + 7222 + 7223 + 7224 + 7225 + 7226 + 7227 + 7228 + 7229 + 7230 + 7231 + 7232 + 7233 + 7234 + 7235 + 7236 + 7237 + 7238 + 7239 + 7240 + 7241 + 7242 + 7243 + 7244 + 7245 + 7246 + 7247 + 7248 + 7249 + 7250 + 7251 + 7252 + 7253 + 7254 + 7255 + 7256 + 7257 + 7258 + 7259 + 7260 + 7261 + 7262 + 7263 + 7264 + 7265 + 7266 + 7267 + 7268 + 7269 + 7270 + 7271 + 7272 + 7273 + 7274 + 7275 + 7276 + 7277 + 7278 + 7279 + 7280 + 7281 + 7282 + 7283 + 7284 + 7285 + 7286 + 7287 + 7288 + 7289 + 7290 + 7291 + 7292 + 7293 + 7294 + 7295 + 7296 + 7297 + 7298 + 7299 + 7300 + 7301 + 7302 + 7303 + 7304 + 7305 + 7306 + 7307 + 7308 + 7309 + 7310 + 7311 + 7312 + 7313 + 7314 + 7315 + 7316 + 7317 + 7318 + 7319 + 7320 + 7321 + 7322 + 7323 + 7324 + 7325 + 7326 + 7327 + 7328 + 7329 + 7330 + 7331 + 7332 + 7333 + 7334 + 7335 + 7336 + 7337 + 7338 + 7339 + 7340 + 7341 + 7342 + 7343 + 7344 + 7345 + 7346 + 7347 + 7348 + 7349 + 7350 + 7351 + 7352 + 7353 + 7354 + 7355 + 7356 + 7357 + 7358 + 7359 + 7360 + 7361 + 7362 + 7363 + 7364 + 7365 + 7366 + 7367 + 7368 + 7369 + 7370 + 7371 + 7372 + 7373 + 7374 + 7375 + 7376 + 7377 + 7378 + 7379 + 7380 + 7381 + 7382 + 7383 + 7384 + 7385 + 7386 + 7387 + 7388 + 7389 + 7390 + 7391 + 7392 + 7393 + 7394 + 7395 + 7396 + 7397 + 7398 + 7399 + 7400 + 7401 + 7402 + 7403 + 7404 + 7405 + 7406 + 7407 + 7408 + 7409 + 7410 + 7411 + 7412 + 7413 + 7414 + 7415 + 7416 + 7417 + 7418 + 7419 + 7420 + 7421 + 7422 + 7423 + 7424 + 7425 + 7426 + 7427 + 7428 + 7429 + 7430 + 7431 + 7432 + 7433 + 7434 + 7435 + 7436 + 7437 + 7438 + 7439 + 7440 + 7441 + 7442 + 7443 + 7444 + 7445 + 7446 + 7447 + 7448 + 7449 + 7450 + 7451 + 7452 + 7453 + 7454 + 7455 + 7456 + 7457 + 7458 + 7459 + 7460 + 7461 + 7462 + 7463 + 7464 + 7465 + 7466 + 7467 + 7468 + 7469 + 7470 + 7471 + 7472 + 7473 + 7474 + 7475 + 7476 + 7477 + 7478 + 7479 + 7480 + 7481 + 7482 + 7483 + 7484 + 7485 + 7486 + 7487 + 7488 + 7489 + 7490 + 7491 + 7492 + 7493 + 7494 + 7495 + 7496 + 7497 + 7498 + 7499 + 7500 + 7501 + 7502 + 7503 + 7504 + 7505 + 7506 + 7507 + 7508 + 7509 + 7510 + 7511 + 7512 + 7513 + 7514 + 7515 + 7516 + 7517 + 7518 + 7519 + 7520 + 7521 + 7522 + 7523 + 7524 + 7525 + 7526 + 7527 + 7528 + 7529 + 7530 + 7531 + 7532 + 7533 + 7534 + 7535 + 7536 + 7537 + 7538 + 7539 + 7540 + 7541 + 7542 + 7543 + 7544 + 7545 + 7546 + 7547 + 7548 + 7549 + 7550 + 7551 + 7552 + 7553 + 7554 + 7555 + 7556 + 7557 + 7558 + 7559 + 7560 + 7561 + 7562 + 7563 + 7564 + 7565 + 7566 + 7567 + 7568 + 7569 + 7570 + 7571 + 7572 + 7573 + 7574 + 7575 + 7576 + 7577 + 7578 + 7579 + 7580 + 7581 + 7582 + 7583 + 7584 + 7585 + 7586 + 7587 + 7588 + 7589 + 7590 + 7591 + 7592 + 7593 + 7594 + 7595 + 7596 + 7597 + 7598 + 7599 + 7600 + 7601 + 7602 + 7603 + 7604 + 7605 + 7606 + 7607 + 7608 + 7609 + 7610 + 7611 + 7612 + 7613 + 7614 + 7615 + 7616 + 7617 + 7618 + 7619 + 7620 + 7621 + 7622 + 7623 + 7624 + 7625 + 7626 + 7627 + 7628 + 7629 + 7630 + 7631 + 7632 + 7633 + 7634 + 7635 + 7636 + 7637 + 7638 + 7639 + 7640 + 7641 + 7642 + 7643 + 7644 + 7645 + 7646 + 7647 + 7648 + 7649 + 7650 + 7651 + 7652 + 7653 + 7654 + 7655 + 7656 + 7657 + 7658 + 7659 + 7660 + 7661 + 7662 + 7663 + 7664 + 7665 + 7666 + 7667 + 7668 + 7669 + 7670 + 7671 + 7672 + 7673 + 7674 + 7675 + 7676 + 7677 + 7678 + 7679 + 7680 + 7681 + 7682 + 7683 + 7684 + 7685 + 7686 + 7687 + 7688 + 7689 + 7690 + 7691 + 7692 + 7693 + 7694 + 7695 + 7696 + 7697 + 7698 + 7699 + 7700 + 7701 + 7702 + 7703 + 7704 + 7705 + 7706 + 7707 + 7708 + 7709 + 7710 + 7711 + 7712 + 7713 + 7714 + 7715 + 7716 + 7717 + 7718 + 7719 + 7720 + 7721 + 7722 + 7723 + 7724 + 7725 + 7726 + 7727 + 7728 + 7729 + 7730 + 7731 + 7732 + 7733 + 7734 + 7735 + 7736 + 7737 + 7738 + 7739 + 7740 + 7741 + 7742 + 7743 + 7744 + 7745 + 7746 + 7747 + 7748 + 7749 + 7750 + 7751 + 7752 + 7753 + 7754 + 7755 + 7756 + 7757 + 7758 + 7759 + 7760 + 7761 + 7762 + 7763 + 7764 + 7765 + 7766 + 7767 + 7768 + 7769 + 7770 + 7771 + 7772 + 7773 + 7774 + 7775 + 7776 + 7777 + 7778 + 7779 + 7780 + 7781 + 7782 + 7783 + 7784 + 7785 + 7786 + 7787 + 7788 + 7789 + 7790 + 7791 + 7792 + 7793 + 7794 + 7795 + 7796 + 7797 + 7798 + 7799 + 7800 + 7801 + 7802 + 7803 + 7804 + 7805 + 7806 + 7807 + 7808 + 7809 + 7810 + 7811 + 7812 + 7813 + 7814 + 7815 + 7816 + 7817 + 7818 + 7819 + 7820 + 7821 + 7822 + 7823 + 7824 + 7825 + 7826 + 7827 + 7828 + 7829 + 7830 + 7831 + 7832 + 7833 + 7834 + 7835 + 7836 + 7837 + 7838 + 7839 + 7840 + 7841 + 7842 + 7843 + 7844 + 7845 + 7846 + 7847 + 7848 + 7849 + 7850 + 7851 + 7852 + 7853 + 7854 + 7855 + 7856 + 7857 + 7858 + 7859 + 7860 + 7861 + 7862 + 7863 + 7864 + 7865 + 7866 + 7867 + 7868 + 7869 + 7870 + 7871 + 7872 + 7873 + 7874 + 7875 + 7876 + 7877 + 7878 + 7879 + 7880 + 7881 + 7882 + 7883 + 7884 + 7885 + 7886 + 7887 + 7888 + 7889 + 7890 + 7891 + 7892 + 7893 + 7894 + 7895 + 7896 + 7897 + 7898 + 7899 + 7900 + 7901 + 7902 + 7903 + 7904 + 7905 + 7906 + 7907 + 7908 + 7909 + 7910 + 7911 + 7912 + 7913 + 7914 + 7915 + 7916 + 7917 + 7918 + 7919 + 7920 + 7921 + 7922 + 7923 + 7924 + 7925 + 7926 + 7927 + 7928 + 7929 + 7930 + 7931 + 7932 + 7933 + 7934 + 7935 + 7936 + 7937 + 7938 + 7939 + 7940 + 7941 + 7942 + 7943 + 7944 + 7945 + 7946 + 7947 + 7948 + 7949 + 7950 + 7951 + 7952 + 7953 + 7954 + 7955 + 7956 + 7957 + 7958 + 7959 + 7960 + 7961 + 7962 + 7963 + 7964 + 7965 + 7966 + 7967 + 7968 + 7969 + 7970 + 7971 + 7972 + 7973 + 7974 + 7975 + 7976 + 7977 + 7978 + 7979 + 7980 + 7981 + 7982 + 7983 + 7984 + 7985 + 7986 + 7987 + 7988 + 7989 + 7990 + 7991 + 7992 + 7993 + 7994 + 7995 + 7996 + 7997 + 7998 + 7999 + 8000 + 8001 + 8002 + 8003 + 8004 + 8005 + 8006 + 8007 + 8008 + 8009 + 8010 + 8011 + 8012 + 8013 + 8014 + 8015 + 8016 + 8017 + 8018 + 8019 + 8020 + 8021 + 8022 + 8023 + 8024 + 8025 + 8026 + 8027 + 8028 + 8029 + 8030 + 8031 + 8032 + 8033 + 8034 + 8035 + 8036 + 8037 + 8038 + 8039 + 8040 + 8041 + 8042 + 8043 + 8044 + 8045 + 8046 + 8047 + 8048 + 8049 + 8050 + 8051 + 8052 + 8053 + 8054 + 8055 + 8056 + 8057 + 8058 + 8059 + 8060 + 8061 + 8062 + 8063 + 8064 + 8065 + 8066 + 8067 + 8068 + 8069 + 8070 + 8071 + 8072 + 8073 + 8074 + 8075 + 8076 + 8077 + 8078 + 8079 + 8080 + 8081 + 8082 + 8083 + 8084 + 8085 + 8086 + 8087 + 8088 + 8089 + 8090 + 8091 + 8092 + 8093 + 8094 + 8095 + 8096 + 8097 + 8098 + 8099 + 8100 + 8101 + 8102 + 8103 + 8104 + 8105 + 8106 + 8107 + 8108 + 8109 + 8110 + 8111 + 8112 + 8113 + 8114 + 8115 + 8116 + 8117 + 8118 + 8119 + 8120 + 8121 + 8122 + 8123 + 8124 + 8125 + 8126 + 8127 + 8128 + 8129 + 8130 + 8131 + 8132 + 8133 + 8134 + 8135 + 8136 + 8137 + 8138 + 8139 + 8140 + 8141 + 8142 + 8143 + 8144 + 8145 + 8146 + 8147 + 8148 + 8149 + 8150 + 8151 + 8152 + 8153 + 8154 + 8155 + 8156 + 8157 + 8158 + 8159 + 8160 + 8161 + 8162 + 8163 + 8164 + 8165 + 8166 + 8167 + 8168 + 8169 + 8170 + 8171 + 8172 + 8173 + 8174 + 8175 + 8176 + 8177 + 8178 + 8179 + 8180 + 8181 + 8182 + 8183 + 8184 + 8185 + 8186 + 8187 + 8188 + 8189 + 8190 + 8191 + 8192 + 8193 + 8194 + 8195 + 8196 + 8197 + 8198 + 8199 + 8200 + 8201 + 8202 + 8203 + 8204 + 8205 + 8206 + 8207 + 8208 + 8209 + 8210 + 8211 + 8212 + 8213 + 8214 + 8215 + 8216 + 8217 + 8218 + 8219 + 8220 + 8221 + 8222 + 8223 + 8224 + 8225 + 8226 + 8227 + 8228 + 8229 + 8230 + 8231 + 8232 + 8233 + 8234 + 8235 + 8236 + 8237 + 8238 + 8239 + 8240 + 8241 + 8242 + 8243 + 8244 + 8245 + 8246 + 8247 + 8248 + 8249 + 8250 + 8251 + 8252 + 8253 + 8254 + 8255 + 8256 + 8257 + 8258 + 8259 + 8260 + 8261 + 8262 + 8263 + 8264 + 8265 + 8266 + 8267 + 8268 + 8269 + 8270 + 8271 + 8272 + 8273 + 8274 + 8275 + 8276 + 8277 + 8278 + 8279 + 8280 + 8281 + 8282 + 8283 + 8284 + 8285 + 8286 + 8287 + 8288 + 8289 + 8290 + 8291 + 8292 + 8293 + 8294 + 8295 + 8296 + 8297 + 8298 + 8299 + 8300 + 8301 + 8302 + 8303 + 8304 + 8305 + 8306 + 8307 + 8308 + 8309 + 8310 + 8311 + 8312 + 8313 + 8314 + 8315 + 8316 + 8317 + 8318 + 8319 + 8320 + 8321 + 8322 + 8323 + 8324 + 8325 + 8326 + 8327 + 8328 + 8329 + 8330 + 8331 + 8332 + 8333 + 8334 + 8335 + 8336 + 8337 + 8338 + 8339 + 8340 + 8341 + 8342 + 8343 + 8344 + 8345 + 8346 + 8347 + 8348 + 8349 + 8350 + 8351 + 8352 + 8353 + 8354 + 8355 + 8356 + 8357 + 8358 + 8359 + 8360 + 8361 + 8362 + 8363 + 8364 + 8365 + 8366 + 8367 + 8368 + 8369 + 8370 + 8371 + 8372 + 8373 + 8374 + 8375 + 8376 + 8377 + 8378 + 8379 + 8380 + 8381 + 8382 + 8383 + 8384 + 8385 + 8386 + 8387 + 8388 + 8389 + 8390 + 8391 + 8392 + 8393 + 8394 + 8395 + 8396 + 8397 + 8398 + 8399 + 8400 + 8401 + 8402 + 8403 + 8404 + 8405 + 8406 + 8407 + 8408 + 8409 + 8410 + 8411 + 8412 + 8413 + 8414 + 8415 + 8416 + 8417 + 8418 + 8419 + 8420 + 8421 + 8422 + 8423 + 8424 + 8425 + 8426 + 8427 + 8428 + 8429 + 8430 + 8431 + 8432 + 8433 + 8434 + 8435 + 8436 + 8437 + 8438 + 8439 + 8440 + 8441 + 8442 + 8443 + 8444 + 8445 + 8446 + 8447 + 8448 + 8449 + 8450 + 8451 + 8452 + 8453 + 8454 + 8455 + 8456 + 8457 + 8458 + 8459 + 8460 + 8461 + 8462 + 8463 + 8464 + 8465 + 8466 + 8467 + 8468 + 8469 + 8470 + 8471 + 8472 + 8473 + 8474 + 8475 + 8476 + 8477 + 8478 + 8479 + 8480 + 8481 + 8482 + 8483 + 8484 + 8485 + 8486 + 8487 + 8488 + 8489 + 8490 + 8491 + 8492 + 8493 + 8494 + 8495 + 8496 + 8497 + 8498 + 8499 + 8500 + 8501 + 8502 + 8503 + 8504 + 8505 + 8506 + 8507 + 8508 + 8509 + 8510 + 8511 + 8512 + 8513 + 8514 + 8515 + 8516 + 8517 + 8518 + 8519 + 8520 + 8521 + 8522 + 8523 + 8524 + 8525 + 8526 + 8527 + 8528 + 8529 + 8530 + 8531 + 8532 + 8533 + 8534 + 8535 + 8536 + 8537 + 8538 + 8539 + 8540 + 8541 + 8542 + 8543 + 8544 + 8545 + 8546 + 8547 + 8548 + 8549 + 8550 + 8551 + 8552 + 8553 + 8554 + 8555 + 8556 + 8557 + 8558 + 8559 + 8560 + 8561 + 8562 + 8563 + 8564 + 8565 + 8566 + 8567 + 8568 + 8569 + 8570 + 8571 + 8572 + 8573 + 8574 + 8575 + 8576 + 8577 + 8578 + 8579 + 8580 + 8581 + 8582 + 8583 + 8584 + 8585 + 8586 + 8587 + 8588 + 8589 + 8590 + 8591 + 8592 + 8593 + 8594 + 8595 + 8596 + 8597 + 8598 + 8599 + 8600 + 8601 + 8602 + 8603 + 8604 + 8605 + 8606 + 8607 + 8608 + 8609 + 8610 + 8611 + 8612 + 8613 + 8614 + 8615 + 8616 + 8617 + 8618 + 8619 + 8620 + 8621 + 8622 + 8623 + 8624 + 8625 + 8626 + 8627 + 8628 + 8629 + 8630 + 8631 + 8632 + 8633 + 8634 + 8635 + 8636 + 8637 + 8638 + 8639 + 8640 + 8641 + 8642 + 8643 + 8644 + 8645 + 8646 + 8647 + 8648 + 8649 + 8650 + 8651 + 8652 + 8653 + 8654 + 8655 + 8656 + 8657 + 8658 + 8659 + 8660 + 8661 + 8662 + 8663 + 8664 + 8665 + 8666 + 8667 + 8668 + 8669 + 8670 + 8671 + 8672 + 8673 + 8674 + 8675 + 8676 + 8677 + 8678 + 8679 + 8680 + 8681 + 8682 + 8683 + 8684 + 8685 + 8686 + 8687 + 8688 + 8689 + 8690 + 8691 + 8692 + 8693 + 8694 + 8695 + 8696 + 8697 + 8698 + 8699 + 8700 + 8701 + 8702 + 8703 + 8704 + 8705 + 8706 + 8707 + 8708 + 8709 + 8710 + 8711 + 8712 + 8713 + 8714 + 8715 + 8716 + 8717 + 8718 + 8719 + 8720 + 8721 + 8722 + 8723 + 8724 + 8725 + 8726 + 8727 + 8728 + 8729 + 8730 + 8731 + 8732 + 8733 + 8734 + 8735 + 8736 + 8737 + 8738 + 8739 + 8740 + 8741 + 8742 + 8743 + 8744 + 8745 + 8746 + 8747 + 8748 + 8749 + 8750 + 8751 + 8752 + 8753 + 8754 + 8755 + 8756 + 8757 + 8758 + 8759 + 8760 + 8761 + 8762 + 8763 + 8764 + 8765 + 8766 + 8767 + 8768 + 8769 + 8770 + 8771 + 8772 + 8773 + 8774 + 8775 + 8776 + 8777 + 8778 + 8779 + 8780 + 8781 + 8782 + 8783 + 8784 + 8785 + 8786 + 8787 + 8788 + 8789 + 8790 + 8791 + 8792 + 8793 + 8794 + 8795 + 8796 + 8797 + 8798 + 8799 + 8800 + 8801 + 8802 + 8803 + 8804 + 8805 + 8806 + 8807 + 8808 + 8809 + 8810 + 8811 + 8812 + 8813 + 8814 + 8815 + 8816 + 8817 + 8818 + 8819 + 8820 + 8821 + 8822 + 8823 + 8824 + 8825 + 8826 + 8827 + 8828 + 8829 + 8830 + 8831 + 8832 + 8833 + 8834 + 8835 + 8836 + 8837 + 8838 + 8839 + 8840 + 8841 + 8842 + 8843 + 8844 + 8845 + 8846 + 8847 + 8848 + 8849 + 8850 + 8851 + 8852 + 8853 + 8854 + 8855 + 8856 + 8857 + 8858 + 8859 + 8860 + 8861 + 8862 + 8863 + 8864 + 8865 + 8866 + 8867 + 8868 + 8869 + 8870 + 8871 + 8872 + 8873 + 8874 + 8875 + 8876 + 8877 + 8878 + 8879 + 8880 + 8881 + 8882 + 8883 + 8884 + 8885 + 8886 + 8887 + 8888 + 8889 + 8890 + 8891 + 8892 + 8893 + 8894 + 8895 + 8896 + 8897 + 8898 + 8899 + 8900 + 8901 + 8902 + 8903 + 8904 + 8905 + 8906 + 8907 + 8908 + 8909 + 8910 + 8911 + 8912 + 8913 + 8914 + 8915 + 8916 + 8917 + 8918 + 8919 + 8920 + 8921 + 8922 + 8923 + 8924 + 8925 + 8926 + 8927 + 8928 + 8929 + 8930 + 8931 + 8932 + 8933 + 8934 + 8935 + 8936 + 8937 + 8938 + 8939 + 8940 + 8941 + 8942 + 8943 + 8944 + 8945 + 8946 + 8947 + 8948 + 8949 + 8950 + 8951 + 8952 + 8953 + 8954 + 8955 + 8956 + 8957 + 8958 + 8959 + 8960 + 8961 + 8962 + 8963 + 8964 + 8965 + 8966 + 8967 + 8968 + 8969 + 8970 + 8971 + 8972 + 8973 + 8974 + 8975 + 8976 + 8977 + 8978 + 8979 + 8980 + 8981 + 8982 + 8983 + 8984 + 8985 + 8986 + 8987 + 8988 + 8989 + 8990 + 8991 + 8992 + 8993 + 8994 + 8995 + 8996 + 8997 + 8998 + 8999 + 9000 + 9001 + 9002 + 9003 + 9004 + 9005 + 9006 + 9007 + 9008 + 9009 + 9010 + 9011 + 9012 + 9013 + 9014 + 9015 + 9016 + 9017 + 9018 + 9019 + 9020 + 9021 + 9022 + 9023 + 9024 + 9025 + 9026 + 9027 + 9028 + 9029 + 9030 + 9031 + 9032 + 9033 + 9034 + 9035 + 9036 + 9037 + 9038 + 9039 + 9040 + 9041 + 9042 + 9043 + 9044 + 9045 + 9046 + 9047 + 9048 + 9049 + 9050 + 9051 + 9052 + 9053 + 9054 + 9055 + 9056 + 9057 + 9058 + 9059 + 9060 + 9061 + 9062 + 9063 + 9064 + 9065 + 9066 + 9067 + 9068 + 9069 + 9070 + 9071 + 9072 + 9073 + 9074 + 9075 + 9076 + 9077 + 9078 + 9079 + 9080 + 9081 + 9082 + 9083 + 9084 + 9085 + 9086 + 9087 + 9088 + 9089 + 9090 + 9091 + 9092 + 9093 + 9094 + 9095 + 9096 + 9097 + 9098 + 9099 + 9100 + 9101 + 9102 + 9103 + 9104 + 9105 + 9106 + 9107 + 9108 + 9109 + 9110 + 9111 + 9112 + 9113 + 9114 + 9115 + 9116 + 9117 + 9118 + 9119 + 9120 + 9121 + 9122 + 9123 + 9124 + 9125 + 9126 + 9127 + 9128 + 9129 + 9130 + 9131 + 9132 + 9133 + 9134 + 9135 + 9136 + 9137 + 9138 + 9139 + 9140 + 9141 + 9142 + 9143 + 9144 + 9145 + 9146 + 9147 + 9148 + 9149 + 9150 + 9151 + 9152 + 9153 + 9154 + 9155 + 9156 + 9157 + 9158 + 9159 + 9160 + 9161 + 9162 + 9163 + 9164 + 9165 + 9166 + 9167 + 9168 + 9169 + 9170 + 9171 + 9172 + 9173 + 9174 + 9175 + 9176 + 9177 + 9178 + 9179 + 9180 + 9181 + 9182 + 9183 + 9184 + 9185 + 9186 + 9187 + 9188 + 9189 + 9190 + 9191 + 9192 + 9193 + 9194 + 9195 + 9196 + 9197 + 9198 + 9199 + 9200 + 9201 + 9202 + 9203 + 9204 + 9205 + 9206 + 9207 + 9208 + 9209 + 9210 + 9211 + 9212 + 9213 + 9214 + 9215 + 9216 + 9217 + 9218 + 9219 + 9220 + 9221 + 9222 + 9223 + 9224 + 9225 + 9226 + 9227 + 9228 + 9229 + 9230 + 9231 + 9232 + 9233 + 9234 + 9235 + 9236 + 9237 + 9238 + 9239 + 9240 + 9241 + 9242 + 9243 + 9244 + 9245 + 9246 + 9247 + 9248 + 9249 + 9250 + 9251 + 9252 + 9253 + 9254 + 9255 + 9256 + 9257 + 9258 + 9259 + 9260 + 9261 + 9262 + 9263 + 9264 + 9265 + 9266 + 9267 + 9268 + 9269 + 9270 + 9271 + 9272 + 9273 + 9274 + 9275 + 9276 + 9277 + 9278 + 9279 + 9280 + 9281 + 9282 + 9283 + 9284 + 9285 + 9286 + 9287 + 9288 + 9289 + 9290 + 9291 + 9292 + 9293 + 9294 + 9295 + 9296 + 9297 + 9298 + 9299 + 9300 + 9301 + 9302 + 9303 + 9304 + 9305 + 9306 + 9307 + 9308 + 9309 + 9310 + 9311 + 9312 + 9313 + 9314 + 9315 + 9316 + 9317 + 9318 + 9319 + 9320 + 9321 + 9322 + 9323 + 9324 + 9325 + 9326 + 9327 + 9328 + 9329 + 9330 + 9331 + 9332 + 9333 + 9334 + 9335 + 9336 + 9337 + 9338 + 9339 + 9340 + 9341 + 9342 + 9343 + 9344 + 9345 + 9346 + 9347 + 9348 + 9349 + 9350 + 9351 + 9352 + 9353 + 9354 + 9355 + 9356 + 9357 + 9358 + 9359 + 9360 + 9361 + 9362 + 9363 + 9364 + 9365 + 9366 + 9367 + 9368 + 9369 + 9370 + 9371 + 9372 + 9373 + 9374 + 9375 + 9376 + 9377 + 9378 + 9379 + 9380 + 9381 + 9382 + 9383 + 9384 + 9385 + 9386 + 9387 + 9388 + 9389 + 9390 + 9391 + 9392 + 9393 + 9394 + 9395 + 9396 + 9397 + 9398 + 9399 + 9400 + 9401 + 9402 + 9403 + 9404 + 9405 + 9406 + 9407 + 9408 + 9409 + 9410 + 9411 + 9412 + 9413 + 9414 + 9415 + 9416 + 9417 + 9418 + 9419 + 9420 + 9421 + 9422 + 9423 + 9424 + 9425 + 9426 + 9427 + 9428 + 9429 + 9430 + 9431 + 9432 + 9433 + 9434 + 9435 + 9436 + 9437 + 9438 + 9439 + 9440 + 9441 + 9442 + 9443 + 9444 + 9445 + 9446 + 9447 + 9448 + 9449 + 9450 + 9451 + 9452 + 9453 + 9454 + 9455 + 9456 + 9457 + 9458 + 9459 + 9460 + 9461 + 9462 + 9463 + 9464 + 9465 + 9466 + 9467 + 9468 + 9469 + 9470 + 9471 + 9472 + 9473 + 9474 + 9475 + 9476 + 9477 + 9478 + 9479 + 9480 + 9481 + 9482 + 9483 + 9484 + 9485 + 9486 + 9487 + 9488 + 9489 + 9490 + 9491 + 9492 + 9493 + 9494 + 9495 + 9496 + 9497 + 9498 + 9499 + 9500 + 9501 + 9502 + 9503 + 9504 + 9505 + 9506 + 9507 + 9508 + 9509 + 9510 + 9511 + 9512 + 9513 + 9514 + 9515 + 9516 + 9517 + 9518 + 9519 + 9520 + 9521 + 9522 + 9523 + 9524 + 9525 + 9526 + 9527 + 9528 + 9529 + 9530 + 9531 + 9532 + 9533 + 9534 + 9535 + 9536 + 9537 + 9538 + 9539 + 9540 + 9541 + 9542 + 9543 + 9544 + 9545 + 9546 + 9547 + 9548 + 9549 + 9550 + 9551 + 9552 + 9553 + 9554 + 9555 + 9556 + 9557 + 9558 + 9559 + 9560 + 9561 + 9562 + 9563 + 9564 + 9565 + 9566 + 9567 + 9568 + 9569 + 9570 + 9571 + 9572 + 9573 + 9574 + 9575 + 9576 + 9577 + 9578 + 9579 + 9580 + 9581 + 9582 + 9583 + 9584 + 9585 + 9586 + 9587 + 9588 + 9589 + 9590 + 9591 + 9592 + 9593 + 9594 + 9595 + 9596 + 9597 + 9598 + 9599 + 9600 + 9601 + 9602 + 9603 + 9604 + 9605 + 9606 + 9607 + 9608 + 9609 + 9610 + 9611 + 9612 + 9613 + 9614 + 9615 + 9616 + 9617 + 9618 + 9619 + 9620 + 9621 + 9622 + 9623 + 9624 + 9625 + 9626 + 9627 + 9628 + 9629 + 9630 + 9631 + 9632 + 9633 + 9634 + 9635 + 9636 + 9637 + 9638 + 9639 + 9640 + 9641 + 9642 + 9643 + 9644 + 9645 + 9646 + 9647 + 9648 + 9649 + 9650 + 9651 + 9652 + 9653 + 9654 + 9655 + 9656 + 9657 + 9658 + 9659 + 9660 + 9661 + 9662 + 9663 + 9664 + 9665 + 9666 + 9667 + 9668 + 9669 + 9670 + 9671 + 9672 + 9673 + 9674 + 9675 + 9676 + 9677 + 9678 + 9679 + 9680 + 9681 + 9682 + 9683 + 9684 + 9685 + 9686 + 9687 + 9688 + 9689 + 9690 + 9691 + 9692 + 9693 + 9694 + 9695 + 9696 + 9697 + 9698 + 9699 + 9700 + 9701 + 9702 + 9703 + 9704 + 9705 + 9706 + 9707 + 9708 + 9709 + 9710 + 9711 + 9712 + 9713 + 9714 + 9715 + 9716 + 9717 + 9718 + 9719 + 9720 + 9721 + 9722 + 9723 + 9724 + 9725 + 9726 + 9727 + 9728 + 9729 + 9730 + 9731 + 9732 + 9733 + 9734 + 9735 + 9736 + 9737 + 9738 + 9739 + 9740 + 9741 + 9742 + 9743 + 9744 + 9745 + 9746 + 9747 + 9748 + 9749 + 9750 + 9751 + 9752 + 9753 + 9754 + 9755 + 9756 + 9757 + 9758 + 9759 + 9760 + 9761 + 9762 + 9763 + 9764 + 9765 + 9766 + 9767 + 9768 + 9769 + 9770 + 9771 + 9772 + 9773 + 9774 + 9775 + 9776 + 9777 + 9778 + 9779 + 9780 + 9781 + 9782 + 9783 + 9784 + 9785 + 9786 + 9787 + 9788 + 9789 + 9790 + 9791 + 9792 + 9793 + 9794 + 9795 + 9796 + 9797 + 9798 + 9799 + 9800 + 9801 + 9802 + 9803 + 9804 + 9805 + 9806 + 9807 + 9808 + 9809 + 9810 + 9811 + 9812 + 9813 + 9814 + 9815 + 9816 + 9817 + 9818 + 9819 + 9820 + 9821 + 9822 + 9823 + 9824 + 9825 + 9826 + 9827 + 9828 + 9829 + 9830 + 9831 + 9832 + 9833 + 9834 + 9835 + 9836 + 9837 + 9838 + 9839 + 9840 + 9841 + 9842 + 9843 + 9844 + 9845 + 9846 + 9847 + 9848 + 9849 + 9850 + 9851 + 9852 + 9853 + 9854 + 9855 + 9856 + 9857 + 9858 + 9859 + 9860 + 9861 + 9862 + 9863 + 9864 + 9865 + 9866 + 9867 + 9868 + 9869 + 9870 + 9871 + 9872 + 9873 + 9874 + 9875 + 9876 + 9877 + 9878 + 9879 + 9880 + 9881 + 9882 + 9883 + 9884 + 9885 + 9886 + 9887 + 9888 + 9889 + 9890 + 9891 + 9892 + 9893 + 9894 + 9895 + 9896 + 9897 + 9898 + 9899 + 9900 + 9901 + 9902 + 9903 + 9904 + 9905 + 9906 + 9907 + 9908 + 9909 + 9910 + 9911 + 9912 + 9913 + 9914 + 9915 + 9916 + 9917 + 9918 + 9919 + 9920 + 9921 + 9922 + 9923 + 9924 + 9925 + 9926 + 9927 + 9928 + 9929 + 9930 + 9931 + 9932 + 9933 + 9934 + 9935 + 9936 + 9937 + 9938 + 9939 + 9940 + 9941 + 9942 + 9943 + 9944 + 9945 + 9946 + 9947 + 9948 + 9949 + 9950 + 9951 + 9952 + 9953 + 9954 + 9955 + 9956 + 9957 + 9958 + 9959 + 9960 + 9961 + 9962 + 9963 + 9964 + 9965 + 9966 + 9967 + 9968 + 9969 + 9970 + 9971 + 9972 + 9973 + 9974 + 9975 + 9976 + 9977 + 9978 + 9979 + 9980 + 9981 + 9982 + 9983 + 9984 + 9985 + 9986 + 9987 + 9988 + 9989 + 9990 + 9991 + 9992 + 9993 + 9994 + 9995 + 9996 + 9997 + 9998 + 9999 + 10000 + 10001 + 10002 + 10003 + 10004 + 10005 + 10006 + 10007 + 10008 + 10009 + 10010 + 10011 + 10012 + 10013 + 10014 + 10015 + 10016 + 10017 + 10018 + 10019 + 10020 + 10021 + 10022 + 10023 + 10024 + 10025 + 10026 + 10027 + 10028 + 10029 + 10030 + 10031 + 10032 + 10033 + 10034 + 10035 + 10036 + 10037 + 10038 + 10039 + 10040 + 10041 + 10042 + 10043 + 10044 + 10045 + 10046 + 10047 + 10048 + 10049 + 10050 + 10051 + 10052 + 10053 + 10054 + 10055 + 10056 + 10057 + 10058 + 10059 + 10060 + 10061 + 10062 + 10063 + 10064 + 10065 + 10066 + 10067 + 10068 + 10069 + 10070 + 10071 + 10072 + 10073 + 10074 + 10075 + 10076 + 10077 + 10078 + 10079 + 10080 + 10081 + 10082 + 10083 + 10084 + 10085 + 10086 + 10087 + 10088 + 10089 + 10090 + 10091 + 10092 + 10093 + 10094 + 10095 + 10096 + 10097 + 10098 + 10099 + 10100 + 10101 + 10102 + 10103 + 10104 + 10105 + 10106 + 10107 + 10108 + 10109 + 10110 + 10111 + 10112 + 10113 + 10114 + 10115 + 10116 + 10117 + 10118 + 10119 + 10120 + 10121 + 10122 + 10123 + 10124 + 10125 + 10126 + 10127 + 10128 + 10129 + 10130 + 10131 + 10132 + 10133 + 10134 + 10135 + 10136 + 10137 + 10138 + 10139 + 10140 + 10141 + 10142 + 10143 + 10144 + 10145 + 10146 + 10147 + 10148 + 10149 + 10150 + 10151 + 10152 + 10153 + 10154 + 10155 + 10156 + 10157 + 10158 + 10159 + 10160 + 10161 + 10162 + 10163 + 10164 + 10165 + 10166 + 10167 + 10168 + 10169 + 10170 + 10171 + 10172 + 10173 + 10174 + 10175 + 10176 + 10177 + 10178 + 10179 + 10180 + 10181 + 10182 + 10183 + 10184 + 10185 + 10186 + 10187 + 10188 + 10189 + 10190 + 10191 + 10192 + 10193 + 10194 + 10195 + 10196 + 10197 + 10198 + 10199 + 10200 + 10201 + 10202 + 10203 + 10204 + 10205 + 10206 + 10207 + 10208 + 10209 + 10210 + 10211 + 10212 + 10213 + 10214 + 10215 + 10216 + 10217 + 10218 + 10219 + 10220 + 10221 + 10222 + 10223 + 10224 + 10225 + 10226 + 10227 + 10228 + 10229 + 10230 + 10231 + 10232 + 10233 + 10234 + 10235 + 10236 + 10237 + 10238 + 10239 + 10240 + 10241 + 10242 + 10243 + 10244 + 10245 + 10246 + 10247 + 10248 + 10249 + 10250 + 10251 + 10252 + 10253 + 10254 + 10255 + 10256 + 10257 + 10258 + 10259 + 10260 + 10261 + 10262 + 10263 + 10264 + 10265 + 10266 + 10267 + 10268 + 10269 + 10270 + 10271 + 10272 + 10273 + 10274 + 10275 + 10276 + 10277 + 10278 + 10279 + 10280 + 10281 + 10282 + 10283 + 10284 + 10285 + 10286 + 10287 + 10288 + 10289 + 10290 + 10291 + 10292 + 10293 + 10294 + 10295 + 10296 + 10297 + 10298 + 10299 + 10300 + 10301 + 10302 + 10303 + 10304 + 10305 + 10306 + 10307 + 10308 + 10309 + 10310 + 10311 + 10312 + 10313 + 10314 + 10315 + 10316 + 10317 + 10318 + 10319 + 10320 + 10321 + 10322 + 10323 + 10324 + 10325 + 10326 + 10327 + 10328 + 10329 + 10330 + 10331 + 10332 + 10333 + 10334 + 10335 + 10336 + 10337 + 10338 + 10339 + 10340 + 10341 + 10342 + 10343 + 10344 + 10345 + 10346 + 10347 + 10348 + 10349 + 10350 + 10351 + 10352 + 10353 + 10354 + 10355 + 10356 + 10357 + 10358 + 10359 + 10360 + 10361 + 10362 + 10363 + 10364 + 10365 + 10366 + 10367 + 10368 + 10369 + 10370 + 10371 + 10372 + 10373 + 10374 + 10375 + 10376 + 10377 + 10378 + 10379 + 10380 + 10381 + 10382 + 10383 + 10384 + 10385 + 10386 + 10387 + 10388 + 10389 + 10390 + 10391 + 10392 + 10393 + 10394 + 10395 + 10396 + 10397 + 10398 + 10399 + 10400 + 10401 + 10402 + 10403 + 10404 + 10405 + 10406 + 10407 + 10408 + 10409 + 10410 + 10411 + 10412 + 10413 + 10414 + 10415 + 10416 + 10417 + 10418 + 10419 + 10420 + 10421 + 10422 + 10423 + 10424 + 10425 + 10426 + 10427 + 10428 + 10429 + 10430 + 10431 + 10432 + 10433 + 10434 + 10435 + 10436 + 10437 + 10438 + 10439 + 10440 + 10441 + 10442 + 10443 + 10444 + 10445 + 10446 + 10447 + 10448 + 10449 + 10450 + 10451 + 10452 + 10453 + 10454 + 10455 + 10456 + 10457 + 10458 + 10459 + 10460 + 10461 + 10462 + 10463 + 10464 + 10465 + 10466 + 10467 + 10468 + 10469 + 10470 + 10471 + 10472 + 10473 + 10474 + 10475 + 10476 + 10477 + 10478 + 10479 + 10480 + 10481 + 10482 + 10483 + 10484 + 10485 + 10486 + 10487 + 10488 + 10489 + 10490 + 10491 + 10492 + 10493 + 10494 + 10495 + 10496 + 10497 + 10498 + 10499 + 10500 + 10501 + 10502 + 10503 + 10504 + 10505 + 10506 + 10507 + 10508 + 10509 + 10510 + 10511 + 10512 + 10513 + 10514 + 10515 + 10516 + 10517 + 10518 + 10519 + 10520 + 10521 + 10522 + 10523 + 10524 + 10525 + 10526 + 10527 + 10528 + 10529 + 10530 + 10531 + 10532 + 10533 + 10534 + 10535 + 10536 + 10537 + 10538 + 10539 + 10540 + 10541 + 10542 + 10543 + 10544 + 10545 + 10546 + 10547 + 10548 + 10549 + 10550 + 10551 + 10552 + 10553 + 10554 + 10555 + 10556 + 10557 + 10558 + 10559 + 10560 + 10561 + 10562 + 10563 + 10564 + 10565 + 10566 + 10567 + 10568 + 10569 + 10570 + 10571 + 10572 + 10573 + 10574 + 10575 + 10576 + 10577 + 10578 + 10579 + 10580 + 10581 + 10582 + 10583 + 10584 + 10585 + 10586 + 10587 + 10588 + 10589 + 10590 + 10591 + 10592 + 10593 + 10594 + 10595 + 10596 + 10597 + 10598 + 10599 + 10600 + 10601 + 10602 + 10603 + 10604 + 10605 + 10606 + 10607 + 10608 + 10609 + 10610 + 10611 + 10612 + 10613 + 10614 + 10615 + 10616 + 10617 + 10618 + 10619 + 10620 + 10621 + 10622 + 10623 + 10624 + 10625 + 10626 + 10627 + 10628 + 10629 + 10630 + 10631 + 10632 + 10633 + 10634 + 10635 + 10636 + 10637 + 10638 + 10639 + 10640 + 10641 + 10642 + 10643 + 10644 + 10645 + 10646 + 10647 + 10648 + 10649 + 10650 + 10651 + 10652 + 10653 + 10654 + 10655 + 10656 + 10657 + 10658 + 10659 + 10660 + 10661 + 10662 + 10663 + 10664 + 10665 + 10666 + 10667 + 10668 + 10669 + 10670 + 10671 + 10672 + 10673 + 10674 + 10675 + 10676 + 10677 + 10678 + 10679 + 10680 + 10681 + 10682 + 10683 + 10684 + 10685 + 10686 + 10687 + 10688 + 10689 + 10690 + 10691 + 10692 + 10693 + 10694 + 10695 + 10696 + 10697 + 10698 + 10699 + 10700 + 10701 + 10702 + 10703 + 10704 + 10705 + 10706 + 10707 + 10708 + 10709 + 10710 + 10711 + 10712 + 10713 + 10714 + 10715 + 10716 + 10717 + 10718 + 10719 + 10720 + 10721 + 10722 + 10723 + 10724 + 10725 + 10726 + 10727 + 10728 + 10729 + 10730 + 10731 + 10732 + 10733 + 10734 + 10735 + 10736 + 10737 + 10738 + 10739 + 10740 + 10741 + 10742 + 10743 + 10744 + 10745 + 10746 + 10747 + 10748 + 10749 + 10750 + 10751 + 10752 + 10753 + 10754 + 10755 + 10756 + 10757 + 10758 + 10759 + 10760 + 10761 + 10762 + 10763 + 10764 + 10765 + 10766 + 10767 + 10768 + 10769 + 10770 + 10771 + 10772 + 10773 + 10774 + 10775 + 10776 + 10777 + 10778 + 10779 + 10780 + 10781 + 10782 + 10783 + 10784 + 10785 + 10786 + 10787 + 10788 + 10789 + 10790 + 10791 + 10792 + 10793 + 10794 + 10795 + 10796 + 10797 + 10798 + 10799 + 10800 + 10801 + 10802 + 10803 + 10804 + 10805 + 10806 + 10807 + 10808 + 10809 + 10810 + 10811 + 10812 + 10813 + 10814 + 10815 + 10816 + 10817 + 10818 + 10819 + 10820 + 10821 + 10822 + 10823 + 10824 + 10825 + 10826 + 10827 + 10828 + 10829 + 10830 + 10831 + 10832 + 10833 + 10834 + 10835 + 10836 + 10837 + 10838 + 10839 + 10840 + 10841 + 10842 + 10843 + 10844 + 10845 + 10846 + 10847 + 10848 + 10849 + 10850 + 10851 + 10852 + 10853 + 10854 + 10855 + 10856 + 10857 + 10858 + 10859 + 10860 + 10861 + 10862 + 10863 + 10864 + 10865 + 10866 + 10867 + 10868 + 10869 + 10870 + 10871 + 10872 + 10873 + 10874 + 10875 + 10876 + 10877 + 10878 + 10879 + 10880 + 10881 + 10882 + 10883 + 10884 + 10885 + 10886 + 10887 + 10888 + 10889 + 10890 + 10891 + 10892 + 10893 + 10894 + 10895 + 10896 + 10897 + 10898 + 10899 + 10900 + 10901 + 10902 + 10903 + 10904 + 10905 + 10906 + 10907 + 10908 + 10909 + 10910 + 10911 + 10912 + 10913 + 10914 + 10915 + 10916 + 10917 + 10918 + 10919 + 10920 + 10921 + 10922 + 10923 + 10924 + 10925 + 10926 + 10927 + 10928 + 10929 + 10930 + 10931 + 10932 + 10933 + 10934 + 10935 + 10936 + 10937 + 10938 + 10939 + 10940 + 10941 + 10942 + 10943 + 10944 + 10945 + 10946 + 10947 + 10948 + 10949 + 10950 + 10951 + 10952 + 10953 + 10954 + 10955 + 10956 + 10957 + 10958 + 10959 + 10960 + 10961 + 10962 + 10963 + 10964 + 10965 + 10966 + 10967 + 10968 + 10969 + 10970 + 10971 + 10972 + 10973 + 10974 + 10975 + 10976 + 10977 + 10978 + 10979 + 10980 + 10981 + 10982 + 10983 + 10984 + 10985 + 10986 + 10987 + 10988 + 10989 + 10990 + 10991 + 10992 + 10993 + 10994 + 10995 + 10996 + 10997 + 10998 + 10999 + 11000 + 11001 + 11002 + 11003 + 11004 + 11005 + 11006 + 11007 + 11008 + 11009 + 11010 + 11011 + 11012 + 11013 + 11014 + 11015 + 11016 + 11017 + 11018 + 11019 + 11020 + 11021 + 11022 + 11023 + 11024 + 11025 + 11026 + 11027 + 11028 + 11029 + 11030 + 11031 + 11032 + 11033 + 11034 + 11035 + 11036 + 11037 + 11038 + 11039 + 11040 + 11041 + 11042 + 11043 + 11044 + 11045 + 11046 + 11047 + 11048 + 11049 + 11050 + 11051 + 11052 + 11053 + 11054 + 11055 + 11056 + 11057 + 11058 + 11059 + 11060 + 11061 + 11062 + 11063 + 11064 + 11065 + 11066 + 11067 + 11068 + 11069 + 11070 + 11071 + 11072 + 11073 + 11074 + 11075 + 11076 + 11077 + 11078 + 11079 + 11080 + 11081 + 11082 + 11083 + 11084 + 11085 + 11086 + 11087 + 11088 + 11089 + 11090 + 11091 + 11092 + 11093 + 11094 + 11095 + 11096 + 11097 + 11098 + 11099 + 11100 + 11101 + 11102 + 11103 + 11104 + 11105 + 11106 + 11107 + 11108 + 11109 + 11110 + 11111 + 11112 + 11113 + 11114 + 11115 + 11116 + 11117 + 11118 + 11119 + 11120 + 11121 + 11122 + 11123 + 11124 + 11125 + 11126 + 11127 + 11128 + 11129 + 11130 + 11131 + 11132 + 11133 + 11134 + 11135 + 11136 + 11137 + 11138 + 11139 + 11140 + 11141 + 11142 + 11143 + 11144 + 11145 + 11146 + 11147 + 11148 + 11149 + 11150 + 11151 + 11152 + 11153 + 11154 + 11155 + 11156 + 11157 + 11158 + 11159 + 11160 + 11161 + 11162 + 11163 + 11164 + 11165 + 11166 + 11167 + 11168 + 11169 + 11170 + 11171 + 11172 + 11173 + 11174 + 11175 + 11176 + 11177 + 11178 + 11179 + 11180 + 11181 + 11182 + 11183 + 11184 + 11185 + 11186 + 11187 + 11188 + 11189 + 11190 + 11191 + 11192 + 11193 + 11194 + 11195 + 11196 + 11197 + 11198 + 11199 + 11200 + 11201 + 11202 + 11203 + 11204 + 11205 + 11206 + 11207 + 11208 + 11209 + 11210 + 11211 + 11212 + 11213 + 11214 + 11215 + 11216 + 11217 + 11218 + 11219 + 11220 + 11221 + 11222 + 11223 + 11224 + 11225 + 11226 + 11227 + 11228 + 11229 + 11230 + 11231 + 11232 + 11233 + 11234 + 11235 + 11236 + 11237 + 11238 + 11239 + 11240 + 11241 + 11242 + 11243 + 11244 + 11245 + 11246 + 11247 + 11248 + 11249 + 11250 + 11251 + 11252 + 11253 + 11254 + 11255 + 11256 + 11257 + 11258 + 11259 + 11260 + 11261 + 11262 + 11263 + 11264 + 11265 + 11266 + 11267 + 11268 + 11269 + 11270 + 11271 + 11272 + 11273 + 11274 + 11275 + 11276 + 11277 + 11278 + 11279 + 11280 + 11281 + 11282 + 11283 + 11284 + 11285 + 11286 + 11287 + 11288 + 11289 + 11290 + 11291 + 11292 + 11293 + 11294 + 11295 + 11296 + 11297 + 11298 + 11299 + 11300 + 11301 + 11302 + 11303 + 11304 + 11305 + 11306 + 11307 + 11308 + 11309 + 11310 + 11311 + 11312 + 11313 + 11314 + 11315 + 11316 + 11317 + 11318 + 11319 + 11320 + 11321 + 11322 + 11323 + 11324 + 11325 + 11326 + 11327 + 11328 + 11329 + 11330 + 11331 + 11332 + 11333 + 11334 + 11335 + 11336 + 11337 + 11338 + 11339 + 11340 + 11341 + 11342 + 11343 + 11344 + 11345 + 11346 + 11347 + 11348 + 11349 + 11350 + 11351 + 11352 + 11353 + 11354 + 11355 + 11356 + 11357 + 11358 + 11359 + 11360 + 11361 + 11362 + 11363 + 11364 + 11365 + 11366 + 11367 + 11368 + 11369 + 11370 + 11371 + 11372 + 11373 + 11374 + 11375 + 11376 + 11377 + 11378 + 11379 + 11380 + 11381 + 11382 + 11383 + 11384 + 11385 + 11386 + 11387 + 11388 + 11389 + 11390 + 11391 + 11392 + 11393 + 11394 + 11395 + 11396 + 11397 + 11398 + 11399 + 11400 + 11401 + 11402 + 11403 + 11404 + 11405 + 11406 + 11407 + 11408 + 11409 + 11410 + 11411 + 11412 + 11413 + 11414 + 11415 + 11416 + 11417 + 11418 + 11419 + 11420 + 11421 + 11422 + 11423 + 11424 + 11425 + 11426 + 11427 + 11428 + 11429 + 11430 + 11431 + 11432 + 11433 + 11434 + 11435 + 11436 + 11437 + 11438 + 11439 + 11440 + 11441 + 11442 + 11443 + 11444 + 11445 + 11446 + 11447 + 11448 + 11449 + 11450 + 11451 + 11452 + 11453 + 11454 + 11455 + 11456 + 11457 + 11458 + 11459 + 11460 + 11461 + 11462 + 11463 + 11464 + 11465 + 11466 + 11467 + 11468 + 11469 + 11470 + 11471 + 11472 + 11473 + 11474 + 11475 + 11476 + 11477 + 11478 + 11479 + 11480 + 11481 + 11482 + 11483 + 11484 + 11485 + 11486 + 11487 + 11488 + 11489 + 11490 + 11491 + 11492 + 11493 + 11494 + 11495 + 11496 + 11497 + 11498 + 11499 + 11500 + 11501 + 11502 + 11503 + 11504 + 11505 + 11506 + 11507 + 11508 + 11509 + 11510 + 11511 + 11512 + 11513 + 11514 + 11515 + 11516 + 11517 + 11518 + 11519 + 11520 + 11521 + 11522 + 11523 + 11524 + 11525 + 11526 + 11527 + 11528 + 11529 + 11530 + 11531 + 11532 + 11533 + 11534 + 11535 + 11536 + 11537 + 11538 + 11539 + 11540 + 11541 + 11542 + 11543 + 11544 + 11545 + 11546 + 11547 + 11548 + 11549 + 11550 + 11551 + 11552 + 11553 + 11554 + 11555 + 11556 + 11557 + 11558 + 11559 + 11560 + 11561 + 11562 + 11563 + 11564 + 11565 + 11566 + 11567 + 11568 + 11569 + 11570 + 11571 + 11572 + 11573 + 11574 + 11575 + 11576 + 11577 + 11578 + 11579 + 11580 + 11581 + 11582 + 11583 + 11584 + 11585 + 11586 + 11587 + 11588 + 11589 + 11590 + 11591 + 11592 + 11593 + 11594 + 11595 + 11596 + 11597 + 11598 + 11599 + 11600 + 11601 + 11602 + 11603 + 11604 + 11605 + 11606 + 11607 + 11608 + 11609 + 11610 + 11611 + 11612 + 11613 + 11614 + 11615 + 11616 + 11617 + 11618 + 11619 + 11620 + 11621 + 11622 + 11623 + 11624 + 11625 + 11626 + 11627 + 11628 + 11629 + 11630 + 11631 + 11632 + 11633 + 11634 + 11635 + 11636 + 11637 + 11638 + 11639 + 11640 + 11641 + 11642 + 11643 + 11644 + 11645 + 11646 + 11647 + 11648 + 11649 + 11650 + 11651 + 11652 + 11653 + 11654 + 11655 + 11656 + 11657 + 11658 + 11659 + 11660 + 11661 + 11662 + 11663 + 11664 + 11665 + 11666 + 11667 + 11668 + 11669 + 11670 + 11671 + 11672 + 11673 + 11674 + 11675 + 11676 + 11677 + 11678 + 11679 + 11680 + 11681 + 11682 + 11683 + 11684 + 11685 + 11686 + 11687 + 11688 + 11689 + 11690 + 11691 + 11692 + 11693 + 11694 + 11695 + 11696 + 11697 + 11698 + 11699 + 11700 + 11701 + 11702 + 11703 + 11704 + 11705 + 11706 + 11707 + 11708 + 11709 + 11710 + 11711 + 11712 + 11713 + 11714 + 11715 + 11716 + 11717 + 11718 + 11719 + 11720 + 11721 + 11722 + 11723 + 11724 + 11725 + 11726 + 11727 + 11728 + 11729 + 11730 + 11731 + 11732 + 11733 + 11734 + 11735 + 11736 + 11737 + 11738 + 11739 + 11740 + 11741 + 11742 + 11743 + 11744 + 11745 + 11746 + 11747 + 11748 + 11749 + 11750 + 11751 + 11752 + 11753 + 11754 + 11755 + 11756 + 11757 + 11758 + 11759 + 11760 + 11761 + 11762 + 11763 + 11764 + 11765 + 11766 + 11767 + 11768 + 11769 + 11770 + 11771 + 11772 + 11773 + 11774 + 11775 + 11776 + 11777 + 11778 + 11779 + 11780 + 11781 + 11782 + 11783 + 11784 + 11785 + 11786 + 11787 + 11788 + 11789 + 11790 + 11791 + 11792 + 11793 + 11794 + 11795 + 11796 + 11797 + 11798 + 11799 + 11800 + 11801 + 11802 + 11803 + 11804 + 11805 + 11806 + 11807 + 11808 + 11809 + 11810 + 11811 + 11812 + 11813 + 11814 + 11815 + 11816 + 11817 + 11818 + 11819 + 11820 + 11821 + 11822 + 11823 + 11824 + 11825 + 11826 + 11827 + 11828 + 11829 + 11830 + 11831 + 11832 + 11833 + 11834 + 11835 + 11836 + 11837 + 11838 + 11839 + 11840 + 11841 + 11842 + 11843 + 11844 + 11845 + 11846 + 11847 + 11848 + 11849 + 11850 + 11851 + 11852 + 11853 + 11854 + 11855 + 11856 + 11857 + 11858 + 11859 + 11860 + 11861 + 11862 + 11863 + 11864 + 11865 + 11866 + 11867 + 11868 + 11869 + 11870 + 11871 + 11872 + 11873 + 11874 + 11875 + 11876 + 11877 + 11878 + 11879 + 11880 + 11881 + 11882 + 11883 + 11884 + 11885 + 11886 + 11887 + 11888 + 11889 + 11890 + 11891 + 11892 + 11893 + 11894 + 11895 + 11896 + 11897 + 11898 + 11899 + 11900 + 11901 + 11902 + 11903 + 11904 + 11905 + 11906 + 11907 + 11908 + 11909 + 11910 + 11911 + 11912 + 11913 + 11914 + 11915 + 11916 + 11917 + 11918 + 11919 + 11920 + 11921 + 11922 + 11923 + 11924 + 11925 + 11926 + 11927 + 11928 + 11929 + 11930 + 11931 + 11932 + 11933 + 11934 + 11935 + 11936 + 11937 + 11938 + 11939 + 11940 + 11941 + 11942 + 11943 + 11944 + 11945 + 11946 + 11947 + 11948 + 11949 + 11950 + 11951 + 11952 + 11953 + 11954 + 11955 + 11956 + 11957 + 11958 + 11959 + 11960 + 11961 + 11962 + 11963 + 11964 + 11965 + 11966 + 11967 + 11968 + 11969 + 11970 + 11971 + 11972 + 11973 + 11974 + 11975 + 11976 + 11977 + 11978 + 11979 + 11980 + 11981 + 11982 + 11983 + 11984 + 11985 + 11986 + 11987 + 11988 + 11989 + 11990 + 11991 + 11992 + 11993 + 11994 + 11995 + 11996 + 11997 + 11998 + 11999 + 12000 + 12001 + 12002 + 12003 + 12004 + 12005 + 12006 + 12007 + 12008 + 12009 + 12010 + 12011 + 12012 + 12013 + 12014 + 12015 + 12016 + 12017 + 12018 + 12019 + 12020 + 12021 + 12022 + 12023 + 12024 + 12025 + 12026 + 12027 + 12028 + 12029 + 12030 + 12031 + 12032 + 12033 + 12034 + 12035 + 12036 + 12037 + 12038 + 12039 + 12040 + 12041 + 12042 + 12043 + 12044 + 12045 + 12046 + 12047 + 12048 + 12049 + 12050 + 12051 + 12052 + 12053 + 12054 + 12055 + 12056 + 12057 + 12058 + 12059 + 12060 + 12061 + 12062 + 12063 + 12064 + 12065 + 12066 + 12067 + 12068 + 12069 + 12070 + 12071 + 12072 + 12073 + 12074 + 12075 + 12076 + 12077 + 12078 + 12079 + 12080 + 12081 + 12082 + 12083 + 12084 + 12085 + 12086 + 12087 + 12088 + 12089 + 12090 + 12091 + 12092 + 12093 + 12094 + 12095 + 12096 + 12097 + 12098 + 12099 + 12100 + 12101 + 12102 + 12103 + 12104 + 12105 + 12106 + 12107 + 12108 + 12109 + 12110 + 12111 + 12112 + 12113 + 12114 + 12115 + 12116 + 12117 + 12118 + 12119 + 12120 + 12121 + 12122 + 12123 + 12124 + 12125 + 12126 + 12127 + 12128 + 12129 + 12130 + 12131 + 12132 + 12133 + 12134 + 12135 + 12136 + 12137 + 12138 + 12139 + 12140 + 12141 + 12142 + 12143 + 12144 + 12145 + 12146 + 12147 + 12148 + 12149 + 12150 + 12151 + 12152 + 12153 + 12154 + 12155 + 12156 + 12157 + 12158 + 12159 + 12160 + 12161 + 12162 + 12163 + 12164 + 12165 + 12166 + 12167 + 12168 + 12169 + 12170 + 12171 + 12172 + 12173 + 12174 + 12175 + 12176 + 12177 + 12178 + 12179 + 12180 + 12181 + 12182 + 12183 + 12184 + 12185 + 12186 + 12187 + 12188 + 12189 + 12190 + 12191 + 12192 + 12193 + 12194 + 12195 + 12196 + 12197 + 12198 + 12199 + 12200 + 12201 + 12202 + 12203 + 12204 + 12205 + 12206 + 12207 + 12208 + 12209 + 12210 + 12211 + 12212 + 12213 + 12214 + 12215 + 12216 + 12217 + 12218 + 12219 + 12220 + 12221 + 12222 + 12223 + 12224 + 12225 + 12226 + 12227 + 12228 + 12229 + 12230 + 12231 + 12232 + 12233 + 12234 + 12235 + 12236 + 12237 + 12238 + 12239 + 12240 + 12241 + 12242 + 12243 + 12244 + 12245 + 12246 + 12247 + 12248 + 12249 + 12250 + 12251 + 12252 + 12253 + 12254 + 12255 + 12256 + 12257 + 12258 + 12259 + 12260 + 12261 + 12262 + 12263 + 12264 + 12265 + 12266 + 12267 + 12268 + 12269 + 12270 + 12271 + 12272 + 12273 + 12274 + 12275 + 12276 + 12277 + 12278 + 12279 + 12280 + 12281 + 12282 + 12283 + 12284 + 12285 + 12286 + 12287 + 12288 + 12289 + 12290 + 12291 + 12292 + 12293 + 12294 + 12295 + 12296 + 12297 + 12298 + 12299 + 12300 + 12301 + 12302 + 12303 + 12304 + 12305 + 12306 + 12307 + 12308 + 12309 + 12310 + 12311 + 12312 + 12313 + 12314 + 12315 + 12316 + 12317 + 12318 + 12319 + 12320 + 12321 + 12322 + 12323 + 12324 + 12325 + 12326 + 12327 + 12328 + 12329 + 12330 + 12331 + 12332 + 12333 + 12334 + 12335 + 12336 + 12337 + 12338 + 12339 + 12340 + 12341 + 12342 + 12343 + 12344 + 12345 + 12346 + 12347 + 12348 + 12349 + 12350 + 12351 + 12352 + 12353 + 12354 + 12355 + 12356 + 12357 + 12358 + 12359 + 12360 + 12361 + 12362 + 12363 + 12364 + 12365 + 12366 + 12367 + 12368 + 12369 + 12370 + 12371 + 12372 + 12373 + 12374 + 12375 + 12376 + 12377 + 12378 + 12379 + 12380 + 12381 + 12382 + 12383 + 12384 + 12385 + 12386 + 12387 + 12388 + 12389 + 12390 + 12391 + 12392 + 12393 + 12394 + 12395 + 12396 + 12397 + 12398 + 12399 + 12400 + 12401 + 12402 + 12403 + 12404 + 12405 + 12406 + 12407 + 12408 + 12409 + 12410 + 12411 + 12412 + 12413 + 12414 + 12415 + 12416 + 12417 + 12418 + 12419 + 12420 + 12421 + 12422 + 12423 + 12424 + 12425 + 12426 + 12427 + 12428 + 12429 + 12430 + 12431 + 12432 + 12433 + 12434 + 12435 + 12436 + 12437 + 12438 + 12439 + 12440 + 12441 + 12442 + 12443 + 12444 + 12445 + 12446 + 12447 + 12448 + 12449 + 12450 + 12451 + 12452 + 12453 + 12454 + 12455 + 12456 + 12457 + 12458 + 12459 + 12460 + 12461 + 12462 + 12463 + 12464 + 12465 + 12466 + 12467 + 12468 + 12469 + 12470 + 12471 + 12472 + 12473 + 12474 + 12475 + 12476 + 12477 + 12478 + 12479 + 12480 + 12481 + 12482 + 12483 + 12484 + 12485 + 12486 + 12487 + 12488 + 12489 + 12490 + 12491 + 12492 + 12493 + 12494 + 12495 + 12496 + 12497 + 12498 + 12499 + 12500 + 12501 + 12502 + 12503 + 12504 + 12505 + 12506 + 12507 + 12508 + 12509 + 12510 + 12511 + 12512 + 12513 + 12514 + 12515 + 12516 + 12517 + 12518 + 12519 + 12520 + 12521 + 12522 + 12523 + 12524 + 12525 + 12526 + 12527 + 12528 + 12529 + 12530 + 12531 + 12532 + 12533 + 12534 + 12535 + 12536 + 12537 + 12538 + 12539 + 12540 + 12541 + 12542 + 12543 + 12544 + 12545 + 12546 + 12547 + 12548 + 12549 + 12550 + 12551 + 12552 + 12553 + 12554 + 12555 + 12556 + 12557 + 12558 + 12559 + 12560 + 12561 + 12562 + 12563 + 12564 + 12565 + 12566 + 12567 + 12568 + 12569 + 12570 + 12571 + 12572 + 12573 + 12574 + 12575 + 12576 + 12577 + 12578 + 12579 + 12580 + 12581 + 12582 + 12583 + 12584 + 12585 + 12586 + 12587 + 12588 + 12589 + 12590 + 12591 + 12592 + 12593 + 12594 + 12595 + 12596 + 12597 + 12598 + 12599 + 12600 + 12601 + 12602 + 12603 + 12604 + 12605 + 12606 + 12607 + 12608 + 12609 + 12610 + 12611 + 12612 + 12613 + 12614 + 12615 + 12616 + 12617 + 12618 + 12619 + 12620 + 12621 + 12622 + 12623 + 12624 + 12625 + 12626 + 12627 + 12628 + 12629 + 12630 + 12631 + 12632 + 12633 + 12634 + 12635 + 12636 + 12637 + 12638 + 12639 + 12640 + 12641 + 12642 + 12643 + 12644 + 12645 + 12646 + 12647 + 12648 + 12649 + 12650 + 12651 + 12652 + 12653 + 12654 + 12655 + 12656 + 12657 + 12658 + 12659 + 12660 + 12661 + 12662 + 12663 + 12664 + 12665 + 12666 + 12667 + 12668 + 12669 + 12670 + 12671 + 12672 + 12673 + 12674 + 12675 + 12676 + 12677 + 12678 + 12679 + 12680 + 12681 + 12682 + 12683 + 12684 + 12685 + 12686 + 12687 + 12688 + 12689 + 12690 + 12691 + 12692 + 12693 + 12694 + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + 2955 + 2956 + 2957 + 2958 + 2959 + 2960 + 2961 + 2962 + 2963 + 2964 + 2965 + 2966 + 2967 + 2968 + 2969 + 2970 + 2971 + 2972 + 2973 + 2974 + 2975 + 2976 + 2977 + 2978 + 2979 + 2980 + 2981 + 2982 + 2983 + 2984 + 2985 + 2986 + 2987 + 2988 + 2989 + 2990 + 2991 + 2992 + 2993 + 2994 + 2995 + 2996 + 2997 + 2998 + 2999 + 3000 + 3001 + 3002 + 3003 + 3004 + 3005 + 3006 + 3007 + 3008 + 3009 + 3010 + 3011 + 3012 + 3013 + 3014 + 3015 + 3016 + 3017 + 3018 + 3019 + 3020 + 3021 + 3022 + 3023 + 3024 + 3025 + 3026 + 3027 + 3028 + 3029 + 3030 + 3031 + 3032 + 3033 + 3034 + 3035 + 3036 + 3037 + 3038 + 3039 + 3040 + 3041 + 3042 + 3043 + 3044 + 3045 + 3046 + 3047 + 3048 + 3049 + 3050 + 3051 + 3052 + 3053 + 3054 + 3055 + 3056 + 3057 + 3058 + 3059 + 3060 + 3061 + 3062 + 3063 + 3064 + 3065 + 3066 + 3067 + 3068 + 3069 + 3070 + 3071 + 3072 + 3073 + 3074 + 3075 + 3076 + 3077 + 3078 + 3079 + 3080 + 3081 + 3082 + 3083 + 3084 + 3085 + 3086 + 3087 + 3088 + 3089 + 3090 + 3091 + 3092 + 3093 + 3094 + 3095 + 3096 + 3097 + 3098 + 3099 + 3100 + 3101 + 3102 + 3103 + 3104 + 3105 + 3106 + 3107 + 3108 + 3109 + 3110 + 3111 + 3112 + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + 2955 + 2956 + 2957 + 2958 + 2959 + 2960 + 2961 + 2962 + 2963 + 2964 + 2965 + 2966 + 2967 + 2968 + 2969 + 2970 + 2971 + 2972 + 2973 + 2974 + 2975 + 2976 + 2977 + 2978 + 2979 + 2980 + 2981 + 2982 + 2983 + 2984 + 2985 + 2986 + 2987 + 2988 + 2989 + 2990 + 2991 + 2992 + 2993 + 2994 + 2995 + 2996 + 2997 + 2998 + 2999 + 3000 + 3001 + 3002 + 3003 + 3004 + 3005 + 3006 + 3007 + 3008 + 3009 + 3010 + 3011 + 3012 + 3013 + 3014 + 3015 + 3016 + 3017 + 3018 + 3019 + 3020 + 3021 + 3022 + 3023 + 3024 + 3025 + 3026 + 3027 + 3028 + 3029 + 3030 + 3031 + 3032 + 3033 + 3034 + 3035 + 3036 + 3037 + 3038 + 3039 + 3040 + 3041 + 3042 + 3043 + 3044 + 3045 + 3046 + 3047 + 3048 + 3049 + 3050 + 3051 + 3052 + 3053 + 3054 + 3055 + 3056 + 3057 + 3058 + 3059 + 3060 + 3061 + 3062 + 3063 + 3064 + 3065 + 3066 + 3067 + 3068 + 3069 + 3070 + 3071 + 3072 + 3073 + 3074 + 3075 + 3076 + 3077 + 3078 + 3079 + 3080 + 3081 + 3082 + 3083 + 3084 + 3085 + 3086 + 3087 + 3088 + 3089 + 3090 + 3091 + 3092 + 3093 + 3094 + 3095 + 3096 + 3097 + 3098 + 3099 + 3100 + 3101 + 3102 + 3103 + 3104 + 3105 + 3106 + 3107 + 3108 + 3109 + 3110 + 3111 + 3112 + 3113 + 3114 + 3115 + 3116 + 3117 + 3118 + 3119 + 3120 + 3121 + 3122 + 3123 + 3124 + 3125 + 3126 + 3127 + 3128 + 3129 + 3130 + 3131 + 3132 + 3133 + 3134 + 3135 + 3136 + 3137 + 3138 + 3139 + 3140 + 3141 + 3142 + 3143 + 3144 + 3145 + 3146 + 3147 + 3148 + 3149 + 3150 + 3151 + 3152 + 3153 + 3154 + 3155 + 3156 + 3157 + 3158 + 3159 + 3160 + 3161 + 3162 + 3163 + 3164 + 3165 + 3166 + 3167 + 3168 + 3169 + 3170 + 3171 + 3172 + 3173 + 3174 + 3175 + 3176 + 3177 + 3178 + 3179 + 3180 + 3181 + 3182 + 3183 + 3184 + 3185 + 3186 + 3187 + 3188 + 3189 + 3190 + 3191 + 3192 + 3193 + 3194 + 3195 + 3196 + 3197 + 3198 + 3199 + 3200 + 3201 + 3202 + 3203 + 3204 + 3205 + 3206 + 3207 + 3208 + 3209 + 3210 + 3211 + 3212 + 3213 + 3214 + 3215 + 3216 + 3217 + 3218 + 3219 + 3220 + 3221 + 3222 + 3223 + 3224 + 3225 + 3226 + 3227 + 3228 + 3229 + 3230 + 3231 + 3232 + 3233 + 3234 + 3235 + 3236 + 3237 + 3238 + 3239 + 3240 + 3241 + 3242 + 3243 + 3244 + 3245 + 3246 + 3247 + 3248 + 3249 + 3250 + 3251 + 3252 + 3253 + 3254 + 3255 + 3256 + 3257 + 3258 + 3259 + 3260 + 3261 + 3262 + 3263 + 3264 + 3265 + 3266 + 3267 + 3268 + 3269 + 3270 + 3271 + 3272 + 3273 + 3274 + 3275 + 3276 + 3277 + 3278 + 3279 + 3280 + 3281 + 3282 + 3283 + 3284 + 3285 + 3286 + 3287 + 3288 + 3289 + 3290 + 3291 + 3292 + 3293 + 3294 + 3295 + 3296 + 3297 + 3298 + 3299 + 3300 + 3301 + 3302 + 3303 + 3304 + 3305 + 3306 + 3307 + 3308 + 3309 + 3310 + 3311 + 3312 + 3313 + 3314 + 3315 + 3316 + 3317 + 3318 + 3319 + 3320 + 3321 + 3322 + 3323 + 3324 + 3325 + 3326 + 3327 + 3328 + 3329 + 3330 + 3331 + 3332 + 3333 + 3334 + 3335 + 3336 + 3337 + 3338 + 3339 + 3340 + 3341 + 3342 + 3343 + 3344 + 3345 + 3346 + 3347 + 3348 + 3349 + 3350 + 3351 + 3352 + 3353 + 3354 + 3355 + 3356 + 3357 + 3358 + 3359 + 3360 + 3361 + 3362 + 3363 + 3364 + 3365 + 3366 + 3367 + 3368 + 3369 + 3370 + 3371 + 3372 + 3373 + 3374 + 3375 + 3376 + 3377 + 3378 + 3379 + 3380 + 3381 + 3382 + 3383 + 3384 + 3385 + 3386 + 3387 + 3388 + 3389 + 3390 + 3391 + 3392 + 3393 + 3394 + 3395 + 3396 + 3397 + 3398 + 3399 + 3400 + 3401 + 3402 + 3403 + 3404 + 3405 + 3406 + 3407 + 3408 + 3409 + 3410 + 3411 + 3412 + 3413 + 3414 + 3415 + 3416 + 3417 + 3418 + 3419 + 3420 + 3421 + 3422 + 3423 + 3424 + 3425 + 3426 + 3427 + 3428 + 3429 + 3430 + 3431 + 3432 + 3433 + 3434 + 3435 + 3436 + 3437 + 3438 + 3439 + 3440 + 3441 + 3442 + 3443 + 3444 + 3445 + 3446 + 3447 + 3448 + 3449 + 3450 + 3451 + 3452 + 3453 + 3454 + 3455 + 3456 + 3457 + 3458 + 3459 + 3460 + 3461 + 3462 + 3463 + 3464 + 3465 + 3466 + 3467 + 3468 + 3469 + 3470 + 3471 + 3472 + 3473 + 3474 + 3475 + 3476 + 3477 + 3478 + 3479 + 3480 + 3481 + 3482 + 3483 + 3484 + 3485 + 3486 + 3487 + 3488 + 3489 + 3490 + 3491 + 3492 + 3493 + 3494 + 3495 + 3496 + 3497 + 3498 + 3499 + 3500 + 3501 + 3502 + 3503 + 3504 + 3505 + 3506 + 3507 + 3508 + 3509 + 3510 + 3511 + 3512 + 3513 + 3514 + 3515 + 3516 + 3517 + 3518 + 3519 + 3520 + 3521 + 3522 + 3523 + 3524 + 3525 + 3526 + 3527 + 3528 + 3529 + 3530 + 3531 + 3532 + 3533 + 3534 + 3535 + 3536 + 3537 + 3538 + 3539 + 3540 + 3541 + 3542 + 3543 + 3544 + 3545 + 3546 + 3547 + 3548 + 3549 + 3550 + 3551 + 3552 + 3553 + 3554 + 3555 + 3556 + 3557 + 3558 + 3559 + 3560 + 3561 + 3562 + 3563 + 3564 + 3565 + 3566 + 3567 + 3568 + 3569 + 3570 + 3571 + 3572 + 3573 + 3574 + 3575 + 3576 + 3577 + 3578 + 3579 + 3580 + 3581 + 3582 + 3583 + 3584 + 3585 + 3586 + 3587 + 3588 + 3589 + 3590 + 3591 + 3592 + 3593 + 3594 + 3595 + 3596 + 3597 + 3598 + 3599 + 3600 + 3601 + 3602 + 3603 + 3604 + 3605 + 3606 + 3607 + 3608 + 3609 + 3610 + 3611 + 3612 + 3613 + 3614 + 3615 + 3616 + 3617 + 3618 + 3619 + 3620 + 3621 + 3622 + 3623 + 3624 + 3625 + 3626 + 3627 + 3628 + 3629 + 3630 + 3631 + 3632 + 3633 + 3634 + 3635 + 3636 + 3637 + 3638 + 3639 + 3640 + 3641 + 3642 + 3643 + 3644 + 3645 + 3646 + 3647 + 3648 + 3649 + 3650 + 3651 + 3652 + 3653 + 3654 + 3655 + 3656 + 3657 + 3658 + 3659 + 3660 + 3661 + 3662 + 3663 + 3664 + 3665 + 3666 + 3667 + 3668 + 3669 + 3670 + 3671 + 3672 + 3673 + 3674 + 3675 + 3676 + 3677 + 3678 + 3679 + 3680 + 3681 + 3682 + 3683 + 3684 + 3685 + 3686 + 3687 + 3688 + 3689 + 3690 + 3691 + 3692 + 3693 + 3694 + 3695 + 3696 + 3697 + 3698 + 3699 + 3700 + 3701 + 3702 + 3703 + 3704 + 3705 + 3706 + 3707 + 3708 + 3709 + 3710 + 3711 + 3712 + 3713 + 3714 + 3715 + 3716 + 3717 + 3718 + 3719 + 3720 + 3721 + 3722 + 3723 + 3724 + 3725 + 3726 + 3727 + 3728 + 3729 + 3730 + 3731 + 3732 + 3733 + 3734 + 3735 + 3736 + 3737 + 3738 + 3739 + 3740 + 3741 + 3742 + 3743 + 3744 + 3745 + 3746 + 3747 + 3748 + 3749 + 3750 + 3751 + 3752 + 3753 + 3754 + 3755 + 3756 + 3757 + 3758 + 3759 + 3760 + 3761 + 3762 + 3763 + 3764 + 3765 + 3766 + 3767 + 3768 + 3769 + 3770 + 3771 + 3772 + 3773 + 3774 + 3775 + 3776 + 3777 + 3778 + 3779 + 3780 + 3781 + 3782 + 3783 + 3784 + 3785 + 3786 + 3787 + 3788 + 3789 + 3790 + 3791 + 3792 + 3793 + 3794 + 3795 + 3796 + 3797 + 3798 + 3799 + 3800 + 3801 + 3802 + 3803 + 3804 + 3805 + 3806 + 3807 + 3808 + 3809 + 3810 + 3811 + 3812 + 3813 + 3814 + 3815 + 3816 + 3817 + 3818 + 3819 + 3820 + 3821 + 3822 + 3823 + 3824 + 3825 + 3826 + 3827 + 3828 + 3829 + 3830 + 3831 + 3832 + 3833 + 3834 + 3835 + 3836 + 3837 + 3838 + 3839 + 3840 + 3841 + 3842 + 3843 + 3844 + 3845 + 3846 + 3847 + 3848 + 3849 + 3850 + 3851 + 3852 + 3853 + 3854 + 3855 + 3856 + 3857 + 3858 + 3859 + 3860 + 3861 + 3862 + 3863 + 3864 + 3865 + 3866 + 3867 + 3868 + 3869 + 3870 + 3871 + 3872 + 3873 + 3874 + 3875 + 3876 + 3877 + 3878 + 3879 + 3880 + 3881 + 3882 + 3883 + 3884 + 3885 + 3886 + 3887 + 3888 + 3889 + 3890 + 3891 + 3892 + 3893 + 3894 + 3895 + 3896 + 3897 + 3898 + 3899 + 3900 + 3901 + 3902 + 3903 + 3904 + 3905 + 3906 + 3907 + 3908 + 3909 + 3910 + 3911 + 3912 + 3913 + 3914 + 3915 + 3916 + 3917 + 3918 + 3919 + 3920 + 3921 + 3922 + 3923 + 3924 + 3925 + 3926 + 3927 + 3928 + 3929 + 3930 + 3931 + 3932 + 3933 + 3934 + 3935 + 3936 + 3937 + 3938 + 3939 + 3940 + 3941 + 3942 + 3943 + 3944 + 3945 + 3946 + 3947 + 3948 + 3949 + 3950 + 3951 + 3952 + 3953 + 3954 + 3955 + 3956 + 3957 + 3958 + 3959 + 3960 + 3961 + 3962 + 3963 + 3964 + 3965 + 3966 + 3967 + 3968 + 3969 + 3970 + 3971 + 3972 + 3973 + 3974 + 3975 + 3976 + 3977 + 3978 + 3979 + 3980 + 3981 + 3982 + 3983 + 3984 + 3985 + 3986 + 3987 + 3988 + 3989 + 3990 + 3991 + 3992 + 3993 + 3994 + 3995 + 3996 + 3997 + 3998 + 3999 + 4000 + 4001 + 4002 + 4003 + 4004 + 4005 + 4006 + 4007 + 4008 + 4009 + 4010 + 4011 + 4012 + 4013 + 4014 + 4015 + 4016 + 4017 + 4018 + 4019 + 4020 + 4021 + 4022 + 4023 + 4024 + 4025 + 4026 + 4027 + 4028 + 4029 + 4030 + 4031 + 4032 + 4033 + 4034 + 4035 + 4036 + 4037 + 4038 + 4039 + 4040 + 4041 + 4042 + 4043 + 4044 + 4045 + 4046 + 4047 + 4048 + 4049 + 4050 + 4051 + 4052 + 4053 + 4054 + 4055 + 4056 + 4057 + 4058 + 4059 + 4060 + 4061 + 4062 + 4063 + 4064 + 4065 + 4066 + 4067 + 4068 + 4069 + 4070 + 4071 + 4072 + 4073 + 4074 + 4075 + 4076 + 4077 + 4078 + 4079 + 4080 + 4081 + 4082 + 4083 + 4084 + 4085 + 4086 + 4087 + 4088 + 4089 + 4090 + 4091 + 4092 + 4093 + 4094 + 4095 + 4096 + 4097 + 4098 + 4099 + 4100 + 4101 + 4102 + 4103 + 4104 + 4105 + 4106 + 4107 + 4108 + 4109 + 4110 + 4111 + 4112 + 4113 + 4114 + 4115 + 4116 + 4117 + 4118 + 4119 + 4120 + 4121 + 4122 + 4123 + 4124 + 4125 + 4126 + 4127 + 4128 + 4129 + 4130 + 4131 + 4132 + 4133 + 4134 + 4135 + 4136 + 4137 + 4138 + 4139 + 4140 + 4141 + 4142 + 4143 + 4144 + 4145 + 4146 + 4147 + 4148 + 4149 + 4150 + 4151 + 4152 + 4153 + 4154 + 4155 + 4156 + 4157 + 4158 + 4159 + 4160 + 4161 + 4162 + 4163 + 4164 + 4165 + 4166 + 4167 + 4168 + 4169 + 4170 + 4171 + 4172 + 4173 + 4174 + 4175 + 4176 + 4177 + 4178 + 4179 + 4180 + 4181 + 4182 + 4183 + 4184 + 4185 + 4186 + 4187 + 4188 + 4189 + 4190 + 4191 + 4192 + 4193 + 4194 + 4195 + 4196 + 4197 + 4198 + 4199 + 4200 + 4201 + 4202 + 4203 + 4204 + 4205 + 4206 + 4207 + 4208 + 4209 + 4210 + 4211 + 4212 + 4213 + 4214 + 4215 + 4216 + 4217 + 4218 + 4219 + 4220 + 4221 + 4222 + 4223 + 4224 + 4225 + 4226 + 4227 + 4228 + 4229 + 4230 + 4231 + 4232 + 4233 + 4234 + 4235 + 4236 + 4237 + 4238 + 4239 + 4240 + 4241 + 4242 + 4243 + 4244 + 4245 + 4246 + 4247 + 4248 + 4249 + 4250 + 4251 + 4252 + 4253 + 4254 + 4255 + 4256 + 4257 + 4258 + 4259 + 4260 + 4261 + 4262 + 4263 + 4264 + 4265 + 4266 + 4267 + 4268 + 4269 + 4270 + 4271 + 4272 + 4273 + 4274 + 4275 + 4276 + 4277 + 4278 + 4279 + 4280 + 4281 + 4282 + 4283 + 4284 + 4285 + 4286 + 4287 + 4288 + 4289 + 4290 + 4291 + 4292 + 4293 + 4294 + 4295 + 4296 + 4297 + 4298 + 4299 + 4300 + 4301 + 4302 + 4303 + 4304 + 4305 + 4306 + 4307 + 4308 + 4309 + 4310 + 4311 + 4312 + 4313 + 4314 + 4315 + 4316 + 4317 + 4318 + 4319 + 4320 + 4321 + 4322 + 4323 + 4324 + 4325 + 4326 + 4327 + 4328 + 4329 + 4330 + 4331 + 4332 + 4333 + 4334 + 4335 + 4336 + 4337 + 4338 + 4339 + 4340 + 4341 + 4342 + 4343 + 4344 + 4345 + 4346 + 4347 + 4348 + 4349 + 4350 + 4351 + 4352 + 4353 + 4354 + 4355 + 4356 + 4357 + 4358 + 4359 + 4360 + 4361 + 4362 + 4363 + 4364 + 4365 + 4366 + 4367 + 4368 + 4369 + 4370 + 4371 + 4372 + 4373 + 4374 + 4375 + 4376 + 4377 + 4378 + 4379 + 4380 + 4381 + 4382 + 4383 + 4384 + 4385 + 4386 + 4387 + 4388 + 4389 + 4390 + 4391 + 4392 + 4393 + 4394 + 4395 + 4396 + 4397 + 4398 + 4399 + 4400 + 4401 + 4402 + 4403 + 4404 + 4405 + 4406 + 4407 + 4408 + 4409 + 4410 + 4411 + 4412 + 4413 + 4414 + 4415 + 4416 + 4417 + 4418 + 4419 + 4420 + 4421 + 4422 + 4423 + 4424 + 4425 + 4426 + 4427 + 4428 + 4429 + 4430 + 4431 + 4432 + 4433 + 4434 + 4435 + 4436 + 4437 + 4438 + 4439 + 4440 + 4441 + 4442 + 4443 + 4444 + 4445 + 4446 + 4447 + 4448 + 4449 + 4450 + 4451 + 4452 + 4453 + 4454 + 4455 + 4456 + diff --git a/docs/xml-responses/get_indexes (podcast with include).xml b/docs/xml-responses/get_indexes (podcast with include).xml deleted file mode 100644 index 1b947bb6..00000000 --- a/docs/xml-responses/get_indexes (podcast with include).xml +++ /dev/null @@ -1,710 +0,0 @@ - - - 3 - - - - - - - - - - - - - <![CDATA[The Incredible, Reanimated 24,000-Year-Old Rotifer]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Astronomers Find an Unexpected Bumper Crop of Black Holes]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Inside Millions of Invisible Droplets, Potential Superbug Killers Grow]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[The Secret behind Songbirds' Magnetic Migratory Sense]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[COVID, Quickly, Episode 12: Masking Up Again and Why People Refuse Shots]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[The Kavli Prize Presents: Understanding Touch [Sponsored]]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Moths Have an Acoustic Invisibility Cloak to Stay under Bats' Radar]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[COVID, Quickly, Episode 11: Vaccine Booster Shots, and Reopening Offices Safely]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Your Brain Does Something Amazing between Bouts of Intense Learning]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[COVID, Quickly, Episode 10: Long Haulers, Delta Woes and Barbershop Shots]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - - - - - - - - - - - - - <![CDATA[What Do an Army of Ants and an Online Encyclopedia Have in Common?]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[I Laughed So Hard I Cried]]> - - - - - - - - - - - - - - - - - 0 - - - - - 1 - - - <![CDATA[Coming Soon]]> - - - - - - - - - - - - - - - - - 0 - - - - - 1 - - - - - - - - - - - - - - - <![CDATA[S1 | Breakthrough in Maria James cold case]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 BONUS — The Price]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 08 | End game]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 07 | Reckoning]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 06 | Whatever it takes]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 05 | Glittering prize]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 04 | Rubicon]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 03 | The darkest night]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 02 | One of the crew]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[S2 01 | Nicola]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - diff --git a/docs/xml-responses/get_indexes (podcast).xml b/docs/xml-responses/get_indexes (podcast).xml deleted file mode 100644 index 17ea8219..00000000 --- a/docs/xml-responses/get_indexes (podcast).xml +++ /dev/null @@ -1,44 +0,0 @@ - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/xml-responses/get_indexes (song with include).xml b/docs/xml-responses/get_indexes (song with include).xml deleted file mode 100644 index 05707c6a..00000000 --- a/docs/xml-responses/get_indexes (song with include).xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 75 - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - - diff --git a/docs/xml-responses/get_indexes (song).xml b/docs/xml-responses/get_indexes (song).xml index 05707c6a..659af0ac 100644 --- a/docs/xml-responses/get_indexes (song).xml +++ b/docs/xml-responses/get_indexes (song).xml @@ -1,40 +1,28 @@ - + - 75 - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - +4 + + <![CDATA[Wishmaster]]> + + + + + + <![CDATA[Wanderlust]]> + + + + + + <![CDATA[Come Cover Me]]> + + + + + + <![CDATA[Dead Boy's Poem]]> + + + + diff --git a/docs/xml-responses/get_similar.xml b/docs/xml-responses/get_similar.xml deleted file mode 100644 index da71e4cf..00000000 --- a/docs/xml-responses/get_similar.xml +++ /dev/null @@ -1,34 +0,0 @@ - - -5 - - <![CDATA[Somebody Told Me]]> - - - - - - <![CDATA[Smile Like You Mean It]]> - - - - - - <![CDATA[Sex on Fire]]> - - - - - - <![CDATA[Use Somebody]]> - - - - - - <![CDATA[Fluorescent Adolescent]]> - - - - - diff --git a/docs/xml-responses/handshake (error).xml b/docs/xml-responses/handshake (error).xml deleted file mode 100644 index 30c0f50d..00000000 --- a/docs/xml-responses/handshake (error).xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/handshake.xml b/docs/xml-responses/handshake.xml index dab6b6aa..5f446f50 100644 --- a/docs/xml-responses/handshake.xml +++ b/docs/xml-responses/handshake.xml @@ -1,24 +1,15 @@ - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/docs/xml-responses/label.xml b/docs/xml-responses/label.xml deleted file mode 100644 index 793a9ed5..00000000 --- a/docs/xml-responses/label.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - 14 - - - - - -
- - - - -
-
diff --git a/docs/xml-responses/label_artists.xml b/docs/xml-responses/label_artists.xml deleted file mode 100644 index 6840c643..00000000 --- a/docs/xml-responses/label_artists.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 17 - - - - - 1 - - 12 - - 1 - 5 - 5 - 3 - - - - 0 - - - diff --git a/docs/xml-responses/labels.xml b/docs/xml-responses/labels.xml deleted file mode 100644 index ce64e4a5..00000000 --- a/docs/xml-responses/labels.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - 14 - - - - - -
- - - - -
- - - - - -
- - - - -
- - - - - -
- - - - -
-
diff --git a/docs/xml-responses/last_shouts.xml b/docs/xml-responses/last_shouts.xml index 6ef1e3a9..094e3cef 100644 --- a/docs/xml-responses/last_shouts.xml +++ b/docs/xml-responses/last_shouts.xml @@ -1,10 +1,19 @@ - + - - 1613973947 - - - - - + + + 1594605026 + + + + + + + 1594604991 + + + + + + diff --git a/docs/xml-responses/license.xml b/docs/xml-responses/license.xml index 65b81a6e..1891325f 100644 --- a/docs/xml-responses/license.xml +++ b/docs/xml-responses/license.xml @@ -1,9 +1,9 @@ - + - 14 - - - - - +1 + + + + + diff --git a/docs/xml-responses/license_songs.xml b/docs/xml-responses/license_songs.xml index 5bdeccdd..4d39c2c1 100644 --- a/docs/xml-responses/license_songs.xml +++ b/docs/xml-responses/license_songs.xml @@ -1,3 +1,2894 @@ +76 + + <![CDATA[You Are Worthless Alec Baldwin (Bonus Track)]]> + + + + + 71 + 1 + + 2014 + 716191 + 44100 + + + + 7233238 + + + + + + 0 + + + + 0 + 2 + + + + CC BY
]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Freedom Isn't Free]]> + + + + + 2 + 2 + + 2014 + 832013 + 44100 + + + + 16507142 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Hot Lava]]> + + + + + 9 + 3 + + 2014 + 1019970 + 44100 + + + + 29438436 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[I'm In Love With Myself]]> + + + + + 46 + 4 + + 2014 + 1200920 + 44100 + + + + 24549065 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Don't Be Stupid]]> + + + + + 65 + 5 + + 2014 + 1294047 + 44100 + + + + 4525441 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Dead Ballernia]]> + + + + + 42 + 6 + + 2014 + 1189455 + 44100 + + + + 27845192 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Without Lips]]> + + + + + 52 + 7 + + 2014 + 1117108 + 44100 + + + + 16634695 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[My Girl Is No Hobbit]]> + + + + + 32 + 8 + + 2014 + 1268291 + 44100 + + + + 10146331 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Shpadoinkle (Reprise)]]> + + + + + 54 + 9 + + 2014 + 1451879 + 44100 + + + + 11749302 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Let's Fighting Love]]> + + + + + 11 + 10 + + 2014 + 1044202 + 44100 + + + + 15691168 + + + + + + 0 + + + + 1 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Everybody Is On Crack]]> + + + + + 20 + 11 + + 2014 + 867603 + 44100 + + + + 22989725 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Lemmiwinks]]> + + + + + 23 + 12 + + 2014 + 853856 + 44100 + + + + 20107791 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Something In My Front Pocket]]> + + + + + 69 + 13 + + 2014 + 688399 + 44100 + + + + 2485520 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Yepper]]> + + + + + 35 + 14 + + 2014 + 1374466 + 44100 + + + + 15331398 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Dead Fetus Song]]> + + + + + 21 + 15 + + 2014 + 1173905 + 44100 + + + + 4182038 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Your Body]]> + + + + + 31 + 16 + + 2014 + 1142471 + 44100 + + + + 2998988 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[David Kelley, TV Warrior]]> + + + + + 19 + 17 + + 2014 + 895412 + 44100 + + + + 22250085 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Pig and Elephant DNA Just Won't Splice]]> + + + + + 47 + 18 + + 2014 + 1406613 + 44100 + + + + 2982188 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Raise The Roof]]> + + + + + 29 + 19 + + 2014 + 587530 + 44100 + + + + 2206237 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Chewbacca]]> + + + + + 18 + 20 + + 2014 + 861678 + 44100 + + + + 23128158 + + + + + + 0 + 3 + 3 + + 1 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[That's Alright, Mama]]> + + + + + 68 + 21 + + 2014 + 509760 + 44100 + + + + 4369377 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Sri Lankan Woman]]> + + + + + 48 + 22 + + 2014 + 1104838 + 44100 + + + + 31856590 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Princess]]> + + + + + 45 + 23 + + 2014 + 1019548 + 44100 + + + + 5034020 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Montage]]> + + + + + 10 + 24 + + 2014 + 909737 + 44100 + + + + 14172590 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Burn Down Hot Topic]]> + + + + + 66 + 25 + + 2014 + 1389615 + 44100 + + + + 8090161 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[The Butters Show]]> + + + + + 17 + 26 + + 2014 + 1036645 + 44100 + + + + 5728266 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Now You're A Man]]> + + + + + 4 + 27 + + 2014 + 932855 + 44100 + + + + 15434373 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Gay Fish]]> + + + + + 43 + 28 + + 2014 + 1654279 + 44100 + + + + 30937219 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[When I Was On Top Of You]]> + + + + + 56 + 29 + + 2014 + 1419141 + 44100 + + + + 28305543 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Only a Woman]]> + + + + + 6 + 30 + + 2014 + 905430 + 44100 + + + + 20160425 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Mi Mi Mi]]> + + + + + 37 + 31 + + 2014 + 1300242 + 44100 + + + + 19341102 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Trapper Song]]> + + + + + 57 + 32 + + 2014 + 1387653 + 44100 + + + + 24990538 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Everyone Has AIDS]]> + + + + + 1 + 33 + + 2014 + 870883 + 44100 + + + + 8448634 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + eng + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Evolution]]> + + + + + 40 + 34 + + 2014 + 1545144 + 44100 + + + + 9077721 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[This Side Of Me]]> + + + + + 58 + 35 + + 2014 + 1381326 + 44100 + + + + 35823476 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[I Spit On Your Love]]> + + + + + 44 + 36 + + 2014 + 1172605 + 44100 + + + + 36808591 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[The Lonely Jew on Christmas]]> + + + + + 22 + 37 + + 2014 + 1576623 + 44100 + + + + 32949662 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Livin' A Lie]]> + + + + + 13 + 38 + + 2014 + 962782 + 44100 + + + + 18463422 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Let's Build A Snowman]]> + + + + + 59 + 39 + + 2014 + 1405504 + 44100 + + + + 17565112 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Sgt. Baker (Live)]]> + + + + + 74 + 40 + + 2014 + 884631 + 44100 + + + + 24498166 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Latter Day Soldier]]> + + + + + 49 + 41 + + 2014 + 1448625 + 44100 + + + + 9053908 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Let's Build A Snowman (Reprise)]]> + + + + + 60 + 42 + + 2014 + 1439242 + 44100 + + + + 5377816 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Sgt. Baker]]> + + + + + 15 + 43 + + 2014 + 814125 + 44100 + + + + 21280252 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[James Cameron Song]]> + + + + + 67 + 44 + + 2014 + 1522400 + 44100 + + + + 5909569 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Hell Isn't Good (Featuring James Hetfield)]]> + + + + + 14 + 45 + + 2014 + 876874 + 44100 + + + + 8463804 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Why Him]]> + + + + + 36 + 46 + + 2014 + 1364632 + 44100 + + + + 19104854 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Living on Hell]]> + + + + + 30 + 47 + + 2014 + 1154514 + 44100 + + + + 3953133 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Time Warped Theme]]> + + + + + 34 + 48 + + 2014 + 1551337 + 44100 + + + + 6868716 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Timmy and the Lords of the Underworld]]> + + + + + 12 + 49 + + 2014 + 1027582 + 44100 + + + + 18625658 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[What Would Brian Boitano Do (Live)]]> + + + + + 75 + 50 + + 2014 + 849033 + 44100 + + + + 16620264 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Shatter Proof!]]> + + + + + 64 + 51 + + 2014 + 1246460 + 44100 + + + + 31395225 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Living a Lie, Living a Lie]]> + + + + + 28 + 52 + + 2014 + 1219161 + 44100 + + + + 4267066 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Jacking it in San Diego]]> + + + + + 24 + 53 + + 2014 + 801657 + 44100 + + + + 10897311 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Shpadoinkle (Finale)]]> + + + + + 63 + 54 + + 2014 + 1294158 + 44100 + + + + 6314739 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[I'm So Ronery (Bonus Track)]]> + + + + + 72 + 55 + + 2014 + 771369 + 44100 + + + + 11160926 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Old People Entertainment]]> + + + + + 26 + 56 + + 2014 + 1201117 + 44100 + + + + 3903632 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[America, Fuck Yeah]]> + + + + + + 3 + 57 + + 2014 + 941420 + 44100 + + + + 15241025 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + + <![CDATA[Twin Brothers In Love]]> + + + + + 50 + 58 + + 2014 + 1033330 + 44100 + + + + 20208810 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[The End of an Act]]> + + + + + 8 + 59 + + 2014 + 817622 + 44100 + + + + 14595733 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[North Korean Melody (Bonus Track)]]> + + + + + 70 + 60 + + 2014 + 679319 + 44100 + + + + 8908238 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[What Would Brian Boitano Do?]]> + + + + + 5 + 61 + + 2014 + 1027902 + 44100 + + + + 17329184 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[You're Not Like The Others (Reprise)]]> + + + + + 41 + 62 + + 2014 + 1474487 + 44100 + + + + 7842506 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Mr. Hankey The Christmas Poo]]> + + + + + 25 + 63 + + 2014 + 1542991 + 44100 + + + + 26452699 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Warts On Your Dick]]> + + + + + 16 + 64 + + 2014 + 552778 + 44100 + + + + 5599078 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Chewbacca (Short Studio Version)]]> + + + + + 76 + 65 + + 2014 + 1371467 + 44100 + + + + 5282149 + + + + + + 0 + 3 + 3 + + 1 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[America, Fuck Yeah [Bummer Remix]]]> + + + + + 7 + 66 + + 2014 + 705973 + 44100 + + + + 5062259 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Dog Dance]]> + + + + + 27 + 67 + + 2014 + 1144898 + 44100 + + + + 2054580 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[That's All I'm Askin' For (Reprise)]]> + + + + + 61 + 68 + + 2014 + 1409405 + 44100 + + + + 6932304 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Yepper (Reprise)]]> + + + + + 38 + 69 + + 2014 + 1319598 + 44100 + + + + 13525887 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Saul of the Mole Men Intro]]> + + + + + 33 + 70 + + 2014 + 797019 + 44100 + + + + 3958713 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[That's All I'm Askin' For]]> + + + + + 55 + 71 + + 2014 + 1418018 + 44100 + + + + 29102694 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Now You're A Man (Live)]]> + + + + + 73 + 72 + + 2014 + 843267 + 44100 + + + + 22179663 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Hang The Bastard]]> + + + + + 62 + 73 + + 2014 + 1360741 + 44100 + + + + 32339319 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[That's My Bush]]> + + + + + 51 + 74 + + 2014 + 715699 + 44100 + + + + 2687072 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Shpadoinkle]]> + + + + + 53 + 75 + + 2014 + 1344616 + 44100 + + + + 18002812 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[You're Not Like The Others]]> + + + + + 39 + 76 + + 2014 + 1570518 + 44100 + + + + 28139801 + + + + + + 0 + + + + 0 + 2 + + + + CC BY]]> + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + diff --git a/docs/xml-responses/licenses.xml b/docs/xml-responses/licenses.xml index d32633f7..ed0e6325 100644 --- a/docs/xml-responses/licenses.xml +++ b/docs/xml-responses/licenses.xml @@ -1,74 +1,149 @@ - + - 14 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/localplay (status).xml b/docs/xml-responses/localplay (status).xml deleted file mode 100644 index 1d23aab0..00000000 --- a/docs/xml-responses/localplay (status).xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/docs/xml-responses/localplay.xml b/docs/xml-responses/localplay.xml deleted file mode 100644 index 89060fd0..00000000 --- a/docs/xml-responses/localplay.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/ping (no auth).xml b/docs/xml-responses/ping (no auth).xml deleted file mode 100644 index 5a192b9f..00000000 --- a/docs/xml-responses/ping (no auth).xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/xml-responses/ping.xml b/docs/xml-responses/ping.xml index 45c0bfe8..525755b2 100644 --- a/docs/xml-responses/ping.xml +++ b/docs/xml-responses/ping.xml @@ -1,27 +1,7 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + diff --git a/docs/xml-responses/playlist.xml b/docs/xml-responses/playlist.xml index f927490c..2905b503 100644 --- a/docs/xml-responses/playlist.xml +++ b/docs/xml-responses/playlist.xml @@ -1,15 +1,10 @@ - + - 20 - - - - 3 - public - - 0 - - - - +1 + + + + 0 + public + diff --git a/docs/xml-responses/playlist_add_song (error).xml b/docs/xml-responses/playlist_add_song (error).xml index b497d606..0485201f 100644 --- a/docs/xml-responses/playlist_add_song (error).xml +++ b/docs/xml-responses/playlist_add_song (error).xml @@ -1,8 +1,4 @@ - + - - - - - + diff --git a/docs/xml-responses/playlist_add_song.xml b/docs/xml-responses/playlist_add_song.xml index d67b300f..ed365844 100644 --- a/docs/xml-responses/playlist_add_song.xml +++ b/docs/xml-responses/playlist_add_song.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/playlist_create.xml b/docs/xml-responses/playlist_create.xml index 30a3a377..8f8e8a66 100644 --- a/docs/xml-responses/playlist_create.xml +++ b/docs/xml-responses/playlist_create.xml @@ -1,15 +1,10 @@ - + - 19 - - - - 0 - private - - 0 - - - - +1 + + + + 0 + private + diff --git a/docs/xml-responses/playlist_delete.xml b/docs/xml-responses/playlist_delete.xml index 666f58ce..9f58406d 100644 --- a/docs/xml-responses/playlist_delete.xml +++ b/docs/xml-responses/playlist_delete.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/playlist_edit.xml b/docs/xml-responses/playlist_edit.xml index 58f9800e..4e735f31 100644 --- a/docs/xml-responses/playlist_edit.xml +++ b/docs/xml-responses/playlist_edit.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/playlist_generate (id).xml b/docs/xml-responses/playlist_generate (id).xml index 8e977df3..6beb390c 100644 --- a/docs/xml-responses/playlist_generate (id).xml +++ b/docs/xml-responses/playlist_generate (id).xml @@ -1,7 +1,174 @@ - + - - - - +4 + + <![CDATA[Everybody Has a Dream]]> + + + + + + 9 + 1 + + 1998 + 320000 + 44100 + + + + 15714015 + + + + + + 0 + + + + 0 + 2 + + + + + + eng + 0.000000 + 0.000000 + -3.820000 + 1.000000 + + + + <![CDATA[Rollin' (Air Raid Vehicle)]]> + + + + + + 6 + 2 + + 2000 + 320000 + 44100 + + + + 8633509 + + + + + + 0 + + + + 0 + 2 + + + + + + eng + 0.000000 + 0.000000 + -6.920000 + 0.638000 + + + + <![CDATA[Greens and Blues]]> + + + + + + + 11 + 3 + + 2015 + 320000 + 44100 + + + + 8342968 + + + + + + 0 + + + + 0 + 2 + + + + + + eng + 0.000000 + 0.000000 + -10.280000 + 1.000000 + + + + + <![CDATA[Ghost of a Man]]> + + + + + + + + + + 4 + 4 + + 2011 + 320000 + 44100 + + + + 9044889 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -4.620000 + 1.000000 + + + + + + diff --git a/docs/xml-responses/playlist_generate (index).xml b/docs/xml-responses/playlist_generate (index).xml index dcc53461..fcb0227b 100644 --- a/docs/xml-responses/playlist_generate (index).xml +++ b/docs/xml-responses/playlist_generate (index).xml @@ -1,40 +1,166 @@ - + - 75 - - <![CDATA[The art of free expression]]> - - - - - - 5 - - - <![CDATA[Vansinne]]> - - - - - - 4 - - - <![CDATA[Hairy Crushed Nuts]]> - - - - - - 15 - - - <![CDATA[Netro]]> - - - - - - 10 - +4 + + <![CDATA[Can't Let Go]]> + + + + + + + 5 + 1 + + 2010 + 320000 + 44100 + + + + 6799737 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -8.850000 + 1.000000 + + + + + <![CDATA[Doo]]> + + + + + + 1 + 2 + + 1999 + 320000 + 44100 + + + + 1306217 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -3.300000 + 0.989000 + + + + <![CDATA[Walk]]> + + + + + + 4 + 3 + + 2011 + 320000 + 44100 + + + + 10828739 + + + + + + 0 + + + + 0 + 2 + + + + + + eng + -10.090000 + 1.053235 + -9.560000 + 1.000000 + + + + <![CDATA[Gloradin]]> + + + + + + 16 + 4 + + 1995 + 320000 + 44100 + + + + 9513881 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -1.460000 + 0.912000 + + diff --git a/docs/xml-responses/playlist_generate (song).xml b/docs/xml-responses/playlist_generate (song).xml index 24a309e3..5a765e2e 100644 --- a/docs/xml-responses/playlist_generate (song).xml +++ b/docs/xml-responses/playlist_generate (song).xml @@ -1,180 +1,176 @@ - + - 75 - - <![CDATA[Something to Do]]> - - - - - - 17 - - - 1 - - 2005 - 246373 - 44100 - - - - 8072761 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Galenskap]]> - - - - - - 3 - - - 2 - - 2011 - 389683 - 44100 - - - - 48633049 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.330000 - 0.977000 - - - - - <![CDATA[PurpleSmoke]]> - - - - - - 3 - - - 3 - - 2007 - 64000 - 22050 - - - - 3131519 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.130000 - 1.000000 - - - - - <![CDATA[Black&BlueSmoke]]> - - - - - - 1 - - - 4 - - 2007 - 64000 - 22050 - - - - 4010069 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -5.110000 - 1.000000 - - - +4 + + <![CDATA[Lichter der Stadt]]> + + + + + + + + + + + 8 + 1 + + 2012 + 256621 + 44100 + + + + 8276864 + + + + + + 0 + + + + 1 + 2 + + + + + + German + 0.000000 + 0.000000 + -9.490000 + 1.000000 + + + + + + + + + <![CDATA[Mixed Emotions (Chris Kimsey's 12")]]> + + + + + + + 3 + 2 + + 2011 + 320000 + 44100 + + + + 14971869 + + + + + + 0 + + + + 0 + 2 + + + + + + eng + 0.000000 + 0.000000 + -8.050000 + 1.000000 + + + + + <![CDATA[Pandora]]> + + + + + + 5 + 3 + + 2016 + 320000 + 44100 + + + + 11804600 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -11.960000 + 1.000000 + + + + <![CDATA[Parrot]]> + + + + + + 15 + 4 + + 2003 + 160000 + 44100 + + + + 961350 + + + + + + 0 + + + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + -1.590000 + 0.881000 + + diff --git a/docs/xml-responses/playlist_remove_song.xml b/docs/xml-responses/playlist_remove_song.xml index e4b36a18..216ad754 100644 --- a/docs/xml-responses/playlist_remove_song.xml +++ b/docs/xml-responses/playlist_remove_song.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/playlist_songs.xml b/docs/xml-responses/playlist_songs.xml index d6522f8d..8bbe5688 100644 --- a/docs/xml-responses/playlist_songs.xml +++ b/docs/xml-responses/playlist_songs.xml @@ -1,90 +1,158 @@ - + - 75 - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 1 - - 2007 - 64000 - 22050 - - - - 3209468 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - -2.880000 - 0.977000 - - - - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 2 - - 2007 - 64000 - 22050 - - - - 3209468 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - -2.880000 - 0.977000 - - - +4 + + <![CDATA[Chapter]]> + + + + + 27 + 1 + + 2016 + 97179 + 44100 + + + + 9229718 + + + + + + 0 + + + + 1 + 2 + + + + + + eng + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Chapter]]> + + + + + 50 + 2 + + 2016 + 97730 + 44100 + + + + 3455996 + + + + + + 0 + + + + 0 + 2 + + + + + + eng + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + <![CDATA[Chapter]]> + + + + + + 48 + 3 + + 2016 + 99212 + 44100 + + + + 2701132 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + + <![CDATA[Chapter]]> + + + + + 33 + 4 + + 2016 + 96823 + 44100 + + + + 4314312 + + + + + + 0 + + + + 0 + 2 + + + + + + eng + 0.000000 + 0.000000 + 0.000000 + 0.000000 + diff --git a/docs/xml-responses/playlists.xml b/docs/xml-responses/playlists.xml index 705da3dc..730fec26 100644 --- a/docs/xml-responses/playlists.xml +++ b/docs/xml-responses/playlists.xml @@ -1,26 +1,28 @@ - + - 19 - - - - 43 - private - - 0 - - - - - - - - 43 - public - - 1 - - - - +4 + + + + 12694 + private + + + + + 23 + public + + + + + 3112 + private + + + + + 4456 + private + diff --git a/docs/xml-responses/podcast (include episodes).xml b/docs/xml-responses/podcast (include episodes).xml index b6291104..cc976c72 100644 --- a/docs/xml-responses/podcast (include episodes).xml +++ b/docs/xml-responses/podcast (include episodes).xml @@ -1,311 +1,70 @@ - + - 3 - - - - - - - - - - - - - 0 - - - - - <![CDATA[The Incredible, Reanimated 24,000-Year-Old Rotifer]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Astronomers Find an Unexpected Bumper Crop of Black Holes]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Inside Millions of Invisible Droplets, Potential Superbug Killers Grow]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[The Secret behind Songbirds' Magnetic Migratory Sense]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[COVID, Quickly, Episode 12: Masking Up Again and Why People Refuse Shots]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[The Kavli Prize Presents: Understanding Touch [Sponsored]]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Moths Have an Acoustic Invisibility Cloak to Stay under Bats' Radar]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[COVID, Quickly, Episode 11: Vaccine Booster Shots, and Reopening Offices Safely]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Your Brain Does Something Amazing between Bouts of Intense Learning]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[COVID, Quickly, Episode 10: Long Haulers, Delta Woes and Barbershop Shots]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - +1 + + + + + Copyright (c) 1998-2018 Penny Arcade, Inc. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/podcast.xml b/docs/xml-responses/podcast.xml index 4821e929..79089c11 100644 --- a/docs/xml-responses/podcast.xml +++ b/docs/xml-responses/podcast.xml @@ -1,21 +1,15 @@ - + - 3 - - - - - - - - - - - - - 0 - - - - +1 + + + + + Copyright (c) 1998-2018 Penny Arcade, Inc. + + + + + + diff --git a/docs/xml-responses/podcast_create.xml b/docs/xml-responses/podcast_create.xml deleted file mode 100644 index 0187d6ca..00000000 --- a/docs/xml-responses/podcast_create.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - 3 - - - - - - - - - - - - - 0 - - - - - diff --git a/docs/xml-responses/podcast_delete (error).xml b/docs/xml-responses/podcast_delete (error).xml deleted file mode 100644 index 6dd97552..00000000 --- a/docs/xml-responses/podcast_delete (error).xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/xml-responses/podcast_delete.xml b/docs/xml-responses/podcast_delete.xml deleted file mode 100644 index d534c122..00000000 --- a/docs/xml-responses/podcast_delete.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/xml-responses/podcast_edit.xml b/docs/xml-responses/podcast_edit.xml deleted file mode 100644 index 002db226..00000000 --- a/docs/xml-responses/podcast_edit.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/xml-responses/podcast_episode.xml b/docs/xml-responses/podcast_episode.xml index d97740ba..973dc5d1 100644 --- a/docs/xml-responses/podcast_episode.xml +++ b/docs/xml-responses/podcast_episode.xml @@ -1,8 +1,18 @@ - + - - - - - +1 + + + + + + + + + + + + + + diff --git a/docs/xml-responses/podcast_episode_delete.xml b/docs/xml-responses/podcast_episode_delete.xml deleted file mode 100644 index 829b683a..00000000 --- a/docs/xml-responses/podcast_episode_delete.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/xml-responses/podcast_episodes.xml b/docs/xml-responses/podcast_episodes.xml index 9c7906ee..bc8cf908 100644 --- a/docs/xml-responses/podcast_episodes.xml +++ b/docs/xml-responses/podcast_episodes.xml @@ -1,120 +1,60 @@ - + - 23 - - <![CDATA[The Incredible, Reanimated 24,000-Year-Old Rotifer]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Astronomers Find an Unexpected Bumper Crop of Black Holes]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[Inside Millions of Invisible Droplets, Potential Superbug Killers Grow]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - - - <![CDATA[The Secret behind Songbirds' Magnetic Migratory Sense]]> - - - - - - - - - - - - - - - - - 0 - - - - - 0 - +4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/podcasts.xml b/docs/xml-responses/podcasts.xml index 3303d278..9b0ba4a8 100644 --- a/docs/xml-responses/podcasts.xml +++ b/docs/xml-responses/podcasts.xml @@ -1,59 +1,48 @@ - + - 3 - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - 0 - - - - - - - - - - - - - - - - - 0 - - - - +4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/rate.xml b/docs/xml-responses/rate.xml index 93bf66aa..4a65b0d1 100644 --- a/docs/xml-responses/rate.xml +++ b/docs/xml-responses/rate.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/record_play.xml b/docs/xml-responses/record_play.xml index 3141cd39..3efb0301 100644 --- a/docs/xml-responses/record_play.xml +++ b/docs/xml-responses/record_play.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/scrobble (error).xml b/docs/xml-responses/scrobble (error).xml index 5d702689..9a1cf19f 100644 --- a/docs/xml-responses/scrobble (error).xml +++ b/docs/xml-responses/scrobble (error).xml @@ -1,8 +1,4 @@ - + - - - - - + diff --git a/docs/xml-responses/scrobble.xml b/docs/xml-responses/scrobble.xml index f3eed211..98b769cd 100644 --- a/docs/xml-responses/scrobble.xml +++ b/docs/xml-responses/scrobble.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/search_songs.xml b/docs/xml-responses/search_songs.xml index cddeeba2..af5ceeef 100644 --- a/docs/xml-responses/search_songs.xml +++ b/docs/xml-responses/search_songs.xml @@ -1,4 +1,44 @@ - + - 75 +1 + + <![CDATA[Fasten Your Seatbelt]]> + + + + + + 4 + 1 + + 2007 + 320000 + 44100 + + + + 15937872 + + + + + + 1 + 5 + 5 + + 1 + 2 + + + + + + eng + 0.000000 + 0.000000 + -9.080000 + 1.000000 + + diff --git a/docs/xml-responses/share.xml b/docs/xml-responses/share.xml index e508ad33..ade14487 100644 --- a/docs/xml-responses/share.xml +++ b/docs/xml-responses/share.xml @@ -1,20 +1,20 @@ - + - 2 - - - - 1 - 0 - - - - 9 - 0 - 0 - 1 - - - - +1 + + + + 1 + 1 + + + + 16604 + 7 + 0 + 0 + + + + diff --git a/docs/xml-responses/share_create.xml b/docs/xml-responses/share_create.xml index 775daa3a..1ba10b4d 100644 --- a/docs/xml-responses/share_create.xml +++ b/docs/xml-responses/share_create.xml @@ -1,20 +1,20 @@ - + - 2 - - - - 1 - 1 - 1629422514 - 0 - - 54 - 0 - 0 - 0 - - - - +1 + + + + 1 + 1 + + + + 16604 + 7 + 0 + 0 + + + + diff --git a/docs/xml-responses/share_delete.xml b/docs/xml-responses/share_delete.xml index 3fa452e2..297706e2 100644 --- a/docs/xml-responses/share_delete.xml +++ b/docs/xml-responses/share_delete.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/share_edit.xml b/docs/xml-responses/share_edit.xml deleted file mode 100644 index 4bb1ed16..00000000 --- a/docs/xml-responses/share_edit.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/xml-responses/shares.xml b/docs/xml-responses/shares.xml index 3d541461..5657cdcd 100644 --- a/docs/xml-responses/shares.xml +++ b/docs/xml-responses/shares.xml @@ -1,36 +1,36 @@ - + - 2 - - - - 1 - 0 - - - - 9 - 0 - 0 - 1 - - - - - - - - 1 - 0 - - - - 18 - 0 - 0 - 0 - - - - +2 + + + + 1 + 1 + + + + 73208 + 7 + 0 + 1 + + + + + + + + 1 + 1 + + + + 16604 + 7 + 0 + 0 + + + + diff --git a/docs/xml-responses/song.xml b/docs/xml-responses/song.xml index 47bae7e2..11219699 100644 --- a/docs/xml-responses/song.xml +++ b/docs/xml-responses/song.xml @@ -1,47 +1,48 @@ - + - 75 - - <![CDATA[Red&GreenSmoke]]> - - - - - - 5 - - - 1 - - 2007 - 64000 - 22050 - - - - 3209468 - - - - - - 0 - - - 1 - 0 - 1 - - - - - - - - - -2.880000 - 0.977000 - - - +1 + + <![CDATA[Dead Boy's Poem]]> + + + + + + + + 10 + 1 + + 2000 + 252769 + 44100 + + + + 12954214 + + + + + + 0 + + + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + -9.660000 + 1.000000 + + + + diff --git a/docs/xml-responses/song_delete.xml b/docs/xml-responses/song_delete.xml deleted file mode 100644 index d028d1a9..00000000 --- a/docs/xml-responses/song_delete.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/xml-responses/songs.xml b/docs/xml-responses/songs.xml index 8dcadfa4..7a266b7c 100644 --- a/docs/xml-responses/songs.xml +++ b/docs/xml-responses/songs.xml @@ -1,179 +1,188 @@ - + - 75 - - <![CDATA[Are we going Crazy]]> - - - - - - 7 - - 1 - - 2012 - 32582 - 44100 - - - - 1776580 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - - - <![CDATA[Arrest Me]]> - - - - - - 9 - - - 2 - - 2012 - 252864 - 44100 - - - - 3091727 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -1.350000 - 0.881000 - - - - - <![CDATA[As Pure as Possible]]> - - - - - - 9 - - - 3 - - 2005 - 234690 - 44100 - - - - 3789410 - - - - - - 0 - - - - 0 - 4 - - - - - - - - - - - - - - - <![CDATA[Beq Ultra Fat]]> - - - - - - 4 - - - - 4 - - 0 - 192000 - 44100 - - - - 9935896 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 0.940000 - 0.989000 - - - +4 + + <![CDATA[!]]> + + + + + + + 1 + 1 + + 2016 + 320000 + 44100 + + + + 3184944 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -6.920000 + 1.000000 + + + + + <![CDATA[! (The Song Formerly Known As)]]> + + + + + + 3 + 2 + + 1997 + 160000 + 44100 + + + + 4198110 + + + + + + 0 + 3 + 3 + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + -10.460000 + 1.000000 + + + + <![CDATA[! (The Song Formerly Known As)]]> + + + + + + + + + + + + + + 12 + 3 + + 1999 + 160000 + 44100 + + + + 4149473 + + + + + + 0 + + + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + -8.090000 + 1.000000 + + + + + + + + + + + + <![CDATA[! (The Song Formerly Known As)]]> + + + + + + + + + 1 + 4 + + 2016 + 320040 + 44100 + + + + 8186819 + + + + + + 0 + + + + 1 + 2 + + + + + + + 0.000000 + 0.000000 + -7.290000 + 1.000000 + + + + + diff --git a/docs/xml-responses/stats (album).xml b/docs/xml-responses/stats (album).xml index a3f664b4..ee9e70a7 100644 --- a/docs/xml-responses/stats (album).xml +++ b/docs/xml-responses/stats (album).xml @@ -1,39 +1,30 @@ - + - 9 - - - - - 0 - - 11 - 1 - - - - - 0 - 2 - 2 - 2 - - - - - - - 2005 - - 20 - 1 - album - - - 0 - - - - - +2 + + + + 2008 + 14 + 1 + + 0 + + + + + + + + + 2009 + 12 + 1 + + 0 + + + + + diff --git a/docs/xml-responses/stats (artist).xml b/docs/xml-responses/stats (artist).xml index 850172bd..ef412d83 100644 --- a/docs/xml-responses/stats (artist).xml +++ b/docs/xml-responses/stats (artist).xml @@ -1,42 +1,37 @@ - + - 17 - - - - - 0 - - 1 - - 0 - - - - - - - 0 - - - - - - - - 1 - - 11 - - 0 - 2 - 2 - 2 - - - - 0 - - +2 + + + + + 1 + 1 + + 0 + + + + + + 0 + + + + + + 1 + 18 + + 0 + + + + + + 0 + + diff --git a/docs/xml-responses/stats (song).xml b/docs/xml-responses/stats (song).xml index 6082e238..52b8f9f8 100644 --- a/docs/xml-responses/stats (song).xml +++ b/docs/xml-responses/stats (song).xml @@ -1,91 +1,84 @@ - + - 75 - - <![CDATA[Strangers Query]]> - - - - - - 7 - - - - 1 - - 0 - 192000 - 44100 - - - - 6719700 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - -3.800000 - 0.966000 - - - - - <![CDATA[YellowSmoke]]> - - - - - - 2 - - - 2 - - 2007 - 64000 - 22050 - - - - 2325568 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - 2.750000 - 0.716000 - - - +2 + + <![CDATA[Leichenteilchen]]> + + + + + + 8 + 1 + + 2009 + 214153 + 44100 + + + + 5802422 + + + + + + 0 + + + + 1 + 2 + + + + + + English + 0.000000 + 0.000000 + -11.470000 + 1.000000 + + + + <![CDATA[ハイハイあかちゃん]]> + + + + + + 1 + 2 + + 2017 + 320000 + 44100 + + + + 5665856 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -13.700000 + 1.000000 + + diff --git a/docs/xml-responses/system_preferences.xml b/docs/xml-responses/system_preferences.xml deleted file mode 100644 index 0425513f..00000000 --- a/docs/xml-responses/system_preferences.xml +++ /dev/null @@ -1,993 +0,0 @@ - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - - - - - - - - 25 - - 0 - - - - - - - 100 - - 1 - - - - - - - 100 - - 0 - - - - - - - 100 - - - - - - - - - 100 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - - - - - - - - 5 - - - - - - - - - 100 - - - - - - - - - 25 - - 0 - - - - - - - 100 - - 5145162 - - - - - - - 100 - - 1 - - - - - - - 100 - - 1 - - - - - - - 100 - - 1 - - - - - - - 100 - - 1 - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 25 - - 1 - - - - - - - 100 - - 0 - - - - - - - 25 - - - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 25 - - - - - - - - - 100 - - - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 100 - - 1 - - - - - - - 100 - - 1 - - - - - - - 25 - - 0 - - - - - - - 100 - - 1 - - - - - - - 100 - - 1 - - - - - - - 75 - - 1 - - - - - - - 50 - - 1 - - - - - - - 25 - - 4 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - - - - - - - - 5 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 0 - - - - - - - 100 - - 1 - - - - - - - 100 - - 100 - - - - - - - 100 - - - - - - - - - 100 - - - - - - - - - 100 - - - - - - - - - 25 - - 1 - - - - - - - 25 - - 10 - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - 0 - - - - - - - 25 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 1 - - - - - - - 5 - - 0 - - - - - - - 100 - - 0 - - - - - - - 100 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 0 - - - - - - - 5 - - 50 - - - - - - - 25 - - 12 - - - - - - - 75 - - 20 - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - 3 - - - - - - - 25 - - 1 - - - - - - - 100 - - 7 - - - - - - - 25 - - 0 - - - - - - - 5 - - - - - - - - - 5 - - - - - - - - - 25 - - 0 - - - - - - - 75 - - - - - - - - - 25 - - - - - - - - - 100 - - 16384 - - - - - - - 25 - - 192 - - - - - - - 75 - - - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 75 - - 1 - - - - - - - 75 - - 1 - - - - - - - 75 - - 1 - - - - - - - 75 - - 21 - - - - - - - 75 - - - - - - - - - 100 - - 1 - - - - - diff --git a/docs/xml-responses/system_update.xml b/docs/xml-responses/system_update.xml deleted file mode 100644 index 5c6eeaa1..00000000 --- a/docs/xml-responses/system_update.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/xml-responses/tag_songs.xml b/docs/xml-responses/tag_songs.xml index 5fba9b90..58cc5ecb 100644 --- a/docs/xml-responses/tag_songs.xml +++ b/docs/xml-responses/tag_songs.xml @@ -16,7 +16,7 @@ 44100 - + 7476664 diff --git a/docs/xml-responses/timeline.xml b/docs/xml-responses/timeline.xml index b00c655d..585ea7fa 100644 --- a/docs/xml-responses/timeline.xml +++ b/docs/xml-responses/timeline.xml @@ -1,94 +1,95 @@ - - 1627949337 + + + 1595916161 - 93 - - + 77371 + + - - 1627949335 + + 1595916087 - 2 + 2069 - + - - 1627949326 - - 10 - - + + 1595914553 + + 94770 + + - - 1627949322 + + 1595914371 - 93 - - + 67568 + + - - 1627949320 - - 2 - - + + 1595914100 + + 19851 + + - - 1627948526 - - 10 - - + + 1595913831 + + 864164 + + - - 1627948523 + + 1595913486 - 93 - - + 13373 + + - - 1627948521 - - 2 - - + + 1595913244 + + 68840 + + - - 1627948509 - - 10 - - + + 1595913013 + + 107346 + + - - 1627948501 + + 1595912775 - 93 - - + 787588 + + - + diff --git a/docs/xml-responses/toggle_follow.xml b/docs/xml-responses/toggle_follow.xml index eb4f1abb..f1aee80e 100644 --- a/docs/xml-responses/toggle_follow.xml +++ b/docs/xml-responses/toggle_follow.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/update_art.xml b/docs/xml-responses/update_art.xml index bc9c5b7a..75b6d8c7 100644 --- a/docs/xml-responses/update_art.xml +++ b/docs/xml-responses/update_art.xml @@ -1,5 +1,4 @@ - + - - + diff --git a/docs/xml-responses/update_artist_info.xml b/docs/xml-responses/update_artist_info.xml index 4c3a40e0..75980580 100644 --- a/docs/xml-responses/update_artist_info.xml +++ b/docs/xml-responses/update_artist_info.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/update_from_tags.xml b/docs/xml-responses/update_from_tags.xml index d2921f64..52b4e268 100644 --- a/docs/xml-responses/update_from_tags.xml +++ b/docs/xml-responses/update_from_tags.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/update_podcast.xml b/docs/xml-responses/update_podcast.xml index d4fe0bae..e41f6e64 100644 --- a/docs/xml-responses/update_podcast.xml +++ b/docs/xml-responses/update_podcast.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/url_to_song.xml b/docs/xml-responses/url_to_song.xml index 1099ddd4..f186d04a 100644 --- a/docs/xml-responses/url_to_song.xml +++ b/docs/xml-responses/url_to_song.xml @@ -1,47 +1,46 @@ - + - 75 - - <![CDATA[BrownSmoke]]> - - - - - - 4 - - - 1 - - 2007 - 20627 - 22050 - - - - 792375 - - - - - - 0 - - - - 0 - 1 - - - - - - - - - - - - - +1 + + <![CDATA[!]]> + + + + + + + 1 + 1 + + 2016 + 320000 + 44100 + + + + 3184944 + + + + + + 0 + + + + 0 + 2 + + + + + + + 0.000000 + 0.000000 + -6.920000 + 1.000000 + + + diff --git a/docs/xml-responses/user (disabled).xml b/docs/xml-responses/user (disabled).xml index f4c3fb63..f2e249a4 100644 --- a/docs/xml-responses/user (disabled).xml +++ b/docs/xml-responses/user (disabled).xml @@ -1,19 +1,19 @@ - + - - - - - 25 - 0 - - 1 - 1627949328 - 0 - - - - - - + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/user (error).xml b/docs/xml-responses/user (error).xml index 41fe5766..1410c6ae 100644 --- a/docs/xml-responses/user (error).xml +++ b/docs/xml-responses/user (error).xml @@ -1,8 +1,19 @@ - + - - - - - + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/user.xml b/docs/xml-responses/user.xml index 5be705d8..87c0e542 100644 --- a/docs/xml-responses/user.xml +++ b/docs/xml-responses/user.xml @@ -1,19 +1,19 @@ - + - - - - - 25 - 0 - - 0 - 1613964067 - 1626919678 - - - - - - + + + + + + + + + + + + + + + + diff --git a/docs/xml-responses/user_create.xml b/docs/xml-responses/user_create.xml index 06fc7140..91438ce7 100644 --- a/docs/xml-responses/user_create.xml +++ b/docs/xml-responses/user_create.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/user_delete.xml b/docs/xml-responses/user_delete.xml index dc699eb7..f6690f3c 100644 --- a/docs/xml-responses/user_delete.xml +++ b/docs/xml-responses/user_delete.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/user_preferences.xml b/docs/xml-responses/user_preferences.xml deleted file mode 100644 index 715e68d9..00000000 --- a/docs/xml-responses/user_preferences.xml +++ /dev/null @@ -1,689 +0,0 @@ - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - - - - - - - - 25 - - 0 - - - - - - - 100 - - 1 - - - - - - - 100 - - - - - - - - - 25 - - 1 - - - - - - - 25 - - - - - - - - - 5 - - - - - - - - - 100 - - - - - - - - - 25 - - 0 - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 25 - - - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 25 - - - - - - - - - 100 - - - - - - - - - 75 - - - - - - - - - 75 - - - - - - - - - 100 - - 1 - - - - - - - 100 - - 1 - - - - - - - 25 - - 0 - - - - - - - 100 - - 1 - - - - - - - 100 - - 1 - - - - - - - 75 - - 0 - - - - - - - 50 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - - - - - - - - 5 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 0 - - - - - - - 100 - - 1 - - - - - - - 100 - - 100 - - - - - - - 100 - - - - - - - - - 25 - - 1 - - - - - - - 25 - - 10 - - - - - - - 25 - - - - - - - - - 25 - - - - - - - - - 25 - - 0 - - - - - - - 25 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 1 - - - - - - - 5 - - 0 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 1 - - - - - - - 25 - - 0 - - - - - - - 25 - - 0 - - - - - - - 5 - - 50 - - - - - - - 25 - - 12 - - - - - - - 75 - - 20 - - - - - - - 25 - - 0 - - - - - - - 5 - - - - - - - - - 5 - - - - - - - - - 25 - - 0 - - - - - - - 75 - - - - - - - - - 25 - - - - - - - - - 100 - - 16384 - - - - - - - 25 - - 192 - - - - - - - 75 - - - - - - - - diff --git a/docs/xml-responses/user_update.xml b/docs/xml-responses/user_update.xml index 2d04bf8f..01db28b3 100644 --- a/docs/xml-responses/user_update.xml +++ b/docs/xml-responses/user_update.xml @@ -1,4 +1,4 @@ - + - + diff --git a/docs/xml-responses/users.xml b/docs/xml-responses/users.xml deleted file mode 100644 index 7473ac73..00000000 --- a/docs/xml-responses/users.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/xml-responses/video.xml b/docs/xml-responses/video.xml index 58058110..2c9eccc5 100644 --- a/docs/xml-responses/video.xml +++ b/docs/xml-responses/video.xml @@ -1,19 +1,12 @@ - + - 2 - +1 + diff --git a/docs/xml-responses/videos.xml b/docs/xml-responses/videos.xml index d14265eb..8115a541 100644 --- a/docs/xml-responses/videos.xml +++ b/docs/xml-responses/videos.xml @@ -1,34 +1,36 @@ - + - 2 - - +4 + + + + diff --git a/requirements.txt b/requirements.txt index 51c0ba37..b0ec33f3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ +ampache~=4.2.0-1 requests~=2.22.0 -setuptools~=44.0.0 +setuptools~=44.0.0 \ No newline at end of file diff --git a/run_tests.py b/run_tests.py index d38f206d..ab721333 100644 --- a/run_tests.py +++ b/run_tests.py @@ -1,8 +1,5 @@ #!/usr/bin/env python3 -import configparser -import os -import re import shutil import sys import time @@ -22,87 +19,76 @@ UNDERLINE = '\033[4m' # user variables -url = 'https://music.server' -api = 'mysuperapikey' -user = 'myusername' try: - if sys.argv[1] and sys.argv[2] and sys.argv[3]: - url = sys.argv[1] - api = sys.argv[2] - user = sys.argv[3] + if sys.argv[1] and sys.argv[2] and sys.argv[2]: + ampache_url = sys.argv[1] + ampache_api = sys.argv[2] + ampache_user = sys.argv[3] except IndexError: - if os.path.isfile('docs/examples/ampyche.conf'): - conf = configparser.RawConfigParser() - conf.read('docs/examples/ampyche.conf') - url = conf.get('conf', 'ampache_url') - user = conf.get('conf', 'ampache_user') - api = conf.get('conf', 'ampache_apikey') - -limit = 4 -offset = 0 -song_url = 'https://music.com.au/play/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=60&uid=4&player=api&name=Synthetic%20-%20BrownSmoke.wma' -tempusername = 'temp_user' - + ampache_url = 'https://music.server' + ampache_api = 'mysuperapikey' + ampache_user = 'myusername' + +limit = 4 def run_tests(ampache_url, ampache_api, ampache_user, api_format): print(f"{HEADER}\n################\nRUN PYTHON TESTS\n################\n{ENDC}") print("Testing: " + api_format) - ampacheConnection = ampache.API() - ampacheConnection.set_format(api_format) """TODO - def update_art(ampache_type, ampache_id, overwrite = False, api_format = 'xml'): - def update_artist_info(id, api_format = 'xml'): - def stream(id, type, destination, api_format = 'xml'): - def download(id, type, destination, format = 'raw', api_format = 'xml'): - def get_art(id, type, api_format = 'xml'): + def update_art(ampache_url, ampache_api, ampache_type, ampache_id, overwrite = False, api_format = 'xml'): + def update_artist_info(ampache_url, ampache_api, id, api_format = 'xml'): + def stream(ampache_url, ampache_api, id, type, destination, api_format = 'xml'): + def download(ampache_url, ampache_api, id, type, destination, format = 'raw', api_format = 'xml'): + def get_art(ampache_url, ampache_api, id, type, api_format = 'xml'): """ """ encrypt_string def encrypt_string(ampache_api, user): """ - encrypted_key = ampacheConnection.encrypt_string(ampache_api, ampache_user) + encrypted_key = ampache.encrypt_string(ampache_api, ampache_user) if encrypted_key: - print(f"ampacheConnection.encrypted_key: {OKGREEN}PASS{ENDC}") + print(f"ampache.encrypted_key: {OKGREEN}PASS{ENDC}") #print("\nreturned:\n" + encrypted_key) else: sys.exit(f"\nampache.encrypted_key: {FAIL}FAIL{ENDC}") """ handshake - def handshake(user = False, timestamp = False, version = '420000', api_format = 'xml'): + def handshake(ampache_url, ampache_api, user = False, timestamp = False, version = '400004', api_format = 'xml'): """ # processed details - ampache_api = ampacheConnection.handshake(ampache_url, encrypted_key, False, False, '420000') + ampache_api = ampache.handshake(ampache_url, encrypted_key, False, False, '400004', api_format) if ampache_api: - print(f"ampacheConnection.handshake: {OKGREEN}PASS{ENDC}") + print(f"ampache.handshake: {OKGREEN}PASS{ENDC}") #print("\nreturned:\n" + ampache_api) else: - print(f"ampacheConnection.handshake: {FAIL}FAIL{ENDC}") + print(f"ampache.handshake: {FAIL}FAIL{ENDC}") sys.exit(f"\n{FAIL}ERROR:{ENDC} Failed to connect to " + ampache_url) """ ping - def ping(api_format = 'xml'): + def ping(ampache_url, ampache_api, api_format = 'xml'): """ # did all this work? - my_ping = ampacheConnection.ping(ampache_url, ampache_api) + my_ping = ampache.ping(ampache_url, ampache_api, api_format) if my_ping: - print(f"ampacheConnection.ping: {OKGREEN}PASS{ENDC}") + print(f"ampache.ping: {OKGREEN}PASS{ENDC}") #print("\nreturned:\n" + my_ping) else: - print(f"ampacheConnection.ping: {FAIL}FAIL{ENDC}") + print(f"ampache.ping: {FAIL}FAIL{ENDC}") sys.exit(f"\n{FAIL}ERROR:{ENDC} Failed to ping " + ampache_url) """ set_debug def set_debug(mybool): """ - set_debug = ampacheConnection.set_debug(False) + set_debug = ampache.set_debug(False) """ url_to_song - def url_to_song(url, api_format = 'xml'): + def url_to_song(ampache_url, ampache_api, url, api_format = 'xml'): """ + song_url = 'https://music.com.au/play/index.php?ssid=eeb9f1b6056246a7d563f479f518bb34&type=song&oid=164215&uid=2&player=api&name=Hellyeah%20-%20-.mp3' song_id = False - url_to_song = ampacheConnection.url_to_song(song_url) + url_to_song = ampache.url_to_song(ampache_url, ampache_api, song_url, api_format) if api_format == 'xml': song_id = ET.tostring(url_to_song).decode() @@ -110,20 +96,19 @@ def url_to_song(url, api_format = 'xml'): song_id = url_to_song if url_to_song and song_id: - print(f"ampacheConnection.url_to_song: {OKGREEN}PASS{ENDC}") + print(f"ampache.url_to_song: {OKGREEN}PASS{ENDC}") #print("\nreturned:") #print(song_id) else: - print(f"ampacheConnection.url_to_song: {FAIL}FAIL{ENDC}") + print(f"ampache.url_to_song: {FAIL}FAIL{ENDC}") """ user_create - def user_create(username, password, email, fullname = False, disable = False, api_format = 'xml'): + def user_create(ampache_url, ampache_api, username, password, email, fullname = False, disable = False, api_format = 'xml'): """ failed = False message = '' - # delete them first if they exists - ampacheConnection.user_delete(tempusername) - createuser = ampacheConnection.user_create(tempusername, 'supoersecretpassword', 'email@gmail.com', False, False) + tempusername = 'temp_user' + createuser = ampache.user_create(ampache_url, ampache_api, tempusername, 'supoersecretpassword', 'email@gmail.com', False, False, api_format) if api_format == 'xml': for child in createuser: if child.tag == 'error': @@ -134,34 +119,28 @@ def user_create(username, password, email, fullname = False, disable = False, ap else: if 'error' in createuser: failed = True - try: - message = createuser['error']['message'] - except TypeError: - message = createuser['error'] + message = createuser['error']['message'] if 'success' in createuser: - try: - message = createuser['success']['message'] - except TypeError: - message = createuser['success'] + message = createuser['success']['message'] if createuser and not failed: - print(f"ampacheConnection.user_create: {OKGREEN}PASS{ENDC}") + print(f"ampache.user_create: {OKGREEN}PASS{ENDC}") #print("\nreturned:") #print(message) else: if message == 'User does not have access to this function': - print(f"ampacheConnection.user_create: {WARNING}WARNING{ENDC}") + print(f"ampache.user_create: {WARNING}WARNING{ENDC}") else: - sys.exit(f"ampacheConnection.user_create: {FAIL}FAIL{ENDC}") + print(f"ampache.user_create: {FAIL}FAIL{ENDC}") print("returned:") print(message + "\n") """ user_edit - def user_update(username, password = False, fullname = False, email = False, website = False, state = False, city = False, disable = False, maxbitrate = False, api_format = 'xml'): + def user_update(ampache_url, ampache_api, username, password = False, fullname = False, email = False, website = False, state = False, city = False, disable = False, maxbitrate = False, api_format = 'xml'): """ failed = False message = '' - edituser = ampacheConnection.user_update(tempusername, False, False, False, False, False, False, True, False) + edituser = ampache.user_update(ampache_url, ampache_api, tempusername, False, False, False, False, False, False, True, False, api_format) if api_format == 'xml': for child in edituser: if child.tag == 'error': @@ -172,34 +151,28 @@ def user_update(username, password = False, fullname = False, email = False, web else: if 'error' in edituser: failed = True - try: - message = edituser['error']['message'] - except TypeError: - message = edituser['error'] + message = edituser['error']['message'] if 'success' in edituser: - try: - message = edituser['success']['message'] - except TypeError: - message = edituser['success'] + message = edituser['success']['message'] if edituser and not failed: - print(f"ampacheConnection.user_update: {OKGREEN}PASS{ENDC}") + print(f"ampache.user_update: {OKGREEN}PASS{ENDC}") #print("\nreturned:") #print(message) else: if message == 'User does not have access to this function': - print(f"ampacheConnection.user_create: {WARNING}WARNING{ENDC}") + print(f"ampache.user_create: {WARNING}WARNING{ENDC}") else: - print(f"ampacheConnection.user_create: {FAIL}FAIL{ENDC}") + print(f"ampache.user_create: {FAIL}FAIL{ENDC}") print("returned:") print(message + "\n") """ user_delete - def user_delete(username, api_format = 'xml'): + def user_delete(ampache_url, ampache_api, username, api_format = 'xml'): """ failed = False message = '' - deleteuser = ampacheConnection.user_delete(tempusername) + deleteuser = ampache.user_delete(ampache_url, ampache_api, tempusername, api_format) if api_format == 'xml': for child in deleteuser: if child.tag == 'error': @@ -210,33 +183,27 @@ def user_delete(username, api_format = 'xml'): else: if 'error' in deleteuser: failed = True - try: - message = deleteuser['error']['message'] - except TypeError: - message = deleteuser['error'] + message = deleteuser['error']['message'] if 'success' in deleteuser: - try: - message = deleteuser['success']['message'] - except TypeError: - message = deleteuser['success'] + message = deleteuser['success']['message'] if deleteuser and not failed: - print(f"ampacheConnection.user_delete: {OKGREEN}PASS{ENDC}") + print(f"ampache.user_delete: {OKGREEN}PASS{ENDC}") #print("\nreturned:") #print(message) else: if message == 'User does not have access to this function': - print(f"ampacheConnection.user_create: {WARNING}WARNING{ENDC}") + print(f"ampache.user_create: {WARNING}WARNING{ENDC}") else: - print(f"ampacheConnection.user_create: {FAIL}FAIL{ENDC}") + print(f"ampache.user_create: {FAIL}FAIL{ENDC}") print("returned:") print(message + "\n") """ user - def user(username, api_format = 'xml'): + def user(ampache_url, ampache_api, username, api_format = 'xml'): """ - myuser = ampacheConnection.user('missing_user') - myuser = ampacheConnection.user(ampache_user) + myuser = ampache.user(ampache_url, ampache_api, 'missing_user', api_format) + myuser = ampache.user(ampache_url, ampache_api, ampache_user, api_format) if api_format == 'xml': user_id = ET.tostring(myuser).decode() @@ -244,45 +211,56 @@ def user(username, api_format = 'xml'): user_id = myuser if myuser: - print(f"ampacheConnection.user: {OKGREEN}PASS{ENDC}") + print(f"ampache.user: {OKGREEN}PASS{ENDC}") #print("\nreturned:") #print(user_id) else: sys.exit(f"\nampache.user: {FAIL}FAIL{ENDC}") """ get_indexes - def get_indexes(type, filter = False, add = False, update = False, offset = 0, limit = 0, api_format = 'xml'): + def get_indexes(ampache_url, ampache_api, type, filter = False, add = False, update = False, offset = 0, limit = 0, api_format = 'xml'): 'song'|'album'|'artist'|'playlist' """ - - songs = ampacheConnection.get_indexes('song', False, False, False, False, False, offset, limit) + songs = ampache.get_indexes(ampache_url, ampache_api, 'song', '', '', '', '', 4, api_format) if api_format == 'xml': - tmpcount = songs.findall('song') - #if len(tmpcount) > int(limit): - # print(f"ampacheConnection.get_indexes: {FAIL}FAIL{ENDC}") - # sys.exit(f"\n{FAIL}ERROR:{ENDC} songs " + str(len(tmpcount)) + ' found more items than the limit ' + str(limit)) + for child in songs: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print(f"ampache.get_indexes: {FAIL}FAIL{ENDC}") + sys.exit(f"\n{FAIL}ERROR:{ENDC} songs " + child.text + ' found more items than the limit ' + str(limit)) + else: + continue - albums = ampacheConnection.get_indexes('album', False, False, False, False, False, offset, limit) + albums = ampache.get_indexes(ampache_url, ampache_api, 'album', '', '', '', '', 4, api_format) if api_format == 'xml': - tmpcount = albums.findall('album') - #if len(tmpcount) > int(limit): - # print(f"ampacheConnection.get_indexes: {FAIL}FAIL{ENDC}") - # sys.exit(f"\n{FAIL}ERROR:{ENDC} albums " + str(len(tmpcount)) + ' found more items than the limit ' + str(limit)) + for child in albums: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print(f"ampache.get_indexes: {FAIL}FAIL{ENDC}") + sys.exit(f"\n{FAIL}ERROR:{ENDC} albums " + child.text + ' found more items than the limit ' + str(limit)) + else: + continue - artists = ampacheConnection.get_indexes('artist', False, False, False, False, False, offset, limit) + artists = ampache.get_indexes(ampache_url, ampache_api, 'artist', '', '', '', '', 4, api_format) if api_format == 'xml': - tmpcount = ampacheConnection.get_object_list(artists, 'artist') - #if len(tmpcount) > int(limit): - # print(f"ampacheConnection.get_indexes: {FAIL}FAIL{ENDC}") - # sys.exit(f"\n{FAIL}ERROR:{ENDC} artists " + str(len(tmpcount)) + ' found more items than the limit ' + str(limit)) + for child in artists: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print(f"ampache.get_indexes: {FAIL}FAIL{ENDC}") + sys.exit(f"\n{FAIL}ERROR:{ENDC} artists " + child.text + ' found more items than the limit ' + str(limit)) + else: + continue - playlists = ampacheConnection.get_indexes('playlist', False, False, False, False, False, offset, limit) + playlists = ampache.get_indexes(ampache_url, ampache_api, 'playlist', '', '', '', '', 4, api_format) if api_format == 'xml': - tmpcount = playlists.findall('playlist') - #if len(tmpcount) > int(limit): - # print(f"ampacheConnection.get_indexes: {FAIL}FAIL{ENDC}") - # sys.exit(f"\n{FAIL}ERROR:{ENDC} playlists " + str(len(tmpcount)) + ' found more items than the limit ' + str(limit)) + for child in playlists: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print(f"ampache.get_indexes: {FAIL}FAIL{ENDC}") + sys.exit(f"\n{FAIL}ERROR:{ENDC} playlists " + child.text + ' found more items than the limit ' + str(limit)) + else: + continue if api_format == 'xml': @@ -305,25 +283,24 @@ def get_indexes(type, filter = False, add = False, update = False, offset = 0, l single_playlist = playlists[0]['id'] if single_song and single_album and single_artist and single_playlist: - print(f"ampacheConnection.get_indexes: {OKGREEN}PASS{ENDC}") + print(f"ampache.get_indexes: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.get_indexes: {FAIL}FAIL{ENDC}") """ advanced_search - def advanced_search(rules, operator = 'and', type = 'song', offset = 0, limit = 0, api_format = 'xml'): + def advanced_search(ampache_url, ampache_api, rules, operator = 'and', type = 'song', offset = 0, limit = 0, api_format = 'xml'): """ - search_rules = [['favorite', 0, '%'], ['title', 2, 'Dance']] - search_song = ampacheConnection.advanced_search(search_rules, 'or', 'song', 0, 4) + search_rules = [['favorite', 0, '%'], ['artist', 3, 'Prodigy']] + search_song = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'or', 'song', 0, 4, api_format) if api_format == 'xml': for child in search_song: if child.tag == 'total_count': + if int(child.text) > int(limit): + print(f"ampache.advanced_search: {FAIL}FAIL{ENDC}") + sys.exit(f"\n{FAIL}ERROR:{ENDC} advanced_search (song) " + child.text + ' found more items than the limit ' + str(limit)) + else: continue - # #if int(child.text) > int(limit): - # # print(f"ampacheConnection.advanced_search: {FAIL}FAIL{ENDC}") - # # sys.exit(f"\n{FAIL}ERROR:{ENDC} advanced_search (song) " + child.text + ' found more items than the limit ' + str(limit)) - # #else: - # # continue #print(child.tag, child.attrib) #for subchildren in child: # #print(str(subchildren.tag) + ': ' + str(subchildren.text)) @@ -331,18 +308,17 @@ def advanced_search(rules, operator = 'and', type = 'song', offset = 0, limit = else: song_title = search_song[0]['title'] - search_rules = [['favorite', 0, '%'], ['artist', 0, 'Car']] - search_album = ampacheConnection.advanced_search(search_rules, 'or', 'album', 0, 4) + search_rules = [['favorite', 0, '%'], ['artist', 0, 'Men']] + search_album = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'or', 'album', 0, 4, api_format) if api_format == 'xml': for child in search_album: if child.tag == 'total_count': + if int(child.text) > int(limit): + print(f"ampache.advanced_search: {FAIL}FAIL{ENDC}") + sys.exit(f"\n{FAIL}ERROR:{ENDC} advanced_search (album) " + child.text + ' found more items than the limit ' + str(limit)) + else: continue - # if int(child.text) > int(limit): - # print(f"ampacheConnection.advanced_search: {FAIL}FAIL{ENDC}") - # sys.exit(f"\n{FAIL}ERROR:{ENDC} advanced_search (album) " + child.text + ' found more items than the limit ' + str(limit)) - # else: - # continue #print(child.tag, child.attrib) #for subchildren in child: # print(str(subchildren.tag) + ': ' + str(subchildren.text)) @@ -351,17 +327,16 @@ def advanced_search(rules, operator = 'and', type = 'song', offset = 0, limit = album_title = search_album[0]['name'] search_rules = [['favorite', 0, '%'], ['artist', 4, 'Prodigy']] - search_artist = ampacheConnection.advanced_search(search_rules, 'or', 'artist', 0, 4) + search_artist = ampache.advanced_search(ampache_url, ampache_api, search_rules, 'or', 'artist', 0, 4, api_format) if api_format == 'xml': for child in search_artist: if child.tag == 'total_count': + if int(child.text) > int(limit): + print(f"ampache.advanced_search: {FAIL}FAIL{ENDC}") + sys.exit(f"{FAIL}ERROR:{ENDC} advanced_search (artist) " + child.text + ' found more items than the limit ' + str(limit)) + else: continue - # if int(child.text) > int(limit): - # print(f"ampacheConnection.advanced_search: {FAIL}FAIL{ENDC}") - # sys.exit(f"{FAIL}ERROR:{ENDC} advanced_search (artist) " + child.text + ' found more items than the limit ' + str(limit)) - # else: - # continue #print(child.tag, child.attrib) #for subchildren in child: # print(str(subchildren.tag) + ': ' + str(subchildren.text)) @@ -370,14 +345,14 @@ def advanced_search(rules, operator = 'and', type = 'song', offset = 0, limit = artist_title = search_artist[0]['name'] if search_song and search_album and search_artist and song_title and album_title and artist_title: - print(f"ampacheConnection.get_indexes: {OKGREEN}PASS{ENDC}") + print(f"ampache.get_indexes: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.get_indexes: {FAIL}FAIL{ENDC}") """ album - def album(filter, include = False, api_format = 'xml'): + def album(ampache_url, ampache_api, filter, include = False, api_format = 'xml'): """ - album = ampacheConnection.album(single_album, False) + album = ampache.album(ampache_url, ampache_api, single_album, False, api_format) if api_format == 'xml': for child in album: @@ -390,14 +365,14 @@ def album(filter, include = False, api_format = 'xml'): album_title = search_album[0]['name'] if album_title: - print(f"ampacheConnection.album: {OKGREEN}PASS{ENDC}") + print(f"ampache.album: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.album: {FAIL}FAIL{ENDC}") """ album_songs - def album_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + def album_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - album_songs = ampacheConnection.album_songs(single_album, 0, 0) + album_songs = ampache.album_songs(ampache_url, ampache_api, single_album, 0, 0, api_format) #if api_format == 'xml': # #for child in album_songs: # # #if child.tag == 'song': @@ -406,35 +381,35 @@ def album_songs(filter, offset = 0, limit = 0, api_format = 'xml'): # # # # print(str(subchildren.tag) + ': ' + str(subchildren.text)) if album_songs: - print(f"ampacheConnection.album_songs: {OKGREEN}PASS{ENDC}") + print(f"ampache.album_songs: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.album_songs: {FAIL}FAIL{ENDC}") """ albums - def albums(filter = False, exact = False, add = False, update = False, offset = 0, limit = 0, include = False, api_format = 'xml'): + def albums(ampache_url, ampache_api, filter = False, exact = False, add = False, update = False, offset = 0, limit = 0, include = False, api_format = 'xml'): """ - albums = ampacheConnection.albums(album_title, 1, False, False, 0, 10, False) - #if api_format == 'xml': - # for child in albums: - # #if child.tag == 'total_count': - # # if int(child.text) > int(limit): - # # print(f"ampacheConnection.albums: {FAIL}FAIL{ENDC}") - # # sys.exit(f"{FAIL}ERROR:{ENDC} albums " + child.text + ' found more items than the limit ' + str(limit)) - # # else: - # # continue - # #print(child.tag, child.attrib) - # #for subchildren in child: - # # print(str(subchildren.tag) + ': ' + str(subchildren.text)) + albums = ampache.albums(ampache_url, ampache_api, album_title, 1, False, False, 0, 10, False, api_format) + if api_format == 'xml': + for child in albums: + if child.tag == 'total_count': + if int(child.text) > int(limit): + print(f"ampache.albums: {FAIL}FAIL{ENDC}") + sys.exit(f"{FAIL}ERROR:{ENDC} albums " + child.text + ' found more items than the limit ' + str(limit)) + else: + continue + #print(child.tag, child.attrib) + #for subchildren in child: + # print(str(subchildren.tag) + ': ' + str(subchildren.text)) if albums: - print(f"ampacheConnection.albums: {OKGREEN}PASS{ENDC}") + print(f"ampache.albums: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.albums: {FAIL}FAIL{ENDC}") """ stats - def stats(type, filter = 'random', username = False, user_id = False, offset = 0, limit = 0, api_format = 'xml'): + def stats(ampache_url, ampache_api, type, filter = 'random', username = False, user_id = False, offset = 0, limit = 0, api_format = 'xml'): """ - stats = ampacheConnection.stats('artist', 'newest', ampache_user, False, 0, limit) + stats = ampache.stats(ampache_url, ampache_api, 'artist', 'random', ampache_user, False, 0, 2, api_format) if api_format == 'xml': for child in stats: @@ -446,7 +421,7 @@ def stats(type, filter = 'random', username = False, user_id = False, offset = 0 # print(str(subchildren.tag) + ': ' + str(subchildren.text)) else: single_artist = stats[0]['id'] - stats = ampacheConnection.stats('album', 'random', ampache_user, None, 0, limit) + stats = ampache.stats(ampache_url, ampache_api, 'album', 'random', ampache_user, None, 0, 2, api_format) if api_format == 'xml': for child in stats: @@ -462,14 +437,14 @@ def stats(type, filter = 'random', username = False, user_id = False, offset = 0 album_title = stats[0]['name'] if single_artist and single_album and album_title: - print(f"ampacheConnection.stats: {OKGREEN}PASS{ENDC}") + print(f"ampache.stats: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.stats: {FAIL}FAIL{ENDC}") """ artist - def artist(filter, include = False, api_format = 'xml'): + def artist(ampache_url, ampache_api, filter, include = False, api_format = 'xml'): """ - artist = ampacheConnection.artist(single_artist, False) + artist = ampache.artist(ampache_url, ampache_api, single_artist, False, api_format) #if api_format == 'xml': # for child in artist: @@ -480,145 +455,145 @@ def artist(filter, include = False, api_format = 'xml'): # # print(str(subchildren.tag) + ': ' + str(subchildren.text)) if artist: - print(f"ampacheConnection.artist: {OKGREEN}PASS{ENDC}") + print(f"ampache.artist: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.artist: {FAIL}FAIL{ENDC}") """ artist_albums - def artist_albums(filter, offset = 0, limit = 0, api_format = 'xml'): + def artist_albums(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - artist_albums = ampacheConnection.artist_albums(single_artist, 0, 0) + artist_albums = ampache.artist_albums(ampache_url, ampache_api, single_artist, 0, 0, api_format) if artist_albums: - print(f"ampacheConnection.artist_albums: {OKGREEN}PASS{ENDC}") + print(f"ampache.artist_albums: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.artist_albums: {FAIL}FAIL{ENDC}") """ artist_songs - def artist_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + def artist_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - artist_songs = ampacheConnection.artist_songs(single_artist, 0, 0) + artist_songs = ampache.artist_songs(ampache_url, ampache_api, single_artist, 0, 0, api_format) if artist_songs: - print(f"ampacheConnection.artist_songs: {OKGREEN}PASS{ENDC}") + print(f"ampache.artist_songs: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.artist_songs: {FAIL}FAIL{ENDC}") """ artists - def artists(filter = False, add = False, update = False, offset = 0, limit = 0, include = False, api_format = 'xml'): + def artists(ampache_url, ampache_api, filter = False, add = False, update = False, offset = 0, limit = 0, include = False, api_format = 'xml'): """ - myartists = ampacheConnection.artists(False, False, False, 0, 0, False) + myartists = ampache.artists(ampache_url, ampache_api, False, False, False, 0, 0, False, api_format) if myartists: - print(f"ampacheConnection.artists: {OKGREEN}PASS{ENDC}") + print(f"ampache.artists: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.artists: {FAIL}FAIL{ENDC}") """ catalog_action - def catalog_action(task, catalog, api_format = 'xml'): + def catalog_action(ampache_url, ampache_api, task, catalog, api_format = 'xml'): """ - catalog_action = ampacheConnection.catalog_action('clean', 1) - catalog_action = ampacheConnection.catalog_action('clean_catalog', 1) + catalog_action = ampache.catalog_action(ampache_url, ampache_api, 'clean', 2, api_format) + catalog_action = ampache.catalog_action(ampache_url, ampache_api, 'clean_catalog', 2, api_format) if catalog_action: - print(f"ampacheConnection.catalog_action: {OKGREEN}PASS{ENDC}") + print(f"ampache.catalog_action: {OKGREEN}PASS{ENDC}") else: sys.exit(f"\nampache.catalog_action: {FAIL}FAIL{ENDC}") """ flag - def flag(type, id, flag, api_format = 'xml'): + def flag(ampache_url, ampache_api, type, id, flag, api_format = 'xml'): """ - #print(ampacheConnection.flag(ampache_url, ampache_api)) + #print(ampache.flag(ampache_url, ampache_api)) """ followers - def followers(username, api_format = 'xml'): + def followers(ampache_url, ampache_api, username, api_format = 'xml'): """ - followers = ampacheConnection.followers(ampache_user) + followers = ampache.followers(ampache_url, ampache_api, ampache_user, api_format) """ following - def following(username, api_format = 'xml'): + def following(ampache_url, ampache_api, username, api_format = 'xml'): """ - following = ampacheConnection.following(ampache_user) + following = ampache.following(ampache_url, ampache_api, ampache_user, api_format) """ friends_timeline - def friends_timeline(limit = 0, since = 0, api_format = 'xml'): + def friends_timeline(ampache_url, ampache_api, limit = 0, since = 0, api_format = 'xml'): """ - friends_timeline = ampacheConnection.friends_timeline(0, 0) + friends_timeline = ampache.friends_timeline(ampache_url, ampache_api, 0, 0, api_format) """ last_shouts - def last_shouts(username, limit = 0, api_format = 'xml'): + def last_shouts(ampache_url, ampache_api, username, limit = 0, api_format = 'xml'): """ - last_shouts = ampacheConnection.last_shouts(ampache_user, 0) + last_shouts = ampache.last_shouts(ampache_url, ampache_api, ampache_user, 0, api_format) """ playlists - def playlists(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): + def playlists(ampache_url, ampache_api, filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): """ - playlists = ampacheConnection.playlists(False, False, 0, 0) + playlists = ampache.playlists(ampache_url, ampache_api, False, False, 0, 0, api_format) """ playlist - def playlist(filter, api_format = 'xml'): + def playlist(ampache_url, ampache_api, filter, api_format = 'xml'): """ - playlist = ampacheConnection.playlist(single_playlist) + playlist = ampache.playlist(ampache_url, ampache_api, single_playlist, api_format) """ playlist_songs - def playlist_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + def playlist_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - playlist_songs = ampacheConnection.playlist_songs(single_playlist, 0, 0) + playlist_songs = ampache.playlist_songs(ampache_url, ampache_api, single_playlist, 0, 0, api_format) """ playlist_create - def playlist_create(name, type, api_format = 'xml'): + def playlist_create(ampache_url, ampache_api, name, type, api_format = 'xml'): """ - #print(ampacheConnection.playlist_create(ampache_url, ampache_api)) + #print(ampache.playlist_create(ampache_url, ampache_api)) """ playlist_edit - def playlist_edit(filter, name = False, type = False, api_format = 'xml'): + def playlist_edit(ampache_url, ampache_api, filter, name = False, type = False, api_format = 'xml'): """ - #print(ampacheConnection.playlist_edit(ampache_url, ampache_api)) + #print(ampache.playlist_edit(ampache_url, ampache_api)) """ playlist_add_song - def playlist_add_song(filter, song, check = 0, api_format = 'xml'): + def playlist_add_song(ampache_url, ampache_api, filter, song, check = 0, api_format = 'xml'): """ - #print(ampacheConnection.playlist_add_song(ampache_url, ampache_api)) + #print(ampache.playlist_add_song(ampache_url, ampache_api)) """ playlist_remove_song - def playlist_remove_song(filter, song = False, track = False, api_format = 'xml'): + def playlist_remove_song(ampache_url, ampache_api, filter, song = False, track = False, api_format = 'xml'): """ - #print(ampacheConnection.playlist_remove_song(ampache_url, ampache_api)) + #print(ampache.playlist_remove_song(ampache_url, ampache_api)) """ playlist_delete - def playlist_delete(filter, api_format = 'xml'): + def playlist_delete(ampache_url, ampache_api, filter, api_format = 'xml'): """ - #print(ampacheConnection.playlist_delete(ampache_url, ampache_api)) + #print(ampache.playlist_delete(ampache_url, ampache_api)) """ playlist_generate - def playlist_generate(mode = 'random', filter = False, album = False, artist = False, flag = False, format = 'song', offset = 0, limit = 0, api_format = 'xml'): + def playlist_generate(ampache_url, ampache_api, mode = 'random', filter = False, album = False, artist = False, flag = False, format = 'song', offset = 0, limit = 0, api_format = 'xml'): """ - ampacheConnection.playlist_generate('random', False, False, False, False, 'song', 0, limit) + ampache.playlist_generate(ampache_url, ampache_api, 'random', False, False, False, False, 'song', 0, limit, api_format) - ampacheConnection.playlist_generate('random', False, False, False, False, 'index', 0, limit) + ampache.playlist_generate(ampache_url, ampache_api, 'random', False, False, False, False, 'index', 0, limit, api_format) - ampacheConnection.playlist_generate('random', False, False, False, False, 'id', 0, limit) + ampache.playlist_generate(ampache_url, ampache_api, 'random', False, False, False, False, 'id', 0, limit, api_format) """ rate - def rate(type, id, rating, api_format = 'xml'): + def rate(ampache_url, ampache_api, type, id, rating, api_format = 'xml'): """ - #print(ampacheConnection.rate(ampache_url, ampache_api)) + #print(ampache.rate(ampache_url, ampache_api)) """ record_play - def record_play(id, user, client = 'AmpacheAPI', api_format = 'xml'): + def record_play(ampache_url, ampache_api, id, user, client = 'AmpacheAPI', api_format = 'xml'): """ - #print(ampacheConnection.record_play(ampache_url, ampache_api)) + #print(ampache.record_play(ampache_url, ampache_api)) """ scrobble - def scrobble(title, artist, album, MBtitle = False, MBartist = False, MBalbum = False, time = False, client = 'AmpacheAPI', api_format = 'xml'): + def scrobble(ampache_url, ampache_api, title, artist, album, MBtitle = False, MBartist = False, MBalbum = False, time = False, client = 'AmpacheAPI', api_format = 'xml'): """ - scrobble = ampacheConnection.scrobble('Hear.Life.Spoken', 'Sub Atari Knives', 'Sub Atari Knives', False, False, False, int(time.time()), 'AmpaceApi') - scrobble = ampacheConnection.scrobble('Welcome to Planet Sexor', 'Tiga', 'Sexor', False, False, False, int(time.time()), 'test.py') + scrobble = ampache.scrobble(ampache_url, ampache_api, 'Hear.Life.Spoken', 'Sub Atari Knives', 'Sub Atari Knives', False, False, False, int(time.time()), 'AmpaceApi', api_format) + scrobble = ampache.scrobble(ampache_url, ampache_api, 'Welcome to Planet Sexor', 'Tiga', 'Sexor', False, False, False, int(time.time()), 'test.py', api_format) """ search_songs - def search_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + def search_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - search_songs = ampacheConnection.search_songs(song_title, 0, 0) + search_songs = ampache.search_songs(ampache_url, ampache_api, song_title, 0, 0, api_format) #if api_format == 'xml': # for child in search_songs: @@ -627,9 +602,9 @@ def search_songs(filter, offset = 0, limit = 0, api_format = 'xml'): # print(str(subchildren.tag) + ': ' + str(subchildren.text)) """ song - def song(filter, api_format = 'xml'): + def song(ampache_url, ampache_api, filter, api_format = 'xml'): """ - song = ampacheConnection.song(single_song) + song = ampache.song(ampache_url, ampache_api, single_song, api_format) #if api_format == 'xml': # for child in song: @@ -638,9 +613,9 @@ def song(filter, api_format = 'xml'): # # print(str(subchildren.tag) + ': ' + str(subchildren.text)) """ songs - def songs(filter = False, exact = False, add = False, update = False, offset = 0, limit = 0, api_format = 'xml'): + def songs(ampache_url, ampache_api, filter = False, exact = False, add = False, update = False, offset = 0, limit = 0, api_format = 'xml'): """ - songs = ampacheConnection.songs(False, False, False, False, 0, 0) + songs = ampache.songs(ampache_url, ampache_api, False, False, False, False, 0, 0, api_format) #if api_format == 'xml': # for child in songs: # #print(child.tag, child.attrib) @@ -648,15 +623,15 @@ def songs(filter = False, exact = False, add = False, update = False, offset = 0 # # print(str(subchildren.tag) + ': ' + str(subchildren.text)) """ tags - def tags(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): + def tags(ampache_url, ampache_api, filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): """ genre = '' - tags = ampacheConnection.tags('Brutal Death Metal', '1', 0, 4) + tags = ampache.tags(ampache_url, ampache_api, 'Brutal Death Metal', '1', 0, 4, api_format) if api_format == 'xml': for child in tags: if child.tag == 'total_count': if int(child.text) > int(limit): - print(f"ampacheConnection.tags: {FAIL}FAIL{ENDC}") + print(f"ampache.tags: {FAIL}FAIL{ENDC}") sys.exit(f"\n{FAIL}ERROR:{ENDC} tags " + child.text + ' found more items than the limit ' + str(limit)) else: continue @@ -666,17 +641,17 @@ def tags(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml # print(str(subchildren.tag) + ': ' + str(subchildren.text)) else: genre = tags[0]['tag']['id'] - + """ tag - def tag(filter, api_format = 'xml'): + def tag(ampache_url, ampache_api, filter, api_format = 'xml'): """ - tag = ampacheConnection.tag(genre) + tag = ampache.tag(ampache_url, ampache_api, genre, api_format) """ tag_albums - def tag_albums(filter, offset = 0, limit = 0, api_format = 'xml'): + def tag_albums(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - tag_albums = ampacheConnection.tag_albums(genre, 0, limit) + tag_albums = ampache.tag_albums(ampache_url, ampache_api, genre, 0, 2, api_format) #if api_format == 'xml': # for child in tag_albums: # #print(child.tag, child.attrib) @@ -684,9 +659,9 @@ def tag_albums(filter, offset = 0, limit = 0, api_format = 'xml'): # # print(str(subchildren.tag) + ': ' + str(subchildren.text)) """ tag_artists - def tag_artists(filter, offset = 0, limit = 0, api_format = 'xml'): + def tag_artists(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - tag_artists = ampacheConnection.tag_artists(genre, 0, 1) + tag_artists = ampache.tag_artists(ampache_url, ampache_api, genre, 0, 1, api_format) #if api_format == 'xml': # for child in tag_artists: # #print(child.tag, child.attrib) @@ -694,14 +669,14 @@ def tag_artists(filter, offset = 0, limit = 0, api_format = 'xml'): # # print(str(subchildren.tag) + ': ' + str(subchildren.text)) """ tag_songs - def tag_songs(filter, offset = 0, limit = 0, api_format = 'xml'): + def tag_songs(ampache_url, ampache_api, filter, offset = 0, limit = 0, api_format = 'xml'): """ - tag_songs = ampacheConnection.tag_songs(genre, 0, 1) + tag_songs = ampache.tag_songs(ampache_url, ampache_api, genre, 0, 1, api_format) """ timeline - def timeline(username, limit = 0, since = 0, api_format = 'xml'): + def timeline(ampache_url, ampache_api, username, limit = 0, since = 0, api_format = 'xml'): """ - timeline = ampacheConnection.timeline(ampache_user, 10, 0) + timeline = ampache.timeline(ampache_url, ampache_api, ampache_user, 10, 0, api_format) #if api_format == 'xml': # for child in timeline: @@ -710,45 +685,45 @@ def timeline(username, limit = 0, since = 0, api_format = 'xml'): # # print(str(subchildren.tag) + ': ' + str(subchildren.text)) """ toggle_follow - def toggle_follow(username, api_format = 'xml'): + def toggle_follow(ampache_url, ampache_api, username, api_format = 'xml'): """ toggle = 'generic' if ampache_user == 'generic': toggle = 'user' - #togglefollow = ampacheConnection.toggle_follow(toggle)) + #togglefollow = ampache.toggle_follow(ampache_url, ampache_api, toggle, api_format)) """ update_from_tags - def update_from_tags(ampache_type, ampache_id, api_format = 'xml'): + def update_from_tags(ampache_url, ampache_api, ampache_type, ampache_id, api_format = 'xml'): """ - update_from_tags = ampacheConnection.update_from_tags('album', single_album) + update_from_tags = ampache.update_from_tags(ampache_url, ampache_api, 'album', single_album, api_format) """ video - def video(filter, api_format = 'xml'): + def video(ampache_url, ampache_api, filter, api_format = 'xml'): """ - #print(ampacheConnection.video(ampache_url, ampache_api)) + #print(ampache.video(ampache_url, ampache_api)) """ videos - def videos(filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): + def videos(ampache_url, ampache_api, filter = False, exact = False, offset = 0, limit = 0, api_format = 'xml'): """ - #print(ampacheConnection.videos(ampache_url, ampache_api)) + #print(ampache.videos(ampache_url, ampache_api)) """ localplay - def localplay(command, api_format = 'xml'): + def localplay(ampache_url, ampache_api, command, api_format = 'xml'): """ - #print(ampacheConnection.localplay(ampache_url, ampache_api)) + #print(ampache.localplay(ampache_url, ampache_api)) """ democratic - def democratic(method, action, oid, api_format = 'xml'): + def democratic(ampache_url, ampache_api, method, action, oid, api_format = 'xml'): """ - #print(ampacheConnection.democratic(ampache_url, ampache_api)) + #print(ampache.democratic(ampache_url, ampache_api)) """ goodbye - def goodbye(api_format = 'xml'): + def goodbye(ampache_url, ampache_api, api_format = 'xml'): """ # Close your session when you're done - goodbye = ampacheConnection.goodbye(api_format) + goodbye = ampache.goodbye(ampache_url, ampache_api, api_format) -run_tests(url, api, user, 'xml') -run_tests(url, api, user, 'json') +run_tests(ampache_url, ampache_api,ampache_user, 'xml') +run_tests(ampache_url, ampache_api,ampache_user, 'json') diff --git a/setup.py b/setup.py index fea45603..c7e6b30d 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,5 @@ """ -Setup file +Setup file for srlearn Refer to https://github.com/ampache/python3-ampache """ @@ -24,7 +24,7 @@ author="Lachlan de Waard (lachlan-00)", author_email="lachlan.00@gmail.com", version=__version__, - description="Python library for Amapche XML & JSON API", + description="Python library for Amapche XML-API", long_description=LONG_DESCRIPTION, include_package_data=False, url="https://github.com/ampache/python3-ampache", @@ -35,12 +35,9 @@ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: POSIX :: Linux", - "Operating System :: Microsoft :: Windows", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", "Topic :: Software Development :: Libraries :: PHP Classes", - "Intended Audience :: Developers", ], keywords="", install_requires=[""], diff --git a/src/_meta.py b/src/_meta.py index 32694b3d..883b1a77 100644 --- a/src/_meta.py +++ b/src/_meta.py @@ -14,6 +14,6 @@ """ __author__ = "Lachlan de Waard (lachlan-00)" -__version__ = "5.0.1" +__version__ = "4.2.0-1" DEBUG = False diff --git a/src/ampache.py b/src/ampache.py index 7e72c803..5224701f 100644 --- a/src/ampache.py +++ b/src/ampache.py @@ -10,14 +10,14 @@ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with this program. If not, see . """ @@ -31,2944 +31,3279 @@ from xml.etree import ElementTree +# used for printing results +AMPACHE_DEBUG = False + + +""" +---------------- +HELPER FUNCTIONS +---------------- +""" + + +def set_debug(mybool): + """ set_debug + + This function can be used to enable/disable debugging messages + + INPUTS + * bool = (boolean) Enable/disable debug messages + """ + global AMPACHE_DEBUG + AMPACHE_DEBUG = mybool + + +def write_xml(xmlstr, filename): + """ write_xml + + This function can be used to write your xml responses to a file. + + INPUTS + * xmlstr = (xml) xml to write to file + * filename = (string) path and filename (e.g. './ampache.xml') + """ + if xmlstr: + text_file = open(filename, "w") + text_file.write(ElementTree.tostring(xmlstr).decode()) + text_file.close() + + +def write_json(json_data, filename): + """ write_json + + This function can be used to write your json responses to a file. + + INPUTS + * json_data = (json) json to write to file + * filename = (string) path and filename (e.g. './ampache.json') + """ + if json_data: + text_file = open(filename, "w") + text_file.write(json.dumps(json_data)) + text_file.close() + -class API(object): +def encrypt_string(ampache_api, username): + """ encrypt_string - def __init__(self): - self.AMPACHE_API = 'xml' - self.AMPACHE_DEBUG = False - self.AMPACHE_URL = '' - self.AMPACHE_SESSION = '' - self.AMPACHE_USER = '' - self.AMPACHE_KEY = '' - # Test colors for printing - self.OKGREEN = '\033[92m' - self.WARNING = '\033[93m' - self.FAIL = '\033[91m' - self.ENDC = '\033[0m' + This function can be used to encrypt your apikey into the accepted format. + INPUTS + * ampache_api = (string) apikey + * user = (string) username """ - ---------------- - HELPER FUNCTIONS - ---------------- + key = hashlib.sha256(ampache_api.encode()).hexdigest() + passphrase = username + key + sha_signature = hashlib.sha256(passphrase.encode()).hexdigest() + return sha_signature + + +def fetch_url(full_url, api_format, method): + """ fetch_url + + This function is used to fetch the string results using urllib + + INPUTS + * full_url = (string) url to fetch """ + try: + result = urllib.request.urlopen(full_url) + except urllib.error.URLError: + return False + except urllib.error.HTTPError: + return False + ampache_response = result.read() + result.close() + if AMPACHE_DEBUG: + url_response = ampache_response.decode('utf-8') + print(url_response) + print(full_url) + try: + text_file = open("docs/" + api_format + "-responses/" + method + "." + api_format, "w", encoding="utf-8") + text_file.write(url_response) + text_file.close() + except FileNotFoundError: + pass + return ampache_response + + +""" +------------- +API FUNCTIONS +------------- +""" + + +def handshake(ampache_url, ampache_api, ampache_user=False, timestamp=False, version='400004', api_format='xml'): + """ handshake + MINIMUM_API_VERSION=380001 - def set_format(self, myformat: str): - """ set_format + This is the function that handles verifying a new handshake + Takes a timestamp, auth key, and username. - Allow forcing a default format + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * user = (string) //optional + * timestamp = (integer) UNIXTIME() //optional + * version = (string) //optional + * api_format = (string) 'xml'|'json' //optional + """ + if timestamp == 0: + timestamp = int(time.time()) + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'handshake', + 'auth': ampache_api, + 'user': ampache_user, + 'timestamp': str(timestamp), + 'version': version} + if not ampache_user: + data.pop('user') + if not timestamp: + data.pop('timestamp') + if not version: + data.pop('version') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'handshake') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + if 'auth' in json_data: + return json_data['auth'] + else: + return False + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + try: + token = tree.find('auth').text + except AttributeError: + token = False + return token - INPUTS - * myformat = (string) 'xml'|'json' - """ - if myformat == 'xml' or myformat == 'json': - print('AMPACHE_API set to ' + myformat) - self.AMPACHE_API = myformat - def set_debug(self, mybool: bool): - """ set_debug +def ping(ampache_url, ampache_api, api_format='xml'): + """ ping + MINIMUM_API_VERSION=380001 - This function can be used to enable/disable debugging messages + This can be called without being authenticated, it is useful for determining if what the status + of the server is, and what version it is running/compatible with - INPUTS - * bool = (boolean) Enable/disable debug messages - """ - if mybool: - print('AMPACHE_DEBUG' + f": {self.OKGREEN}enabled{self.ENDC}") + INPUTS + * ampache_url = (string) + * ampache_api = (string) session auth key //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'ping', + 'auth': ampache_api} + if not ampache_api: + data.pop('auth') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'ping') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + if 'session_expire' in json_data: + return ampache_api else: - print('AMPACHE_DEBUG' + f": {self.WARNING}disabled{self.ENDC}") - self.AMPACHE_DEBUG = mybool + return False + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + try: + tree.find('session_expire').text + except AttributeError: + return False + return ampache_api + + +def goodbye(ampache_url, ampache_api, api_format='xml'): + """ goodbye + MINIMUM_API_VERSION=400001 + + Destroy session for ampache_api auth key. + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'goodbye', + 'auth': ampache_api} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'goodbye') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def url_to_song(ampache_url, ampache_api, url, api_format='xml'): + """ url_to_song + MINIMUM_API_VERSION=380001 + + This takes a url and returns the song object in question + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * url = (string) Full Ampache URL from server, translates back into a song XML + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'url_to_song', + 'auth': ampache_api, + 'url': url} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'url_to_song') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree - def set_user(self, myuser: str): - """ set_user - Set the user string for connection +def get_similar(ampache_url, ampache_api, object_type, filter_str, offset=0, limit=0, api_format='xml'): + """ get_similar + MINIMUM_API_VERSION=420000 - INPUTS - * myuser = (string) '' - """ - self.AMPACHE_USER = myuser + Return similar artist id's or similar song ids compared to the input filter - def set_key(self, mykey: str): - """ set_key + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_type = (string) 'song'|'album'|'artist'|'playlist' + * filter_str = (string) artist id or song id + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'get_similar', + 'auth': ampache_api, + 'type': object_type, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'get_similar') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def get_indexes(ampache_url, ampache_api, object_type, + filter_str=False, add=False, update=False, + offset=0, limit=0, api_format='xml'): + """ get_indexes + MINIMUM_API_VERSION=400001 + + This takes a collection of inputs and returns ID + name for the object type + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_type = (string) 'song'|'album'|'artist'|'playlist' + * filter_str = (string) //optional + * add = //optional + * update = //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'get_indexes', + 'auth': ampache_api, + 'type': object_type, + 'filter': filter_str, + 'add': add, + 'update': update, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not add: + data.pop('add') + if not update: + data.pop('update') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'get_indexes') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree - set AMPACHE_KEY (api key or password) - INPUTS - * mykey = (string) '' - """ - self.AMPACHE_KEY = mykey +def artists(ampache_url, ampache_api, filter_str=False, + add=False, update=False, offset=0, limit=0, include=False, api_format='xml'): + """ artists + MINIMUM_API_VERSION=380001 - def set_url(self, myurl: str): - """ set_url + This takes a collection of inputs and returns artist objects. - set the ampache url + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * add = //optional + * update = //optional + * offset = (integer) //optional + * limit = (integer) //optional + * include = //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'artists', + 'auth': ampache_api, + 'filter': filter_str, + 'add': add, + 'update': update, + 'offset': str(offset), + 'limit': str(limit), + 'include': include} + if not filter_str: + data.pop('filter') + if not add: + data.pop('add') + if not update: + data.pop('update') + if not include: + data.pop('include') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'artists') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree - INPUTS - * myurl = (string) '' - """ - self.AMPACHE_URL = myurl - def test_result(self, result, title): - """ set_debug +def artist(ampache_url, ampache_api, filter_str, include=False, api_format='xml'): + """ artist + MINIMUM_API_VERSION=380001 - This function can be used to enable/disable debugging messages + This returns a single artist based on the UID of said artist - INPUTS - * bool = (boolean) Enable/disable debug messages - """ - if not result: - print("ampache." + title + f": {self.FAIL}FAIL{self.ENDC}") + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) $artist_id + * include = //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'artist', + 'auth': ampache_api, + 'filter': filter_str, + 'include': include} + if not include: + data.pop('include') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'artist') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: return False - if 'Require: ' in result: - print(f"ampache." + title + f": {self.WARNING}WARNING{self.ENDC} " + result) - return True - if result: - print("ampache." + title + f": {self.OKGREEN}PASS{self.ENDC}") - return True - print("ampache." + title + f": {self.FAIL}FAIL{self.ENDC}") + return tree + + +def artist_albums(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ artist_albums + MINIMUM_API_VERSION=380001 + + This returns the albums of an artist + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'artist_albums', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'artist_albums') + if not ampache_response: return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree - def return_data(self, data): - """ return_data - return json or xml data based on api format +def artist_songs(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ artist_songs + MINIMUM_API_VERSION=380001 - INPUTS - * data = (string) - """ - # json format - if self.AMPACHE_API == 'json': - json_data = json.loads(data.decode('utf-8')) - return json_data - # xml format - else: - try: - tree = ElementTree.fromstring(data.decode('utf-8')) - except ElementTree.ParseError: - return False + This returns the songs of the specified artist + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'artist_songs', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'artist_songs') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def albums(ampache_url, ampache_api, filter_str=False, + exact=False, add=False, update=False, offset=0, limit=0, + include=False, api_format='xml'): + """ albums + MINIMUM_API_VERSION=380001 + + This returns albums based on the provided search filters + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * add = //optional + * update = //optional + * offset = (integer) //optional + * limit = (integer) //optional + * include = //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'albums', + 'auth': ampache_api, + 'filter': filter_str, + 'exact': exact, + 'add': add, + 'update': update, + 'offset': str(offset), + 'limit': str(limit), + 'include': include} + if not filter_str: + data.pop('filter') + if not add: + data.pop('add') + if not update: + data.pop('update') + if not include: + data.pop('include') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'albums') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def album(ampache_url, ampache_api, filter_str, include=False, api_format='xml'): + """ album + MINIMUM_API_VERSION=380001 + + This returns a single album based on the UID provided + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) $album_id + * include = //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'album', + 'auth': ampache_api, + 'filter': filter_str, + 'include': include} + if not include: + data.pop('include') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'album') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def album_songs(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ album_songs + MINIMUM_API_VERSION=380001 + + This returns the songs of a specified album + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (string) + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'album_songs', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'album_songs') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def tags(ampache_url, ampache_api, filter_str=False, exact=False, offset=0, limit=0, api_format='xml'): + """ tags + MINIMUM_API_VERSION=380001 + + This returns the tags (Genres) based on the specified filter + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'tags', + 'auth': ampache_api, + 'exact': exact, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not exact: + data.pop('exact') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'tags') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def tag(ampache_url, ampache_api, filter_str, api_format='xml'): + """ tag + MINIMUM_API_VERSION=380001 + + This returns a single tag based on UID + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) $genre_id + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'tag', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'tag') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def tag_artists(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ tag_artists + MINIMUM_API_VERSION=380001 + + This returns the artists associated with the tag in question as defined by the UID + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'tag_artists', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'tag_artists') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def tag_albums(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ tag_albums + MINIMUM_API_VERSION=380001 + + This returns the albums associated with the tag in question + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'tag_albums', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'tag_albums') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def tag_songs(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ tag_songs + MINIMUM_API_VERSION=380001 + + returns the songs for this tag + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'tag_songs', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'tag_songs') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def songs(ampache_url, ampache_api, filter_str=False, exact=False, + add=False, update=False, offset=0, limit=0, api_format='xml'): + """ songs + MINIMUM_API_VERSION=380001 + + Returns songs based on the specified filter_str + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * add = //optional + * update = //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'songs', + 'auth': ampache_api, + 'exact': exact, + 'add': add, + 'update': update, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not exact: + data.pop('exact') + if not add: + data.pop('add') + if not update: + data.pop('update') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'songs') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def song(ampache_url, ampache_api, filter_str, api_format='xml'): + """ song + MINIMUM_API_VERSION=380001 + + returns a single song + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'song', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'song') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def playlists(ampache_url, ampache_api, filter_str=False, exact=False, offset=0, limit=0, api_format='xml'): + """ playlists + MINIMUM_API_VERSION=380001 + + This returns playlists based on the specified filter + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'playlists', + 'auth': ampache_api, + 'exact': exact, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not exact: + data.pop('exact') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlists') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def playlist(ampache_url, ampache_api, filter_str, api_format='xml'): + """ playlist + MINIMUM_API_VERSION=380001 + + This returns a single playlist + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'playlist', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlist') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def playlist_songs(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ playlist_songs + MINIMUM_API_VERSION=380001 + + This returns the songs for a playlist + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'playlist_songs', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlist_songs') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def playlist_create(ampache_url, ampache_api, name, object_type, api_format='xml'): + """ playlist_create + MINIMUM_API_VERSION=380001 + + This create a new playlist and return it + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * name = (string) + * object_type = (string) + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'playlist_create', + 'auth': ampache_api, + 'name': name, + 'type': object_type} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlist_create') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + try: + token = tree.find('playlist').text + except AttributeError: + token = False + if token: return tree + try: + token = tree.find('error').text + except AttributeError: + token = False + return token - def get_id_list(self, data, attribute: str): - """ get_id_list - - return a list of id's from the data you've got from the api - - INPUTS - * data = (mixed) XML or JSON from the API - * attribute = (string) attribute you are searching for - """ - id_list = list() - if not data: - return id_list - if self.AMPACHE_API == 'xml': - try: - for child in data: - if child.tag == attribute: - id_list.append(child.attrib['id']) - except KeyError: - id_list.append(data['id']) - else: - try: - for data_object in data[attribute]: - id_list.append(data_object['id']) - except TypeError: - for data_object in data: - id_list.append(data_object[0]) - except KeyError: - id_list.append(data['id']) - return id_list - - @staticmethod - def get_object_list(data, field: str, data_format: str = 'xml'): - """ get_id_list - - return a list of objects from the data matching your field stirng - - INPUTS - * data = (mixed) XML or JSON from the API - * field = (string) field you are searching for - * data_format = (string) 'xml','json' - """ - id_list = list() - if data_format == 'xml': - return data.findall(field) - else: - try: - for data_object in data[field]: - id_list.append(data_object['id']) - except TypeError: - for data_object in data: - id_list.append(data_object[0]) - return id_list - - @staticmethod - def write_xml(xmlstr, filename: str): - """ write_xml - - This function can be used to write your xml responses to a file. - - INPUTS - * xmlstr = (xml) xml to write to file - * filename = (string) path and filename (e.g. './ampache.xml') - """ - if xmlstr: - text_file = open(filename, "w") - text_file.write(ElementTree.tostring(xmlstr).decode()) - text_file.close() - @staticmethod - def get_message(data): - """ get_message - - Return the string message text from the api response - - INPUTS - * data = (mixed) XML or JSON from the API - """ - message = data - print(data) - if 'error' in data: - try: - message = data['error']['message'] - except TypeError: - message = data['error'] - except KeyError: - message = data['error']['errorMessage'] - if 'success' in data: - try: - message = data['success']['message'] - except TypeError: - message = data['success'] - return message - - @staticmethod - def write_json(json_data: str, filename: str): - """ write_json - - This function can be used to write your json responses to a file. - - INPUTS - * json_data = (json) json to write to file - * filename = (string) path and filename (e.g. './ampache.json') - """ - if json_data: - text_file = open(filename, "w") - text_file.write(json.dumps(json_data)) - text_file.close() +def playlist_edit(ampache_url, ampache_api, filter_str, name=False, object_type=False, api_format='xml'): + """ playlist_edit + MINIMUM_API_VERSION=400001 - @staticmethod - def encrypt_password(password: str, current_time: int): - """ encrypt_password - - This function can be used to encrypt your password into the accepted format. - - INPUTS - * password = (string) unencrypted password string - * time = (integer) linux time - """ - key = hashlib.sha256(password.encode()).hexdigest() - passphrase = str(current_time) + key - sha_signature = hashlib.sha256(passphrase.encode()).hexdigest() - return sha_signature - - @staticmethod - def encrypt_string(api_key: str, username: str): - """ encrypt_string - - This function can be used to encrypt your apikey into the accepted format. - - INPUTS - * api_key = (string) unencrypted apikey - * user = (string) username - """ - key = hashlib.sha256(api_key.encode()).hexdigest() - passphrase = username + key - sha_signature = hashlib.sha256(passphrase.encode()).hexdigest() - return sha_signature - - def fetch_url(self, full_url: str, api_format: str, method: str): - """ fetch_url - - This function is used to fetch the string results using urllib - - INPUTS - * full_url = (string) url to fetch - * api_format = (string) 'xml'|'json' - * method = (string) - """ - try: - result = urllib.request.urlopen(full_url) - except urllib.error.URLError: - return False - except urllib.error.HTTPError: - return False - except ValueError: - return False - ampache_response = result.read() - result.close() - if self.AMPACHE_DEBUG: - url_response = ampache_response.decode('utf-8') - print(url_response) - print(full_url) - try: - text_file = open("docs/" + api_format + "-responses/" + method + "." + api_format, "w", encoding="utf-8") - text_file.write(url_response) - text_file.close() - except FileNotFoundError: - pass - return ampache_response - - """ - ------------- - API FUNCTIONS - ------------- - """ - - def handshake(self, ampache_url: str, ampache_api: str, ampache_user: str = False, - timestamp: int = 0, version: str = '5.0.0'): - """ handshake - MINIMUM_API_VERSION=380001 - - This is the function that handles verifying a new handshake - Takes a timestamp, auth key, and username. - - INPUTS - * ampache_url = (string) Full Ampache URL e.g. 'https://music.com.au' - * ampache_api = (string) encrypted apikey OR password if using password auth - * user = (string) username //optional - * timestamp = (integer) UNIXTIME() //optional - * version = (string) //optional - """ - self.AMPACHE_URL = ampache_url - if timestamp == 0: - timestamp = int(time.time()) - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'handshake', - 'auth': ampache_api, - 'user': ampache_user, - 'timestamp': str(timestamp), - 'version': version} - if not ampache_user: - data.pop('user') - if not timestamp or not ampache_user: - data.pop('timestamp') - if not version: - data.pop('version') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'handshake') - if not ampache_response: - return False - # json format - if self.AMPACHE_API == 'json': - json_data = json.loads(ampache_response.decode('utf-8')) - if 'auth' in json_data: - self.AMPACHE_SESSION = json_data['auth'] - return json_data['auth'] - else: - return False - # xml format - else: - try: - tree = ElementTree.fromstring(ampache_response.decode('utf-8')) - except ElementTree.ParseError: - return False - try: - token = tree.find('auth').text - except AttributeError: - token = False - self.AMPACHE_SESSION = token - return token - - def ping(self, ampache_url: str, ampache_api: str = False, version: str = '5.0.0'): - """ ping - MINIMUM_API_VERSION=380001 - - This can be called without being authenticated, it is useful for determining if what the status - of the server is, and what version it is running/compatible with - - INPUTS - * ampache_url = (string) Full Ampache URL e.g. 'https://music.com.au' - * ampache_api = (string) encrypted apikey //optional - """ - ampache_url = ampache_url + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'ping', - 'version': version, - 'auth': ampache_api} - if not ampache_api: - data.pop('auth') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'ping') - if not ampache_response: - return False - # json format - if self.AMPACHE_API == 'json': - json_data = json.loads(ampache_response.decode('utf-8')) - if 'session_expire' in json_data: - if not self.AMPACHE_URL: - self.AMPACHE_URL = ampache_url - self.AMPACHE_SESSION = ampache_api - return ampache_api - else: - return False - # xml format - else: - try: - tree = ElementTree.fromstring(ampache_response.decode('utf-8')) - except ElementTree.ParseError: - return False - try: - tree.find('session_expire').text - if not self.AMPACHE_URL: - self.AMPACHE_URL = ampache_url - self.AMPACHE_SESSION = ampache_api - except AttributeError: - return False - return ampache_api + This modifies name and type of a playlist - def goodbye(self): - """ goodbye - MINIMUM_API_VERSION=400001 - - Destroy session for ampache_api auth key. - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'goodbye', - 'auth': self.AMPACHE_SESSION} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'goodbye') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def url_to_song(self, url): - """ url_to_song - MINIMUM_API_VERSION=380001 - - This takes a url and returns the song object in question - - INPUTS - * url = (string) Full Ampache URL from server, translates back into a song XML - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'url_to_song', - 'auth': self.AMPACHE_SESSION, - 'url': url} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'url_to_song') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def get_similar(self, object_type, filter_id: int, - offset=0, limit=0): - """ get_similar - MINIMUM_API_VERSION=420000 - - Return similar artist id's or similar song ids compared to the input filter - - INPUTS - * object_type = (string) 'song'|'album'|'artist'|'playlist' - * filter_id = (integer) $artist_id or song_id - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'get_similar', - 'auth': self.AMPACHE_SESSION, - 'type': object_type, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'get_similar') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def get_indexes(self, object_type, - filter_str: str = False, exact: int = False, add: int = False, update: int = False, - include=False, offset=0, limit=0): - """ get_indexes - MINIMUM_API_VERSION=400001 - - This takes a collection of inputs and returns ID + name for the object type - - INPUTS - * object_type = (string) 'song'|'album'|'artist'|'album_artist'|'playlist' - * filter_str = (string) search the name of the object_type //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * add = (integer) UNIXTIME() //optional - * update = (integer) UNIXTIME() //optional - * include = (integer) 0,1 include songs if available for that object //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(include): - include = 1 - else: - include = 0 - data = {'action': 'get_indexes', - 'auth': self.AMPACHE_SESSION, - 'type': object_type, - 'filter': filter_str, - 'exact': exact, - 'add': add, - 'update': update, - 'include': include, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not add: - data.pop('add') - if not update: - data.pop('update') - if not include: - data.pop('include') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'get_indexes') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def artists(self, filter_str: str = False, - add: int = False, update: int = False, offset=0, limit=0, include=False, album_artist=False): - """ artists - MINIMUM_API_VERSION=380001 - - This takes a collection of inputs and returns artist objects. - - INPUTS - * filter_str = (string) search the name of an artist //optional - * add = (integer) UNIXTIME() //optional - * update = (integer) UNIXTIME() //optional - * offset = (integer) //optional - * limit = (integer) //optional - * include = (string) 'albums', 'songs' //optional - * album_artist = (boolean) 0,1 if true filter for album artists only //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(include) and not isinstance(include, str): - include = 'albums,songs' - data = {'action': 'artists', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str, - 'add': add, - 'update': update, - 'offset': str(offset), - 'limit': str(limit), - 'include': include, - 'album_artist': album_artist} - if not filter_str: - data.pop('filter') - if not add: - data.pop('add') - if not update: - data.pop('update') - if not include: - data.pop('include') - if not album_artist: - data.pop('album_artist') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'artists') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def artist(self, filter_id: int, include=False): - """ artist - MINIMUM_API_VERSION=380001 - - This returns a single artist based on the UID of said artist - - INPUTS - * filter_id = (integer) $artist_id - * include = (string) 'albums', 'songs' //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(include) and not isinstance(include, str): - include = 'albums,songs' - data = {'action': 'artist', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'include': include} - if not include: - data.pop('include') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'artist') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def artist_albums(self, filter_id: int, offset=0, limit=0): - """ artist_albums - MINIMUM_API_VERSION=380001 - - This returns the albums of an artist - - INPUTS - * filter_id = (integer) $artist_id - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'artist_albums', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'artist_albums') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def artist_songs(self, filter_id: int, offset=0, limit=0): - """ artist_songs - MINIMUM_API_VERSION=380001 - - This returns the songs of the specified artist - - INPUTS - * filter_id = (integer) $artist_id - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'artist_songs', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'artist_songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def albums(self, filter_str: str = False, - exact=False, add: int = False, update: int = False, offset=0, limit=0, - include=False): - """ albums - MINIMUM_API_VERSION=380001 - - This returns albums based on the provided search filters - - INPUTS - * filter_str = (string) search the name of an album //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * add = (integer) UNIXTIME() //optional - * update = (integer) UNIXTIME() //optional - * offset = (integer) //optional - * limit = (integer) //optional - * include = (string) 'songs' //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(include) and not isinstance(include, str): - include = 'songs' - data = {'action': 'albums', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str, - 'exact': exact, - 'add': add, - 'update': update, - 'offset': str(offset), - 'limit': str(limit), - 'include': include} - if not filter_str: - data.pop('filter_str') - if not add: - data.pop('add') - if not update: - data.pop('update') - if not include: - data.pop('include') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'albums') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def album(self, filter_id: int, include=False): - """ album - MINIMUM_API_VERSION=380001 - - This returns a single album based on the UID provided - - INPUTS - * filter_id = (integer) $album_id - * include = (string) 'songs' //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(include) and not isinstance(include, str): - include = 'songs' - data = {'action': 'album', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'include': include} - if not include: - data.pop('include') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'album') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def album_songs(self, filter_id: int, offset=0, limit=0): - """ album_songs - MINIMUM_API_VERSION=380001 - - This returns the songs of a specified album - - INPUTS - * filter_id = (integer) $album_id - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'album_songs', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'album_songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def genres(self, filter_str: str = False, - exact: int = False, offset=0, limit=0): - """ genres - MINIMUM_API_VERSION=380001 - - This returns the genres (Tags) based on the specified filter - - INPUTS - * filter_str = (string) search the name of a genre //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'genres', - 'auth': self.AMPACHE_SESSION, - 'exact': exact, - 'filter': filter_str, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not exact: - data.pop('exact') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'genres') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def genre(self, filter_id: int): - """ genre - MINIMUM_API_VERSION=380001 - - This returns a single genre based on UID - - INPUTS - * filter_id = (integer) $genre_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'genre', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'genre') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def genre_artists(self, filter_id: int, offset=0, limit=0): - """ genre_artists - MINIMUM_API_VERSION=380001 - - This returns the artists associated with the genre in question as defined by the UID - - INPUTS - * filter_id = (integer) $genre_id - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'genre_artists', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'genre_artists') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def genre_albums(self, filter_id: int, offset=0, limit=0): - """ genre_albums - MINIMUM_API_VERSION=380001 - - This returns the albums associated with the genre in question - - INPUTS - * filter_id = (integer) $genre_id - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'genre_albums', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'genre_albums') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def genre_songs(self, filter_id: int, offset=0, limit=0): - """ genre_songs - MINIMUM_API_VERSION=380001 - - returns the songs for this genre - - INPUTS - * filter_id = (integer) $genre_id - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'genre_songs', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'genre_songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def songs(self, filter_str: str = False, exact: int = False, - add: int = False, update: int = False, offset=0, limit=0): - """ songs - MINIMUM_API_VERSION=380001 - - Returns songs based on the specified filter_str - - INPUTS - * filter_str = (string) search the name of a song //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * add = (integer) UNIXTIME() //optional - * update = (integer) UNIXTIME() //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'songs', - 'auth': self.AMPACHE_SESSION, - 'exact': exact, - 'add': add, - 'update': update, - 'filter': filter_str, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not exact: - data.pop('exact') - if not add: - data.pop('add') - if not update: - data.pop('update') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def song(self, filter_id: int): - """ song - MINIMUM_API_VERSION=380001 - - returns a single song - - INPUTS - * filter_id = (integer) $song_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'song', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'song') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def song_delete(self, filter_id: int): - """ song_delete - MINIMUM_API_VERSION=5.0.0 - - Delete an existing song. - - INPUTS - * filter_id = (string) UID of song to delete - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'song_delete', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'song') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlists(self, filter_str: str = False, exact: int = False, offset=0, limit=0): - """ playlists - MINIMUM_API_VERSION=380001 - - This returns playlists based on the specified filter - - INPUTS - * filter_str = (string) search the name of a playlist //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'playlists', - 'auth': self.AMPACHE_SESSION, - 'exact': exact, - 'filter': filter_str, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not exact: - data.pop('exact') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlists') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlist(self, filter_id: int): - """ playlist - MINIMUM_API_VERSION=380001 - - This returns a single playlist - - INPUTS - * filter_id = (integer) $playlist_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'playlist', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlist') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlist_songs(self, filter_id: int, offset=0, limit=0): - """ playlist_songs - MINIMUM_API_VERSION=380001 - - This returns the songs for a playlist - - INPUTS - * filter_id = (integer) $playlist_id - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'playlist_songs', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlist_songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlist_create(self, name, object_type): - """ playlist_create - MINIMUM_API_VERSION=380001 - - This create a new playlist and return it - - INPUTS - * name = (string) - * object_type = (string) - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'playlist_create', - 'auth': self.AMPACHE_SESSION, - 'name': name, - 'type': object_type} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlist_create') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlist_edit(self, filter_id: int, name=False, - object_type=False): - """ playlist_edit - MINIMUM_API_VERSION=400001 - - This modifies name and type of a playlist - - INPUTS - * filter_id = (integer) - * name = (string) playlist name //optional - * object_type = (string) 'public'|'private' - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'playlist_edit', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'name': name, - 'type': object_type} - if not name: - data.pop('name') - if not object_type: - data.pop('type') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlist_edit') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlist_delete(self, filter_id: int): - """ playlist_delete - MINIMUM_API_VERSION=380001 - - This deletes a playlist - - INPUTS - * filter_id = (integer) $playlist_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'playlist_delete', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlist_delete') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlist_add_song(self, filter_id: int, song_id, check=False): - """ playlist_add_song - MINIMUM_API_VERSION=380001 - CHANGED_IN_API_VERSION=400003 - - This adds a song to a playlist. - Added duplicate checks in 400003 - - INPUTS - * filter_id = (integer) $playlist_id - * song_id = (integer) $song_id - * check = (boolean|integer) (True,False | 0|1) Check for duplicates //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(check): - check = 1 - else: - check = 0 - data = {'action': 'playlist_add_song', - 'auth': self.AMPACHE_SESSION, - 'song': song_id, - 'filter': filter_id, - 'check': check} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlist_add_song') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlist_remove_song(self, filter_id: int, - song_id=False, track=False): - """ playlist_remove_song - MINIMUM_API_VERSION=380001 - CHANGED_IN_API_VERSION=400001 - - This removes a song from a playlist. Previous versions required 'track' instead of 'song'. - - INPUTS - * filter_id = (integer) $playlist_id - * song_id = (integer) $song_id //optional - * track = (integer) $playlist_track number //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - - data = {'action': 'playlist_remove_song', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'song': song_id, - 'track': track} - if not song_id: - data.pop('song') - if not track: - data.pop('track') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlist_remove_song') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def playlist_generate(self, mode='random', - filter_str: str = False, album_id=False, artist_id=False, flagged=False, - list_format='song', offset=0, limit=0): - """ playlist_generate - MINIMUM_API_VERSION=400001 - CHANGED_IN_API_VERSION=400002 - - Get a list of song XML, indexes or id's based on some simple search criteria = - 'recent' will search for tracks played after 'Popular Threshold' days - 'forgotten' will search for tracks played before 'Popular Threshold' days - 'unplayed' added in 400002 for searching unplayed tracks - - INPUTS - * mode = (string) 'recent', 'forgotten', 'unplayed', 'random' (default = 'random') //optional - * filter_str = (string) string LIKE matched to song title //optional - * album_id = (integer) $album_id //optional - * artist_id = (integer) $artist_id //optional - * flagged = (integer) get flagged songs only 0, 1 (default=0) //optional - * list_format = (string) 'song', 'index','id' (default = 'song') //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'playlist_generate', - 'auth': self.AMPACHE_SESSION, - 'mode': mode, - 'filter': filter_str, - 'album': album_id, - 'artist': artist_id, - 'flag': flagged, - 'format': list_format, - 'offset': offset, - 'limit': limit} - if not filter_str: - data.pop('filter') - if not album_id: - data.pop('album') - if not artist_id: - data.pop('artist') - if not flagged: - data.pop('flag') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'playlist_generate') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def shares(self, filter_str: str = False, - exact: int = False, offset=0, limit=0): - """ shares - MINIMUM_API_VERSION=420000 - - INPUTS - * filter_str = (string) search the name of a share //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'shares', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str, - 'exact': exact, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not exact: - data.pop('exact') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'shares') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def share(self, filter_id: int): - """ share - MINIMUM_API_VERSION=420000 - - Return shares by UID - - INPUTS - * filter_id = (integer) UID of Share - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'share', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'share') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def share_create(self, filter_id: int, object_type, - description=False, expires=False): - """ share_create - MINIMUM_API_VERSION=420000 - - Create a public url that can be used by anyone to stream media. - Takes the file id with optional description and expires parameters. - - INPUTS - * filter_id = (integer) $object_id - * object_type = (string) object_type ('song', 'album', 'artist') - * description = (string) description (will be filled for you if empty) //optional - * expires = (integer) days to keep active //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'share_create', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'type': object_type, - 'description': description, - 'expires': expires} - if not description: - data.pop('description') - if not expires: - data.pop('expires') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'share_create') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def share_edit(self, filter_id: int, can_stream=False, can_download=False, - expires=False, description=False): - """ share_edit - MINIMUM_API_VERSION=420000 - - Update the description and/or expiration date for an existing share. - Takes the share id to update with optional description and expires parameters. - - INPUT - * filter_id = (integer) UID of Share - * can_stream = (boolean) 0,1 //optional - * can_download = (boolean) 0,1 //optional - * expires = (integer) number of whole days before expiry //optional - * description = (string) update description //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'share_edit', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'stream': can_stream, - 'download': can_download, - 'expires': expires, - 'description': description} - if not can_stream: - data.pop('stream') - if not can_download: - data.pop('download') - if not expires: - data.pop('expires') - if not description: - data.pop('description') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'share_edit') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def share_delete(self, filter_id: int): - """ share_delete - MINIMUM_API_VERSION=420000 - - Delete an existing share. - - INPUT - * filter_id = (integer) UID of Share to delete - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'share_delete', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'share_delete') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def catalogs(self, filter_str: str = False, offset=0, limit=0): - """ catalogs - MINIMUM_API_VERSION=420000 - - INPUTS - * filter_str = (string) search the name of a catalog //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'catalogs', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'catalogs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def catalog(self, filter_id: int, offset=0, limit=0): - """ catalog - MINIMUM_API_VERSION=420000 - - Return catalogs by UID - - INPUTS - * filter_id = (integer) UID of catalog - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'catalog', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'catalog') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def catalog_action(self, task, catalog_id): - """ catalog_action - MINIMUM_API_VERSION=400001 - - Kick off a catalog update or clean for the selected catalog - - INPUTS - * task = (string) 'add_to_catalog'|'clean_catalog'|'verify_catalog'|'gather_art' - * catalog_id = (integer) $catalog_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'catalog_action', - 'auth': self.AMPACHE_SESSION, - 'task': task, - 'catalog': catalog_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'catalog_action') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def catalog_file(self, file, task, catalog_id): - """ catalog_file - MINIMUM_API_VERSION=420000 - - Perform actions on local catalog files. - Single file versions of catalog add, clean and verify. - Make sure you remember to urlencode those file names! - - INPUTS - * file = (string) urlencode(FULL path to local file) - * task = (string) 'add'|'clean'|'verify'|'remove' - * catalog_id = (integer) $catalog_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'catalog_file', - 'auth': self.AMPACHE_SESSION, - 'file': file, - 'task': task, - 'catalog': catalog_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'catalog_action') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def podcasts(self, filter_str: str = False, - exact: int = False, offset=0, limit=0): - """ podcasts - MINIMUM_API_VERSION=420000 - - INPUTS - * filter_str = (string) search the name of a podcast //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'podcasts', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str, - 'exact': exact, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not exact: - data.pop('exact') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'podcasts') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def podcast(self, filter_id: int, include=False): - """ podcast - MINIMUM_API_VERSION=420000 - - Return podcasts by UID - - INPUTS - * filter_id = (integer) UID of Podcast - * include = (string) 'episodes' Include episodes with the response //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'podcast', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'include': include} - if not include: - data.pop('include') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'podcast') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def podcast_create(self, url, catalog_id): - """ podcast_create - MINIMUM_API_VERSION=420000 - - Return podcasts by UID - - INPUTS - * url = (string) rss url for podcast - * catalog_id = (string) podcast catalog - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'podcast_create', - 'auth': self.AMPACHE_SESSION, - 'url': url, - 'catalog': catalog_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'podcast_create') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def podcast_edit(self, filter_id: int, - feed=False, title=False, website=False, - description=False, generator=False, copyright_str=False): - """ podcast_edit - MINIMUM_API_VERSION=420000 - - Update the description and/or expiration date for an existing podcast. - Takes the podcast id to update with optional description and expires parameters. - - INPUTS - * filter_id = (integer) $podcast_id - * feed = (string) feed url (xml!) //optional - * title = (string) title string //optional - * website = (string) source website url //optional - * description = (string) //optional - * generator = (string) //optional - * copyright_str = (string) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'podcast_edit', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'feed': feed, - 'title': title, - 'website': website, - 'description': description, - 'generator': generator, - 'copyright': copyright_str} - if not feed: - data.pop('feed') - if not title: - data.pop('title') - if not website: - data.pop('website') - if not description: - data.pop('description') - if not generator: - data.pop('generator') - if not copyright: - data.pop('copyright') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'podcast_edit') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def podcast_delete(self, filter_id: int): - """ podcast_delete - MINIMUM_API_VERSION=420000 - - Delete an existing podcast. - - INPUTS - * filter_id = (integer) UID of podcast to delete - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'podcast_delete', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'podcast_delete') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def podcast_episodes(self, filter_id: int, offset=0, limit=0): - """ podcast_episodes - MINIMUM_API_VERSION=420000 - - INPUTS - * filter_id = (string) UID of podcast - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'podcast_episodes', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'podcast_episodes') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def podcast_episode(self, filter_id: int): - """ podcast_episode - MINIMUM_API_VERSION=420000 - - Return podcast_episodes by UID - - INPUTS - * filter_id = (integer) UID of Podcast - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'podcast_episode', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'podcast_episode') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def podcast_episode_delete(self, filter_id: int): - """ podcast_episode_delete - MINIMUM_API_VERSION=420000 - - Delete an existing podcast_episode. - - INPUTS - * filter_id = (integer) UID of podcast_episode to delete - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'podcast_episode_delete', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'podcast_episode') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def update_podcast(self, filter_id: int): - """ update_podcast - MINIMUM_API_VERSION=420000 - - Sync and download new podcast episodes - - INPUTS - * filter_id = (integer) UID of Podcast - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'update_podcast', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'update_podcast') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def search_songs(self, filter_str, offset=0, limit=0): - """ search_songs - MINIMUM_API_VERSION=380001 - - This searches the songs and returns... songs - - INPUTS - * filter_str = (string) search the name of a song - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'search_songs', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'search_songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def advanced_search(self, rules, - operator='and', object_type='song', offset=0, limit=0, random=0): - """ advanced_search - MINIMUM_API_VERSION=380001 - - Perform an advanced search given passed rules - the rules can occur multiple times and are joined by the operator item. - - Refer to the wiki for further information - http://ampache.org/api/api-advanced-search - - INPUTS - * rules = (array) = [[rule_1,rule_1_operator,rule_1_input], [rule_2,rule_2_operator,rule_2_input], [etc]] - * operator = (string) 'and'|'or' (whether to match one rule or all) //optional - * object_type = (string) //optional - * offset = (integer) //optional - * limit = (integer) //optional - * random = (integer) 0|1' //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'advanced_search', - 'auth': self.AMPACHE_SESSION, - 'operator': operator, - 'type': object_type, - 'offset': offset, - 'limit': limit, - 'random': random} - count = 0 - # inputs [rule_1, rule_1_operator, rule_1_input] - # example ['year', 2, 1999] - for item in rules: - count = count + 1 - data['rule_' + str(count)] = item[0] - data['rule_' + str(count) + '_operator'] = item[1] - data['rule_' + str(count) + '_input'] = item[2] - if item[0] == 'metadata': - data['rule_' + str(count) + '_subtype'] = item[3] - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'advanced_search') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def videos(self, filter_str: str = False, - exact: int = False, offset=0, limit=0): - """ videos - MINIMUM_API_VERSION=380001 - - This returns video objects! - - INPUTS - * filter_str = (string) search the name of a video //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'videos', - 'auth': self.AMPACHE_SESSION, - 'exact': exact, - 'filter': filter_str, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not exact: - data.pop('exact') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'videos') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def video(self, filter_id: int): - """ video - MINIMUM_API_VERSION=380001 - - This returns a single video - - INPUTS - * filter_id = (integer) $video_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'video', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'video') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def localplay(self, command, oid=False, otype=False, clear=0): - """ localplay - MINIMUM_API_VERSION=380001 - CHANGED_IN_API_VERSION=5.0.0 - - This is for controlling localplay - - INPUTS - * command = (string) 'next', 'prev', 'stop', 'play', 'pause', 'add', 'volume_up', - 'volume_down', 'volume_mute', 'delete_all', 'skip', 'status' - * oid = (integer) object_id //optional - * otype = (string) 'Song', 'Video', 'Podcast_Episode', 'Channel', - 'Broadcast', 'Democratic', 'Live_Stream' //optional - * clear = (integer) 0,1 Clear the current playlist before adding //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'localplay', - 'auth': self.AMPACHE_SESSION, - 'command': command, - 'oid': oid, - 'type': otype, - 'clear': clear} - if not oid: - data.pop('oid') - if not type: - data.pop('type') - if not clear: - data.pop('clear') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'localplay') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def localplay_songs(self): - """ localplay_songs - MINIMUM_API_VERSION=5.0.0 - - Get the list of songs in your localplay playlist - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'localplay_songs', - 'auth': self.AMPACHE_SESSION} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'localplay_songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def democratic(self, method, oid): - """ democratic - MINIMUM_API_VERSION=380001 - - This is for controlling democratic play - - INPUTS - * oid = (integer) object_id (song_id|playlist_id) - * method = (string) 'vote'|'devote'|'playlist'|'play' - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'democratic', - 'auth': self.AMPACHE_SESSION, - 'oid': oid, - 'method': method} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'democratic') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def stats(self, object_type, filter_str='random', - username=False, user_id=False, offset=0, limit=0): - """ stats - MINIMUM_API_VERSION=380001 - CHANGED_IN_API_VERSION=400001 - - This gets library stats for different object types. When filter is null get some random items instead - - INPUTS - * object_type = (string) 'song'|'album'|'artist' - * filter_str = (string) 'newest'|'highest'|'frequent'|'recent'|'flagged'|'random' - * offset = (integer) //optional - * limit = (integer) //optional - * user_id = (integer) //optional - * username = (string) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'stats', - 'auth': self.AMPACHE_SESSION, - 'type': object_type, - 'filter': filter_str, - 'offset': offset, - 'limit': limit, - 'user_id': user_id, - 'username': username} - if not username: - data.pop('username') - if not user_id: - data.pop('user_id') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'stats') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def users(self): - """ users - MINIMUM_API_VERSION=5.0.0 - - Get ids and usernames for your site users - - INPUTS - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'users', - 'auth': self.AMPACHE_SESSION} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'user') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def user(self, username): - """ user - MINIMUM_API_VERSION=380001 - - This get an user public information - - INPUTS - * username = - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'user', - 'auth': self.AMPACHE_SESSION, - 'username': username} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'user') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def followers(self, username): - """ followers - MINIMUM_API_VERSION=380001 - - This get an user followers - - INPUTS - * username = - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'followers', - 'auth': self.AMPACHE_SESSION, - 'username': username} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'followers') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def following(self, username): - """ following - MINIMUM_API_VERSION=380001 - - This get the user list followed by an user - - INPUTS - * username = - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'following', - 'auth': self.AMPACHE_SESSION, - 'username': username} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'following') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def toggle_follow(self, username): - """ toggle_follow - MINIMUM_API_VERSION=380001 - - This follow/unfollow an user - - INPUTS - * username = - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'toggle_follow', - 'auth': self.AMPACHE_SESSION, - 'username': username} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'toggle_follow') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def last_shouts(self, username, limit=0): - """ last_shouts - MINIMUM_API_VERSION=380001 - - This get the latest posted shouts - - INPUTS - * username = - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'last_shouts', - 'auth': self.AMPACHE_SESSION, - 'username': username, - 'limit': limit} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'last_shouts') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def rate(self, object_type, object_id, rating): - """ rate - MINIMUM_API_VERSION=380001 - - This rates a library item - - INPUTS - * object_type = (string) 'song'|'album'|'artist' - * object_id = (integer) $object_id - * rating = (integer) 0|1|2|3|4|5 - """ - if (rating < 0 or rating > 5) or not (object_type == 'song' or object_type == 'album' or object_type == 'artist'): - return False - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'rate', - 'auth': self.AMPACHE_SESSION, - 'type': object_type, - 'id': object_id, - 'rating': rating} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'rate') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def flag(self, object_type, object_id, flagbool): - """ flag - MINIMUM_API_VERSION=400001 - - This flags a library item as a favorite - - Setting flagbool to true (1) will set the flag - Setting flagbool to false (0) will remove the flag - - INPUTS - * object_type = (string) 'song'|'album'|'artist' - * object_id = (integer) $object_id - * flagbool = (boolean|integer) (True,False | 0|1) - """ - if bool(flagbool): - flag_state = 1 - else: - flag_state = 0 - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'flag', - 'auth': self.AMPACHE_SESSION, - 'type': object_type, - 'id': object_id, - 'flag': flag_state} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'flag') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def record_play(self, object_id, user_id, client='AmpacheAPI'): - """ record_play - MINIMUM_API_VERSION=400001 - - Take a song_id and update the object_count and user_activity table with a play. - This allows other sources to record play history to ampache - - INPUTS - * object_id = (integer) $object_id - * user_id = (integer) $user_id - * client = (string) $agent //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'record_play', - 'auth': self.AMPACHE_SESSION, - 'id': object_id, - 'user': user_id, - 'client': client} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'record_play') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def scrobble(self, title, artist_name, album_name, - mbtitle=False, mbartist=False, mbalbum=False, stime=False, - client='AmpacheAPI'): - """ scrobble - MINIMUM_API_VERSION=400001 - - Search for a song using text info and then record a play if found. - This allows other sources to record play history to ampache - - INPUTS - * title = (string) song title - * artist_name = (string) artist name - * album_name = (string) album name - * mbtitle = (string) song mbid //optional - * mbartist = (string) artist mbid //optional - * mbalbum = (string) album mbid //optional - * stime = (integer) UNIXTIME() //optional - * client = (string) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'scrobble', - 'auth': self.AMPACHE_SESSION, - 'client': client, - 'date': str(stime), - 'song': title, - 'artist': artist_name, - 'album': album_name, - 'songmbid': mbtitle, - 'albummbid': mbalbum, - 'artistmdib': mbartist} - if not mbtitle: - data.pop('songmbid') - if not mbalbum: - data.pop('albummbid') - if not mbartist: - data.pop('artistmdib') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'scrobble') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def timeline(self, username, limit=0, since=0): - """ timeline - MINIMUM_API_VERSION=380001 - - This get a user timeline - - INPUTS - * username = (string) - * limit = (integer) //optional - * since = (integer) UNIXTIME() //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'timeline', - 'auth': self.AMPACHE_SESSION, - 'username': username, - 'limit': limit, - 'since': since} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'timeline') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def friends_timeline(self, limit=0, since=0): - """ friends_timeline - MINIMUM_API_VERSION=380001 - - This get current user friends timeline - - INPUTS - * limit = (integer) //optional - * since = (integer) UNIXTIME() //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'friends_timeline', - 'auth': self.AMPACHE_SESSION, - 'limit': limit, - 'since': since} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'friends_timeline') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def update_from_tags(self, ampache_type, ampache_id): - """ update_from_tags - MINIMUM_API_VERSION=400001 - - updates a single album,artist,song from the tag data - - INPUTS - * object_type = (string) 'artist'|'album'|'song' - * object_id = (integer) $artist_id, $album_id, $song_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'update_from_tags', - 'auth': self.AMPACHE_SESSION, - 'type': ampache_type, - 'id': ampache_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'update_from_tags') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def update_art(self, ampache_type, ampache_id, overwrite=False): - """ update_art - MINIMUM_API_VERSION=400001 - - updates a single album, artist, song looking for art files - Doesn't overwrite existing art by default. - - INPUTS - * object_type = (string) 'artist'|'album'|'song' - * object_id = (integer) $artist_id, $album_id, $song_id - * overwrite = (boolean|integer) (True,False | 0|1) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(overwrite): - overwrite = 1 - else: - overwrite = 0 - data = {'action': 'update_art', - 'auth': self.AMPACHE_SESSION, - 'type': ampache_type, - 'id': ampache_id, - 'overwrite': overwrite} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'update_art') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def update_artist_info(self, object_id): - """ update_artist_info - MINIMUM_API_VERSION=400001 - - Update artist information and fetch similar artists from last.fm - Make sure lastfm_api_key is set in your configuration file - - INPUTS - * object_id = (integer) $artist_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'update_artist_info', - 'auth': self.AMPACHE_SESSION, - 'id': object_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'update_artist_info') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def stream(self, object_id, object_type, destination): - """ stream - MINIMUM_API_VERSION=400001 - - stream a song or podcast episode - - INPUTS - * object_id = (string) $song_id / $podcast_episode_id - * object_type = (string) 'song'|'podcast' - * destination = (string) full file path - """ - if not os.path.isdir(os.path.dirname(destination)): - return False - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'stream', - 'auth': self.AMPACHE_SESSION, - 'id': object_id, - 'type': object_type} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - result = requests.get(full_url, allow_redirects=True) - open(destination, 'wb').write(result.content) - return True - - def download(self, object_id, object_type, destination, - transcode='raw'): - """ download - MINIMUM_API_VERSION=400001 - - download a song or podcast episode - - INPUTS - * object_id = (string) $song_id / $podcast_episode_id - * object_type = (string) 'song'|'podcast' - * destination = (string) full file path - * transcode = (string) 'mp3', 'ogg', etc. ('raw' / original by default) //optional - """ - os.makedirs(os.path.dirname(destination), exist_ok=True) - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'download', - 'auth': self.AMPACHE_SESSION, - 'id': object_id, - 'type': object_type, - 'format': transcode} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - result = requests.get(full_url, allow_redirects=True) - open(destination, 'wb').write(result.content) - return True - - def get_art(self, object_id, object_type, destination): - """ get_art - MINIMUM_API_VERSION=400001 - - get the binary art for an item - - INPUTS - * object_id = (string) $song_id / $podcast_episode_id - * object_type = (string) 'song', 'artist', 'album', 'playlist', 'search', 'podcast' - * destination = (string) output file path - """ - if not os.path.isdir(os.path.dirname(destination)): - return False - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'get_art', - 'auth': self.AMPACHE_SESSION, - 'id': object_id, - 'type': object_type} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - result = requests.get(full_url, allow_redirects=True) - open(destination, 'wb').write(result.content) - return True - - def user_create(self, username: str, password: str, email: str, - fullname: str = False, disable=False): - """ user_create - MINIMUM_API_VERSION=400001 - - Create a new user. (Requires the username, password and email.) @param array $input - - INPUTS - * username = (string) $username - * password = (string) hash('sha256', $password)) - * email = (string) 'user@gmail.com' - * fullname = (string) //optional - * disable = (boolean|integer) (True,False | 0|1) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(disable): - disable = 1 - else: - disable = 0 - if hashlib.sha256(password.encode()).hexdigest() != password: - password = hashlib.sha256(password.encode()).hexdigest() - data = {'action': 'user_create', - 'auth': self.AMPACHE_SESSION, - 'username': username, - 'password': password, - 'email': email, - 'fullname': fullname, - 'disable': disable} - if not fullname: - data.pop('fullname') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'user_create') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def user_update(self, username, password=False, fullname=False, email=False, - website=False, state=False, city=False, disable=False, maxbitrate=False): - """ user_update - MINIMUM_API_VERSION=400001 - - Update an existing user. @param array $input - - INPUTS - * username = (string) $username - * password = (string) hash('sha256', $password)) //optional - * fullname = (string) //optional - * email = (string) 'user@gmail.com' //optional - * website = (string) //optional - * state = (string) //optional - * city = (string) //optional - * disable = (boolean|integer) (True,False | 0|1) //optional - * maxbitrate = (string) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - if bool(disable): - disable = 1 - else: - disable = 0 - data = {'action': 'user_update', - 'auth': self.AMPACHE_SESSION, - 'username': username, - 'password': password, - 'fullname': fullname, - 'email': email, - 'website': website, - 'state': state, - 'city': city, - 'disable': disable, - 'maxbitrate': maxbitrate} - if not password: - data.pop('password') - if not fullname: - data.pop('fullname') - if not email: - data.pop('email') - if not website: - data.pop('website') - if not state: - data.pop('state') - if not city: - data.pop('city') - if not maxbitrate: - data.pop('maxbitrate') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'user_update') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def user_delete(self, username): - """ user_delete - MINIMUM_API_VERSION=400001 - - Delete an existing user. @param array $input - - INPUTS - * username = (string) $username - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'user_delete', - 'auth': self.AMPACHE_SESSION, - 'username': username} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'user_delete') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def user_preferences(self): - """ user_preferences - MINIMUM_API_VERSION=5.0.0 - - Returns user_preferences - - INPUTS - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'user_preferences', - 'auth': self.AMPACHE_SESSION} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'user_preferences') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def user_preference(self, filter_str): - """ user_preference - MINIMUM_API_VERSION=5.0.0 - - Returns preference based on the specified filter_str - - INPUTS - * filter_str = (string) search the name of a preference //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'user_preferences', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'user_preferences') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def system_preferences(self): - """ system_preferences - MINIMUM_API_VERSION=5.0.0 - - Returns system_preferences - - INPUTS - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'system_preferences', - 'auth': self.AMPACHE_SESSION} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'system_preferences') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def system_preference(self, filter_str): - """ system_preference - MINIMUM_API_VERSION=5.0.0 - - Returns preference based on the specified filter_str - - INPUTS - * filter_str = (string) search the name of a preference //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'system_preferences', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'system_preferences') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def system_update(self): - """ system_update - MINIMUM_API_VERSION=5.0.0 - - update ampache - - INPUTS - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'system_update', - 'auth': self.AMPACHE_SESSION} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'system_update') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def preference_create(self, filter_str, type_str, default, category, - description=False, subcategory=False, level=100): - """ preference_create - MINIMUM_API_VERSION=5.0.0 - - Returns preference based on the specified filter_str - - INPUTS - * filter_str = (string) search the name of a preference - * type_str = (string) 'boolean', 'integer', 'string', 'special' - * default = (string|integer) default value - * category = (string) 'interface', 'internal', 'options', 'playlist', 'plugins', 'streaming', 'system' - * description = (string) description of preference //optional - * subcategory = (string) $subcategory //optional - * level = (integer) access level required to change the value (default 100) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'preference_create', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str, - 'type': type_str, - 'default': default, - 'category': category, - 'description': description, - 'subcategory': subcategory, - 'level': level} - if not description: - data.pop('description') - if not subcategory: - data.pop('subcategory') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'preference_create') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def preference_edit(self, filter_str, value, apply_all=0): - """ preference_edit - MINIMUM_API_VERSION=5.0.0 - - Returns preference based on the specified filter_str - - INPUTS - * filter_str = (string) search the name of a preference - * value = (string|integer) Preference value - * apply_all = (boolean) apply to all users //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'preference_edit', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str, - 'value': value, - 'all': apply_all} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'preference_edit') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def preference_delete(self, filter_str): - """ preference_delete - MINIMUM_API_VERSION=5.0.0 - - Returns preference based on the specified filter_str - - INPUTS - * filter_str = (string) search the name of a preference - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'preference_delete', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_str} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'preference_delete') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def licenses(self, filter_str: str = False, exact: int = False, - add: int = False, update: int = False, offset=0, limit=0): - """ licenses - MINIMUM_API_VERSION=420000 - - Returns licenses based on the specified filter_str - - INPUTS - * filter_str = (string) search the name of a license //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * add = (integer) UNIXTIME() //optional - * update = (integer) UNIXTIME() //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'licenses', - 'auth': self.AMPACHE_SESSION, - 'exact': exact, - 'add': add, - 'update': update, - 'filter': filter_str, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not exact: - data.pop('exact') - if not add: - data.pop('add') - if not update: - data.pop('update') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'licenses') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def license(self, filter_id: int): - """ license - MINIMUM_API_VERSION=420000 - - returns a single license - - INPUTS - * filter_id = (integer) $license_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'license', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'license') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def license_songs(self, filter_id: int): - """ license_songs - MINIMUM_API_VERSION=420000 - - returns a songs for a single license ID - - INPUTS - * filter_id = (integer) $license_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'license_songs', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'license_songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def labels(self, filter_str: str = False, exact: int = False, - offset=0, limit=0): - """ labels - MINIMUM_API_VERSION=420000 - - Returns labels based on the specified filter_str - - INPUTS - * filter_str = (string) search the name of a label //optional - * exact = (integer) 0,1, if true filter is exact rather then fuzzy //optional - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'labels', - 'auth': self.AMPACHE_SESSION, - 'exact': exact, - 'filter': filter_str, - 'offset': str(offset), - 'limit': str(limit)} - if not filter_str: - data.pop('filter') - if not exact: - data.pop('exact') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'labels') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def label(self, filter_id: int): - """ label - MINIMUM_API_VERSION=420000 - - returns a single label - - INPUTS - * filter_id = (integer) $label_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'label', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'label') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def label_artists(self, filter_id: int): - """ label_artists - MINIMUM_API_VERSION=420000 - - returns a artists for a single label ID - - INPUTS - * filter_id = (integer) $label_id - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'label_artists', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'label_artists') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def get_bookmark(self, filter_id: str, object_type: str): - """ get_bookmark - MINIMUM_API_VERSION=5.0.0 - - Get the bookmark from it's object_id and object_type. - - INPUTS - * filter_id = (integer) object_id - * object_type = (string) object_type ('song', 'video', 'podcast_episode') - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'get_bookmark', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'type': object_type} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'get_bookmark') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def bookmarks(self): - """ bookmarks - MINIMUM_API_VERSION=5.0.0 - - Get information about bookmarked media this user is allowed to manage. - - INPUTS - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'bookmarks', - 'auth': self.AMPACHE_SESSION} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'bookmarks') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def bookmark_create(self, filter_id, object_type, - position: int = 0, client: str = 'AmpacheAPI', date=False): - """ bookmark_create - MINIMUM_API_VERSION=5.0.0 - - Create a placeholder for the current media that you can return to later. - - INPUTS - * filter_id = (integer) object_id - * object_type = (string) object_type ('song', 'video', 'podcast_episode') - * position = (integer) current track time in seconds - * client = (string) Agent string. (Default: 'AmpacheAPI') //optional - * date = (integer) update time (Default: UNIXTIME()) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'bookmark_create', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'type': object_type, - 'position': position, - 'client': client, - 'date': date} - if not client: - data.pop('client') - if not date: - data.pop('date') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'bookmark_create') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def bookmark_edit(self, filter_id, object_type, - position: int = 0, client: str = 'AmpacheAPI', date=False): - """ bookmark_edit - MINIMUM_API_VERSION=5.0.0 - - Edit a placeholder for the current media that you can return to later. - - INPUTS - * filter_id = (integer) object_id - * object_type = (string) object_type ('song', 'video', 'podcast_episode') - * position = (integer) current track time in seconds - * client = (string) Agent string. (Default: 'AmpacheAPI') //optional - * date = (integer) update time (Default: UNIXTIME()) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'bookmark_edit', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'type': object_type, - 'position': position, - 'client': client, - 'date': date} - if not client: - data.pop('client') - if not date: - data.pop('date') - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'bookmark_edit') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def bookmark_delete(self, filter_id: int, object_type=False): - """ bookmark_delete - MINIMUM_API_VERSION=5.0.0 - - Delete an existing bookmark. (if it exists) - - INPUTS - * filter_id = (integer) object_id - * object_type = (string) object_type ('song', 'video', 'podcast_episode') - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'bookmark_delete', - 'auth': self.AMPACHE_SESSION, - 'filter': filter_id, - 'type': object_type} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'bookmark_delete') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def deleted_songs(self, offset=0, limit=0): - """ deleted_songs - MINIMUM_API_VERSION=500000 - - Returns deleted_song - - INPUTS - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'deleted_songs', - 'auth': self.AMPACHE_SESSION, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'deleted_songs') - if not ampache_response: - return False - return self.return_data(ampache_response) - - def deleted_podcast_episodes(self, offset=0, limit=0): - """ deleted_podcast_episodes - MINIMUM_API_VERSION=500000 - - Returns deleted_podcast_episode - - INPUTS - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'deleted_podcast_episodes', - 'auth': self.AMPACHE_SESSION, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'deleted_podcast_episodes') - if not ampache_response: - return False - return self.return_data(ampache_response) - - - def deleted_videos(self, offset=0, limit=0): - """ deleted_videos - MINIMUM_API_VERSION=500000 - - Returns deleted_video - - INPUTS - * offset = (integer) //optional - * limit = (integer) //optional - """ - ampache_url = self.AMPACHE_URL + '/server/' + self.AMPACHE_API + '.server.php' - data = {'action': 'deleted_videos', - 'auth': self.AMPACHE_SESSION, - 'offset': str(offset), - 'limit': str(limit)} - data = urllib.parse.urlencode(data) - full_url = ampache_url + '?' + data - ampache_response = self.fetch_url(full_url, self.AMPACHE_API, 'deleted_videos') - if not ampache_response: - return False - return self.return_data(ampache_response) - - """ - -------------------- - BACKCOMPAT FUNCTIONS - -------------------- - """ - tag = genre - tags = genres - tag_artists = genre_artists - tag_albums = genre_albums - tag_songs = genre_songs + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) + * name = + * object_type = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'playlist_edit', + 'auth': ampache_api, + 'filter': filter_str, + 'name': name, + 'type': object_type} + if not name: + data.pop('name') + if not object_type: + data.pop('type') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlist_edit') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def playlist_delete(ampache_url, ampache_api, filter_str, api_format='xml'): + """ playlist_delete + MINIMUM_API_VERSION=380001 + + This deletes a playlist + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) $playlist_id + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'playlist_delete', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlist_delete') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def playlist_add_song(ampache_url, ampache_api, filter_str, song, check=False, api_format='xml'): + """ playlist_add_song + MINIMUM_API_VERSION=380001 + CHANGED_IN_API_VERSION=400003 + + This adds a song to a playlist. + Added duplicate checks in 400003 + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) $playlist_id + * song = (integer) $song_id + * check = (boolean|integer) (True,False | 0|1) Check for duplicates //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + if bool(check): + check = 1 + else: + check = 0 + data = {'action': 'playlist_add_song', + 'auth': ampache_api, + 'song': song, + 'filter': filter_str, + 'check': check} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlist_add_song') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def playlist_remove_song(ampache_url, ampache_api, filter_str, song=False, track=False, api_format='xml'): + """ playlist_remove_song + MINIMUM_API_VERSION=380001 + CHANGED_IN_API_VERSION=400001 + + This removes a song from a playlist. Previous versions required 'track' instead of 'song'. + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) $playlist_id + * song = (integer) $song_id //optional + * track = (integer) $playlist_track number //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + + data = {'action': 'playlist_remove_song', + 'auth': ampache_api, + 'filter': filter_str, + 'song': song, + 'track': track} + if not song: + data.pop('song') + if not track: + data.pop('track') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlist_remove_song') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def playlist_generate(ampache_url, ampache_api, mode='random', + filter_str=False, album=False, artist=False, flag=False, + list_format='song', offset=0, limit=0, api_format='xml'): + """ playlist_generate + MINIMUM_API_VERSION=400001 + CHANGED_IN_API_VERSION=400002 + + Get a list of song XML, indexes or id's based on some simple search criteria = + 'recent' will search for tracks played after 'Popular Threshold' days + 'forgotten' will search for tracks played before 'Popular Threshold' days + 'unplayed' added in 400002 for searching unplayed tracks + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * mode = (string) 'recent', 'forgotten', 'unplayed', 'random' (default = 'random') //optional + * filter_str = (string) string LIKE matched to song title //optional + * album = (integer) $album_id //optional + * artist = (integer) $artist_id //optional + * flag = (integer) get flagged songs only 0, 1 (default=0) //optional + * list_format = (string) 'song', 'index','id' (default = 'song') //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'playlist_generate', + 'auth': ampache_api, + 'mode': mode, + 'filter': filter_str, + 'album': album, + 'artist': artist, + 'flag': flag, + 'format': list_format, + 'offset': offset, + 'limit': limit} + if not filter_str: + data.pop('filter') + if not album: + data.pop('album') + if not artist: + data.pop('artist') + if not flag: + data.pop('flag') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'playlist_generate') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def shares(ampache_url, ampache_api, filter_str=False, exact=False, offset=0, limit=0, api_format='xml'): + """ shares + MINIMUM_API_VERSION=420000 + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'shares', + 'auth': ampache_api, + 'filter': filter_str, + 'exact': exact, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not exact: + data.pop('exact') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'shares') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def share(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ share + MINIMUM_API_VERSION=420000 + + Return shares by UID + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of Share + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'share', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'share') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def share_create(ampache_url, ampache_api, filter_str, object_type, + description=False, expires=False, api_format='xml'): + """ share_create + MINIMUM_API_VERSION=420000 + + Create a public url that can be used by anyone to stream media. + Takes the file id with optional description and expires parameters. + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (string) object_id + * object_type = (string) object_type + * description = (string) description (will be filled for you if empty) //optional + * expires = (integer) days to keep active //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'share_create', + 'auth': ampache_api, + 'filter': filter_str, + 'type': object_type, + 'description': description, + 'expires': expires} + if not description: + data.pop('description') + if not expires: + data.pop('expires') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'share_create') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + try: + token = tree.find('share').text + except AttributeError: + token = False + if token: + return tree + try: + token = tree.find('error').text + except AttributeError: + token = False + return token + + +def share_edit(ampache_url, ampache_api, filter_str, stream=False, download=False, + expires=False, description=False, api_format='xml'): + """ share_edit + MINIMUM_API_VERSION=420000 + + Update the description and/or expiration date for an existing share. + Takes the share id to update with optional description and expires parameters. + + INPUT + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of Share + * stream = (boolean) 0,1 // optional + * download = (boolean) 0,1 // optional + * expires = (integer) number of whole days before expiry // optional + * description = (string) update description // optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'share_edit', + 'auth': ampache_api, + 'filter': filter_str, + 'stream': stream, + 'download': download, + 'expires': expires, + 'description': description} + if not stream: + data.pop('name') + if not download: + data.pop('download') + if not expires: + data.pop('expires') + if not description: + data.pop('description') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'share_edit') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def share_delete(ampache_url, ampache_api, filter_str, api_format='xml'): + """ share_delete + MINIMUM_API_VERSION=420000 + + Delete an existing share. + + INPUT + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of Share to delete + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'share_delete', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'share_delete') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def catalogs(ampache_url, ampache_api, filter_str=False, offset=0, limit=0, api_format='xml'): + """ catalogs + MINIMUM_API_VERSION=420000 + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'catalogs', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'catalogs') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def catalog(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ catalog + MINIMUM_API_VERSION=420000 + + Return catalogs by UID + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of catalog + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'catalog', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'catalog') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def catalog_action(ampache_url, ampache_api, task, catalog, api_format='xml'): + """ catalog_action + MINIMUM_API_VERSION=400001 + + Kick off a catalog update or clean for the selected catalog + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * task = (string) 'add_to_catalog'|'clean_catalog'|'verify_catalog'|'gather_art' + * catalog = (integer) $catalog_id + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'catalog_action', + 'auth': ampache_api, + 'task': task, + 'catalog': catalog} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'catalog_action') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def catalog_file(ampache_url, ampache_api, file, task, catalog, api_format='xml'): + """ catalog_file + MINIMUM_API_VERSION=420000 + + Perform actions on local catalog files. + Single file versions of catalog add, clean and verify. + Make sure you remember to urlencode those file names! + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * file = (string) urlencode(FULL path to local file) + * task = (string) 'add'|'clean'|'verify'|'remove' + * catalog = (integer) $catalog_id + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'catalog_file', + 'auth': ampache_api, + 'file': file, + 'task': task, + 'catalog': catalog} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'catalog_action') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def podcasts(ampache_url, ampache_api, filter_str=False, exact=False, offset=0, limit=0, api_format='xml'): + """ podcasts + MINIMUM_API_VERSION=420000 + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'podcasts', + 'auth': ampache_api, + 'filter': filter_str, + 'exact': exact, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not exact: + data.pop('exact') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'podcasts') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def podcast(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ podcast + MINIMUM_API_VERSION=420000 + + Return podcasts by UID + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of Podcast + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'podcast', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'podcast') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def podcast_create(ampache_url, ampache_api, url, catalog, api_format='xml'): + """ podcast_create + MINIMUM_API_VERSION=420000 + + Return podcasts by UID + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * url = (string) rss url for podcast + * catalog = (string) podcast catalog + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'podcast_create', + 'auth': ampache_api, + 'url': url, + 'catalog': catalog} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'podcast') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def podcast_edit(ampache_url, ampache_api, filter_str, stream, download, expires, description, api_format='xml'): + """ podcast_edit + MINIMUM_API_VERSION=420000 + + Update the description and/or expiration date for an existing podcast. + Takes the podcast id to update with optional description and expires parameters. + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (string) Alpha-numeric search term //optional + * stream = (boolean) 0,1 // optional + * download = (boolean) 0,1 // optional + * expires = (integer) number of whole days before expiry // optional + * description = (string) update description // optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'podcast_edit', + 'auth': ampache_api, + 'filter': filter_str, + 'stream': stream, + 'download': download, + 'expires': expires, + 'description': description} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'podcast') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def podcast_delete(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ podcast_delete + MINIMUM_API_VERSION=420000 + + Delete an existing podcast. + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of podcast to delete + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'podcast_delete', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'podcast') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def podcast_episodes(ampache_url, ampache_api, filter_str=False, exact=False, offset=0, limit=0, api_format='xml'): + """ podcast_episodes + MINIMUM_API_VERSION=420000 + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'podcast_episodes', + 'auth': ampache_api, + 'filter': filter_str, + 'exact': exact, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not exact: + data.pop('exact') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'podcast_episodes') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def podcast_episode(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ podcast_episode + MINIMUM_API_VERSION=420000 + + Return podcast_episodes by UID + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of Podcast + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'podcast_episode', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'podcast_episode') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def podcast_episode_delete(ampache_url, ampache_api, filter_str, api_format='xml'): + """ podcast_episode_delete + MINIMUM_API_VERSION=420000 + + Delete an existing podcast_episode. + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of podcast_episode to delete + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'podcast_episode_delete', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'podcast_episode') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def update_podcast(ampache_url, ampache_api, filter_str, api_format='xml'): + """ update_podcast + MINIMUM_API_VERSION=420000 + + Sync and download new podcast episodes + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) UID of Podcast + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'update_podcast', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'update_podcast') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def search_songs(ampache_url, ampache_api, filter_str, offset=0, limit=0, api_format='xml'): + """ search_songs + MINIMUM_API_VERSION=380001 + + This searches the songs and returns... songs + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'search_songs', + 'auth': ampache_api, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'search_songs') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def advanced_search(ampache_url, ampache_api, rules, + operator='and', object_type='song', offset=0, limit=0, api_format='xml'): + """ advanced_search + MINIMUM_API_VERSION=380001 + + Perform an advanced search given passed rules + the rules can occur multiple times and are joined by the operator item. + + Refer to the wiki for further information + https://github.com/ampache/ampache/wiki/XML-methods + + rule_1 + * anywhere + * title + * favorite + * name + * playlist_name + * album + * artist + * composer + * comment + * label + * tag + * album_tag + * filename + * placeformed + * username + * year + * time + * rating + * myrating + * artistrating + * albumrating + * played_times + * bitrate + * image height + * image width + * yearformed + * played + * myplayed + * myplayedartist + * myplayedalbum + * last_play + * added + * updated + * catalog + * playlist + * licensing + * smartplaylist + * metadata + + rule_1_operator + * 0 contains / is greater than or equal to / before / is true / is / before (x) days ago + * 1 does not contain / is less than or equal to / after / is false / is not / after (x) days ago + * 2 starts with / is + * 3 ends with / is not + * 4 is / is greater than + * 5 is not / is less than + * 6 sounds like + * 7 does not sound like + + rule_1_input + * text + * integer + * etc + + rule_1_subtype + * integer code of metadata search items + * NEEDS EXTENSION IN PYTHON + API + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * rules = (array) = [[rule_1,rule_1_operator,rule_1_input], [rule_2,rule_2_operator,rule_2_input], [etc]] + * operator = (string) 'and'|'or' (whether to match one rule or all) //optional + * object_type = (string) //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'advanced_search', + 'auth': ampache_api, + 'operator': operator, + 'type': object_type, + 'offset': offset, + 'limit': limit} + count = 0 + # inputs [rule_1, rule_1_operator, rule_1_input] + # example ['year', 2, 1999] + for item in rules: + count = count + 1 + data['rule_' + str(count)] = item[0] + data['rule_' + str(count) + '_operator'] = item[1] + data['rule_' + str(count) + '_input'] = item[2] + if item[0] == 'metadata': + data['rule_' + str(count) + '_subtype'] = item[3] + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'advanced_search') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def videos(ampache_url, ampache_api, filter_str=False, exact=False, offset=0, limit=0, api_format='xml'): + """ videos + MINIMUM_API_VERSION=380001 + + This returns video objects! + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'videos', + 'auth': ampache_api, + 'exact': exact, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not exact: + data.pop('exact') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'videos') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def video(ampache_url, ampache_api, filter_str, api_format='xml'): + """ video + MINIMUM_API_VERSION=380001 + + This returns a single video + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = (integer) $video_id + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'video', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'video') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def localplay(ampache_url, ampache_api, command, api_format='xml'): + """ localplay + MINIMUM_API_VERSION=380001 + + This is for controlling localplay + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * command = (string) 'next', 'prev', 'stop', 'play' + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'localplay', + 'auth': ampache_api, + 'command': command} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'localplay') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def democratic(ampache_url, ampache_api, method, action, oid, api_format='xml'): + """ democratic + MINIMUM_API_VERSION=380001 + + This is for controlling democratic play + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * oid = (integer) object_id (song_id|playlist_id) + * method = (string) 'vote'|'devote'|'playlist'|'play' + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'democratic', + 'auth': ampache_api, + 'oid': oid, + 'method': method} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'democratic') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def stats(ampache_url, ampache_api, object_type, filter_str='random', + username=False, user_id=False, offset=0, limit=0, api_format='xml'): + """ stats + MINIMUM_API_VERSION=380001 + CHANGED_IN_API_VERSION=400001 + + This gets library stats for different object types. When filter is null get some random items instead + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_type = (string) 'song'|'album'|'artist' + * filter_str = (string) 'newest'|'highest'|'frequent'|'recent'|'flagged'|'random' + * offset = (integer) //optional + * limit = (integer) //optional + * user_id = (integer) //optional + * username = (string) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'stats', + 'auth': ampache_api, + 'type': object_type, + 'filter': filter_str, + 'offset': offset, + 'limit': limit, + 'user_id': user_id, + 'username': username} + if not username: + data.pop('username') + if not user_id: + data.pop('user_id') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'stats') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def user(ampache_url, ampache_api, username, api_format='xml'): + """ user + MINIMUM_API_VERSION=380001 + + This get an user public information + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'user', + 'auth': ampache_api, + 'username': username} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'user') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def followers(ampache_url, ampache_api, username, api_format='xml'): + """ followers + MINIMUM_API_VERSION=380001 + + This get an user followers + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'followers', + 'auth': ampache_api, + 'username': username} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'followers') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def following(ampache_url, ampache_api, username, api_format='xml'): + """ following + MINIMUM_API_VERSION=380001 + + This get the user list followed by an user + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'following', + 'auth': ampache_api, + 'username': username} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'following') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def toggle_follow(ampache_url, ampache_api, username, api_format='xml'): + """ toggle_follow + MINIMUM_API_VERSION=380001 + + This follow/unfollow an user + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'toggle_follow', + 'auth': ampache_api, + 'username': username} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'toggle_follow') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def last_shouts(ampache_url, ampache_api, username, limit=0, api_format='xml'): + """ last_shouts + MINIMUM_API_VERSION=380001 + + This get the latest posted shouts + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'last_shouts', + 'auth': ampache_api, + 'username': username, + 'limit': limit} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'last_shouts') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def rate(ampache_url, ampache_api, object_type, object_id, rating, api_format='xml'): + """ rate + MINIMUM_API_VERSION=380001 + + This rates a library item + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_type = (string) 'song'|'album'|'artist' + * object_id = (integer) $object_id + * rating = (integer) 0|1|2|3|4|5 + * api_format = (string) 'xml'|'json' //optional + """ + if (rating < 0 or rating > 5) or not (object_type == 'song' or object_type == 'album' or object_type == 'artist'): + return False + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'rate', + 'auth': ampache_api, + 'type': object_type, + 'id': object_id, + 'rating': rating} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'rate') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def flag(ampache_url, ampache_api, object_type, object_id, flag, api_format='xml'): + """ flag + MINIMUM_API_VERSION=400001 + + This flags a library item as a favorite + + Setting flag to true (1) will set the flag + Setting flag to false (0) will remove the flag + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_type = (string) 'song'|'album'|'artist' + * object_id = (integer) $object_id + * flag = (boolean|integer) (True,False | 0|1) + * api_format = (string) 'xml'|'json' //optional + """ + if bool(flag): + flag = 1 + else: + flag = 0 + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'flag', + 'auth': ampache_api, + 'type': object_type, + 'id': object_id, + 'flag': flag} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'flag') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def record_play(ampache_url, ampache_api, object_id, user, client='AmpacheAPI', api_format='xml'): + """ record_play + MINIMUM_API_VERSION=400001 + + Take a song_id and update the object_count and user_activity table with a play. + This allows other sources to record play history to ampache + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_id = (integer) $object_id + * user = (integer) $user_id + * client = (string) $agent //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'record_play', + 'auth': ampache_api, + 'id': object_id, + 'user': user, + 'client': client} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'record_play') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def scrobble(ampache_url, ampache_api, title, artist, album, + mbtitle=False, mbartist=False, mbalbum=False, time=False, + client='AmpacheAPI', api_format='xml'): + """ scrobble + MINIMUM_API_VERSION=400001 + + Search for a song using text info and then record a play if found. + This allows other sources to record play history to ampache + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * title = (string) + * artist = (string) + * album = (string) + * mbtitle = (string) //optional + * mbartist = (string) //optional + * mbalbum = (string) //optional + * time = (integer) UNIXTIME() //optional + * client = (string) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'scrobble', + 'auth': ampache_api, + 'client': client, + 'date': str(time), + 'song': title, + 'album': album, + 'artist': artist, + 'songmbid': mbtitle, + 'albummbid': mbalbum, + 'artistmdib': mbartist} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'scrobble') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def timeline(ampache_url, ampache_api, username, limit=0, since=0, api_format='xml'): + """ timeline + MINIMUM_API_VERSION=380001 + + This get a user timeline + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = (string) + * limit = (integer) //optional + * since = (integer) UNIXTIME() //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'timeline', + 'auth': ampache_api, + 'username': username, + 'limit': limit, + 'since': since} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'timeline') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def friends_timeline(ampache_url, ampache_api, limit=0, since=0, api_format='xml'): + """ friends_timeline + MINIMUM_API_VERSION=380001 + + This get current user friends timeline + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * limit = (integer) //optional + * since = (integer) UNIXTIME() //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'friends_timeline', + 'auth': ampache_api, + 'limit': limit, + 'since': since} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'friends_timeline') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def update_from_tags(ampache_url, ampache_api, ampache_type, ampache_id, api_format='xml'): + """ update_from_tags + MINIMUM_API_VERSION=400001 + + updates a single album,artist,song from the tag data + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_type = (string) 'artist'|'album'|'song' + * object_id = (integer) $artist_id, $album_id, $song_id + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'update_from_tags', + 'auth': ampache_api, + 'type': ampache_type, + 'id': ampache_id} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'update_from_tags') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def update_art(ampache_url, ampache_api, ampache_type, ampache_id, overwrite=False, api_format='xml'): + """ update_art + MINIMUM_API_VERSION=400001 + + updates a single album, artist, song looking for art files + Doesn't overwrite existing art by default. + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_type = (string) 'artist'|'album'|'song' + * object_id = (integer) $artist_id, $album_id, $song_id + * overwrite = (boolean|integer) (True,False | 0|1) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + if bool(overwrite): + overwrite = 1 + else: + overwrite = 0 + data = {'action': 'update_art', + 'auth': ampache_api, + 'type': ampache_type, + 'id': ampache_id, + 'overwrite': overwrite} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'update_art') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def update_artist_info(ampache_url, ampache_api, object_id, api_format='xml'): + """ update_artist_info + MINIMUM_API_VERSION=400001 + + Update artist information and fetch similar artists from last.fm + Make sure lastfm_api_key is set in your configuration file + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_id = (integer) $artist_id + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'update_artist_info', + 'auth': ampache_api, + 'id': object_id} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'update_artist_info') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def stream(ampache_url, ampache_api, object_id, object_type, destination, api_format='xml'): + """ stream + MINIMUM_API_VERSION=400001 + + stream a song or podcast episode + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_id = (string) $song_id / $podcast_episode_id + * object_type = (string) 'song'|'podcast' + * destination = (string) full file path + * api_format = (string) 'xml'|'json' //optional + """ + if not os.path.isdir(os.path.dirname(destination)): + return False + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'stream', + 'auth': ampache_api, + 'id': object_id, + 'type': object_type} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + result = requests.get(full_url, allow_redirects=True) + open(destination, 'wb').write(result.content) + return True + + +def download(ampache_url, ampache_api, object_id, object_type, destination, file_format='raw', api_format='xml'): + """ download + MINIMUM_API_VERSION=400001 + + download a song or podcast episode + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_id = (string) $song_id / $podcast_episode_id + * object_type = (string) 'song'|'podcast' + * destination = (string) full file path + * file_format = (string) 'mp3', 'ogg', etc. ('raw' / original by default) //optional + * api_format = (string) 'xml'|'json' //optional + """ + if not os.path.isdir(os.path.dirname(destination)): + return False + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'download', + 'auth': ampache_api, + 'id': object_id, + 'type': object_type, + 'format': file_format} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + result = requests.get(full_url, allow_redirects=True) + open(destination, 'wb').write(result.content) + return True + + +def get_art(ampache_url, ampache_api, object_id, object_type, destination, api_format='xml'): + """ get_art + MINIMUM_API_VERSION=400001 + + get the binary art for an item + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * object_id = (string) $song_id / $podcast_episode_id + * object_type = (string) 'song', 'artist', 'album', 'playlist', 'search', 'podcast' + * destination = (string) output file path + * api_format = (string) 'xml'|'json' //optional + """ + if not os.path.isdir(os.path.dirname(destination)): + return False + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'get_art', + 'auth': ampache_api, + 'id': object_id, + 'type': object_type} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + result = requests.get(full_url, allow_redirects=True) + open(destination, 'wb').write(result.content) + return True + + +def user_create(ampache_url, ampache_api, username, password, email, + fullname=False, disable=False, api_format='xml'): + """ user_create + MINIMUM_API_VERSION=400001 + + Create a new user. (Requires the username, password and email.) @param array $input + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = (string) $username + * password = (string) hash('sha256', $password)) + * email = (string) 'user@gmail.com' + * fullname = (string) //optional + * disable = (boolean|integer) (True,False | 0|1) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + if bool(disable): + disable = 1 + else: + disable = 0 + data = {'action': 'user_create', + 'auth': ampache_api, + 'username': username, + 'password': password, + 'email': email, + 'fullname': fullname, + 'disable': disable} + if not fullname: + data.pop('fullname') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'user_create') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def user_update(ampache_url, ampache_api, username, password=False, fullname=False, email=False, website=False, + state=False, city=False, disable=False, maxbitrate=False, api_format='xml'): + """ user_update + MINIMUM_API_VERSION=400001 + + Update an existing user. @param array $input + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = (string) $username + * password = (string) hash('sha256', $password)) //optional + * fullname = (string) //optional + * email = (string) 'user@gmail.com' //optional + * website = (string) //optional + * state = (string) //optional + * city = (string) //optional + * disable = (boolean|integer) (True,False | 0|1) //optional + * maxbitrate = (string) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + if bool(disable): + disable = 1 + else: + disable = 0 + data = {'action': 'user_update', + 'auth': ampache_api, + 'username': username, + 'password': password, + 'fullname': fullname, + 'email': email, + 'website': website, + 'state': state, + 'city': city, + 'disable': disable, + 'maxbitrate': maxbitrate} + if not password: + data.pop('password') + if not fullname: + data.pop('fullname') + if not email: + data.pop('email') + if not website: + data.pop('website') + if not state: + data.pop('state') + if not city: + data.pop('city') + if not maxbitrate: + data.pop('maxbitrate') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'user_update') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def user_delete(ampache_url, ampache_api, username, api_format='xml'): + """ user_delete + MINIMUM_API_VERSION=400001 + + Delete an existing user. @param array $input + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * username = (string) $username + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'user_delete', + 'auth': ampache_api, + 'username': username} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'user_delete') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def licenses(ampache_url, ampache_api, filter_str=False, exact=False, + add=False, update=False, offset=0, limit=0, api_format='xml'): + """ licenses + MINIMUM_API_VERSION=420000 + + Returns licenses based on the specified filter_str + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = //optional + * exact = (integer) 0|1 //optional + * add = //optional + * update = //optional + * offset = (integer) //optional + * limit = (integer) //optional + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'licenses', + 'auth': ampache_api, + 'exact': exact, + 'add': add, + 'update': update, + 'filter': filter_str, + 'offset': str(offset), + 'limit': str(limit)} + if not filter_str: + data.pop('filter') + if not exact: + data.pop('exact') + if not add: + data.pop('add') + if not update: + data.pop('update') + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'licenses') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def license(ampache_url, ampache_api, filter_str, api_format='xml'): + """ license + MINIMUM_API_VERSION=420000 + + returns a single license + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'license', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'license') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree + + +def license_songs(ampache_url, ampache_api, filter_str, api_format='xml'): + """ license_songs + MINIMUM_API_VERSION=420000 + + returns a songs for a single license ID + + INPUTS + * ampache_url = (string) + * ampache_api = (string) + * filter_str = + * api_format = (string) 'xml'|'json' //optional + """ + ampache_url = ampache_url + '/server/' + api_format + '.server.php' + data = {'action': 'license_songs', + 'auth': ampache_api, + 'filter': filter_str} + data = urllib.parse.urlencode(data) + full_url = ampache_url + '?' + data + ampache_response = fetch_url(full_url, api_format, 'license_songs') + if not ampache_response: + return False + # json format + if api_format == 'json': + json_data = json.loads(ampache_response.decode('utf-8')) + return json_data + # xml format + else: + try: + tree = ElementTree.fromstring(ampache_response.decode('utf-8')) + except ElementTree.ParseError: + return False + return tree