From d65bc6989a6291d983478e8ebba820ee7ab13936 Mon Sep 17 00:00:00 2001 From: Brandon4466 Date: Wed, 14 Dec 2022 22:07:25 -0800 Subject: [PATCH] beautified --- .cache-thebrandon45 | 2 +- credentials.json | 2 +- icons/pause-circle.png | Bin 0 -> 859 bytes icons/play-circle.png | Bin 0 -> 934 bytes icons/skip-next.png | Bin 0 -> 442 bytes icons/skip-previous.png | Bin 0 -> 487 bytes json_file1.txt | 109 ----- json_file2.txt | 184 -------- json_file3.txt | 404 ------------------ json_file4.txt | 402 ----------------- json_file5.txt | 0 json_file6.txt | 0 librespot_example.py | 121 ------ program.py | 92 ++-- schematics/design.png | Bin 0 -> 36015 bytes schematics/design_pull_out_drawer.png | Bin 0 -> 7531 bytes .../potential_bottom_progress_design.png | Bin 0 -> 9836 bytes 17 files changed, 62 insertions(+), 1254 deletions(-) create mode 100644 icons/pause-circle.png create mode 100644 icons/play-circle.png create mode 100644 icons/skip-next.png create mode 100644 icons/skip-previous.png delete mode 100644 json_file1.txt delete mode 100644 json_file2.txt delete mode 100644 json_file3.txt delete mode 100644 json_file4.txt delete mode 100644 json_file5.txt delete mode 100644 json_file6.txt delete mode 100644 librespot_example.py create mode 100644 schematics/design.png create mode 100644 schematics/design_pull_out_drawer.png create mode 100644 schematics/potential_bottom_progress_design.png diff --git a/.cache-thebrandon45 b/.cache-thebrandon45 index 5e62790..8a0c033 100644 --- a/.cache-thebrandon45 +++ b/.cache-thebrandon45 @@ -1 +1 @@ -{"access_token": "BQDT_WherHrUXbbhIgBKI7Fo7emhUb-CW2hhY2eGzJjIS01ryBT2r71AxXKkVQcX1aa7-98pw_0yMOvIjWO8w6WwJuZVTRM4y0_-NvZLuTTCCF7fr7pme0EYQ8VdHdJtxESZO81ZGatYvpt7MQ59TsTQSE9aGhIKfnTprUtWJR43XfYJn6QWcT2bfNTIkQ", "token_type": "Bearer", "expires_in": 3600, "scope": "user-modify-playback-state user-read-playback-state", "expires_at": 1671062858, "refresh_token": "AQAQRkRkmOxwR34lsJu_mpG4wxEFiNuJ1FIdmHYN5j0dClEEqMRqPPFX8jM3cQTQkRpeXXyi3xPQ8YImc7Fc-PH1CKTvyARy9VkMKXIes4-l6ijO9fVMyCNwbI0IGvpfrqE"} \ No newline at end of file +{"access_token": "BQDGLDKMfiNe4CK2l9-RdoedRx2QfGqoYkmW21bEXH43BW2731XrUtwkQnomX472HG0U04FahklGSfPSFHJLl4052Bxdypf6I1LWmlEh9Y_pGYVWxK279xyUMrg6MUksj3QcxFfn44PCajOvkgCrSQU3gdaBxbUWvNStiaYZ6DgcE2ou9fJ-HYhm3EeCkA", "token_type": "Bearer", "expires_in": 3600, "scope": "user-modify-playback-state user-read-playback-state", "expires_at": 1671086161, "refresh_token": "AQAQRkRkmOxwR34lsJu_mpG4wxEFiNuJ1FIdmHYN5j0dClEEqMRqPPFX8jM3cQTQkRpeXXyi3xPQ8YImc7Fc-PH1CKTvyARy9VkMKXIes4-l6ijO9fVMyCNwbI0IGvpfrqE"} \ No newline at end of file diff --git a/credentials.json b/credentials.json index e16ee35..c3a8ea4 100644 --- a/credentials.json +++ b/credentials.json @@ -1 +1 @@ -{"username": "thebrandon45", "credentials": "QVFESGtlN01Mb3VURGRWT1YyQy0xRHh4LXFfSmczdkdzbTNvbVRIbVNVSDVXMVg3ZjZWMmxOTWdxYnpTdG93RmpwR2tjYkhKYVBsc3h3RTVDWVVoVXh6Q2NuTlR0dHVRYXlhai1WbUQ0WnlDTEdtbDg0cVVCQUxXMEVfcno2bWpDOHdieUdneXM4N0tnQQ==", "type": "AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS"} \ No newline at end of file +{"username": "thebrandon45", "credentials": "QVFEalQxYVlobUdHczYwd21NNERDcWgxMVhtUFBlU1dicWN6VW9PR0JraDNLa0NrUDU4YlFVSzNQUDRka2NTLUo3aHVtQlFrMHJYWGlnai1pc0RQNjY4a1dDSDFZYmR6NnB6ZGhRaFd0bkNaSjVpMVZLeXlWWlE2dEJiOW5zR3RwMy1IQlkxdEJ2RjhMQQ==", "type": "AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS"} \ No newline at end of file diff --git a/icons/pause-circle.png b/icons/pause-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..3de7b9240e2af6b6351f5d0e03792b7be070c540 GIT binary patch literal 859 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`z6LcLCBs@Y8vBJ&@uo z@Q5r1(g|SvA=~LZ0|Qg6r;B4q#=W;Q4gEzNW!&#K1PJ6fa5o*1SbQOSOWXSdgI}B; zUz~3&*ehY8Qg%hGtCv&$fP=o8T2+%8mq}1Vr(JjJlRLMg%XjXTy;%M9+`T)$&)#`^ z?hkv_mmm8%LrWHYW4_*y`GCuSwTJO=`}Q}C^BZ^*WFuJP+6C&|eAoM};J@N~`g7pk z_4B$F>%wXm$;mj|oNe5-V%|#cf75maH&)Eb{hDTel>N$5y^iITYxqKR?U(FZc4R4;qnJT91ADrWtcOUpE}hpl6w390R@BUKli@m z&XWJYsIk?}(|hH#O#K651$HeT7XM7T#uKBj9WVS?Mf>jk6I=$ew@un-Dlx7*w(ZQq z3p_D>xib%^Ok_yjs9T&-c$&)~X2If!IeJ15TqcSp=x+<*yWhp~L*}+oyV&+M4Ef2? z&o%_A9Ei#}EfaNT6Vn=y8AsRNO?qc*5V-8QlvpwE1E*cHt{XA8o9mP(|FBB2TrE-= zWM;yC;Hbc%uw9CuUB#Sku*^HQEiXyaTkezjS7nv{wKsl0l1*6kWtm;e2JSn(I{XIL z{q_l{Z9NsCQz8@pHhjM8g!+Z^R;BRycJ0MXk-yWw7ja8QR zdroo+`E2-F?POeXZ%XJ+xxX{Ey7$*N#Lr*R?{{~l=`&!8Q!R0gC`m~yNwrEYN(E93 zMg~Skx`sex8e(8*Wom3?Y@uynU}a!nQpS7%MMG|WN@iLmZVj&5yK{gV7(8A5T-G@y GGywqZhhbL$ literal 0 HcmV?d00001 diff --git a/icons/play-circle.png b/icons/play-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..160eeb3d5fb05f826f17fffc9bb4fe69d718f29b GIT binary patch literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`z6LcLCBs@Y8vBJ&@uo z@Q5r1(g|SvA=~LZ0|V0vPZ!6KjC*fqTIUNpinN}8qI$GNt&zzxAc?zEOQXZ+C%*=V zN{Uo~$`3)4MmtBvfQAW|E-ZO)QDG^&C9mt03xYZmPAopyvE$+58Cz4{Y~8%uc=zeU z%VXZh)jvOX^~_w!mFxHY%a@dQY;g3vJSk1Z*Hg>eN;OlbVyWKC%}a7Ur6*le-D`a8 z&zY;X1yVcsuXL>UKVX|+#Q$OP0j>)k4ENTtZQz-6g6p5whWCtnVyh2KH96SccwDn# z`)fsmH`4nU_MBtbw=&$}VEVJoE%~o_4IUkK5KF!6dwSi6>qRa3S?k0Xzhtym%=8X2 zyBu9E>!Br?{OwSk%!`i?56Ls=dp@4@?$|G;87e=ON@Z76>n&z0P&>zQXWEnuHiKg} zlizlm+4ddkSn_klP5A@gG&`>drHkCo`w_%@+e9w&!KBmsTaK)Luztz1#ZxZy9A7xy z@Y%{gQ?KNRFpJknaror070O$-&FV^euqL0mu~YuojOa;u9>3-p_`Ez}UXU|&aR5W= zgW9GKy93=4beNi7XXJS9TJb}*)TXO(zn8P(`B$4xmuE4Znl#VbO8)cZ{I~pv+#YzJ z`XK6gmF2_2oJ2OeB`kJaYdoryUPc@;xE;t765OEgU8VhUS@H_LZ3fJ*=RMT+iZl9n zbHmv?eXp$={-?cDzA*7aAN#?=`>T?#oo9_K*PR)**3GW#NUrna&A)SA31}QU`)E@- zhq!Lp<2PGZ%1@uW?bAK+_ug8^?_H5j=2N+QQZjDRv)u>Xg}$vZ($}@T&Cb@iRpvoF zlk+(?CSle$joD#Ujq4BJ6%#(3Vr;BidAdeix%faH*Ms=R(<>Xd&z!*^mmn??F3Z$? zBhxyX(e;gM?4)~{>=6p@xNfV(Uthz#>A2eFP44olp00oE&PGkXn;nw6`&93p^^w0{ zy_UbAA5>Wwepmc)A29K%mbgZgq$HN4S|t~y0x1R~10y3{Lm)B@F)*|;HLx-^)HX1% lGBEJE`4^}jNkeXaN@iLmZVlEgu6sZ_JYD@<);T3K0RSWBg;@Xq literal 0 HcmV?d00001 diff --git a/icons/skip-next.png b/icons/skip-next.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6d4c52d2031da5bdb8c14c17dc7d5c70c71124 GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`z6LcLCBs@Y8vBJ&@uo z@Q5r1(g|SvA=~LZkg>)>%&sfIB6SvWWuR-6Y zU$Wru^P|t7*~cw>G2P;qvD9znZaLMY_MI;Zt;!a5#%V5|{);!yy-r~{_li}kR_#)7 z7tCMtE=(eD3(y~`C9V-ADTyViR>?)FK#IZ0z{p6~5Qt1e3=FMI4XsSfwG9lc3=Gcj gt&&C2kei>9nO2Eg!`@(_g+L7qp00i_>zopr0HltMLjV8( literal 0 HcmV?d00001 diff --git a/icons/skip-previous.png b/icons/skip-previous.png new file mode 100644 index 0000000000000000000000000000000000000000..edd88502cdadfec7f981db018960cf43f9f84b21 GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yLU`z6LcLCBs@Y8vBJ&@uo z@Q5r1(g|SvA=~LZknz&f#W5t~-rMVYeVH8v+7g>RJQS2v%N{Y^X|PsU%DUZwdrN~0 zcJ5j&O)%x0=k8hS&=6`>e=Dv85Mi&r0%3xtTv-fbc7o*Qd z%O}h~#ToBBV6}ICpHa-%voWhwWj5CX$@qT@vKeg>68Z0PCA4j2E>UlY-t*{tz~{T1 z2~GXUQt!PO!e>1GJ>}VMfdk6ZmYdycWtg|Ya{JF>mUXkGzaMjzUpRNx9{s`@Or93k&^}i~9mwSJf738o*8hRbNA@)mG znx*P50(x4t#5JNMC9x#cD!C{XNHG{07#Zmr0+DHmfuWVDk(Ggkwt<0_fkCKsJ}-)f c-29Zxv`X9>RMM_*1ZrULboFyt=akR{0Q%XhLjV8( literal 0 HcmV?d00001 diff --git a/json_file1.txt b/json_file1.txt deleted file mode 100644 index 6ce0988..0000000 --- a/json_file1.txt +++ /dev/null @@ -1,109 +0,0 @@ -{ - "actions": { - "disallows": { - "resuming": true, - "skipping_prev": true - } - }, - "context": null, - "currently_playing_type": "track", - "device": { - "id": "3e20a2964c1151e118255b819e12e57836e32c1b", - "is_active": true, - "is_private_session": false, - "is_restricted": false, - "name": "SILVERHAND", - "type": "Computer", - "volume_percent": 20 - }, - "is_playing": true, - "item": { - "album": { - "album_type": "album", - "artists": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/2tIP7SsRs7vjIcLrU85W8J" - }, - "href": "https://api.spotify.com/v1/artists/2tIP7SsRs7vjIcLrU85W8J", - "id": "2tIP7SsRs7vjIcLrU85W8J", - "name": "The Kid LAROI", - "type": "artist", - "uri": "spotify:artist:2tIP7SsRs7vjIcLrU85W8J" - } - ], - "available_markets": [ - "AD", - "ZM", - "ZW" - ], - "external_urls": { - "spotify": "https://open.spotify.com/album/3YjfdLdpQcVI72uKhooZst" - }, - "href": "https://api.spotify.com/v1/albums/3YjfdLdpQcVI72uKhooZst", - "id": "3YjfdLdpQcVI72uKhooZst", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b273df16d539f508603bfb1efe02", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e02df16d539f508603bfb1efe02", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d00004851df16d539f508603bfb1efe02", - "width": 64 - } - ], - "name": "F*CK LOVE (SAVAGE)", - "release_date": "2020-11-06", - "release_date_precision": "day", - "total_tracks": 22, - "type": "album", - "uri": "spotify:album:3YjfdLdpQcVI72uKhooZst" - }, - "artists": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/2tIP7SsRs7vjIcLrU85W8J" - }, - "href": "https://api.spotify.com/v1/artists/2tIP7SsRs7vjIcLrU85W8J", - "id": "2tIP7SsRs7vjIcLrU85W8J", - "name": "The Kid LAROI", - "type": "artist", - "uri": "spotify:artist:2tIP7SsRs7vjIcLrU85W8J" - } - ], - "available_markets": [ - "AD", - "ZM", - "ZW" - ], - "disc_number": 1, - "duration_ms": 151704, - "explicit": true, - "external_ids": { - "isrc": "USSM12006583" - }, - "external_urls": { - "spotify": "https://open.spotify.com/track/3QCU8BT0zDS9LPVfEhRFEE" - }, - "href": "https://api.spotify.com/v1/tracks/3QCU8BT0zDS9LPVfEhRFEE", - "id": "3QCU8BT0zDS9LPVfEhRFEE", - "is_local": false, - "name": "ALWAYS DO", - "popularity": 71, - "preview_url": "https://p.scdn.co/mp3-preview/d5f01637c9840500d1434131f804a4cc184bd1e4?cid=69b82a34d0fb40be80b020eae8e80f25", - "track_number": 4, - "type": "track", - "uri": "spotify:track:3QCU8BT0zDS9LPVfEhRFEE" - }, - "progress_ms": 25688, - "repeat_state": "off", - "shuffle_state": true, - "timestamp": 1670714537726 -} \ No newline at end of file diff --git a/json_file2.txt b/json_file2.txt deleted file mode 100644 index 4e0e559..0000000 --- a/json_file2.txt +++ /dev/null @@ -1,184 +0,0 @@ -{ - "artists": { - "href": "https://api.spotify.com/v1/search?query=artist%3Amachine+gun+kelly&type=artist&offset=0&limit=10", - "items": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/6TIYQ3jFPwQSRmorSezPxX" - }, - "followers": { - "href": null, - "total": 4894771 - }, - "genres": [ - "ohio hip hop", - "pop", - "pop rap" - ], - "href": "https://api.spotify.com/v1/artists/6TIYQ3jFPwQSRmorSezPxX", - "id": "6TIYQ3jFPwQSRmorSezPxX", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab6761610000e5eb1fd54eb6e30d0bc8f633621e", - "width": 640 - }, - { - "height": 320, - "url": "https://i.scdn.co/image/ab676161000051741fd54eb6e30d0bc8f633621e", - "width": 320 - }, - { - "height": 160, - "url": "https://i.scdn.co/image/ab6761610000f1781fd54eb6e30d0bc8f633621e", - "width": 160 - } - ], - "name": "Machine Gun Kelly", - "popularity": 80, - "type": "artist", - "uri": "spotify:artist:6TIYQ3jFPwQSRmorSezPxX" - }, - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/1lP7f2evgtQcghRmqkPb3j" - }, - "followers": { - "href": null, - "total": 686 - }, - "genres": [], - "href": "https://api.spotify.com/v1/artists/1lP7f2evgtQcghRmqkPb3j", - "id": "1lP7f2evgtQcghRmqkPb3j", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b2734f88aa4c73f3017a3e21d9d4", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e024f88aa4c73f3017a3e21d9d4", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d000048514f88aa4c73f3017a3e21d9d4", - "width": 64 - } - ], - "name": "Machine Gun Kelly", - "popularity": 1, - "type": "artist", - "uri": "spotify:artist:1lP7f2evgtQcghRmqkPb3j" - }, - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/4VPvSWeZ4gpl80xJBJ4Dsh" - }, - "followers": { - "href": null, - "total": 2473 - }, - "genres": [ - "swedish hard rock" - ], - "href": "https://api.spotify.com/v1/artists/4VPvSWeZ4gpl80xJBJ4Dsh", - "id": "4VPvSWeZ4gpl80xJBJ4Dsh", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b273bed51eb447e0d2c2fcd5d80f", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e02bed51eb447e0d2c2fcd5d80f", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d00004851bed51eb447e0d2c2fcd5d80f", - "width": 64 - } - ], - "name": "MachineGun Kelly", - "popularity": 19, - "type": "artist", - "uri": "spotify:artist:4VPvSWeZ4gpl80xJBJ4Dsh" - }, - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/05m0YksOWOcA4yJ32hqNui" - }, - "followers": { - "href": null, - "total": 340 - }, - "genres": [], - "href": "https://api.spotify.com/v1/artists/05m0YksOWOcA4yJ32hqNui", - "id": "05m0YksOWOcA4yJ32hqNui", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b2736fa54a23a30401c989fd5fa7", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e026fa54a23a30401c989fd5fa7", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d000048516fa54a23a30401c989fd5fa7", - "width": 64 - } - ], - "name": "Machine Gun Kelly", - "popularity": 0, - "type": "artist", - "uri": "spotify:artist:05m0YksOWOcA4yJ32hqNui" - }, - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/3I5tJ05CH0HiK1PCw3vqOS" - }, - "followers": { - "href": null, - "total": 847 - }, - "genres": [], - "href": "https://api.spotify.com/v1/artists/3I5tJ05CH0HiK1PCw3vqOS", - "id": "3I5tJ05CH0HiK1PCw3vqOS", - "images": [], - "name": "Machine Gun Kelly & Ray Jr.", - "popularity": 4, - "type": "artist", - "uri": "spotify:artist:3I5tJ05CH0HiK1PCw3vqOS" - }, - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/1DKkR55mGDMlx2bASVW4iq" - }, - "followers": { - "href": null, - "total": 26 - }, - "genres": [], - "href": "https://api.spotify.com/v1/artists/1DKkR55mGDMlx2bASVW4iq", - "id": "1DKkR55mGDMlx2bASVW4iq", - "images": [], - "name": "Machine Gunn Kelly", - "popularity": 0, - "type": "artist", - "uri": "spotify:artist:1DKkR55mGDMlx2bASVW4iq" - } - ], - "limit": 10, - "next": null, - "offset": 0, - "previous": null, - "total": 6 - } -} \ No newline at end of file diff --git a/json_file3.txt b/json_file3.txt deleted file mode 100644 index b7487d9..0000000 --- a/json_file3.txt +++ /dev/null @@ -1,404 +0,0 @@ -{ - "albums": { - "href": "https://api.spotify.com/v1/search?query=machine+gun+kelly&type=album&market=US&offset=0&limit=2", - "items": [ - { - "album_type": "album", - "artists": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/6TIYQ3jFPwQSRmorSezPxX" - }, - "href": "https://api.spotify.com/v1/artists/6TIYQ3jFPwQSRmorSezPxX", - "id": "6TIYQ3jFPwQSRmorSezPxX", - "name": "Machine Gun Kelly", - "type": "artist", - "uri": "spotify:artist:6TIYQ3jFPwQSRmorSezPxX" - } - ], - "external_urls": { - "spotify": "https://open.spotify.com/album/3sKZHtQoq3tPtkXbT8PJAc" - }, - "href": "https://api.spotify.com/v1/albums/3sKZHtQoq3tPtkXbT8PJAc", - "id": "3sKZHtQoq3tPtkXbT8PJAc", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b273b4683d9ac3c5f14a71523c84", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e02b4683d9ac3c5f14a71523c84", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d00004851b4683d9ac3c5f14a71523c84", - "width": 64 - } - ], - "name": "mainstream sellout", - "release_date": "2022-03-25", - "release_date_precision": "day", - "total_tracks": 16, - "type": "album", - "uri": "spotify:album:3sKZHtQoq3tPtkXbT8PJAc" - }, - { - "album_type": "album", - "artists": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/6TIYQ3jFPwQSRmorSezPxX" - }, - "href": "https://api.spotify.com/v1/artists/6TIYQ3jFPwQSRmorSezPxX", - "id": "6TIYQ3jFPwQSRmorSezPxX", - "name": "Machine Gun Kelly", - "type": "artist", - "uri": "spotify:artist:6TIYQ3jFPwQSRmorSezPxX" - } - ], - "external_urls": { - "spotify": "https://open.spotify.com/album/57lgFncHBYu5E3igZnuCJK" - }, - "href": "https://api.spotify.com/v1/albums/57lgFncHBYu5E3igZnuCJK", - "id": "57lgFncHBYu5E3igZnuCJK", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b273d4d4929a3a86fe2f9fadbd42", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e02d4d4929a3a86fe2f9fadbd42", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d00004851d4d4929a3a86fe2f9fadbd42", - "width": 64 - } - ], - "name": "Tickets To My Downfall", - "release_date": "2020-09-25", - "release_date_precision": "day", - "total_tracks": 15, - "type": "album", - "uri": "spotify:album:57lgFncHBYu5E3igZnuCJK" - } - ], - "limit": 2, - "next": "https://api.spotify.com/v1/search?query=machine+gun+kelly&type=album&market=US&offset=2&limit=2", - "offset": 0, - "previous": null, - "total": 532 - }, - "artists": { - "href": "https://api.spotify.com/v1/search?query=machine+gun+kelly&type=artist&market=US&offset=0&limit=2", - "items": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/6TIYQ3jFPwQSRmorSezPxX" - }, - "followers": { - "href": null, - "total": 4894771 - }, - "genres": [ - "ohio hip hop", - "pop", - "pop rap" - ], - "href": "https://api.spotify.com/v1/artists/6TIYQ3jFPwQSRmorSezPxX", - "id": "6TIYQ3jFPwQSRmorSezPxX", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab6761610000e5eb1fd54eb6e30d0bc8f633621e", - "width": 640 - }, - { - "height": 320, - "url": "https://i.scdn.co/image/ab676161000051741fd54eb6e30d0bc8f633621e", - "width": 320 - }, - { - "height": 160, - "url": "https://i.scdn.co/image/ab6761610000f1781fd54eb6e30d0bc8f633621e", - "width": 160 - } - ], - "name": "Machine Gun Kelly", - "popularity": 80, - "type": "artist", - "uri": "spotify:artist:6TIYQ3jFPwQSRmorSezPxX" - }, - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/4VPvSWeZ4gpl80xJBJ4Dsh" - }, - "followers": { - "href": null, - "total": 2473 - }, - "genres": [ - "swedish hard rock" - ], - "href": "https://api.spotify.com/v1/artists/4VPvSWeZ4gpl80xJBJ4Dsh", - "id": "4VPvSWeZ4gpl80xJBJ4Dsh", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b273bed51eb447e0d2c2fcd5d80f", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e02bed51eb447e0d2c2fcd5d80f", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d00004851bed51eb447e0d2c2fcd5d80f", - "width": 64 - } - ], - "name": "MachineGun Kelly", - "popularity": 19, - "type": "artist", - "uri": "spotify:artist:4VPvSWeZ4gpl80xJBJ4Dsh" - } - ], - "limit": 2, - "next": "https://api.spotify.com/v1/search?query=machine+gun+kelly&type=artist&market=US&offset=2&limit=2", - "offset": 0, - "previous": null, - "total": 25 - }, - "playlists": { - "href": "https://api.spotify.com/v1/search?query=machine+gun+kelly&type=playlist&market=US&offset=0&limit=2", - "items": [ - { - "collaborative": false, - "description": "", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/51UkIAIWZwzn0pav4LTixC" - }, - "href": "https://api.spotify.com/v1/playlists/51UkIAIWZwzn0pav4LTixC", - "id": "51UkIAIWZwzn0pav4LTixC", - "images": [ - { - "height": null, - "url": "https://i.scdn.co/image/ab67706c0000bebb4cba5729c734756bc3171e8f", - "width": null - } - ], - "name": "Machine Gun Kelly: Best Of", - "owner": { - "display_name": "MGK", - "external_urls": { - "spotify": "https://open.spotify.com/user/machinegunkellyak" - }, - "href": "https://api.spotify.com/v1/users/machinegunkellyak", - "id": "machinegunkellyak", - "type": "user", - "uri": "spotify:user:machinegunkellyak" - }, - "primary_color": null, - "public": null, - "snapshot_id": "MzAzLDJiNjNhMjBlMjA2OTA1NDJhNTMwMTk5ZDFjMmVhMTc0ZDA5ZmJmZWM=", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/51UkIAIWZwzn0pav4LTixC/tracks", - "total": 125 - }, - "type": "playlist", - "uri": "spotify:playlist:51UkIAIWZwzn0pav4LTixC" - }, - { - "collaborative": false, - "description": "This is Machine Gun Kelly. The essential tracks, all in one playlist.", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/37i9dQZF1DZ06evO44TgnC" - }, - "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DZ06evO44TgnC", - "id": "37i9dQZF1DZ06evO44TgnC", - "images": [ - { - "height": null, - "url": "https://thisis-images.scdn.co/37i9dQZF1DZ06evO44TgnC-large.jpg", - "width": null - } - ], - "name": "This Is Machine Gun Kelly", - "owner": { - "display_name": "Spotify", - "external_urls": { - "spotify": "https://open.spotify.com/user/spotify" - }, - "href": "https://api.spotify.com/v1/users/spotify", - "id": "spotify", - "type": "user", - "uri": "spotify:user:spotify" - }, - "primary_color": null, - "public": null, - "snapshot_id": "Mjc4NDQ5MDIsMDAwMDAwMDAxYWFhZTljYTZlM2U5NzYzZjVkMDBmMjg3M2JlYzQ4MQ==", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DZ06evO44TgnC/tracks", - "total": 48 - }, - "type": "playlist", - "uri": "spotify:playlist:37i9dQZF1DZ06evO44TgnC" - } - ], - "limit": 2, - "next": "https://api.spotify.com/v1/search?query=machine+gun+kelly&type=playlist&market=US&offset=2&limit=2", - "offset": 0, - "previous": null, - "total": 3793 - }, - "tracks": { - "href": "https://api.spotify.com/v1/search?query=machine+gun+kelly&type=track&market=US&offset=0&limit=2", - "items": [ - { - "album": { - "album_type": "album", - "artists": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/6TIYQ3jFPwQSRmorSezPxX" - }, - "href": "https://api.spotify.com/v1/artists/6TIYQ3jFPwQSRmorSezPxX", - "id": "6TIYQ3jFPwQSRmorSezPxX", - "name": "Machine Gun Kelly", - "type": "artist", - "uri": "spotify:artist:6TIYQ3jFPwQSRmorSezPxX" - } - ], - "external_urls": { - "spotify": "https://open.spotify.com/album/57lgFncHBYu5E3igZnuCJK" - }, - "href": "https://api.spotify.com/v1/albums/57lgFncHBYu5E3igZnuCJK", - "id": "57lgFncHBYu5E3igZnuCJK", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b273d4d4929a3a86fe2f9fadbd42", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e02d4d4929a3a86fe2f9fadbd42", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d00004851d4d4929a3a86fe2f9fadbd42", - "width": 64 - } - ], - "name": "Tickets To My Downfall", - "release_date": "2020-09-25", - "release_date_precision": "day", - "total_tracks": 15, - "type": "album", - "uri": "spotify:album:57lgFncHBYu5E3igZnuCJK" - }, - "artists": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/6TIYQ3jFPwQSRmorSezPxX" - }, - "href": "https://api.spotify.com/v1/artists/6TIYQ3jFPwQSRmorSezPxX", - "id": "6TIYQ3jFPwQSRmorSezPxX", - "name": "Machine Gun Kelly", - "type": "artist", - "uri": "spotify:artist:6TIYQ3jFPwQSRmorSezPxX" - }, - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/2cFrymmkijnjDg9SS92EPM" - }, - "href": "https://api.spotify.com/v1/artists/2cFrymmkijnjDg9SS92EPM", - "id": "2cFrymmkijnjDg9SS92EPM", - "name": "blackbear", - "type": "artist", - "uri": "spotify:artist:2cFrymmkijnjDg9SS92EPM" - } - ], - "disc_number": 1, - "duration_ms": 139460, - "explicit": true, - "external_ids": { - "isrc": "USUM72014730" - }, - "external_urls": { - "spotify": "https://open.spotify.com/track/7kDUspsoYfLkWnZR7qwHZl" - }, - "href": "https://api.spotify.com/v1/tracks/7kDUspsoYfLkWnZR7qwHZl", - "id": "7kDUspsoYfLkWnZR7qwHZl", - "is_local": false, - "is_playable": true, - "name": "my ex's best friend (with blackbear)", - "popularity": 78, - "preview_url": null, - "track_number": 11, - "type": "track", - "uri": "spotify:track:7kDUspsoYfLkWnZR7qwHZl" - }, - { - "album": { - "album_type": "album", - "artists": [ - { - "external_urls": { - "spotify": "https://open.spotify.com/artist/6TIYQ3jFPwQSRmorSezPxX" - }, - "href": "https://api.spotify.com/v1/artists/6TIYQ3jFPwQSRmorSezPxX", - "id": "6TIYQ3jFPwQSRmorSezPxX", - "name": "Machine Gun Kelly", - "type": "artist", - "uri": "spotify:artist:6TIYQ3jFPwQSRmorSezPxX" - } - ], - "external_urls": { - "spotify": "https://open.spotify.com/album/5NzdnPboXcqvuvyEH1wSEJ" - }, - "href": "https://api.spotify.com/v1/albums/5NzdnPboXcqvuvyEH1wSEJ", - "id": "5NzdnPboXcqvuvyEH1wSEJ", - "images": [ - { - "height": 640, - "url": "https://i.scdn.co/image/ab67616d0000b273a57d3a2736f815d3cf358e37", - "width": 640 - }, - { - "height": 300, - "url": "https://i.scdn.co/image/ab67616d00001e02a57d3a2736f815d3cf358e37", - "width": 300 - }, - { - "height": 64, - "url": "https://i.scdn.co/image/ab67616d00004851a57d3a2736f815d3cf358e37", - "width": 64 - } - ], - "name": "Lace Up (Deluxe)", - "release_date": "2012-01-01", - "release_date_precision": "day", - "total_tracks": 16, - "type": "album", - "uri": "spotify:album:5NzdnPboXcqvuvyEH1wSEJ" - }, - "artists": [ - } - ], - "limit": 2, - "next": "https://api.spotify.com/v1/search?query=machine+gun+kelly&type=track&market=US&offset=2&limit=2", - "offset": 0, - "previous": null, - "total": 2563 - } -} \ No newline at end of file diff --git a/json_file4.txt b/json_file4.txt deleted file mode 100644 index db66f3f..0000000 --- a/json_file4.txt +++ /dev/null @@ -1,402 +0,0 @@ -{ - "playlists": { - "href": "https://api.spotify.com/v1/search?query=playlist%3Arap&type=playlist&offset=0&limit=10", - "items": [ - { - "collaborative": false, - "description": "", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/6jkyRflychhI50Lcv9TCfr" - }, - "href": "https://api.spotify.com/v1/playlists/6jkyRflychhI50Lcv9TCfr", - "id": "6jkyRflychhI50Lcv9TCfr", - "images": [ - { - "height": 640, - "url": "https://mosaic.scdn.co/640/ab67616d0000b273419cedff7b313b962a93932eab67616d0000b273bba7cfaf7c59ff0898acba1fab67616d0000b273ce159a3ba2096e13fa9d4b4cab67616d0000b273e31a279d267f3b3d8912e6f1", - "width": 640 - }, - { - "height": 300, - "url": "https://mosaic.scdn.co/300/ab67616d0000b273419cedff7b313b962a93932eab67616d0000b273bba7cfaf7c59ff0898acba1fab67616d0000b273ce159a3ba2096e13fa9d4b4cab67616d0000b273e31a279d267f3b3d8912e6f1", - "width": 300 - }, - { - "height": 60, - "url": "https://mosaic.scdn.co/60/ab67616d0000b273419cedff7b313b962a93932eab67616d0000b273bba7cfaf7c59ff0898acba1fab67616d0000b273ce159a3ba2096e13fa9d4b4cab67616d0000b273e31a279d267f3b3d8912e6f1", - "width": 60 - } - ], - "name": "Playlist Rap us Chill \ud83c\uddfa\ud83c\uddf8", - "owner": { - "display_name": "Pierre-Louis Drouelle", - "external_urls": { - "spotify": "https://open.spotify.com/user/21x6ai6t5q6udgg3hx45fxmay" - }, - "href": "https://api.spotify.com/v1/users/21x6ai6t5q6udgg3hx45fxmay", - "id": "21x6ai6t5q6udgg3hx45fxmay", - "type": "user", - "uri": "spotify:user:21x6ai6t5q6udgg3hx45fxmay" - }, - "primary_color": null, - "public": null, - "snapshot_id": "MzgsYWQwMzNmZTdmNjVkZjYxZDRmOWQ0ZTgwOGFiMWE3OTY4ZGFjYTdhOQ==", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/6jkyRflychhI50Lcv9TCfr/tracks", - "total": 37 - }, - "type": "playlist", - "uri": "spotify:playlist:6jkyRflychhI50Lcv9TCfr" - }, - { - "collaborative": false, - "description": "Les classiques et les nouveaut\u00e9s du Rap FR ! Photo : Orelsan Contact, insta : @lerapenfrance", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/2kZm59MItcYXMO0RMtTTjd" - }, - "href": "https://api.spotify.com/v1/playlists/2kZm59MItcYXMO0RMtTTjd", - "id": "2kZm59MItcYXMO0RMtTTjd", - "images": [ - { - "height": null, - "url": "https://i.scdn.co/image/ab67706c0000bebbca81a1f3a58ab3893bced31d", - "width": null - } - ], - "name": "Playlist Rap Francais 2022", - "owner": { - "display_name": "LeRapEnFrance", - "external_urls": { - "spotify": "https://open.spotify.com/user/math.vecchioni-fr" - }, - "href": "https://api.spotify.com/v1/users/math.vecchioni-fr", - "id": "math.vecchioni-fr", - "type": "user", - "uri": "spotify:user:math.vecchioni-fr" - }, - "primary_color": null, - "public": null, - "snapshot_id": "NjU5NSw0NGMwOGQwOTIyMDYyZWNjYmUwOGVkYzRlNjllZTdiOTkwMDQxM2Vl", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/2kZm59MItcYXMO0RMtTTjd/tracks", - "total": 85 - }, - "type": "playlist", - "uri": "spotify:playlist:2kZm59MItcYXMO0RMtTTjd" - }, - { - "collaborative": false, - "description": "", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/7HFibvUcJL4V1ixYYsGK8J" - }, - "href": "https://api.spotify.com/v1/playlists/7HFibvUcJL4V1ixYYsGK8J", - "id": "7HFibvUcJL4V1ixYYsGK8J", - "images": [ - { - "height": 640, - "url": "https://mosaic.scdn.co/640/ab67616d0000b27336f15d38804d5bdd29b9fc7aab67616d0000b27341b41e6f7924e530a9b00f9cab67616d0000b273ce159a3ba2096e13fa9d4b4cab67616d0000b273f54b99bf27cda88f4a7403ce", - "width": 640 - }, - { - "height": 300, - "url": "https://mosaic.scdn.co/300/ab67616d0000b27336f15d38804d5bdd29b9fc7aab67616d0000b27341b41e6f7924e530a9b00f9cab67616d0000b273ce159a3ba2096e13fa9d4b4cab67616d0000b273f54b99bf27cda88f4a7403ce", - "width": 300 - }, - { - "height": 60, - "url": "https://mosaic.scdn.co/60/ab67616d0000b27336f15d38804d5bdd29b9fc7aab67616d0000b27341b41e6f7924e530a9b00f9cab67616d0000b273ce159a3ba2096e13fa9d4b4cab67616d0000b273f54b99bf27cda88f4a7403ce", - "width": 60 - } - ], - "name": "", - "owner": { - "display_name": "Jakedorworth", - "external_urls": { - "spotify": "https://open.spotify.com/user/toxicsnouis" - }, - "href": "https://api.spotify.com/v1/users/toxicsnouis", - "id": "toxicsnouis", - "type": "user", - "uri": "spotify:user:toxicsnouis" - }, - "primary_color": null, - "public": null, - "snapshot_id": "NjExLDI2OTFjNjYxMmJiOWYzZGQ1NzRhMDJjNDE4MDliOWRiYmM2YjlmODY=", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/7HFibvUcJL4V1ixYYsGK8J/tracks", - "total": 487 - }, - "type": "playlist", - "uri": "spotify:playlist:7HFibvUcJL4V1ixYYsGK8J" - }, - { - "collaborative": false, - "description": "", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/3aUN9KuF9Ce87BXdL86MVI" - }, - "href": "https://api.spotify.com/v1/playlists/3aUN9KuF9Ce87BXdL86MVI", - "id": "3aUN9KuF9Ce87BXdL86MVI", - "images": [ - { - "height": null, - "url": "https://i.scdn.co/image/ab67706c0000bebb72951219c5e1ef0daad297d4", - "width": null - } - ], - "name": "Playlist rap triste ", - "owner": { - "display_name": "bastien lefel", - "external_urls": { - "spotify": "https://open.spotify.com/user/8bu7sbzpe1qn67adebtn65lgn" - }, - "href": "https://api.spotify.com/v1/users/8bu7sbzpe1qn67adebtn65lgn", - "id": "8bu7sbzpe1qn67adebtn65lgn", - "type": "user", - "uri": "spotify:user:8bu7sbzpe1qn67adebtn65lgn" - }, - "primary_color": null, - "public": null, - "snapshot_id": "Mjg4LGI3YmMyMWRlMzI2ZjJiZDA1MTYyMzVlNTE3NjdlNGE2YTQ3YzFhMWY=", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/3aUN9KuF9Ce87BXdL86MVI/tracks", - "total": 243 - }, - "type": "playlist", - "uri": "spotify:playlist:3aUN9KuF9Ce87BXdL86MVI" - }, - { - "collaborative": false, - "description": "You can also find us with: top country rap songs - cowboy rap music - country rap songs - best country rap songs - country rap music - top country rap songs 2022 - cowboy rap song - rap country - country rap 2022 - best country rap songs 2022 - country rap songs 2022 - country rap - rap country 2022", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/25GMAkhuPpZvT2UqNp1G04" - }, - "href": "https://api.spotify.com/v1/playlists/25GMAkhuPpZvT2UqNp1G04", - "id": "25GMAkhuPpZvT2UqNp1G04", - "images": [ - { - "height": null, - "url": "https://i.scdn.co/image/ab67706c0000bebb341e17482a0f26650e4645a9", - "width": null - } - ], - "name": "Country Rap 2022 - Best Country Rap Songs 2022 Playlist (Cowboy Rap Music Hits)", - "owner": { - "display_name": "Redlist Playlists", - "external_urls": { - "spotify": "https://open.spotify.com/user/7bntwjdswpqhrnqr0gssydbd0" - }, - "href": "https://api.spotify.com/v1/users/7bntwjdswpqhrnqr0gssydbd0", - "id": "7bntwjdswpqhrnqr0gssydbd0", - "type": "user", - "uri": "spotify:user:7bntwjdswpqhrnqr0gssydbd0" - }, - "primary_color": null, - "public": null, - "snapshot_id": "MjA5NSwyNmYyZjZmNjViNGIyZTJhYzdlMDA0OWMzZWNmMDUzZDM1ZTg5MTQ0", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/25GMAkhuPpZvT2UqNp1G04/tracks", - "total": 40 - }, - "type": "playlist", - "uri": "spotify:playlist:25GMAkhuPpZvT2UqNp1G04" - }, - { - "collaborative": false, - "description": "HOTTEST HIP HOP BANGERS \ud83d\udd25 BEST INDIE RAP - BEST RAP PLAYLIST 2022 - HIP HOP 2022", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/6cqAN7tZC8eUY3862EYnUK" - }, - "href": "https://api.spotify.com/v1/playlists/6cqAN7tZC8eUY3862EYnUK", - "id": "6cqAN7tZC8eUY3862EYnUK", - "images": [ - { - "height": null, - "url": "https://i.scdn.co/image/ab67706c0000bebb90dd7bab8ab72f66406f6574", - "width": null - } - ], - "name": "Best Rap Playlist 2022 \ud83d\udd25 Hip Hop 2022 \ud83d\udd25 Best Rap Hits 2022 / Hip Hop Hits 2022 / Rap Playlist", - "owner": { - "display_name": "LABYRINTH RECORDS", - "external_urls": { - "spotify": "https://open.spotify.com/user/7wbrcexsh97eqgo8wyk3be4zi" - }, - "href": "https://api.spotify.com/v1/users/7wbrcexsh97eqgo8wyk3be4zi", - "id": "7wbrcexsh97eqgo8wyk3be4zi", - "type": "user", - "uri": "spotify:user:7wbrcexsh97eqgo8wyk3be4zi" - }, - "primary_color": null, - "public": null, - "snapshot_id": "NzM2NCw5NTI1MWE0YTZhYmIxOTVjY2I1Y2U4MGEzODJiYjYxNDcxOTAzZWU5", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/6cqAN7tZC8eUY3862EYnUK/tracks", - "total": 310 - }, - "type": "playlist", - "uri": "spotify:playlist:6cqAN7tZC8eUY3862EYnUK" - }, - { - "collaborative": false, - "description": "", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/4ERLnbsHKTjKRJjLuPjr8g" - }, - "href": "https://api.spotify.com/v1/playlists/4ERLnbsHKTjKRJjLuPjr8g", - "id": "4ERLnbsHKTjKRJjLuPjr8g", - "images": [ - { - "height": 640, - "url": "https://mosaic.scdn.co/640/ab67616d0000b2734ad6e5838f15401ff7d62856ab67616d0000b2739b19c107109de740bad72df5ab67616d0000b273f7f74100d5cc850e01172cbfab67616d0000b273fe3cf32b1320e8ded39d8c74", - "width": 640 - }, - { - "height": 300, - "url": "https://mosaic.scdn.co/300/ab67616d0000b2734ad6e5838f15401ff7d62856ab67616d0000b2739b19c107109de740bad72df5ab67616d0000b273f7f74100d5cc850e01172cbfab67616d0000b273fe3cf32b1320e8ded39d8c74", - "width": 300 - }, - { - "height": 60, - "url": "https://mosaic.scdn.co/60/ab67616d0000b2734ad6e5838f15401ff7d62856ab67616d0000b2739b19c107109de740bad72df5ab67616d0000b273f7f74100d5cc850e01172cbfab67616d0000b273fe3cf32b1320e8ded39d8c74", - "width": 60 - } - ], - "name": "Playlist rap us 2000", - "owner": { - "display_name": "Ade.bltr", - "external_urls": { - "spotify": "https://open.spotify.com/user/8mntv4fukzl27b86nl85t66sf" - }, - "href": "https://api.spotify.com/v1/users/8mntv4fukzl27b86nl85t66sf", - "id": "8mntv4fukzl27b86nl85t66sf", - "type": "user", - "uri": "spotify:user:8mntv4fukzl27b86nl85t66sf" - }, - "primary_color": null, - "public": null, - "snapshot_id": "OTYsY2U5ZDkzYzY1ODM4NGFlMzE1MzdmZGM0ZDk1NzA1OGI1NzkwOGMyZA==", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/4ERLnbsHKTjKRJjLuPjr8g/tracks", - "total": 95 - }, - "type": "playlist", - "uri": "spotify:playlist:4ERLnbsHKTjKRJjLuPjr8g" - }, - { - "collaborative": false, - "description": "Game time", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/2ms4lv3Kl23tXdC0O8F0ZW" - }, - "href": "https://api.spotify.com/v1/playlists/2ms4lv3Kl23tXdC0O8F0ZW", - "id": "2ms4lv3Kl23tXdC0O8F0ZW", - "images": [ - { - "height": null, - "url": "https://i.scdn.co/image/ab67706c0000bebbe28d1988febe51f64b4493bc", - "width": null - } - ], - "name": "Gym Workout Rap Playlist ", - "owner": { - "display_name": "Jayden", - "external_urls": { - "spotify": "https://open.spotify.com/user/31xjko2hitivryhl3xm7afsntbdu" - }, - "href": "https://api.spotify.com/v1/users/31xjko2hitivryhl3xm7afsntbdu", - "id": "31xjko2hitivryhl3xm7afsntbdu", - "type": "user", - "uri": "spotify:user:31xjko2hitivryhl3xm7afsntbdu" - }, - "primary_color": null, - "public": null, - "snapshot_id": "MjUzLGJhZjMyODEwOWIxMDY2OGVjOTQ5Y2VhMTg3NThjNzkyZDc3MGNlNTU=", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/2ms4lv3Kl23tXdC0O8F0ZW/tracks", - "total": 619 - }, - "type": "playlist", - "uri": "spotify:playlist:2ms4lv3Kl23tXdC0O8F0ZW" - }, - { - "collaborative": false, - "description": "Curating Christian Rap culture. Tap the \ud83d\udc9a to follow! The Rapzilla Playlist is the hottest new songs in Christian Hip Hop. Follow our New Songs Daily Playlist also. Cover Artists: DJ Mykael V & 1995", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/4UoWnawInXuG6Z8iyi2YAs" - }, - "href": "https://api.spotify.com/v1/playlists/4UoWnawInXuG6Z8iyi2YAs", - "id": "4UoWnawInXuG6Z8iyi2YAs", - "images": [ - { - "height": null, - "url": "https://i.scdn.co/image/ab67706c0000bebb10306e9bf3961142807c6c4e", - "width": null - } - ], - "name": "Christian Rap - The Rapzilla Playlist", - "owner": { - "display_name": "Rapzilla.com", - "external_urls": { - "spotify": "https://open.spotify.com/user/rapzilla.com" - }, - "href": "https://api.spotify.com/v1/users/rapzilla.com", - "id": "rapzilla.com", - "type": "user", - "uri": "spotify:user:rapzilla.com" - }, - "primary_color": null, - "public": null, - "snapshot_id": "ODQ2OSwwNDQ1ZDQxZDZmNTdiM2I2ODZlMWI3OWVlY2Q5ZTJlMzM3NTJhMjJl", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/4UoWnawInXuG6Z8iyi2YAs/tracks", - "total": 97 - }, - "type": "playlist", - "uri": "spotify:playlist:4UoWnawInXuG6Z8iyi2YAs" - }, - { - "collaborative": false, - "description": "Damn son, where'd ya find this? Cover: MOUNT WESTMORE", - "external_urls": { - "spotify": "https://open.spotify.com/playlist/37i9dQZF1DX3XgesiUXnsq" - }, - "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX3XgesiUXnsq", - "id": "37i9dQZF1DX3XgesiUXnsq", - "images": [ - { - "height": null, - "url": "https://i.scdn.co/image/ab67706f00000003186ba85b84fc0c0af0ceec24", - "width": null - } - ], - "name": "Raw & Uncut", - "owner": { - "display_name": "Spotify", - "external_urls": { - "spotify": "https://open.spotify.com/user/spotify" - }, - "href": "https://api.spotify.com/v1/users/spotify", - "id": "spotify", - "type": "user", - "uri": "spotify:user:spotify" - }, - "primary_color": null, - "public": null, - "snapshot_id": "MTY3MDU2MjAwMCwwMDAwMDAwMDI1OTFhZjdiZDVhNzIyOTE5ZjY2Mjg4OWYzMzZiMzRl", - "tracks": { - "href": "https://api.spotify.com/v1/playlists/37i9dQZF1DX3XgesiUXnsq/tracks", - "total": 100 - }, - "type": "playlist", - "uri": "spotify:playlist:37i9dQZF1DX3XgesiUXnsq" - } - ], - "limit": 10, - "next": "https://api.spotify.com/v1/search?query=playlist%3Arap&type=playlist&offset=10&limit=10", - "offset": 0, - "previous": null, - "total": 20017 - } -} \ No newline at end of file diff --git a/json_file5.txt b/json_file5.txt deleted file mode 100644 index e69de29..0000000 diff --git a/json_file6.txt b/json_file6.txt deleted file mode 100644 index e69de29..0000000 diff --git a/librespot_example.py b/librespot_example.py deleted file mode 100644 index 6489c0a..0000000 --- a/librespot_example.py +++ /dev/null @@ -1,121 +0,0 @@ -import os -import re -import socket -import threading - -from librespot.audio.decoders import AudioQuality, VorbisOnlyAudioQuality -from librespot.core import Session -from librespot.metadata import TrackId - -session: Session -sock: socket - - -def handler(client: socket.socket, address: str): - req_raw = client.recv(1024 * 1024) - if len(req_raw) == 0: - return - req_arr = req_raw.split(b"\r\n") - req_http_raw = req_arr[0] - req_header_str = req_raw.split(b"\r\n\r\n")[0] - req_body_str = req_raw.split(b"\r\n\r\n")[1] - req_http_arr = req_http_raw.split(b" ") - req_method = req_http_arr[0] - req_uri = req_http_arr[1] - req_http_version = req_http_arr[2] - req_header = {} - for header in req_header_str.split(b"\r\n"): - try: - key, value = header.split(b": ") - except ValueError: - continue - else: - req_header[key.decode().lower()] = value.decode() - status, headers, content, manually = response(client, req_uri.decode(), - req_header, req_body_str) - if not manually: - client.send(req_http_version + b" " + status.encode() + b"\r\n") - client.send(b"Access-Control-Allow-Origin: *\r\n") - for header in headers: - client.send(header.encode() + "\r\n") - client.send(b"\r\n") - client.send(content) - client.close() - - -class HttpCode: - http_200 = "200 OK" - http_204 = "204 No Content" - http_400 = "400 Bad Request" - http_403 = "403 Forbidden" - http_404 = "404 Not Found" - http_500 = "500 Internal Server Error" - - -def main(): - global session, sock - session = None - if os.path.isfile("credentials.json"): - try: - session = Session.Builder().stored_file().create() - except RuntimeError: - pass - if session is None or not session.is_valid(): - username = input("Username: ") - password = input("Password: ") - session = Session.Builder().user_pass(username, password).create() - if not session.is_valid(): - return - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.bind(("127.0.0.1", 8080)) - sock.listen(5) - while True: - threading.Thread(target=handler, args=sock.accept()).start() - - -def response(client: socket.socket, uri: str, header: dict, - body: bytes) -> tuple[str, list, bytes, bool]: - if re.search(r"^/audio/track/([0-9a-zA-Z]{22})$", uri) is not None: - track_id_search = re.search( - r"^/audio/track/(?P[0-9a-zA-Z]{22})$", uri) - track_id_str = track_id_search.group("TrackID") - track_id = TrackId.from_base62(track_id_str) - stream = session.content_feeder().load( - track_id, VorbisOnlyAudioQuality(AudioQuality.VERY_HIGH), False, - None) - start = 0 - end = stream.input_stream.stream().size() - if header.get("range") is not None: - range_search = re.search( - "^bytes=(?P[0-9]+?)-(?P[0-9]+?)$", - header.get("range")) - if range_search is not None: - start = int(range_search.group("start")) - end = (int(range_search.group("end")) - if int(range_search.group("end")) <= - stream.input_stream.stream().size() else - stream.input_stream.stream().size()) - stream.input_stream.stream().skip(start) - client.send(b"HTTP/1.0 200 OK\r\n") - client.send(b"Access-Control-Allow-Origin: *\r\n") - client.send(b"Content-Length: " + - (str(stream.input_stream.stream().size()).encode() if - stream.input_stream.stream().size() == end else "{}-{}/{}" - .format(start, end, - stream.input_stream.stream().size()).encode()) + - b"\r\n") - client.send(b"Content-Type: audio/ogg\r\n") - client.send(b"\r\n") - while True: - if (stream.input_stream.stream().pos() >= - stream.input_stream.stream().size()): - break - byte = stream.input_stream.stream().read(1) - client.send(byte) - return "", [], b"", True - else: - return HttpCode.http_404, [], HttpCode.http_404.encode(), False - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/program.py b/program.py index 63fb6c6..7113c19 100644 --- a/program.py +++ b/program.py @@ -39,6 +39,8 @@ spotify = spotipy.Spotify(auth=token) root = ttk.Tk() root.title("Media Controller") root.attributes("-topmost", True) +root.overrideredirect(1) +# root.geometry("380x160") sv_ttk.use_dark_theme() @@ -47,10 +49,14 @@ sv_ttk.use_dark_theme() # Function to call the Spotify API to play the current track def play(): + play_button.grid_forget() + pause_button.grid(row=0, column=1) spotify.start_playback() # Function to call the Spotify API to pause the current track def pause(): + pause_button.grid_forget() + play_button.grid(row=0, column=1) spotify.pause_playback() def next(): @@ -140,21 +146,27 @@ def hide_devices(): # audio_analysis_label.config(text=audio_analysis) -# frame = tk.Frame(root) -# frame2 = tk.Frame(root) +play_img = ttk.PhotoImage(file="icons/play-circle.png") +pause_img = ttk.PhotoImage(file="icons/pause-circle.png") +next_img = ttk.PhotoImage(file="icons/skip-next.png") +previous_img = ttk.PhotoImage(file="icons/skip-previous.png") + + +frame_artist_song = tk.Frame(root) +frame_controls = tk.Frame(root) # Create the media control buttons and a text label -play_button = tk.Button(root, text="Play", command=play) -pause_button = tk.Button(root, text="Pause", command=pause) -next_button = tk.Button(root, text="Next", command=next) -previous_button = tk.Button(root, text="Previous", command=previous) +play_button = ttk.Button(frame_controls, image=play_img, command=play, borderwidth=0, relief=None) +pause_button = ttk.Button(frame_controls, image=pause_img, command=pause, borderwidth=0) +next_button = ttk.Button(frame_controls, image=next_img, command=next, borderwidth=0) +previous_button = ttk.Button(frame_controls, image=previous_img, command=previous, borderwidth=0) maxvolume_button = tk.Button(root, text="Max Volume", command=maxvolume) minvolume_button = tk.Button(root, text="Min Volume", command=minvolume) randomvolume_button = tk.Button(root, text="Random Volume", command=randomvolume) -volumeslider_button = tk.Scale(root, from_=0, to=100, orient=ttk.HORIZONTAL, command=volumeslider) +volumeslider_button = tk.Scale(root, from_=100, to=0, orient=ttk.VERTICAL, command=volumeslider) #doaudio_analysis = tk.Button(root, text="Audio Analysis", command=doaudioanalysis) -artist_label = tk.Label(root, text="") -song_label = tk.Label(root, text="") +artist_label = tk.Label(frame_artist_song, text="") +song_label = tk.Label(frame_artist_song, text="") track_progress_label = tk.Label(root, text="") track_duration_label = tk.Label(root, text="") track_combined_label = tk.Label(root, text="") @@ -169,7 +181,7 @@ username_label = tk.Label(root, text="Username: " + spotify.me()["display_name"] devices_list = ttk.Listbox(root, selectmode=ttk.SINGLE) -progress_bar = tk.Progressbar(root, orient=ttk.HORIZONTAL, length=180) +progress_bar = tk.Progressbar(root, orient=ttk.HORIZONTAL, length=300) # Play music locally @@ -179,31 +191,47 @@ progress_bar = tk.Progressbar(root, orient=ttk.HORIZONTAL, length=180) #audio_analysis = tk.Label(root, text="") #track_label = tk.Label(root, text="") + + +# root.grid_rowconfigure(1, weight=1) +# root.grid_columnconfigure(0) +# root.grid_columnconfigure(1) +# root.grid_columnconfigure(2) + # frame.pack() # frame2.pack() # Place the media control buttons and text label on the window -username_label.pack() -maxvolume_button.pack() -minvolume_button.pack() -randomvolume_button.pack() -volumeslider_button.pack() -artist_label.pack() -song_label.pack() +# username_label.grid(row=0, column=0, columnspan=2) + +# minvolume_button.grid(row=1, column=1, sticky="e", padx=(0,5)) +# maxvolume_button.grid() +# randomvolume_button.grid() +volumeslider_button.grid(row=1, column=1, rowspan=3, sticky="e", padx=(0,5)) +frame_artist_song.grid(row=1, column=1, pady=(20,5)) +frame_controls.grid(row=2, column=1, pady=(20,0)) +artist_label.grid() +song_label.grid() +previous_button.grid(row=0, column=0, padx=(0,10)) +play_button.grid(row=0, column=1) +next_button.grid(row=0, column=2, padx=(10,0)) + +# track_progress_label.grid(row=3, column=0, pady=(20,5), padx=10) +progress_bar.grid(row=3, column=1, pady=(20,5)) +# track_duration_label.grid(row=3, column=2, pady=(20,5), padx=10) +# pause_button.grid() +# track_combined_label.grid() +# track_search.grid() +# track_search_button.grid() +# get_devices_button.grid() + + #doaudio_analysis.pack() #audio_analysis.pack() -play_button.pack() -pause_button.pack() -next_button.pack() -previous_button.pack() -track_combined_label.pack() -progress_bar.pack() -track_search.pack() -track_search_button.pack() -get_devices_button.pack() # start_local_playback_button.pack() # audio_analysis_button.pack() # album_image_label.pack() + root.bind("", search) # Function to update the song label with the current track's name @@ -225,17 +253,17 @@ def update_song_label(): # Set the text of the song label to the track's name song_label.config(text=track_name) artist_label.config(text=artist_name) - track_progress_label.config(text=((track_progress//(1000*60))%60, "m", (track_progress//1000)%60, "s")) - track_duration_label.config(text=((track_duration//(1000*60))%60, "m", (track_duration//1000)%60, "s")) + track_progress_min = track_progress//(1000*60)%60 + track_progress_sec = (track_progress//1000)%60 + track_duration_min = track_duration//(1000*60)%60 + track_duration_sec = (track_duration//1000)%60 + track_progress_label.config(text=("{}:{:02d}".format(track_progress_min, track_progress_sec))) + track_duration_label.config(text=("{}:{:02d}".format(track_duration_min, track_duration_sec))) progress_bar.config(maximum=track_duration) progress_bar.config(value=track_progress) # urllib.request.urlretrieve(album_image_url, "album_image.jpg") # image_data = tk.PhotoImage("album_image.jpg") # album_image_label.config(image=image_data) - track_progress_min = track_progress//(1000*60)%60 - track_progress_sec = (track_progress//1000)%60 - track_duration_min = track_duration//(1000*60)%60 - track_duration_sec = (track_duration//1000)%60 track_combined_label.config(text=("{}:{:02d} / {}:{:02d}".format(track_progress_min, track_progress_sec, track_duration_min, track_duration_sec))) # track_combined_label.config(text=((track_progress//(1000*60))%60, ":", (track_progress//1000)%60, "/", (track_duration//(1000*60))%60, ":", (track_duration//1000)%60)) diff --git a/schematics/design.png b/schematics/design.png new file mode 100644 index 0000000000000000000000000000000000000000..28ee62fce8806251b08d0c21b64e0f0d0d5e3838 GIT binary patch literal 36015 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

