diff --git a/SubSonic.py b/SubSonic.py index 3195451..625536d 100644 --- a/SubSonic.py +++ b/SubSonic.py @@ -305,6 +305,23 @@ class SubpyConn: return playlists + def getPlaylist(self, playlist_id: str) -> list[Song]: + url = self.base_url + "/rest/getPlaylist?" + + payload = self._getBasePayload() + payload['f'] = 'json' + payload['id'] = playlist_id + + r = requests.get(url + self._encodePayload(payload)) + + json_r = r.json() + + songs: list[Song] = [] + for song in json_r['subsonic-response']['playlist']['entry']: + songs.append(Song(song)) + + return songs + def getStarred(self) -> list[Album | Song | Artist]: url = self.base_url + "/rest/getStarred?" diff --git a/main.py b/main.py index 1d30b39..866fa42 100644 --- a/main.py +++ b/main.py @@ -97,7 +97,10 @@ class SubPyPlayer: # for playlist in conn.getPlaylists(): # print(playlist.name, playlist.duration) -for song in conn.getStarredSongs(): +# for song in conn.getStarredSongs(): +# print(song.title) + +for song in conn.getPlaylist('9d76a86b-901f-4727-a2ec-01210157ff01'): print(song.title) # player.play_song(echidna_id) diff --git a/responses/playlist.json b/responses/playlist.json new file mode 100644 index 0000000..4d74593 --- /dev/null +++ b/responses/playlist.json @@ -0,0 +1,1691 @@ +{ + "subsonic-response": { + "status": "ok", + "version": "1.16.1", + "type": "navidrome", + "serverVersion": "0.54.3 (734eb30a)", + "openSubsonic": true, + "playlist": { + "id": "9d76a86b-901f-4727-a2ec-01210157ff01", + "name": "Maidcore", + "songCount": 43, + "duration": 11109, + "public": true, + "owner": "pseudo", + "created": "2025-01-08T16:32:46.021014672Z", + "changed": "2025-01-21T17:49:53.312033526Z", + "coverArt": "pl-9d76a86b-901f-4727-a2ec-01210157ff01_678fde41", + "entry": [ + { + "id": "2761150fb921c0225d2ecaece0abd776", + "parent": "47e9412a4c73816e0d8411fddf5ac071", + "isDir": false, + "title": "C13H16N2O2", + "album": "%NAME%", + "artist": "Madoi The Maid", + "track": 2, + "year": 2022, + "coverArt": "mf-2761150fb921c0225d2ecaece0abd776_677f0639", + "size": 44182000, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:38:20.530718668Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 220, + "bitRate": 1600, + "path": "/music/Madoi The Maid - %NAME%/Madoi The Maid - -NAME- - 02 C13H16N2O2.flac", + "playCount": 3, + "created": "2025-01-09T01:44:52.036351678Z", + "albumId": "47e9412a4c73816e0d8411fddf5ac071", + "artistId": "5cd6da7549d3b2f7d486e823403179d9", + "type": "music", + "isVideo": false, + "played": "2025-01-18T21:12:38.186840097Z", + "bpm": 0, + "comment": "Visit https://madoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "2b6ef4048117881e74cbaa6a88e6a7de", + "parent": "47e9412a4c73816e0d8411fddf5ac071", + "isDir": false, + "title": "IDK", + "album": "%NAME%", + "artist": "Madoi The Maid", + "track": 3, + "year": 2022, + "coverArt": "mf-2b6ef4048117881e74cbaa6a88e6a7de_677f067a", + "size": 35039136, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:38:21.449462956Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 176, + "bitRate": 1589, + "path": "/music/Madoi The Maid - %NAME%/Madoi The Maid - -NAME- - 03 IDK.flac", + "playCount": 4, + "created": "2025-01-09T01:44:52.036413937Z", + "albumId": "47e9412a4c73816e0d8411fddf5ac071", + "artistId": "5cd6da7549d3b2f7d486e823403179d9", + "type": "music", + "isVideo": false, + "played": "2025-01-22T17:30:25.733688541Z", + "bpm": 0, + "comment": "Visit https://madoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "e9ce5d9bdd2313d16e7864c2282a5a37", + "parent": "9c9ad2db5e9b3d744732412fd393488c", + "isDir": false, + "title": "Project Basement", + "album": "Cruelty Squad", + "artist": "Madoi The Maid", + "track": 4, + "year": 2024, + "coverArt": "mf-e9ce5d9bdd2313d16e7864c2282a5a37_677f0607", + "size": 21331642, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:38:49.330915007Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 154, + "bitRate": 1094, + "path": "/music/Madoi the Maid - [2024] Cruelty Squad/Madoi The Maid - Cruelty Squad - 04 Project Basement.flac", + "playCount": 1, + "created": "2025-01-09T01:53:52.189546857Z", + "albumId": "9c9ad2db5e9b3d744732412fd393488c", + "artistId": "5cd6da7549d3b2f7d486e823403179d9", + "type": "music", + "isVideo": false, + "played": "2025-01-22T17:33:02.237549166Z", + "bpm": 0, + "comment": "Visit https://madoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "dbf0a6558b762fabbcc45580d5623837", + "parent": "9c9ad2db5e9b3d744732412fd393488c", + "isDir": false, + "title": "Now Show me Your Smile :)", + "album": "Cruelty Squad", + "artist": "Madoi The Maid", + "track": 5, + "year": 2024, + "coverArt": "mf-dbf0a6558b762fabbcc45580d5623837_677f0618", + "size": 22707087, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:38:49.944505727Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 166, + "bitRate": 1081, + "path": "/music/Madoi the Maid - [2024] Cruelty Squad/Madoi The Maid - Cruelty Squad - 05 Now Show me Your Smile -).flac", + "created": "2025-01-09T01:53:52.189620236Z", + "albumId": "9c9ad2db5e9b3d744732412fd393488c", + "artistId": "5cd6da7549d3b2f7d486e823403179d9", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://madoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "81e38d4d50bcbc22eba8f4c8d93579b1", + "parent": "561d6e3c87fe3142e44091b00abb6919", + "isDir": false, + "title": "Dream Pill", + "album": "Dream Summoner Pill", + "artist": "Madoi The Maid", + "track": 4, + "year": 2022, + "coverArt": "mf-81e38d4d50bcbc22eba8f4c8d93579b1_677f0684", + "size": 21781133, + "contentType": "audio/flac", + "suffix": "flac", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 186, + "bitRate": 922, + "path": "/music/Madoi the Maid - [2022] Dream Summoner Pill/Madoi The Maid - Dream Summoner Pill - 04 Dream Pill.flac", + "created": "2025-01-09T01:53:52.100003909Z", + "albumId": "561d6e3c87fe3142e44091b00abb6919", + "artistId": "5cd6da7549d3b2f7d486e823403179d9", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://madoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "8c66425605ec58c831b7efcd81347d85", + "parent": "8079c86d60d95ba0f8e6ba83e81b5619", + "isDir": false, + "title": "Serenity", + "album": "Fireflies", + "artist": "Yakui the Maid", + "track": 3, + "year": 2015, + "coverArt": "mf-8c66425605ec58c831b7efcd81347d85_67857256", + "size": 44838156, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-09T17:32:20.17568208Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 368, + "bitRate": 970, + "path": "/music/YAKUITHEMAID - Fireflies/YAKUITHEMAID - Fireflies - 03 Serenity.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:59:13.016102732Z", + "albumId": "8079c86d60d95ba0f8e6ba83e81b5619", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-18T22:41:31.151265909Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "f63edb14-a80d-49fa-9eed-e604c3460938", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "a57e00930bb5a1b50dcaf7c573f4ba66", + "parent": "8079c86d60d95ba0f8e6ba83e81b5619", + "isDir": false, + "title": "Midian", + "album": "Fireflies", + "artist": "Yakui the Maid", + "track": 8, + "year": 2015, + "coverArt": "mf-a57e00930bb5a1b50dcaf7c573f4ba66_67857257", + "size": 48390839, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-09T17:32:24.85854808Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 472, + "bitRate": 817, + "path": "/music/YAKUITHEMAID - Fireflies/YAKUITHEMAID - Fireflies - 08 Midian.flac", + "discNumber": 1, + "created": "2025-01-07T00:59:13.015956463Z", + "albumId": "8079c86d60d95ba0f8e6ba83e81b5619", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "b1dabc18-bf24-4322-8648-3647f38c43aa", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "d7668cbf1827836ee7d371e981c1d160", + "parent": "6ddba7800ea74494b4564bbef93fbd6c", + "isDir": false, + "title": "Flock", + "album": "Flock", + "artist": "Yakui the Maid", + "track": 2, + "year": 2020, + "coverArt": "mf-d7668cbf1827836ee7d371e981c1d160_6785725a", + "size": 56339250, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:40:15.849868335Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 269, + "bitRate": 1667, + "path": "/music/YAKUITHEMAID - Flock/YAKUITHEMAID - Flock - 02 Flock.flac", + "discNumber": 1, + "created": "2025-01-07T00:59:13.0423018Z", + "albumId": "6ddba7800ea74494b4564bbef93fbd6c", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "a5e34467-4d30-4533-9ef7-9ab6cb2c5e8b", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "bbf0404740ec8edd552a80f998016444", + "parent": "6ddba7800ea74494b4564bbef93fbd6c", + "isDir": false, + "title": "Guilt", + "album": "Flock", + "artist": "Yakui the Maid", + "track": 4, + "year": 2020, + "coverArt": "mf-bbf0404740ec8edd552a80f998016444_6785725a", + "size": 29625506, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:40:17.514065772Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 247, + "bitRate": 952, + "path": "/music/YAKUITHEMAID - Flock/YAKUITHEMAID - Flock - 04 Guilt.flac", + "discNumber": 1, + "created": "2025-01-07T00:59:13.0423516Z", + "albumId": "6ddba7800ea74494b4564bbef93fbd6c", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "6b79bc49-664e-4519-a8a5-fa516948c909", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "980633e95f76fd545491d0b3890beaa0", + "parent": "6ddba7800ea74494b4564bbef93fbd6c", + "isDir": false, + "title": "Cremation", + "album": "Flock", + "artist": "Yakui the Maid", + "track": 5, + "year": 2020, + "coverArt": "mf-980633e95f76fd545491d0b3890beaa0_6785725a", + "size": 51966230, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:40:18.08325855Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 247, + "bitRate": 1671, + "path": "/music/YAKUITHEMAID - Flock/YAKUITHEMAID - Flock - 05 Cremation.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:59:13.042449339Z", + "albumId": "6ddba7800ea74494b4564bbef93fbd6c", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-18T23:12:01.137642149Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "808cd0c7-987c-495a-ba3e-5327ac73e304", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "8f7a348f19d0ef4357cdcf60d0f5fd46", + "parent": "adb0f57808124782093e111434eb0d81", + "isDir": false, + "title": "Futility", + "album": "Futility", + "artist": "Yakui the Maid", + "track": 1, + "year": 2023, + "coverArt": "mf-8f7a348f19d0ef4357cdcf60d0f5fd46_67867807", + "size": 43821950, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:40:36.357485127Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 195, + "bitRate": 1785, + "path": "/music/YAKUITHEMAID - Futility/YAKUITHEMAID - Futility - 01 Futility.flac", + "discNumber": 1, + "created": "2025-01-07T00:58:13.016804678Z", + "albumId": "adb0f57808124782093e111434eb0d81", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "75bcc6c8-ac91-4ebb-901e-a6aeb87d8de3", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "b3f1e27a0ca8c257aac1c1de0179e234", + "parent": "adb0f57808124782093e111434eb0d81", + "isDir": false, + "title": "Tides", + "album": "Futility", + "artist": "Yakui the Maid", + "track": 2, + "year": 2023, + "coverArt": "mf-b3f1e27a0ca8c257aac1c1de0179e234_67867807", + "size": 53650724, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:40:36.992889964Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 240, + "bitRate": 1781, + "path": "/music/YAKUITHEMAID - Futility/YAKUITHEMAID - Futility - 02 Tides.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:58:13.01651192Z", + "albumId": "adb0f57808124782093e111434eb0d81", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-18T19:56:54.333760431Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "ce60de04-d530-4d68-a48c-86625dea8e29", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "8b899fe3b07a8d226c633053bf496f62", + "parent": "adb0f57808124782093e111434eb0d81", + "isDir": false, + "title": "Artificial Stupidity", + "album": "Futility", + "artist": "Yakui the Maid", + "track": 3, + "year": 2023, + "coverArt": "mf-8b899fe3b07a8d226c633053bf496f62_67867807", + "size": 56709359, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:40:37.746550671Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 263, + "bitRate": 1718, + "path": "/music/YAKUITHEMAID - Futility/YAKUITHEMAID - Futility - 03 Artificial Stupidity.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:58:13.016662469Z", + "albumId": "adb0f57808124782093e111434eb0d81", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-19T22:58:16.083744778Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "9ac80bac-fc54-4632-a22f-a2980fc25cf0", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "c6416f8dfe1e73e70606de44e2dc3120", + "parent": "adb0f57808124782093e111434eb0d81", + "isDir": false, + "title": "Side Effects of Mushroom Tea", + "album": "Futility", + "artist": "Yakui the Maid", + "track": 4, + "year": 2023, + "coverArt": "mf-c6416f8dfe1e73e70606de44e2dc3120_67867807", + "size": 56777727, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:40:39.141800975Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 262, + "bitRate": 1721, + "path": "/music/YAKUITHEMAID - Futility/YAKUITHEMAID - Futility - 04 Side Effects of Mushroom Tea.flac", + "discNumber": 1, + "created": "2025-01-07T00:58:13.016857887Z", + "albumId": "adb0f57808124782093e111434eb0d81", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "d1b2d7e9-3181-4655-a733-ca2658551c68", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "8857c1447a4fd06b433935721464a01c", + "parent": "adb0f57808124782093e111434eb0d81", + "isDir": false, + "title": "Arrays", + "album": "Futility", + "artist": "Yakui the Maid", + "track": 8, + "year": 2023, + "coverArt": "mf-8857c1447a4fd06b433935721464a01c_67867808", + "size": 55961166, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:40:41.290636239Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 265, + "bitRate": 1677, + "path": "/music/YAKUITHEMAID - Futility/YAKUITHEMAID - Futility - 08 Arrays.flac", + "discNumber": 1, + "created": "2025-01-07T00:58:13.01646039Z", + "albumId": "adb0f57808124782093e111434eb0d81", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "28f6ddb1-74cc-44e0-8ac0-3a0b237d5726", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "243fe604d485234a338fd02ae5d813bc", + "parent": "0f3ee28ee30325f4f1ce890e94977215", + "isDir": false, + "title": "Calamity", + "album": "Goodnight World", + "artist": "Yakui the Maid", + "track": 2, + "year": 2019, + "coverArt": "mf-243fe604d485234a338fd02ae5d813bc_67857262", + "size": 51835577, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:41:45.095064275Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 262, + "bitRate": 1578, + "path": "/music/YAKUITHEMAID - Goodnight World/YAKUITHEMAID - Goodnight World - 02 Calamity.flac", + "discNumber": 1, + "created": "2025-01-07T00:59:13.070188738Z", + "albumId": "0f3ee28ee30325f4f1ce890e94977215", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "7eee6d1d-f149-4931-b39f-6fbb5e539ee1", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "19ab82dab50292d09da86de8f9016797", + "parent": "0f3ee28ee30325f4f1ce890e94977215", + "isDir": false, + "title": "Goodnight World", + "album": "Goodnight World", + "artist": "Yakui the Maid", + "track": 3, + "year": 2019, + "coverArt": "mf-19ab82dab50292d09da86de8f9016797_67857262", + "size": 81553399, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:41:45.839593661Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 422, + "bitRate": 1543, + "path": "/music/YAKUITHEMAID - Goodnight World/YAKUITHEMAID - Goodnight World - 03 Goodnight World.flac", + "discNumber": 1, + "created": "2025-01-07T00:59:13.070395527Z", + "albumId": "0f3ee28ee30325f4f1ce890e94977215", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "d10f4295-d8bf-4293-b642-1ce1a13847ed", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "e058905b8d21620b39119373f7780b23", + "parent": "0f3ee28ee30325f4f1ce890e94977215", + "isDir": false, + "title": "A Moth", + "album": "Goodnight World", + "artist": "Yakui the Maid", + "track": 4, + "year": 2019, + "coverArt": "mf-e058905b8d21620b39119373f7780b23_67857262", + "size": 28488370, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:41:46.449259966Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 239, + "bitRate": 949, + "path": "/music/YAKUITHEMAID - Goodnight World/YAKUITHEMAID - Goodnight World - 04 A Moth.flac", + "discNumber": 1, + "created": "2025-01-07T00:59:13.070296918Z", + "albumId": "0f3ee28ee30325f4f1ce890e94977215", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "040b0790-8720-46db-894c-f3a169812085", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "144b4e7ca0fd8e20c0e6add67a65ca4f", + "parent": "0f3ee28ee30325f4f1ce890e94977215", + "isDir": false, + "title": "In Affliction", + "album": "Goodnight World", + "artist": "Yakui the Maid", + "track": 5, + "year": 2019, + "coverArt": "mf-144b4e7ca0fd8e20c0e6add67a65ca4f_67857262", + "size": 45526532, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:41:48.753743125Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 229, + "bitRate": 1583, + "path": "/music/YAKUITHEMAID - Goodnight World/YAKUITHEMAID - Goodnight World - 05 In Affliction.flac", + "playCount": 2, + "discNumber": 1, + "created": "2025-01-07T00:59:13.070542886Z", + "albumId": "0f3ee28ee30325f4f1ce890e94977215", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-19T22:15:47.522583673Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "ff44a28a-2eb2-4b18-9670-f4bd71cc0e60", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "e42504133eb14576d14a795cdb354ba1", + "parent": "0f3ee28ee30325f4f1ce890e94977215", + "isDir": false, + "title": "Kyphosis", + "album": "Goodnight World", + "artist": "Yakui the Maid", + "track": 8, + "year": 2019, + "coverArt": "mf-e42504133eb14576d14a795cdb354ba1_67857262", + "size": 27722610, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:41:50.240379841Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 129, + "bitRate": 1701, + "path": "/music/YAKUITHEMAID - Goodnight World/YAKUITHEMAID - Goodnight World - 08 Kyphosis.flac", + "playCount": 2, + "discNumber": 1, + "created": "2025-01-07T00:59:13.070443167Z", + "albumId": "0f3ee28ee30325f4f1ce890e94977215", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-19T23:29:34.495581127Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "bb3d9a58-eee1-4106-8a72-57213b21aa80", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "d4d079d5e6e85627e302916ff5578477", + "parent": "0f3ee28ee30325f4f1ce890e94977215", + "isDir": false, + "title": "Continium", + "album": "Goodnight World", + "artist": "Yakui the Maid", + "track": 9, + "year": 2019, + "coverArt": "mf-d4d079d5e6e85627e302916ff5578477_67857262", + "size": 38530067, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:41:51.409011675Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 199, + "bitRate": 1542, + "path": "/music/YAKUITHEMAID - Goodnight World/YAKUITHEMAID - Goodnight World - 09 Continium.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:59:13.070643005Z", + "albumId": "0f3ee28ee30325f4f1ce890e94977215", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-19T18:33:15.611287342Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "5357606d-4b7e-4c94-8d73-378c8a6c5bd3", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "02ec5610fb3f7c370be6ddeb8ccd620f", + "parent": "0f3ee28ee30325f4f1ce890e94977215", + "isDir": false, + "title": "Chloramine", + "album": "Goodnight World", + "artist": "Yakui the Maid", + "track": 10, + "year": 2019, + "coverArt": "mf-02ec5610fb3f7c370be6ddeb8ccd620f_67857262", + "size": 45808277, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:41:53.171656395Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 236, + "bitRate": 1549, + "path": "/music/YAKUITHEMAID - Goodnight World/YAKUITHEMAID - Goodnight World - 10 Chloramine.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:59:13.070591006Z", + "albumId": "0f3ee28ee30325f4f1ce890e94977215", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-18T20:58:05.358022056Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "0ae2feeb-fed1-4306-8358-c1a0ccecae59", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "1c5f127dd9f8acd0d4d9d14060a4c678", + "parent": "c69cdc593487ed813f1e11ecb270b228", + "isDir": false, + "title": "Helios", + "album": "Helios", + "artist": "Yakui the Maid", + "track": 2, + "year": 2019, + "coverArt": "mf-1c5f127dd9f8acd0d4d9d14060a4c678_67857269", + "size": 66199494, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:42:48.51396464Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 336, + "bitRate": 1572, + "path": "/music/YAKUITHEMAID - Helios/YAKUITHEMAID - Helios - 02 Helios.flac", + "discNumber": 1, + "created": "2025-01-07T00:58:13.055076358Z", + "albumId": "c69cdc593487ed813f1e11ecb270b228", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "bfd47b18-7f53-47fa-8200-7a2562cf0253", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "937004317800a879f0cddd471fb82387", + "parent": "c69cdc593487ed813f1e11ecb270b228", + "isDir": false, + "title": "Echidna", + "album": "Helios", + "artist": "Yakui the Maid", + "track": 3, + "year": 2019, + "coverArt": "mf-937004317800a879f0cddd471fb82387_67857269", + "size": 32724161, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:42:47.935755328Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 163, + "bitRate": 1597, + "path": "/music/YAKUITHEMAID - Helios/YAKUITHEMAID - Helios - 03 Echidna.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:58:13.054979178Z", + "albumId": "c69cdc593487ed813f1e11ecb270b228", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-16T16:48:25.475684076Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "545a4f2b-23b5-4c11-924b-8d5641dc9e2b", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "5df989c75abc72849734b053ce5d8714", + "parent": "c69cdc593487ed813f1e11ecb270b228", + "isDir": false, + "title": "Continium", + "album": "Helios", + "artist": "Yakui the Maid", + "track": 8, + "year": 2019, + "coverArt": "mf-5df989c75abc72849734b053ce5d8714_67857269", + "size": 56781561, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:42:57.80113352Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 275, + "bitRate": 1646, + "path": "/music/YAKUITHEMAID - Helios/YAKUITHEMAID - Helios - 08 Continium.flac", + "discNumber": 1, + "created": "2025-01-07T00:58:13.055170767Z", + "albumId": "c69cdc593487ed813f1e11ecb270b228", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "473b4b86-d485-41c8-9a9b-e0054ab5bf35", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "bcfd4eb2c2705932de1399f39cc8494e", + "parent": "f4d8ba942eb0968ec74398db6684c3ae", + "isDir": false, + "title": "Asper Girl", + "album": "Polyneuroparty", + "artist": "Yakui the Maid", + "track": 2, + "year": 2020, + "coverArt": "mf-bcfd4eb2c2705932de1399f39cc8494e_6785725e", + "size": 22868820, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:46:45.481655616Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 208, + "bitRate": 874, + "path": "/music/YAKUITHEMAID - Polyneuroparty/YAKUITHEMAID - Polyneuroparty - 02 Asper Girl.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:59:13.115705121Z", + "albumId": "f4d8ba942eb0968ec74398db6684c3ae", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-15T14:45:20.183187072Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "633daa8a-7da2-4769-8dc2-35559e61493b", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "e1e0be19aa7db7fe14521cc84fd9df12", + "parent": "f4d8ba942eb0968ec74398db6684c3ae", + "isDir": false, + "title": "Clonidine", + "album": "Polyneuroparty", + "artist": "Yakui the Maid", + "track": 3, + "year": 2020, + "coverArt": "mf-e1e0be19aa7db7fe14521cc84fd9df12_6785725e", + "size": 36058529, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:49:41.249572164Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 267, + "bitRate": 1078, + "path": "/music/YAKUITHEMAID - Polyneuroparty/YAKUITHEMAID - Polyneuroparty - 03 Clonidine.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:59:13.115936Z", + "albumId": "f4d8ba942eb0968ec74398db6684c3ae", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-22T17:33:38.523310082Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "8260d9b7-042d-4995-961e-0255b71e5178", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "a6d95a30ac301c55ed803a3c3b1b92ee", + "parent": "e50a24d9e730b17e9481bf8068ae4155", + "isDir": false, + "title": "Daisy Killer", + "album": "Polyneuroparty pt. 2", + "artist": "Yakui the Maid", + "track": 1, + "year": 2021, + "coverArt": "mf-a6d95a30ac301c55ed803a3c3b1b92ee_6785726d", + "size": 25269674, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:49:58.958234295Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 223, + "bitRate": 896, + "path": "/music/YAKUITHEMAID - Polyneuroparty pt. 2/YAKUITHEMAID - Polyneuroparty pt. 2 - 01 Daisy Killer.flac", + "playCount": 2, + "discNumber": 1, + "created": "2025-01-07T00:59:13.145479107Z", + "albumId": "e50a24d9e730b17e9481bf8068ae4155", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-19T18:26:25.257609131Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "37e726f0-65e6-4765-96cd-308a75494d9f", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "ad7fb1ef9ffc841d5223a2e095fe8ea3", + "parent": "e50a24d9e730b17e9481bf8068ae4155", + "isDir": false, + "title": "Neuma", + "album": "Polyneuroparty pt. 2", + "artist": "Yakui the Maid", + "track": 2, + "year": 2021, + "coverArt": "mf-ad7fb1ef9ffc841d5223a2e095fe8ea3_6785726d", + "size": 45120726, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:49:59.733798918Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 346, + "bitRate": 1038, + "path": "/music/YAKUITHEMAID - Polyneuroparty pt. 2/YAKUITHEMAID - Polyneuroparty pt. 2 - 02 Neuma.flac", + "playCount": 2, + "discNumber": 1, + "created": "2025-01-07T00:59:13.145347568Z", + "albumId": "e50a24d9e730b17e9481bf8068ae4155", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-19T18:54:47.569198684Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "6ba60011-0b26-4ed7-8377-291bf41440dd", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "d5e5df1e1a934429f29a472fc48bda22", + "parent": "e50a24d9e730b17e9481bf8068ae4155", + "isDir": false, + "title": "Hati", + "album": "Polyneuroparty pt. 2", + "artist": "Yakui the Maid", + "track": 5, + "year": 2021, + "coverArt": "mf-d5e5df1e1a934429f29a472fc48bda22_6785726d", + "size": 26079906, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:50:01.950240953Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 220, + "bitRate": 937, + "path": "/music/YAKUITHEMAID - Polyneuroparty pt. 2/YAKUITHEMAID - Polyneuroparty pt. 2 - 05 Hati.flac", + "playCount": 2, + "discNumber": 1, + "created": "2025-01-07T00:59:13.145502257Z", + "albumId": "e50a24d9e730b17e9481bf8068ae4155", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-19T22:11:58.024725316Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "bd8631ce-5cfd-4e90-bd70-d6dd5be1d699", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "0c14e64df620d599ced9f9982231254c", + "parent": "235d8f7ef2908a483337b4492df2ef03", + "isDir": false, + "title": "Missile Bay Cadenza Continium", + "album": "Teamaid", + "artist": "Scythe of Luna × Yakui the Maid", + "track": 2, + "year": 2019, + "coverArt": "mf-0c14e64df620d599ced9f9982231254c_677f0a80", + "size": 38752152, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:54:07.740404379Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 300, + "bitRate": 986, + "path": "/music/Scythe of Luna - (2019) Teamaid/02 Missile Bay Cadenza Continium.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-09T01:56:52.051991251Z", + "albumId": "235d8f7ef2908a483337b4492df2ef03", + "artistId": "c037544c3ca832aae9fb0a8e1e01d7c2", + "type": "music", + "isVideo": false, + "played": "2025-01-22T17:26:50.849220832Z", + "bpm": 0, + "comment": "", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "9dba4750-544d-4564-bc71-7b5927beff41", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "f193fd2005e4e1fb6bea8ae4fbee260e", + "parent": "0a0e77d24e831df4768b8a2baf56e4be", + "isDir": false, + "title": "Youth", + "album": "Youth", + "artist": "Yakui the Maid", + "track": 2, + "year": 2024, + "coverArt": "mf-f193fd2005e4e1fb6bea8ae4fbee260e_67857491", + "size": 48082789, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:54:55.372792563Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 213, + "bitRate": 1799, + "path": "/music/YAKUITHEMAID - Youth/YAKUITHEMAID - Youth - 02 Youth.flac", + "playCount": 1, + "created": "2025-01-07T00:58:13.085522369Z", + "albumId": "0a0e77d24e831df4768b8a2baf56e4be", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-22T20:14:10.801Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "fb1dab0e3b8175bd19d37586a4be8b69", + "parent": "0a0e77d24e831df4768b8a2baf56e4be", + "isDir": false, + "title": "Sea", + "album": "Youth", + "artist": "Yakui the Maid", + "track": 3, + "year": 2024, + "coverArt": "mf-fb1dab0e3b8175bd19d37586a4be8b69_67857491", + "size": 47703336, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:54:56.292768752Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 243, + "bitRate": 1566, + "path": "/music/YAKUITHEMAID - Youth/YAKUITHEMAID - Youth - 03 Sea.flac", + "playCount": 2, + "created": "2025-01-07T00:58:13.08538977Z", + "albumId": "0a0e77d24e831df4768b8a2baf56e4be", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-13T18:59:39.767Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "410b54c316d5c036b25201e010295cf6", + "parent": "0a0e77d24e831df4768b8a2baf56e4be", + "isDir": false, + "title": "Continium", + "album": "Youth", + "artist": "Yakui the Maid", + "track": 7, + "year": 2024, + "coverArt": "mf-410b54c316d5c036b25201e010295cf6_67857491", + "size": 43444233, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:54:57.804691127Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 203, + "bitRate": 1706, + "path": "/music/YAKUITHEMAID - Youth/YAKUITHEMAID - Youth - 07 Continium.flac", + "playCount": 1, + "created": "2025-01-07T00:58:13.085602219Z", + "albumId": "0a0e77d24e831df4768b8a2baf56e4be", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-16T16:51:48.074179163Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "146969d83f640e4a8953ab244497f3b7", + "parent": "b05d056d4d3f1ae8e2c250ab0625b593", + "isDir": false, + "title": "Портрет", + "album": "Горя Сезон", + "artist": "Medoi The Maid, Lieath", + "track": 2, + "year": 2024, + "coverArt": "mf-146969d83f640e4a8953ab244497f3b7_677f5e55", + "size": 34892522, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:56:08.101309452Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 156, + "bitRate": 1785, + "path": "/music/Medoi The Maid- Lieath - Горя Сезон/Medoi The Maid, Lieath - Горя Сезон - 02 Портрет.flac", + "playCount": 1, + "created": "2025-01-09T05:28:52.054517498Z", + "albumId": "b05d056d4d3f1ae8e2c250ab0625b593", + "artistId": "db0d812919f08d2c36dba57992ac2e39", + "type": "music", + "isVideo": false, + "played": "2025-01-18T23:19:45.244387547Z", + "bpm": 0, + "comment": "Visit https://medoi.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "89002e415db26b51af97c215a32d1ebb", + "parent": "b05d056d4d3f1ae8e2c250ab0625b593", + "isDir": false, + "title": "Марионетка", + "album": "Горя Сезон", + "artist": "Medoi The Maid, Lieath", + "track": 4, + "year": 2024, + "coverArt": "mf-89002e415db26b51af97c215a32d1ebb_677f5e56", + "size": 30685301, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T17:56:06.030311831Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 130, + "bitRate": 1879, + "path": "/music/Medoi The Maid- Lieath - Горя Сезон/Medoi The Maid, Lieath - Горя Сезон - 04 Марионетка.flac", + "created": "2025-01-09T05:28:52.056303979Z", + "albumId": "b05d056d4d3f1ae8e2c250ab0625b593", + "artistId": "db0d812919f08d2c36dba57992ac2e39", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://medoi.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "730e2a478f5e25a84464eb59a0e65a90", + "parent": "e50a24d9e730b17e9481bf8068ae4155", + "isDir": false, + "title": "Wounds", + "album": "Polyneuroparty pt. 2", + "artist": "Yakui the Maid", + "track": 3, + "year": 2021, + "coverArt": "mf-730e2a478f5e25a84464eb59a0e65a90_6785726d", + "size": 32983847, + "contentType": "audio/flac", + "suffix": "flac", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 257, + "bitRate": 1019, + "path": "/music/YAKUITHEMAID - Polyneuroparty pt. 2/YAKUITHEMAID - Polyneuroparty pt. 2 - 03 Wounds.flac", + "playCount": 1, + "discNumber": 1, + "created": "2025-01-07T00:59:13.145453467Z", + "albumId": "e50a24d9e730b17e9481bf8068ae4155", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "played": "2025-01-13T17:59:36.979Z", + "bpm": 0, + "comment": "Visit https://yakuithemaid1.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "92ec9e77-20af-4783-a6db-d6038fb29d79", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "a219072b27aa20aa7217bdd388f74f47", + "parent": "30b78834edfa708f076e2cd2f4c89811", + "isDir": false, + "title": "Catharsis", + "album": "Insertion", + "artist": "Chikoi The Maid", + "track": 3, + "year": 2023, + "coverArt": "mf-a219072b27aa20aa7217bdd388f74f47_677c7d49", + "size": 34364618, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-08T16:11:30.361780613Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 265, + "bitRate": 1033, + "path": "/music/Chikoi The Maid - Insertion/Chikoi The Maid - Insertion - 03 Catharsis.flac", + "playCount": 5, + "created": "2025-01-07T01:38:13.017945662Z", + "albumId": "30b78834edfa708f076e2cd2f4c89811", + "artistId": "71a8dd793c539d587125ae25eb00ce3f", + "type": "music", + "isVideo": false, + "played": "2025-01-14T16:36:50.543897058Z", + "bpm": 0, + "comment": "Visit https://chikoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 48000 + }, + { + "id": "7950506e5c80b25f74910d8890c8a915", + "parent": "e2188299bcf4a924b9a1266f25442ca9", + "isDir": false, + "title": "Suicide by Starlight", + "album": "Suicide by Starlight", + "artist": "Kichi", + "track": 1, + "year": 2019, + "coverArt": "mf-7950506e5c80b25f74910d8890c8a915_677f0749", + "size": 57011160, + "contentType": "audio/flac", + "suffix": "flac", + "starred": "2025-01-13T19:25:14.946833184Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 276, + "bitRate": 1652, + "path": "/music/Kichi - [2019] Suicide by Starlight/01 - Suicide by Starlight.flac", + "playCount": 3, + "created": "2025-01-09T01:45:52.030301404Z", + "albumId": "e2188299bcf4a924b9a1266f25442ca9", + "artistId": "f8439e9a5e59dbd90557d22865d2517a", + "type": "music", + "isVideo": false, + "played": "2025-01-23T16:33:51.574187334Z", + "bpm": 0, + "comment": "Visit http://mahoukichi.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "442a8f1eafd9f0667d676726a3e690ef", + "parent": "5815d1618fe53bb50b90e14d15f33cde", + "isDir": false, + "title": "Wonderland", + "album": "Wonderland", + "artist": "Ozoi The Maid x Yakui The Maid", + "track": 1, + "year": 2016, + "coverArt": "mf-442a8f1eafd9f0667d676726a3e690ef_677c0c90", + "size": 20230653, + "contentType": "audio/mpeg", + "suffix": "mp3", + "starred": "2025-01-13T19:27:38.266301121Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 600, + "bitRate": 269, + "path": "/music/Ozoi The Maid x Yakui The Maid - Wonderland/Ozoi The Maid x Yakui The Maid - Wonderland - 01 Wonderland.mp3", + "playCount": 2, + "created": "2025-01-06T17:02:13.0097283Z", + "albumId": "5815d1618fe53bb50b90e14d15f33cde", + "artistId": "6b6edd959cf31df396694744f24b66ae", + "type": "music", + "isVideo": false, + "played": "2025-01-21T03:31:28.665034363Z", + "bpm": 0, + "comment": "Visit https://ozoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "c9a87d86ce66649d306be77edbaa3550", + "parent": "5815d1618fe53bb50b90e14d15f33cde", + "isDir": false, + "title": "Lanterns", + "album": "Wonderland", + "artist": "Ozoi The Maid x Yakui The Maid", + "track": 3, + "year": 2016, + "coverArt": "mf-c9a87d86ce66649d306be77edbaa3550_677c0c90", + "size": 14367014, + "contentType": "audio/mpeg", + "suffix": "mp3", + "starred": "2025-01-13T19:27:35.667563542Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 430, + "bitRate": 265, + "path": "/music/Ozoi The Maid x Yakui The Maid - Wonderland/Ozoi The Maid x Yakui The Maid - Wonderland - 03 Lanterns.mp3", + "playCount": 3, + "created": "2025-01-06T17:02:13.011823575Z", + "albumId": "5815d1618fe53bb50b90e14d15f33cde", + "artistId": "6b6edd959cf31df396694744f24b66ae", + "type": "music", + "isVideo": false, + "played": "2025-01-22T23:56:14.808698988Z", + "bpm": 0, + "comment": "Visit https://ozoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "44b54bf534cc0e046531e28f1555df9b", + "parent": "5815d1618fe53bb50b90e14d15f33cde", + "isDir": false, + "title": "Frontier", + "album": "Wonderland", + "artist": "Ozoi The Maid x Yakui The Maid", + "track": 5, + "year": 2016, + "coverArt": "mf-44b54bf534cc0e046531e28f1555df9b_677c0c90", + "size": 12864796, + "contentType": "audio/mpeg", + "suffix": "mp3", + "starred": "2025-01-13T19:27:37.38027021Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 400, + "bitRate": 256, + "path": "/music/Ozoi The Maid x Yakui The Maid - Wonderland/Ozoi The Maid x Yakui The Maid - Wonderland - 05 Frontier.mp3", + "created": "2025-01-06T17:02:13.010249026Z", + "albumId": "5815d1618fe53bb50b90e14d15f33cde", + "artistId": "6b6edd959cf31df396694744f24b66ae", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "Visit https://ozoithemaid.bandcamp.com", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackPeak": 1, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + }, + { + "id": "54bcae9418122b9a55ee81cd968c7dd6", + "parent": "7e3f62f383cd2cf9926ac04466366644", + "isDir": false, + "title": "I Stole Some Witchouse to Feed My Пирожки", + "album": "I Stole Some Witchouse to Feed My Пирожки", + "artist": "Yakui the Maid", + "coverArt": "al-7e3f62f383cd2cf9926ac04466366644_0", + "size": 5503682, + "contentType": "audio/mpeg", + "suffix": "mp3", + "starred": "2025-01-14T20:26:35.691258863Z", + "transcodedContentType": "audio/ogg", + "transcodedSuffix": "ogg", + "duration": 137, + "bitRate": 320, + "path": "/music/YAKUITHEMAID - (2024) I Stole Some Witchouse To Feed My Pirozhki/I Stole Some Witchouse To Feed My Pirozhki.mp3", + "created": "2025-01-09T00:29:52.080283967Z", + "albumId": "7e3f62f383cd2cf9926ac04466366644", + "artistId": "7f6ca9951af294420382442061a2d6ee", + "type": "music", + "isVideo": false, + "bpm": 0, + "comment": "", + "sortName": "", + "mediaType": "song", + "musicBrainzId": "", + "genres": [], + "replayGain": { + "trackGain": -11.4, + "trackPeak": 1.10611, + "albumPeak": 1 + }, + "channelCount": 2, + "samplingRate": 44100 + } + ] + } + } +} \ No newline at end of file diff --git a/screens-test.py b/screens-test.py index cee0ad2..8aab8db 100644 --- a/screens-test.py +++ b/screens-test.py @@ -1,7 +1,6 @@ import logging import os - -from enum import Enum +import io LOG_FILE = 'textual.log' LOGGING_LEVEL = logging.DEBUG @@ -14,10 +13,12 @@ logging.basicConfig(filename=LOG_FILE, level=LOGGING_LEVEL, format=LOG_FORMAT) import SubSonic +os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" +import pygame from textual import on, events from textual.app import App, ComposeResult -from textual.widgets import Footer, Header, OptionList, DataTable, Tabs, Tab, TabbedContent, TabPane, ProgressBar, Label +from textual.widgets import Footer, Header, OptionList, DataTable, ProgressBar, Label from textual.screen import Screen from textual.widgets.option_list import Option @@ -26,6 +27,8 @@ p = 'telegram9dock-MICHEL' conn = SubSonic.SubpyConn(u, p, "https://music.0x01fe.net") +pygame.mixer.init() + class AlbumSongs(Screen): BINDINGS = [ ('escape', 'die()', "Back"), @@ -161,6 +164,7 @@ class Playlists(Screen): ] playlists: list[SubSonic.Playlist] | None = None + selected_playlist_id: str = None def compose(self) -> ComposeResult: yield Header(icon="") @@ -178,6 +182,71 @@ class Playlists(Screen): for playlist in self.playlists: playlistTable.add_row(playlist.name, playlist.songCount, playlist.duration, playlist.owner, key=playlist.id) + @on(DataTable.RowHighlighted) + def row_highlighted(self, event: DataTable.RowHighlighted) -> None: + self.selected_playlist_id = event.row_key.value + + @on(DataTable.RowSelected) + def playlist_selected(self, event: DataTable.RowSelected) -> None: + app.install_screen(PlaylistSongs(self._find_selected_playlist()), "playlistSongs") + app.push_screen('playlistSongs') + + def _find_selected_playlist(self) -> SubSonic.Playlist: + for playlist in self.playlists: + if playlist.id == self.selected_playlist_id: + return playlist + + +class PlaylistSongs(Screen): + BINDINGS = [ + ('escape', 'die()', "Back"), + ('p', 'play()', 'Play Song'), + ('q' 'queue()', 'Queue Song') + ] + + selected_song_id: str | None = None + + def __init__(self, playlist: SubSonic.Playlist): + self.playlist = playlist + self.songs = conn.getPlaylist(playlist.id) + super().__init__() + + def compose(self) -> ComposeResult: + self.sub_title = self.playlist.name + yield Header(icon="") + yield DataTable() + yield Footer() + + def on_mount(self) -> None: + songTable: DataTable = self.query_one(DataTable) + + songTable.cursor_type = "row" + songTable.add_columns("Title", "Album", "Artist", "Plays", "Duration", "Bitrate") + + for song in self.songs: + songTable.add_row(song.title, song.album, song.artist, song.playCount, song.duration, song.bitRate, key=song.id) + + # Pops and uninstalls self + def action_die(self) -> None: + app.pop_screen() + app.uninstall_screen("playlistSongs") + + @on(DataTable.RowHighlighted) + def row_highlighted(self, event: DataTable.RowHighlighted) -> None: + self.selected_song_id = event.row_key.value + + def action_play(self) -> None: + app.play_song(self._find_selected_song()) + + def action_queue(self) -> None: + app.queue_song(self._find_selected_song()) + + # Find the song that was selected + def _find_selected_song(self) -> SubSonic.Song: + for song in self.songs: + if song.id == self.selected_song_id: + return song + class Favourites(Screen): BINDINGS = [ ('escape', 'app.pop_screen', "Back") @@ -203,6 +272,7 @@ class Favourites(Screen): class TextualSubpyPlayer(App): BINDINGS = [ + ("space", "play_pause_song()", "⏯️"), ("f1", "push_screen('artists')", "Artists"), ("f2", "push_screen('albums')", "Albums"), ("f3", "push_screen('favourites')", "Favourites"), @@ -211,6 +281,8 @@ class TextualSubpyPlayer(App): currently_playing: SubSonic.Song | None = None song_queue: list[SubSonic.Song] = [] + playing: bool = False + place: int = 0 def compose(self) -> ComposeResult: yield Label() @@ -226,12 +298,20 @@ class TextualSubpyPlayer(App): self.install_screen(Playlists(), name="playlists") def on_key(self, event: events.Key) -> None: - logging.debug(f'Key Pressed {event.name}') + # logging.debug(f'Key Pressed {event.name}') + pass def play_song(self, song: SubSonic.Song) -> None: self.currently_playing = song + self.playing = True logging.debug(f"Playing song {song.title} by {song.artist}.") + r = conn.stream(song.id) + audio_data = io.BytesIO(r.content) + + pygame.mixer.music.load(audio_data) + pygame.mixer.music.play() + # Set callback loop for progress bar # self.progress_timer = self.set_interval(1 / 10, self.update_progress, pause=False) @@ -242,6 +322,18 @@ class TextualSubpyPlayer(App): logging.debug(f'Queue\'d song "{song.title}" by {song.artist}.') self.song_queue.append(song) + def action_play_pause_song(self) -> None: + self.play_pause_song() + + def play_pause_song(self) -> None: + if self.playing: + self.place = pygame.mixer.music.get_pos() + pygame.mixer.music.pause() + self.playing = False + else: + pygame.mixer.music.play(start=self.place) + self.playing = True + if __name__ == '__main__': app = TextualSubpyPlayer() app.run() diff --git a/textual.log b/textual.log index b7e6451..33c97d3 100644 --- a/textual.log +++ b/textual.log @@ -1,306 +1,9 @@ -[2025-01-23 16:30:12,660] DEBUG in proactor_events: Using proactor: IocpProactor -[2025-01-23 16:30:12,688] DEBUG in screens-test: mount called -[2025-01-23 16:30:13,222] DEBUG in screens-test: Key Pressed f3 -[2025-01-23 16:30:13,249] DEBUG in connectionpool: Starting new HTTPS connection (1): music.0x01fe.net:443 -[2025-01-23 16:30:13,561] DEBUG in connectionpool: https://music.0x01fe.net:443 "GET /rest/getStarred?u=pseudo&t=9b4d304e86861c6941ca94888cc7663f&s=KKZ4XKZK&v=1.16.1&c=testing&f=json HTTP/1.1" 200 None -[2025-01-23 16:30:14,577] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,070] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,100] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,130] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,163] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,193] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,242] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,272] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,308] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,339] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,370] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,400] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,432] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,464] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,499] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,529] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,561] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,592] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,627] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,658] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,703] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,739] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,769] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,800] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,838] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,863] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,894] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,928] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,959] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:15,990] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,024] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,054] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,109] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,118] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,164] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,199] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,231] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,261] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,293] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,330] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,359] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,391] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,424] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,452] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,491] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,518] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,552] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,580] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,630] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,659] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,693] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,721] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,752] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,786] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,817] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,849] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,879] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,911] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,960] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:16,990] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,020] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,052] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,089] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,115] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,149] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,180] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,210] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,249] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,299] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,305] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,358] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,386] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,418] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,459] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,482] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,516] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,544] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,609] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,630] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,640] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,673] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,704] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,736] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,769] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,800] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,859] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,899] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,938] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:17,969] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,000] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,009] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,040] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,070] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,102] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,169] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,170] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,211] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,249] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,279] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,319] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,349] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,385] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,449] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,449] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,489] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,519] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,551] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,589] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,618] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,649] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,720] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,720] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,754] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,783] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,814] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,854] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,880] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,924] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,949] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:18,957] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,019] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,051] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,083] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,119] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,150] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,179] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,210] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,284] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,289] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,289] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,322] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,352] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,389] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,433] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,468] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,499] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,571] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,574] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,600] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,629] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,669] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,700] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,738] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,764] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,799] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,870] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,870] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,899] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,929] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:19,960] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,002] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,033] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,069] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,099] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,173] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,173] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,210] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,249] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,258] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,289] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,323] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,360] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,420] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,420] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,499] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,499] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,549] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,551] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,589] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,636] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,679] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,685] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,730] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,779] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,779] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,872] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,876] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,909] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,909] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,971] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:20,971] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,017] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,057] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,088] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,119] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,189] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,189] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,206] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,240] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,290] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,334] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,336] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:21,799] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,304] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,340] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,371] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,400] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,449] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,481] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,509] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,541] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,574] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,605] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,639] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,670] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,702] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,736] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,765] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,799] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,829] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,860] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,909] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,941] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:22,976] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:23,004] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:23,042] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:23,070] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:23,103] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:23,132] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:23,163] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:23,195] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:23,462] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:23,972] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,004] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,039] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,070] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,100] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,132] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,169] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,199] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,231] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,260] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,295] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,326] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,370] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,402] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,434] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,468] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,500] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,529] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,561] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,592] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,630] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,654] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,701] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,732] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,769] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,799] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,829] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,861] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,893] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,939] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:24,971] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,059] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,060] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,062] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,112] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,173] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,178] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,221] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,226] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,259] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,299] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,337] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,420] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,420] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,420] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,462] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,510] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,571] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,574] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,599] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,640] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,673] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,703] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,788] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,789] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,789] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,828] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,873] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,899] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,941] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:25,941] DEBUG in screens-test: Key Pressed down -[2025-01-23 16:30:26,190] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,699] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,740] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,773] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,801] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,833] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,869] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,899] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,930] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,964] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:26,992] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:27,029] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:27,060] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:27,093] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:27,122] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:27,164] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:27,188] DEBUG in screens-test: Key Pressed up -[2025-01-23 16:30:41,251] DEBUG in screens-test: Key Pressed escape +[2025-01-24 09:18:52,525] DEBUG in selector_events: Using selector: EpollSelector +[2025-01-24 09:18:52,547] DEBUG in screens-test: mount called +[2025-01-24 09:18:54,151] DEBUG in connectionpool: Starting new HTTPS connection (1): music.0x01fe.net:443 +[2025-01-24 09:18:54,419] DEBUG in connectionpool: https://music.0x01fe.net:443 "GET /rest/getPlaylists?u=pseudo&t=c6b26171189c620b2009abc58bc771ea&s=063M4T63&v=1.16.1&c=testing&f=json HTTP/1.1" 200 705 +[2025-01-24 09:18:55,614] DEBUG in connectionpool: Starting new HTTPS connection (1): music.0x01fe.net:443 +[2025-01-24 09:18:55,905] DEBUG in connectionpool: https://music.0x01fe.net:443 "GET /rest/getPlaylist?u=pseudo&t=1f300cff0009c58d53cd9787b0a62863&s=QOUYC15M&v=1.16.1&c=testing&f=json&id=e6e8ff27-2a60-4e33-8aa1-09586191166a HTTP/1.1" 200 None +[2025-01-24 09:18:58,356] DEBUG in screens-test: Playing song Extinction by King Gizzard & The Lizard Wizard. +[2025-01-24 09:18:58,358] DEBUG in connectionpool: Starting new HTTPS connection (1): music.0x01fe.net:443 +[2025-01-24 09:18:58,667] DEBUG in connectionpool: https://music.0x01fe.net:443 "GET /rest/stream?u=pseudo&t=4e02447422167ec59342fd7c4c42c866&s=Q7CW4DUF&v=1.16.1&c=testing&id=9d7ff682cdf372d99f1d6d8db29f4d41 HTTP/1.1" 200 11569918