^yJPJfK(PFNp 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 literal 0 HcmV?d00001 diff --git a/schematics/potential_bottom_progress_design.png b/schematics/potential_bottom_progress_design.png new file mode 100644 index 0000000000000000000000000000000000000000..69aff7ebb3349afa12f0fcd559e1f9ff2f311cae GIT binary patch literal 9836 zcmZ8{by$<(_xAt+X%rDQS`?)Rqol(k1QC>O8H|vQfpn>)Ah6L$OFLRRMvaip(cL-P zcYeRW>;1jg`_HaDyLRsLdCq;#=X{>?++W_Pzoa4ukpln#D&<$t-U0vw5d8P1+a&nU zSR*NA0Dv8!{7gaHlVB&+JBEHVwe#|qfu@uA7a<$gAcWngz9;Ro+8rV74>!4}lV_)# zF*feK9)VwyN13vs3Px4l(*LRd{)Eo$(~CPD41r+Eh-LsGxy`Z=*hAp<;w3Qd+QRlD z(AS`8_4p7EqGa;X_%d{Ak3R$6~Z z{w~hgcZFV2rIhMt!LYswgp1vFRNw)CaWtW`muw*tAaL8pI0IN81Y0{nFLOC-bsK6E z75y6c-o5l6i6*&L*?W%%rcJn1Xw9ZQds~Rn@2FQtJI#y}^gYe!5CM)w`Q;jWNBg zQ&6ugzUre-tiaQ~J9WOIrOB|}qH|Z9J*|q4DQul72R&2<#+G}ewJ*6~ zawCMnm^~XknK60NH&7bydoGJT6~fxXrj--EvS6ZxhE8{;zYOp1m#MUJ8b?J$O{&#HQ-n<(WORRpq5H-w#TPbvvEo;}!^s)<$KGFH}r9A6}8F6h|O zpRwMI64n)!7LE0;SZ##zp6pZ}x9#y|Gl?N+R>De~tT=qG(_V`R|N8Q=X2=I4>x+BA z6F)XcBWU=lNpBC}HaknPvE|{AZAMY{tC#`YUB{S@RV|2lZxZ!rCSysjax#iVDnEf+ zElc^>xYUK1M>&BqLqa+1UXTrLclN6?CMVI@t9yAA+wj$B@e9b|kX@Fhr|Cwrq0vpI z?+k0Be|E?#B2g0{(D31Ys@Gz5f#bZ~+ZIINEhc%QL3t(7{Q`|NwLG7t2X$A6COlk1 zH4?#=#zNH+LTwU2hokA9YV6yM$jm$#8keZqNi04XK-V-es792q&X+-8&8|XpxrZaZ zm>lr3ixFx@7-7mhu<)=55BPq%T$^dWy?NmN3s z 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