diff --git a/CHANGELOG.md b/CHANGELOG.md index bf906a76..3b363f00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -154,687 +154,1199 @@ ### Bug Fixes -- alternative sources not showing up for SongLink matched results ([37d002d](https://github.com/krtirtho/spotube/commit/37d002d133cacb3a34884713ac8f6637694af57c)) -- **android:** Media Controls not working above Android 14 [#1561](https://github.com/krtirtho/spotube/issues/1561) ([3394c1b](https://github.com/krtirtho/spotube/commit/3394c1b0574e44dc624b2b2f0bf32f343ae9f049)) -- browse anonymously button takes to wrong route ([73c5b30](https://github.com/krtirtho/spotube/commit/73c5b30b63a4c82bb7ad5b52bc10c5594566a800)) -- **desktop:** titlebar drag to move not working ([5f280a1](https://github.com/krtirtho/spotube/commit/5f280a19f4d5f8882ae2ff60c6cc595ded7a5a1d)) -- **desktop:** window is not centered ([47f98b9](https://github.com/krtirtho/spotube/commit/47f98b98aafab9b426733ed44cab2be8a646a98e)) -- **ios:** download not working [#1575](https://github.com/krtirtho/spotube/issues/1575) ([6591ec0](https://github.com/krtirtho/spotube/commit/6591ec0e1b441dd8fd535eace19a58c7749389ca)) -- **linux:** application window not visible after launch ([8fc44ed](https://github.com/krtirtho/spotube/commit/8fc44ed6550e8b2b804991ff82df08afb1c94ca8)) -- local track not showing up in queue ([d82261c](https://github.com/krtirtho/spotube/commit/d82261cb25ece63f85af0e40216cf32dccdc9dd5)) -- use weak match for Jiosaavn fallback to improve matching ([6cb2986](https://github.com/krtirtho/spotube/commit/6cb29868d2030b5e9312863c17e8f24889942e24)) -- **windows:** media controls not showing up [#1542](https://github.com/krtirtho/spotube/issues/1542) ([d7d864f](https://github.com/krtirtho/spotube/commit/d7d864ff2bc937675a544a7edf645c5148ec836a)) -- **windows:** revert Flutter version to 3.19.6 to avoid distortion [#1553](https://github.com/krtirtho/spotube/issues/1553) ([982cf0b](https://github.com/krtirtho/spotube/commit/982cf0bd435638fa20f17ef527fe21d031b5ffaf)) +- alternative sources not showing up for SongLink matched + results ([37d002d](https://github.com/krtirtho/spotube/commit/37d002d133cacb3a34884713ac8f6637694af57c)) +- **android:** Media Controls not working above Android + 14 [#1561](https://github.com/krtirtho/spotube/issues/1561) ([3394c1b](https://github.com/krtirtho/spotube/commit/3394c1b0574e44dc624b2b2f0bf32f343ae9f049)) +- browse anonymously button takes to wrong + route ([73c5b30](https://github.com/krtirtho/spotube/commit/73c5b30b63a4c82bb7ad5b52bc10c5594566a800)) +- **desktop:** titlebar drag to move not + working ([5f280a1](https://github.com/krtirtho/spotube/commit/5f280a19f4d5f8882ae2ff60c6cc595ded7a5a1d)) +- **desktop:** window is not + centered ([47f98b9](https://github.com/krtirtho/spotube/commit/47f98b98aafab9b426733ed44cab2be8a646a98e)) +- **ios:** download not + working [#1575](https://github.com/krtirtho/spotube/issues/1575) ([6591ec0](https://github.com/krtirtho/spotube/commit/6591ec0e1b441dd8fd535eace19a58c7749389ca)) +- **linux:** application window not visible after + launch ([8fc44ed](https://github.com/krtirtho/spotube/commit/8fc44ed6550e8b2b804991ff82df08afb1c94ca8)) +- local track not showing up in + queue ([d82261c](https://github.com/krtirtho/spotube/commit/d82261cb25ece63f85af0e40216cf32dccdc9dd5)) +- use weak match for Jiosaavn fallback to improve + matching ([6cb2986](https://github.com/krtirtho/spotube/commit/6cb29868d2030b5e9312863c17e8f24889942e24)) +- **windows:** media controls not showing + up [#1542](https://github.com/krtirtho/spotube/issues/1542) ([d7d864f](https://github.com/krtirtho/spotube/commit/d7d864ff2bc937675a544a7edf645c5148ec836a)) +- **windows:** revert Flutter version to 3.19.6 to avoid + distortion [#1553](https://github.com/krtirtho/spotube/issues/1553) ([982cf0b](https://github.com/krtirtho/spotube/commit/982cf0bd435638fa20f17ef527fe21d031b5ffaf)) ## [3.7.0](https://github.com/krtirtho/spotube/compare/v3.6.0...v3.7.0) (2024-06-03) ### Features -- local library folder cards ([fc5bfa0](https://github.com/krtirtho/spotube/commit/fc5bfa089ce2f46ab786565d6750564d704ee7e0)) -- Local music library ([#1479](https://github.com/krtirtho/spotube/issues/1479)) ([22caa81](https://github.com/krtirtho/spotube/commit/22caa818f4ac31626aaff6952e43512b42237d00)) -- personalized stats based on local music history ([#1522](https://github.com/krtirtho/spotube/issues/1522)) ([82307bc](https://github.com/krtirtho/spotube/commit/82307bc030035b03ab1b8d8ec7b24da19a866b12)) -- play initially available tracks of playlist/album immediately and fetch rest in background [#670](https://github.com/krtirtho/spotube/issues/670) ([02acbd9](https://github.com/krtirtho/spotube/commit/02acbd93271145dde365f6c547e0d9d902be65f1)) -- **player:** add volume slider floating label showing percentage ([#1445](https://github.com/krtirtho/spotube/issues/1445)) ([8fad225](https://github.com/krtirtho/spotube/commit/8fad2251b3536e9468e0fb193939ead98bad3bc6)), closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) -- **translations:** add Basque translation ([#1493](https://github.com/krtirtho/spotube/issues/1493)) ([dbc1c45](https://github.com/krtirtho/spotube/commit/dbc1c452dd53153c61589f956ea9836cea7bf2bb)) -- **translations:** add Finnish translations ([#1449](https://github.com/krtirtho/spotube/issues/1449)) ([edc997e](https://github.com/krtirtho/spotube/commit/edc997e7470ce17f60c96b8198dc8851cbf21f18)), closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) -- **translations:** add georgian language ([#1450](https://github.com/krtirtho/spotube/issues/1450)) ([1e7f0e1](https://github.com/krtirtho/spotube/commit/1e7f0e1fe71e0a8d86614fc884861f8791469112)) -- **translations:** add Indonesian translation ([#1426](https://github.com/krtirtho/spotube/issues/1426)) ([0280654](https://github.com/krtirtho/spotube/commit/0280654bb6bad373aee521f5a866228d2d38f038)), closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) -- **translations:** Improve tr locales ([#1419](https://github.com/krtirtho/spotube/issues/1419)) ([bf45681](https://github.com/krtirtho/spotube/commit/bf45681deb951c772bf6ca05e213c949c04bded1)), closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) -- upgrade to Flutter 3.22.0 ([71341ec](https://github.com/krtirtho/spotube/commit/71341ec0bda6ed985b43836712075b97a2cf8bac)) +- local library folder + cards ([fc5bfa0](https://github.com/krtirtho/spotube/commit/fc5bfa089ce2f46ab786565d6750564d704ee7e0)) +- Local music + library ([#1479](https://github.com/krtirtho/spotube/issues/1479)) ([22caa81](https://github.com/krtirtho/spotube/commit/22caa818f4ac31626aaff6952e43512b42237d00)) +- personalized stats based on local music + history ([#1522](https://github.com/krtirtho/spotube/issues/1522)) ([82307bc](https://github.com/krtirtho/spotube/commit/82307bc030035b03ab1b8d8ec7b24da19a866b12)) +- play initially available tracks of playlist/album immediately and fetch rest in + background [#670](https://github.com/krtirtho/spotube/issues/670) ([02acbd9](https://github.com/krtirtho/spotube/commit/02acbd93271145dde365f6c547e0d9d902be65f1)) +- **player:** add volume slider floating label showing + percentage ([#1445](https://github.com/krtirtho/spotube/issues/1445)) ([8fad225](https://github.com/krtirtho/spotube/commit/8fad2251b3536e9468e0fb193939ead98bad3bc6)), + closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) +- **translations:** add Basque + translation ([#1493](https://github.com/krtirtho/spotube/issues/1493)) ([dbc1c45](https://github.com/krtirtho/spotube/commit/dbc1c452dd53153c61589f956ea9836cea7bf2bb)) +- **translations:** add Finnish + translations ([#1449](https://github.com/krtirtho/spotube/issues/1449)) ([edc997e](https://github.com/krtirtho/spotube/commit/edc997e7470ce17f60c96b8198dc8851cbf21f18)), + closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) +- **translations:** add georgian + language ([#1450](https://github.com/krtirtho/spotube/issues/1450)) ([1e7f0e1](https://github.com/krtirtho/spotube/commit/1e7f0e1fe71e0a8d86614fc884861f8791469112)) +- **translations:** add Indonesian + translation ([#1426](https://github.com/krtirtho/spotube/issues/1426)) ([0280654](https://github.com/krtirtho/spotube/commit/0280654bb6bad373aee521f5a866228d2d38f038)), + closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) +- **translations:** Improve tr + locales ([#1419](https://github.com/krtirtho/spotube/issues/1419)) ([bf45681](https://github.com/krtirtho/spotube/commit/bf45681deb951c772bf6ca05e213c949c04bded1)), + closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) +- upgrade to Flutter + 3.22.0 ([71341ec](https://github.com/krtirtho/spotube/commit/71341ec0bda6ed985b43836712075b97a2cf8bac)) ### Bug Fixes -- fallback to LRCLIB when lyrics line less than 6 lines [#1461](https://github.com/krtirtho/spotube/issues/1461) ([9aea354](https://github.com/krtirtho/spotube/commit/9aea35468fa7cd176ddc8810b37b90c2d8246931)) -- **linux:** tray icon not showing [#541](https://github.com/krtirtho/spotube/issues/541) ([7ac7917](https://github.com/krtirtho/spotube/commit/7ac791757abb30f40374c169c4211916287bb3f3)) -- local track not showing up in queue ([d82261c](https://github.com/krtirtho/spotube/commit/d82261cb25ece63f85af0e40216cf32dccdc9dd5)) -- **macos:** Logs directory not created by default [#1353](https://github.com/krtirtho/spotube/issues/1353) ([4ca8939](https://github.com/krtirtho/spotube/commit/4ca893950b07f678acf7db690112c47d21e54782)) -- **playback:** skipping tracks with unplayable sources instead of falling back [#1492](https://github.com/krtirtho/spotube/issues/1492) ([c607a33](https://github.com/krtirtho/spotube/commit/c607a330ed279dfbebe8d4bd325745ac6301a58f)) -- **search:** load more button not working [#1417](https://github.com/krtirtho/spotube/issues/1417) ([7e07c2e](https://github.com/krtirtho/spotube/commit/7e07c2e1985da7ccb96b1fac2ecd703720068d26)) -- some text are garbled in different parts of the app [#1463](https://github.com/krtirtho/spotube/issues/1463) [#1505](https://github.com/krtirtho/spotube/issues/1505) ([d2683c5](https://github.com/krtirtho/spotube/commit/d2683c52d81d807be6ff72f15b8e9eb18181e211)) -- spotify friends and user profile icon (mobile) showing when not authenticated [#1410](https://github.com/krtirtho/spotube/issues/1410) ([9bccbc9](https://github.com/krtirtho/spotube/commit/9bccbc93c63dd34f6e15ff68c276976ecd1d9a33)) -- **updater:** dead link ([#1408](https://github.com/krtirtho/spotube/issues/1408)) ([6907f9c](https://github.com/krtirtho/spotube/commit/6907f9c756d8f49aadb1b23a2a1dc8bf7d658dc0)), closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) -- windows SSL Certificate error breaking login [#905](https://github.com/krtirtho/spotube/issues/905) ([#1474](https://github.com/krtirtho/spotube/issues/1474)) ([937a706](https://github.com/krtirtho/spotube/commit/937a706ac9c0e59943b2609e5cc398dcdbed2344)), closes [#1468](https://github.com/krtirtho/spotube/issues/1468) -- **windows:** installer tries to install in current directory ([c3c9fc5](https://github.com/krtirtho/spotube/commit/c3c9fc544c68b3d897dd7241a61cab7a199b4539)) +- fallback to LRCLIB when lyrics line less than 6 + lines [#1461](https://github.com/krtirtho/spotube/issues/1461) ([9aea354](https://github.com/krtirtho/spotube/commit/9aea35468fa7cd176ddc8810b37b90c2d8246931)) +- **linux:** tray icon not + showing [#541](https://github.com/krtirtho/spotube/issues/541) ([7ac7917](https://github.com/krtirtho/spotube/commit/7ac791757abb30f40374c169c4211916287bb3f3)) +- local track not showing up in + queue ([d82261c](https://github.com/krtirtho/spotube/commit/d82261cb25ece63f85af0e40216cf32dccdc9dd5)) +- **macos:** Logs directory not created by + default [#1353](https://github.com/krtirtho/spotube/issues/1353) ([4ca8939](https://github.com/krtirtho/spotube/commit/4ca893950b07f678acf7db690112c47d21e54782)) +- **playback:** skipping tracks with unplayable sources instead of falling + back [#1492](https://github.com/krtirtho/spotube/issues/1492) ([c607a33](https://github.com/krtirtho/spotube/commit/c607a330ed279dfbebe8d4bd325745ac6301a58f)) +- **search:** load more button not + working [#1417](https://github.com/krtirtho/spotube/issues/1417) ([7e07c2e](https://github.com/krtirtho/spotube/commit/7e07c2e1985da7ccb96b1fac2ecd703720068d26)) +- some text are garbled in different parts of the + app [#1463](https://github.com/krtirtho/spotube/issues/1463) [#1505](https://github.com/krtirtho/spotube/issues/1505) ([d2683c5](https://github.com/krtirtho/spotube/commit/d2683c52d81d807be6ff72f15b8e9eb18181e211)) +- spotify friends and user profile icon (mobile) showing when not + authenticated [#1410](https://github.com/krtirtho/spotube/issues/1410) ([9bccbc9](https://github.com/krtirtho/spotube/commit/9bccbc93c63dd34f6e15ff68c276976ecd1d9a33)) +- **updater:** dead + link ([#1408](https://github.com/krtirtho/spotube/issues/1408)) ([6907f9c](https://github.com/krtirtho/spotube/commit/6907f9c756d8f49aadb1b23a2a1dc8bf7d658dc0)), + closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1171](https://github.com/krtirtho/spotube/issues/1171) [#1082](https://github.com/krtirtho/spotube/issues/1082) [#1082](https://github.com/krtirtho/spotube/issues/1082) +- windows SSL Certificate error breaking + login [#905](https://github.com/krtirtho/spotube/issues/905) ([#1474](https://github.com/krtirtho/spotube/issues/1474)) ([937a706](https://github.com/krtirtho/spotube/commit/937a706ac9c0e59943b2609e5cc398dcdbed2344)), + closes [#1468](https://github.com/krtirtho/spotube/issues/1468) +- **windows:** installer tries to install in current + directory ([c3c9fc5](https://github.com/krtirtho/spotube/commit/c3c9fc544c68b3d897dd7241a61cab7a199b4539)) ## [3.6.0](https://github.com/krtirtho/spotube/compare/v3.5.0...v3.6.0) (2024-04-15) ### Features -- add Spotify homepage personalized recommendations ([#1402](https://github.com/krtirtho/spotube/issues/1402)) ([9e25c74](https://github.com/krtirtho/spotube/commit/9e25c742d4e43e4e10d2b48afb8e6d90288ffa11)) +- add Spotify homepage personalized + recommendations ([#1402](https://github.com/krtirtho/spotube/issues/1402)) ([9e25c74](https://github.com/krtirtho/spotube/commit/9e25c742d4e43e4e10d2b48afb8e6d90288ffa11)) - add user profile page ([39e97ee](https://github.com/krtirtho/spotube/commit/39e97eef34d87348a264843e145f31f82832d12e)) -- **android:** Filter Device To Force High Frame Rate ([#880](https://github.com/krtirtho/spotube/issues/880)) ([6e41b10](https://github.com/krtirtho/spotube/commit/6e41b106fa989adee393d3ce2535e75446ad3eea)) -- improved caching based on riverpod ([#1343](https://github.com/krtirtho/spotube/issues/1343)) ([6673e5a](https://github.com/krtirtho/spotube/commit/6673e5a8a86b9667cf9dbff9bb7c40ea6b7de771)) -- LAN connect a.k.a control remote Spotube playback and local output device selection ([#1355](https://github.com/krtirtho/spotube/issues/1355)) ([68374ef](https://github.com/krtirtho/spotube/commit/68374efd3ec556f31b937e5b96920787b54eec78)) -- **lyrics:** add LRCLIB lyrics provider as fallback ([5afe823](https://github.com/krtirtho/spotube/commit/5afe823abdb198340b55d138d8173d886a811632)) -- search history support [#1236](https://github.com/krtirtho/spotube/issues/1236) ([82b1cfa](https://github.com/krtirtho/spotube/commit/82b1cfa0d775e3958c666280943a893c9113d468)) -- **translations:** Add Czech translation ([#1401](https://github.com/krtirtho/spotube/issues/1401)) ([5a6b800](https://github.com/krtirtho/spotube/commit/5a6b80091259359bc38c4b91cd8cb496c4270fa4)) -- **translations:** add Thai Language ([#1319](https://github.com/krtirtho/spotube/issues/1319)) ([b70f250](https://github.com/krtirtho/spotube/commit/b70f250e8d5137fd990787ec9e3d058126cf14f3)), closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) +- **android:** Filter Device To Force High Frame + Rate ([#880](https://github.com/krtirtho/spotube/issues/880)) ([6e41b10](https://github.com/krtirtho/spotube/commit/6e41b106fa989adee393d3ce2535e75446ad3eea)) +- improved caching based on + riverpod ([#1343](https://github.com/krtirtho/spotube/issues/1343)) ([6673e5a](https://github.com/krtirtho/spotube/commit/6673e5a8a86b9667cf9dbff9bb7c40ea6b7de771)) +- LAN connect a.k.a control remote Spotube playback and local output device + selection ([#1355](https://github.com/krtirtho/spotube/issues/1355)) ([68374ef](https://github.com/krtirtho/spotube/commit/68374efd3ec556f31b937e5b96920787b54eec78)) +- **lyrics:** add LRCLIB lyrics provider as + fallback ([5afe823](https://github.com/krtirtho/spotube/commit/5afe823abdb198340b55d138d8173d886a811632)) +- search history + support [#1236](https://github.com/krtirtho/spotube/issues/1236) ([82b1cfa](https://github.com/krtirtho/spotube/commit/82b1cfa0d775e3958c666280943a893c9113d468)) +- **translations:** Add Czech + translation ([#1401](https://github.com/krtirtho/spotube/issues/1401)) ([5a6b800](https://github.com/krtirtho/spotube/commit/5a6b80091259359bc38c4b91cd8cb496c4270fa4)) +- **translations:** add Thai + Language ([#1319](https://github.com/krtirtho/spotube/issues/1319)) ([b70f250](https://github.com/krtirtho/spotube/commit/b70f250e8d5137fd990787ec9e3d058126cf14f3)), + closes [#1310](https://github.com/krtirtho/spotube/issues/1310) [#1311](https://github.com/krtirtho/spotube/issues/1311) ### Bug Fixes -- instance of Artist bug [#1362](https://github.com/krtirtho/spotube/issues/1362) ([c8dd802](https://github.com/krtirtho/spotube/commit/c8dd8025ec96bd78ed77cae35f1429aa48c16fde)) -- **playback:** sponsor block skips and stutters in same position ([0d080b7](https://github.com/krtirtho/spotube/commit/0d080b77b72529c0be5ebc27ace1c52307511f73)) +- instance of Artist + bug [#1362](https://github.com/krtirtho/spotube/issues/1362) ([c8dd802](https://github.com/krtirtho/spotube/commit/c8dd8025ec96bd78ed77cae35f1429aa48c16fde)) +- **playback:** sponsor block skips and stutters in same + position ([0d080b7](https://github.com/krtirtho/spotube/commit/0d080b77b72529c0be5ebc27ace1c52307511f73)) ## [3.5.0](https://github.com/krtirtho/spotube/compare/v3.4.1...v3.5.0) (2024-03-08) ### Features -- add endless playback support [#285](https://github.com/krtirtho/spotube/issues/285) ([9dfd49c](https://github.com/krtirtho/spotube/commit/9dfd49ca04f0e915e333e205b17ac70456873f6e)) -- add getting started page ([96a2a1f](https://github.com/krtirtho/spotube/commit/96a2a1f5a622cb3c580041417d5023e37fa69716)) -- Add iOS background play support ([#1166](https://github.com/krtirtho/spotube/issues/1166)) ([095587e](https://github.com/krtirtho/spotube/commit/095587ee84f7d867c69fcf4b09ed608d63478e1e)) -- add songlink based track matching for youtube and open song link button ([9095a8c](https://github.com/krtirtho/spotube/commit/9095a8c8f849e42daabb7efcc20085cfb863c974)) -- **playlist:** show confirmation before deleting user playlist [#1222](https://github.com/krtirtho/spotube/issues/1222) ([9f92440](https://github.com/krtirtho/spotube/commit/9f9244062a39759aa0ce28d2d5f7c8fa53d73003)) -- Sort by Duration ([#1238](https://github.com/krtirtho/spotube/issues/1238)) ([6f8271f](https://github.com/krtirtho/spotube/commit/6f8271f5e9394cb4053e41dd222aa2844c34d609)) +- add endless playback + support [#285](https://github.com/krtirtho/spotube/issues/285) ([9dfd49c](https://github.com/krtirtho/spotube/commit/9dfd49ca04f0e915e333e205b17ac70456873f6e)) +- add getting started + page ([96a2a1f](https://github.com/krtirtho/spotube/commit/96a2a1f5a622cb3c580041417d5023e37fa69716)) +- Add iOS background play + support ([#1166](https://github.com/krtirtho/spotube/issues/1166)) ([095587e](https://github.com/krtirtho/spotube/commit/095587ee84f7d867c69fcf4b09ed608d63478e1e)) +- add songlink based track matching for youtube and open song link + button ([9095a8c](https://github.com/krtirtho/spotube/commit/9095a8c8f849e42daabb7efcc20085cfb863c974)) +- **playlist:** show confirmation before deleting user + playlist [#1222](https://github.com/krtirtho/spotube/issues/1222) ([9f92440](https://github.com/krtirtho/spotube/commit/9f9244062a39759aa0ce28d2d5f7c8fa53d73003)) +- Sort by + Duration ([#1238](https://github.com/krtirtho/spotube/issues/1238)) ([6f8271f](https://github.com/krtirtho/spotube/commit/6f8271f5e9394cb4053e41dd222aa2844c34d609)) - start radio support ([4defeef](https://github.com/krtirtho/spotube/commit/4defeefe7e5947aa00a2afb2a06577ec141cdc52)) -- **translations:** add Korean translation ([#1275](https://github.com/krtirtho/spotube/issues/1275)) ([fdea930](https://github.com/krtirtho/spotube/commit/fdea9307bbfb8f3f62cfb795bfb3ca58c38c33d9)) -- **translations:** Added Vietnamese ([#1135](https://github.com/krtirtho/spotube/issues/1135)) ([019ba86](https://github.com/krtirtho/spotube/commit/019ba865e20a8b54ea3490c01e47158eaf3a4c8d)) -- **windows:** Install Visual C++ 2015-2022 Redistributable if missing when installing ([ba69496](https://github.com/krtirtho/spotube/commit/ba69496dcc9a1b7f6ea4e104e71764a854d27f1f)) +- **translations:** add Korean + translation ([#1275](https://github.com/krtirtho/spotube/issues/1275)) ([fdea930](https://github.com/krtirtho/spotube/commit/fdea9307bbfb8f3f62cfb795bfb3ca58c38c33d9)) +- **translations:** Added + Vietnamese ([#1135](https://github.com/krtirtho/spotube/issues/1135)) ([019ba86](https://github.com/krtirtho/spotube/commit/019ba865e20a8b54ea3490c01e47158eaf3a4c8d)) +- **windows:** Install Visual C++ 2015-2022 Redistributable if missing when + installing ([ba69496](https://github.com/krtirtho/spotube/commit/ba69496dcc9a1b7f6ea4e104e71764a854d27f1f)) ### Bug Fixes -- album images are small in certain places ([ca76a39](https://github.com/krtirtho/spotube/commit/ca76a39910b1a5af91aa7882a0d33c9d71db58a2)) -- album, artist page not loading [#1282](https://github.com/krtirtho/spotube/issues/1282) ([a9a1d4c](https://github.com/krtirtho/spotube/commit/a9a1d4c9dc24aaf3181dc4090d1822ebfe755991)) -- **android:** audio issue when screen is off and broadcast audio session id ([#1221](https://github.com/krtirtho/spotube/issues/1221) & [#1247](https://github.com/krtirtho/spotube/issues/1247)) ([17105a6](https://github.com/krtirtho/spotube/commit/17105a640bf5107bd5d333b9b4d097c14a3949a2)), closes [KRTirtho/spotube#571](https://github.com/KRTirtho/spotube/issues/571) -- **android:** only ask battery optimization once [#1252](https://github.com/krtirtho/spotube/issues/1252) ([e516afb](https://github.com/krtirtho/spotube/commit/e516afb185f616471822ea745495a3d1d1281bd3)) -- **android:** pressing back button in any other tab other than home exits the app ([c3289a0](https://github.com/krtirtho/spotube/commit/c3289a0ba4e7de094a15246677ffcb940504ebde)) -- **android:** system back button in player page exits the app ([3294f65](https://github.com/krtirtho/spotube/commit/3294f657fe8a03b18d9be8974968b6508465963d)) -- cleanTitle removing feat and ft from words instead of whole words ([8612345](https://github.com/krtirtho/spotube/commit/86123456f2ff577921cf62cffca180427dfe1dd5)) -- friends list not scrollable with mouse drag ([ab08c82](https://github.com/krtirtho/spotube/commit/ab08c82c8dd501263049f3adcbd48907ba13e3a9)) -- no draggable scrollbar in playlist/album page [#1158](https://github.com/krtirtho/spotube/issues/1158) ([6f71e52](https://github.com/krtirtho/spotube/commit/6f71e52ea8a5712d2c3527f2a524af9fbb718bef)) -- non-banger songs breaking the queue if sources not found ([90f7c53](https://github.com/krtirtho/spotube/commit/90f7c531cdc8640afdbabf5a0592159715ea1e6f)) -- track loading when not found in Youtube ([e964f61](https://github.com/krtirtho/spotube/commit/e964f61d38cb303e3d3fd60c866414f57207181c)) -- **translations:** Update app_nl.arb ([#1168](https://github.com/krtirtho/spotube/issues/1168)) ([8167963](https://github.com/krtirtho/spotube/commit/8167963212eeb5dfb0b4fb2eadf81d466659a9f1)) +- album images are small in certain + places ([ca76a39](https://github.com/krtirtho/spotube/commit/ca76a39910b1a5af91aa7882a0d33c9d71db58a2)) +- album, artist page not + loading [#1282](https://github.com/krtirtho/spotube/issues/1282) ([a9a1d4c](https://github.com/krtirtho/spotube/commit/a9a1d4c9dc24aaf3181dc4090d1822ebfe755991)) +- **android:** audio issue when screen is off and broadcast audio session + id ([#1221](https://github.com/krtirtho/spotube/issues/1221) & [#1247](https://github.com/krtirtho/spotube/issues/1247)) ([17105a6](https://github.com/krtirtho/spotube/commit/17105a640bf5107bd5d333b9b4d097c14a3949a2)), + closes [KRTirtho/spotube#571](https://github.com/KRTirtho/spotube/issues/571) +- **android:** only ask battery optimization + once [#1252](https://github.com/krtirtho/spotube/issues/1252) ([e516afb](https://github.com/krtirtho/spotube/commit/e516afb185f616471822ea745495a3d1d1281bd3)) +- **android:** pressing back button in any other tab other than home exits the + app ([c3289a0](https://github.com/krtirtho/spotube/commit/c3289a0ba4e7de094a15246677ffcb940504ebde)) +- **android:** system back button in player page exits the + app ([3294f65](https://github.com/krtirtho/spotube/commit/3294f657fe8a03b18d9be8974968b6508465963d)) +- cleanTitle removing feat and ft from words instead of whole + words ([8612345](https://github.com/krtirtho/spotube/commit/86123456f2ff577921cf62cffca180427dfe1dd5)) +- friends list not scrollable with mouse + drag ([ab08c82](https://github.com/krtirtho/spotube/commit/ab08c82c8dd501263049f3adcbd48907ba13e3a9)) +- no draggable scrollbar in playlist/album + page [#1158](https://github.com/krtirtho/spotube/issues/1158) ([6f71e52](https://github.com/krtirtho/spotube/commit/6f71e52ea8a5712d2c3527f2a524af9fbb718bef)) +- non-banger songs breaking the queue if sources not + found ([90f7c53](https://github.com/krtirtho/spotube/commit/90f7c531cdc8640afdbabf5a0592159715ea1e6f)) +- track loading when not found in + Youtube ([e964f61](https://github.com/krtirtho/spotube/commit/e964f61d38cb303e3d3fd60c866414f57207181c)) +- **translations:** Update + app_nl.arb ([#1168](https://github.com/krtirtho/spotube/issues/1168)) ([8167963](https://github.com/krtirtho/spotube/commit/8167963212eeb5dfb0b4fb2eadf81d466659a9f1)) ## [3.4.1](https://personal.github.com/krtirtho/spotube/compare/v3.4.0...v3.4.1) (2024-01-27) ### Features -- add create playlist button in add playlist dialog ([2168a64](https://personal.github.com/krtirtho/spotube/commit/2168a640af3104a43139c303d78e2c2326a1bda7)) -- add spotify friends activity ([#1130](https://personal.github.com/krtirtho/spotube/issues/1130)) ([7983932](https://personal.github.com/krtirtho/spotube/commit/79839329b0970acccb0c566a31eee508adbc8557)) -- **deep-link:** add track opening page ([988a975](https://personal.github.com/krtirtho/spotube/commit/988a975bf1a675df0cfc7b17776bcec74c67f1f2)) -- haptic feedback on long press and reordering actions ([6242200](https://personal.github.com/krtirtho/spotube/commit/624220090572eb643dce37ca8ffd85d2b3f5c9df)) -- improve youtube/piped matching by suffixing "- Topic" ([8184555](https://personal.github.com/krtirtho/spotube/commit/8184555ee89fd30aaf886af9fc1d52c142fdebb0)) -- **translations:** add Nepali (नेपाली) translations ([#1111](https://personal.github.com/krtirtho/spotube/issues/1111)) ([c3ebf56](https://personal.github.com/krtirtho/spotube/commit/c3ebf56ac149b0af8815a5533fe6c386df743440)), closes [#1074](https://personal.github.com/krtirtho/spotube/issues/1074) [#1100](https://personal.github.com/krtirtho/spotube/issues/1100) +- add create playlist button in add playlist + dialog ([2168a64](https://personal.github.com/krtirtho/spotube/commit/2168a640af3104a43139c303d78e2c2326a1bda7)) +- add spotify friends + activity ([#1130](https://personal.github.com/krtirtho/spotube/issues/1130)) ([7983932](https://personal.github.com/krtirtho/spotube/commit/79839329b0970acccb0c566a31eee508adbc8557)) +- **deep-link:** add track opening + page ([988a975](https://personal.github.com/krtirtho/spotube/commit/988a975bf1a675df0cfc7b17776bcec74c67f1f2)) +- haptic feedback on long press and reordering + actions ([6242200](https://personal.github.com/krtirtho/spotube/commit/624220090572eb643dce37ca8ffd85d2b3f5c9df)) +- improve youtube/piped matching by suffixing "- + Topic" ([8184555](https://personal.github.com/krtirtho/spotube/commit/8184555ee89fd30aaf886af9fc1d52c142fdebb0)) +- **translations:** add Nepali (नेपाली) + translations ([#1111](https://personal.github.com/krtirtho/spotube/issues/1111)) ([c3ebf56](https://personal.github.com/krtirtho/spotube/commit/c3ebf56ac149b0af8815a5533fe6c386df743440)), + closes [#1074](https://personal.github.com/krtirtho/spotube/issues/1074) [#1100](https://personal.github.com/krtirtho/spotube/issues/1100) ### Bug Fixes -- alternative searched sources doesn't play [#1059](https://personal.github.com/krtirtho/spotube/issues/1059) ([a8e9b82](https://personal.github.com/krtirtho/spotube/commit/a8e9b824f33add8f6a83f0d147e889eb6beeb442)) -- alternative source doesn't persist on next restart [#840](https://personal.github.com/krtirtho/spotube/issues/840) ([62fde50](https://personal.github.com/krtirtho/spotube/commit/62fde50442f04f93255b5b1b1dcca23d116a13ec)) -- **android:** download failing for permission issues [#1015](https://personal.github.com/krtirtho/spotube/issues/1015) ([5509cae](https://personal.github.com/krtirtho/spotube/commit/5509cae91c8b1f5cb9fac179060f477397a4a27f)) -- artist page error [#1018](https://personal.github.com/krtirtho/spotube/issues/1018) ([8cd650b](https://personal.github.com/krtirtho/spotube/commit/8cd650b07e5f4c4c2f296bf4374e5ee67fb3eb50)) -- audio resumes after a phone call even if it was paused before [#926](https://personal.github.com/krtirtho/spotube/issues/926) ([fd1899f](https://personal.github.com/krtirtho/spotube/commit/fd1899f162395752142d7aa7320d1c39b0995070)) -- better error message for failing to find lyrics [#1085](https://personal.github.com/krtirtho/spotube/issues/1085) ([e58e18d](https://personal.github.com/krtirtho/spotube/commit/e58e18de33d7bc6fb0e4ddd7ccf6ea14472642b1)) -- Black window flash when starting the app ([#1003](https://personal.github.com/krtirtho/spotube/issues/1003)) ([02e44fc](https://personal.github.com/krtirtho/spotube/commit/02e44fc6b849a873adad382f5d46ed8caf32359f)) -- **linux:** crash after login ([0dfd401](https://personal.github.com/krtirtho/spotube/commit/0dfd40153714b7a4b83ac30f0c56830bc0c05ffd)) -- **macos:** backbutton and window button overlap and unused empty space on home ([b9417ca](https://personal.github.com/krtirtho/spotube/commit/b9417ca3575992673357230dab49e0124dd576b1)) -- **macos:** download folder unchangeable ([9d74cf5](https://personal.github.com/krtirtho/spotube/commit/9d74cf5fc250a6a143321d49b8e045519b4c2872)) -- **macos:** Respect Minimize to tray option ([#1001](https://personal.github.com/krtirtho/spotube/issues/1001)) ([69559ba](https://personal.github.com/krtirtho/spotube/commit/69559ba24285636e42b2f2231f956c31388c5cf3)) -- **macos:** system tray shows name and sidebar weird gap [#1083](https://personal.github.com/krtirtho/spotube/issues/1083) ([27057ea](https://personal.github.com/krtirtho/spotube/commit/27057ea0c8d83c9701057c18b473f1af4e4e82be)) -- releases section is empty when user doesn't follow any artists [#1104](https://personal.github.com/krtirtho/spotube/issues/1104) ([682e88e](https://personal.github.com/krtirtho/spotube/commit/682e88e0c55bc0f4708bc0b4681b129e5c61c999)) -- search page vertical scrollbar moves on horizontal scroll [#1017](https://personal.github.com/krtirtho/spotube/issues/1017) ([c203ac6](https://personal.github.com/krtirtho/spotube/commit/c203ac69ee74ba8722dae3da4b47761cd8d59c34)) -- songs doesn't play when sources with preferred audio codec is empty ([#976](https://personal.github.com/krtirtho/spotube/issues/976)) ([ba4e11a](https://personal.github.com/krtirtho/spotube/commit/ba4e11a40ab18308437a05333a46eace6f8eeb5a)) -- track index not showing after 200 ([a752cf4](https://personal.github.com/krtirtho/spotube/commit/a752cf4c978d1b05851aabb6c84c7862de551320)) -- track pad horizontal scrolling not working ([59e0e6b](https://personal.github.com/krtirtho/spotube/commit/59e0e6bb659b70831f6e0ae064100381c57f149c)) +- alternative searched sources doesn't + play [#1059](https://personal.github.com/krtirtho/spotube/issues/1059) ([a8e9b82](https://personal.github.com/krtirtho/spotube/commit/a8e9b824f33add8f6a83f0d147e889eb6beeb442)) +- alternative source doesn't persist on next + restart [#840](https://personal.github.com/krtirtho/spotube/issues/840) ([62fde50](https://personal.github.com/krtirtho/spotube/commit/62fde50442f04f93255b5b1b1dcca23d116a13ec)) +- **android:** download failing for permission + issues [#1015](https://personal.github.com/krtirtho/spotube/issues/1015) ([5509cae](https://personal.github.com/krtirtho/spotube/commit/5509cae91c8b1f5cb9fac179060f477397a4a27f)) +- artist page + error [#1018](https://personal.github.com/krtirtho/spotube/issues/1018) ([8cd650b](https://personal.github.com/krtirtho/spotube/commit/8cd650b07e5f4c4c2f296bf4374e5ee67fb3eb50)) +- audio resumes after a phone call even if it was paused + before [#926](https://personal.github.com/krtirtho/spotube/issues/926) ([fd1899f](https://personal.github.com/krtirtho/spotube/commit/fd1899f162395752142d7aa7320d1c39b0995070)) +- better error message for failing to find + lyrics [#1085](https://personal.github.com/krtirtho/spotube/issues/1085) ([e58e18d](https://personal.github.com/krtirtho/spotube/commit/e58e18de33d7bc6fb0e4ddd7ccf6ea14472642b1)) +- Black window flash when starting the + app ([#1003](https://personal.github.com/krtirtho/spotube/issues/1003)) ([02e44fc](https://personal.github.com/krtirtho/spotube/commit/02e44fc6b849a873adad382f5d46ed8caf32359f)) +- **linux:** crash after + login ([0dfd401](https://personal.github.com/krtirtho/spotube/commit/0dfd40153714b7a4b83ac30f0c56830bc0c05ffd)) +- **macos:** backbutton and window button overlap and unused empty space on + home ([b9417ca](https://personal.github.com/krtirtho/spotube/commit/b9417ca3575992673357230dab49e0124dd576b1)) +- **macos:** download folder + unchangeable ([9d74cf5](https://personal.github.com/krtirtho/spotube/commit/9d74cf5fc250a6a143321d49b8e045519b4c2872)) +- **macos:** Respect Minimize to tray + option ([#1001](https://personal.github.com/krtirtho/spotube/issues/1001)) ([69559ba](https://personal.github.com/krtirtho/spotube/commit/69559ba24285636e42b2f2231f956c31388c5cf3)) +- **macos:** system tray shows name and sidebar weird + gap [#1083](https://personal.github.com/krtirtho/spotube/issues/1083) ([27057ea](https://personal.github.com/krtirtho/spotube/commit/27057ea0c8d83c9701057c18b473f1af4e4e82be)) +- releases section is empty when user doesn't follow any + artists [#1104](https://personal.github.com/krtirtho/spotube/issues/1104) ([682e88e](https://personal.github.com/krtirtho/spotube/commit/682e88e0c55bc0f4708bc0b4681b129e5c61c999)) +- search page vertical scrollbar moves on horizontal + scroll [#1017](https://personal.github.com/krtirtho/spotube/issues/1017) ([c203ac6](https://personal.github.com/krtirtho/spotube/commit/c203ac69ee74ba8722dae3da4b47761cd8d59c34)) +- songs doesn't play when sources with preferred audio codec is + empty ([#976](https://personal.github.com/krtirtho/spotube/issues/976)) ([ba4e11a](https://personal.github.com/krtirtho/spotube/commit/ba4e11a40ab18308437a05333a46eace6f8eeb5a)) +- track index not showing after + 200 ([a752cf4](https://personal.github.com/krtirtho/spotube/commit/a752cf4c978d1b05851aabb6c84c7862de551320)) +- track pad horizontal scrolling not + working ([59e0e6b](https://personal.github.com/krtirtho/spotube/commit/59e0e6bb659b70831f6e0ae064100381c57f149c)) ## [3.4.0](https://github.com/KRTirtho/spotube/compare/v3.3.0...v3.4.0) (2023-12-30) ### Features -- Add Go to Album option in track option [#917](https://github.com/KRTirtho/spotube/issues/917) ([b0beeca](https://github.com/KRTirtho/spotube/commit/b0beeca0cbaf810fae27832cff98cfda95715050)) -- **translations:** add Italian language translations ([#818](https://github.com/KRTirtho/spotube/issues/818)) ([e4eb0e2](https://github.com/KRTirtho/spotube/commit/e4eb0e2596ade2bb5195e183f03af42742fc8486)), closes [#676](https://github.com/KRTirtho/spotube/issues/676) [#676](https://github.com/KRTirtho/spotube/issues/676) -- compact genre view in home page ([82ed5e9](https://github.com/KRTirtho/spotube/commit/82ed5e90576b57ef32e61a65015e04862ab15461)) -- Deep link support ([#950](https://github.com/KRTirtho/spotube/issues/950)) ([4050f55](https://github.com/KRTirtho/spotube/commit/4050f556400aaec5515231578512cf1a6b990110)) -- improve loading animations ([b92583d](https://github.com/KRTirtho/spotube/commit/b92583d0df7b8dee0d121cd2bb666b14c77d8c86)) -- toggle for discord rpc ([24a2294](https://github.com/KRTirtho/spotube/commit/24a2294512bb0c4aff77bc8dcad9b4de3e8b45c6)) -- **translations:** add Dutch Language ([#969](https://github.com/KRTirtho/spotube/issues/969)) ([3ad7ba6](https://github.com/KRTirtho/spotube/commit/3ad7ba66b56e93e69d2181d47029b7549ed225fc)) +- Add Go to Album option in track + option [#917](https://github.com/KRTirtho/spotube/issues/917) ([b0beeca](https://github.com/KRTirtho/spotube/commit/b0beeca0cbaf810fae27832cff98cfda95715050)) +- **translations:** add Italian language + translations ([#818](https://github.com/KRTirtho/spotube/issues/818)) ([e4eb0e2](https://github.com/KRTirtho/spotube/commit/e4eb0e2596ade2bb5195e183f03af42742fc8486)), + closes [#676](https://github.com/KRTirtho/spotube/issues/676) [#676](https://github.com/KRTirtho/spotube/issues/676) +- compact genre view in home + page ([82ed5e9](https://github.com/KRTirtho/spotube/commit/82ed5e90576b57ef32e61a65015e04862ab15461)) +- Deep link + support ([#950](https://github.com/KRTirtho/spotube/issues/950)) ([4050f55](https://github.com/KRTirtho/spotube/commit/4050f556400aaec5515231578512cf1a6b990110)) +- improve loading + animations ([b92583d](https://github.com/KRTirtho/spotube/commit/b92583d0df7b8dee0d121cd2bb666b14c77d8c86)) +- toggle for discord + rpc ([24a2294](https://github.com/KRTirtho/spotube/commit/24a2294512bb0c4aff77bc8dcad9b4de3e8b45c6)) +- **translations:** add Dutch + Language ([#969](https://github.com/KRTirtho/spotube/issues/969)) ([3ad7ba6](https://github.com/KRTirtho/spotube/commit/3ad7ba66b56e93e69d2181d47029b7549ed225fc)) ### Bug Fixes - add safe area in home ([9ee6067](https://github.com/KRTirtho/spotube/commit/9ee60677f6d50df7468e12dc6653ecedefa2494f)) -- amoled mode and color scheme can't be changed ([840e014](https://github.com/KRTirtho/spotube/commit/840e014f2b18f193d040baef0e0cd595088a4a84)) -- doesn't minimize to tray when system title bar close button is used [#866](https://github.com/KRTirtho/spotube/issues/866) ([bb8f250](https://github.com/KRTirtho/spotube/commit/bb8f250f5f351c1a353791b77b25b9de7586191f)) +- amoled mode and color scheme can't be + changed ([840e014](https://github.com/KRTirtho/spotube/commit/840e014f2b18f193d040baef0e0cd595088a4a84)) +- doesn't minimize to tray when system title bar close button is + used [#866](https://github.com/KRTirtho/spotube/issues/866) ([bb8f250](https://github.com/KRTirtho/spotube/commit/bb8f250f5f351c1a353791b77b25b9de7586191f)) - genre border issues ([2fb16e6](https://github.com/KRTirtho/spotube/commit/2fb16e64e9cdfca54d633cdf287b0544ecdda3b6)) -- Incorrect "Artist" label/heading on Search Results Page [#920](https://github.com/KRTirtho/spotube/issues/920) ([f86d544](https://github.com/KRTirtho/spotube/commit/f86d5449168068e338f769d7f504d2146b86dc79)) -- metadata not getting added for YouTube tracks [#916](https://github.com/KRTirtho/spotube/issues/916) and Wrong duration of downloaded tracks [#912](https://github.com/KRTirtho/spotube/issues/912) ([a7b9398](https://github.com/KRTirtho/spotube/commit/a7b9398708ede865dc2c25fb791c8e98eeff7a38)) -- Playlist refresh not working [#915](https://github.com/KRTirtho/spotube/issues/915) ([5f1df5a](https://github.com/KRTirtho/spotube/commit/5f1df5a87d8fb7980b52cf57b7b6bedea57a1269)) -- track view header title overflow and player view drag glitch ([b04d884](https://github.com/KRTirtho/spotube/commit/b04d8849e7169824ec5b980236b5d61b2629f56e)) -- wrong artist name sent while scrobbling [#958](https://github.com/KRTirtho/spotube/issues/958) ([dcbe729](https://github.com/KRTirtho/spotube/commit/dcbe7294b742d43fbff4e89ab4c4825e94421dd9)) +- Incorrect "Artist" label/heading on Search Results + Page [#920](https://github.com/KRTirtho/spotube/issues/920) ([f86d544](https://github.com/KRTirtho/spotube/commit/f86d5449168068e338f769d7f504d2146b86dc79)) +- metadata not getting added for YouTube tracks [#916](https://github.com/KRTirtho/spotube/issues/916) and Wrong + duration of downloaded + tracks [#912](https://github.com/KRTirtho/spotube/issues/912) ([a7b9398](https://github.com/KRTirtho/spotube/commit/a7b9398708ede865dc2c25fb791c8e98eeff7a38)) +- Playlist refresh not + working [#915](https://github.com/KRTirtho/spotube/issues/915) ([5f1df5a](https://github.com/KRTirtho/spotube/commit/5f1df5a87d8fb7980b52cf57b7b6bedea57a1269)) +- track view header title overflow and player view drag + glitch ([b04d884](https://github.com/KRTirtho/spotube/commit/b04d8849e7169824ec5b980236b5d61b2629f56e)) +- wrong artist name sent while + scrobbling [#958](https://github.com/KRTirtho/spotube/issues/958) ([dcbe729](https://github.com/KRTirtho/spotube/commit/dcbe7294b742d43fbff4e89ab4c4825e94421dd9)) ## [3.3.0](https://github.com/KRTirtho/spotube/compare/v3.2.0...v3.3.0) (2023-11-27) ### Features -- Add JioSaavn as audio source ([#881](https://github.com/KRTirtho/spotube/issues/881)) ([14069cd](https://github.com/KRTirtho/spotube/commit/14069cd4fe08597c8d9aa0810270fb4c386c1d55)) -- **android:** better quick scroll/drag to scroll implementation ([2e2c44f](https://github.com/KRTirtho/spotube/commit/2e2c44f0afef69bf9bc485db97d45127a0847c8e)) -- **artist:** modularize page and add wikipedia section ([2a69886](https://github.com/KRTirtho/spotube/commit/2a698865567883271471ace9a44123bbfd8fcd2f)) -- discord RPC integration [#98](https://github.com/KRTirtho/spotube/issues/98) ([88b8785](https://github.com/KRTirtho/spotube/commit/88b8785cb86a19900f3a867b044c1ccb2fe400bb)) -- **mini_player:** show/hide lyrics [#851](https://github.com/KRTirtho/spotube/issues/851) ([dcbb156](https://github.com/KRTirtho/spotube/commit/dcbb1568337969841acc0abe0e7185ee5e4c3590)) -- paginated playlist and album page ([28a5d6b](https://github.com/KRTirtho/spotube/commit/28a5d6bb3820ab0bd4007664f73d685f6e1d2c90)) -- **translations:** add Turkish translations ([0c22469](https://github.com/KRTirtho/spotube/commit/0c22469503f32dbbf1a5d31419c1b76c699fa966)) +- Add JioSaavn as audio + source ([#881](https://github.com/KRTirtho/spotube/issues/881)) ([14069cd](https://github.com/KRTirtho/spotube/commit/14069cd4fe08597c8d9aa0810270fb4c386c1d55)) +- **android:** better quick scroll/drag to scroll + implementation ([2e2c44f](https://github.com/KRTirtho/spotube/commit/2e2c44f0afef69bf9bc485db97d45127a0847c8e)) +- **artist:** modularize page and add wikipedia + section ([2a69886](https://github.com/KRTirtho/spotube/commit/2a698865567883271471ace9a44123bbfd8fcd2f)) +- discord RPC + integration [#98](https://github.com/KRTirtho/spotube/issues/98) ([88b8785](https://github.com/KRTirtho/spotube/commit/88b8785cb86a19900f3a867b044c1ccb2fe400bb)) +- **mini_player:** show/hide + lyrics [#851](https://github.com/KRTirtho/spotube/issues/851) ([dcbb156](https://github.com/KRTirtho/spotube/commit/dcbb1568337969841acc0abe0e7185ee5e4c3590)) +- paginated playlist and album + page ([28a5d6b](https://github.com/KRTirtho/spotube/commit/28a5d6bb3820ab0bd4007664f73d685f6e1d2c90)) +- **translations:** add Turkish + translations ([0c22469](https://github.com/KRTirtho/spotube/commit/0c22469503f32dbbf1a5d31419c1b76c699fa966)) ### Bug Fixes -- "Add () to Playlist" option not showing in favorited playlists [#904](https://github.com/KRTirtho/spotube/issues/904) ([96021e1](https://github.com/KRTirtho/spotube/commit/96021e1a49d22bd25fd052c122f49f439c2bea43)) -- 0:00 media duration in queue after application restart [#782](https://github.com/KRTirtho/spotube/issues/782) ([83c0b49](https://github.com/KRTirtho/spotube/commit/83c0b49da962d9f3d40de9525f90f0b320e8f7b8)) -- Add to Playlist Dialog memory leak [#817](https://github.com/KRTirtho/spotube/issues/817) ([fed36ec](https://github.com/KRTirtho/spotube/commit/fed36ecdd81e8a0f8358693eff0a6233dea32e5d)) -- **album_card:** show loading state during adding track to queue/play ([5633367](https://github.com/KRTirtho/spotube/commit/5633367397812148f6d712d06e97a4f84033f968)) -- alternative track source safearea overflow [#876](https://github.com/KRTirtho/spotube/issues/876) ([7b72a90](https://github.com/KRTirtho/spotube/commit/7b72a90bc65b541cbe2e24ef2234524b522ad71d)) -- android invalid download location Download not starting or not explaining error [#720](https://github.com/KRTirtho/spotube/issues/720) ([d056dbf](https://github.com/KRTirtho/spotube/commit/d056dbf9eeef7033dbc012d0c05800063e820042)) -- changed settings are not persisting after force stop [#821](https://github.com/KRTirtho/spotube/issues/821) ([e29a38d](https://github.com/KRTirtho/spotube/commit/e29a38dfa43ddf7a38046d1d40424f01dbe62261)) -- check for unsynced lyrics and error handling for timed lyrics query ([1d77556](https://github.com/KRTirtho/spotube/commit/1d77556157d158600f29cf2ea5f26c567607dec7)) -- **genres:** lag while scrolling ([dc980b0](https://github.com/KRTirtho/spotube/commit/dc980b024edad3132e72cbb2f0087297a4b76469)) -- infinite list disappearing for a moment everytime new page is fetched ([1334a62](https://github.com/KRTirtho/spotube/commit/1334a62aaea31f97031b3ebf455e94c583f37314)) -- last track of queue keeps repeating [#718](https://github.com/KRTirtho/spotube/issues/718) ([58e5698](https://github.com/KRTirtho/spotube/commit/58e569864dddd74c3064624998dfc184046e97eb)) -- Navigating to settings, redirects to home page [#812](https://github.com/KRTirtho/spotube/issues/812) ([da04f06](https://github.com/KRTirtho/spotube/commit/da04f068f9b7effff8d50cb5714d93ea80c22b7f)) -- new releases section flickering on scroll glitch ([ee94b7c](https://github.com/KRTirtho/spotube/commit/ee94b7cbb24e0f0bc22a6d49c830d4055aa02895)) -- **playbutton_card:** annoying animation ([574406d](https://github.com/KRTirtho/spotube/commit/574406dd5fc410914b27e7fce374323696845012)) -- scrobbling not working for first track or single track ([0a6b54d](https://github.com/KRTirtho/spotube/commit/0a6b54da367345b73fe6e954f1d9368d9f9ead71)) -- settings page scrollbar position ([ee82290](https://github.com/KRTirtho/spotube/commit/ee8229020b3b03fc074b316db4b322af13b807bd)) -- shuffle doesn't move active track to top ([4956bf3](https://github.com/KRTirtho/spotube/commit/4956bf367baae39c88b5de7c6c136513a14f8ad2)) -- spotube doesn't exit properly, hangs in infinite loop [#768](https://github.com/KRTirtho/spotube/issues/768) ([353ca79](https://github.com/KRTirtho/spotube/commit/353ca79be334077c3ac27b4f64e8b4b15eca7175)) -- trim login field padding ([286ef83](https://github.com/KRTirtho/spotube/commit/286ef83e8ec516db70019398d9e3e724437a4172)) -- use CustomScrollView for personalized page ([7d05c40](https://github.com/KRTirtho/spotube/commit/7d05c40dc0d04208b059f2483c1e4de199c8b51d)) -- user_playlists layout, track tile index, ([487c2ed](https://github.com/KRTirtho/spotube/commit/487c2ed6bdc4af33006ba52532eb4eaaa261dceb)) -- **windows:** media control not working [#641](https://github.com/KRTirtho/spotube/issues/641) ([7818574](https://github.com/KRTirtho/spotube/commit/7818574356d0fb8ff567e1f6a83fd0b6f2ee7c8a)) +- "Add () to Playlist" option not showing in favorited + playlists [#904](https://github.com/KRTirtho/spotube/issues/904) ([96021e1](https://github.com/KRTirtho/spotube/commit/96021e1a49d22bd25fd052c122f49f439c2bea43)) +- 0:00 media duration in queue after application + restart [#782](https://github.com/KRTirtho/spotube/issues/782) ([83c0b49](https://github.com/KRTirtho/spotube/commit/83c0b49da962d9f3d40de9525f90f0b320e8f7b8)) +- Add to Playlist Dialog memory + leak [#817](https://github.com/KRTirtho/spotube/issues/817) ([fed36ec](https://github.com/KRTirtho/spotube/commit/fed36ecdd81e8a0f8358693eff0a6233dea32e5d)) +- **album_card:** show loading state during adding track to + queue/play ([5633367](https://github.com/KRTirtho/spotube/commit/5633367397812148f6d712d06e97a4f84033f968)) +- alternative track source safearea + overflow [#876](https://github.com/KRTirtho/spotube/issues/876) ([7b72a90](https://github.com/KRTirtho/spotube/commit/7b72a90bc65b541cbe2e24ef2234524b522ad71d)) +- android invalid download location Download not starting or not explaining + error [#720](https://github.com/KRTirtho/spotube/issues/720) ([d056dbf](https://github.com/KRTirtho/spotube/commit/d056dbf9eeef7033dbc012d0c05800063e820042)) +- changed settings are not persisting after force + stop [#821](https://github.com/KRTirtho/spotube/issues/821) ([e29a38d](https://github.com/KRTirtho/spotube/commit/e29a38dfa43ddf7a38046d1d40424f01dbe62261)) +- check for unsynced lyrics and error handling for timed lyrics + query ([1d77556](https://github.com/KRTirtho/spotube/commit/1d77556157d158600f29cf2ea5f26c567607dec7)) +- **genres:** lag while + scrolling ([dc980b0](https://github.com/KRTirtho/spotube/commit/dc980b024edad3132e72cbb2f0087297a4b76469)) +- infinite list disappearing for a moment everytime new page is + fetched ([1334a62](https://github.com/KRTirtho/spotube/commit/1334a62aaea31f97031b3ebf455e94c583f37314)) +- last track of queue keeps + repeating [#718](https://github.com/KRTirtho/spotube/issues/718) ([58e5698](https://github.com/KRTirtho/spotube/commit/58e569864dddd74c3064624998dfc184046e97eb)) +- Navigating to settings, redirects to home + page [#812](https://github.com/KRTirtho/spotube/issues/812) ([da04f06](https://github.com/KRTirtho/spotube/commit/da04f068f9b7effff8d50cb5714d93ea80c22b7f)) +- new releases section flickering on scroll + glitch ([ee94b7c](https://github.com/KRTirtho/spotube/commit/ee94b7cbb24e0f0bc22a6d49c830d4055aa02895)) +- **playbutton_card:** annoying + animation ([574406d](https://github.com/KRTirtho/spotube/commit/574406dd5fc410914b27e7fce374323696845012)) +- scrobbling not working for first track or single + track ([0a6b54d](https://github.com/KRTirtho/spotube/commit/0a6b54da367345b73fe6e954f1d9368d9f9ead71)) +- settings page scrollbar + position ([ee82290](https://github.com/KRTirtho/spotube/commit/ee8229020b3b03fc074b316db4b322af13b807bd)) +- shuffle doesn't move active track to + top ([4956bf3](https://github.com/KRTirtho/spotube/commit/4956bf367baae39c88b5de7c6c136513a14f8ad2)) +- spotube doesn't exit properly, hangs in infinite + loop [#768](https://github.com/KRTirtho/spotube/issues/768) ([353ca79](https://github.com/KRTirtho/spotube/commit/353ca79be334077c3ac27b4f64e8b4b15eca7175)) +- trim login field + padding ([286ef83](https://github.com/KRTirtho/spotube/commit/286ef83e8ec516db70019398d9e3e724437a4172)) +- use CustomScrollView for personalized + page ([7d05c40](https://github.com/KRTirtho/spotube/commit/7d05c40dc0d04208b059f2483c1e4de199c8b51d)) +- user_playlists layout, track tile + index, ([487c2ed](https://github.com/KRTirtho/spotube/commit/487c2ed6bdc4af33006ba52532eb4eaaa261dceb)) +- **windows:** media control not + working [#641](https://github.com/KRTirtho/spotube/issues/641) ([7818574](https://github.com/KRTirtho/spotube/commit/7818574356d0fb8ff567e1f6a83fd0b6f2ee7c8a)) ## [3.2.0](https://github.com/KRTirtho/spotube/compare/v3.1.2...v3.2.0) (2023-10-16) ### Features -- ability to select/copy lyrics [#802](https://github.com/KRTirtho/spotube/issues/802) ([0eb9ee8](https://github.com/KRTirtho/spotube/commit/0eb9ee8648bee43a8009e6752674b1be646c0916)) -- add Amoled theme [#724](https://github.com/KRTirtho/spotube/issues/724) ([5c5dbf6](https://github.com/KRTirtho/spotube/commit/5c5dbf69ecea95c92d3c3900ad690a500d75b4e2)) -- add audio normalization [#164](https://github.com/KRTirtho/spotube/issues/164) ([da10ab2](https://github.com/KRTirtho/spotube/commit/da10ab2e291d4ba4d3082b9a6ae535639fb8f1b7)) -- add restore default settings button ([94c3866](https://github.com/KRTirtho/spotube/commit/94c386638f2e5a42d21c8f157835443333ee6d5c)) -- configurable audio normalization switch ([c325911](https://github.com/KRTirtho/spotube/commit/c325911c0d87758a203a52df02179c1513bad3fd)) -- customizable stream/download file formats ([#757](https://github.com/KRTirtho/spotube/issues/757)) ([e54762b](https://github.com/KRTirtho/spotube/commit/e54762be6add6524ab614d103fc3557a101c75f4)) -- improve and unify the logging framework ([#738](https://github.com/KRTirtho/spotube/issues/738)) ([c7432bb](https://github.com/KRTirtho/spotube/commit/c7432bbd986d576a93957f0a22bdbca5c1e87f20)) -- LastFM scrobbling support ([#761](https://github.com/KRTirtho/spotube/issues/761)) ([f5bd907](https://github.com/KRTirtho/spotube/commit/f5bd90731d9abc19d684c8bcb231eff399e73023)) -- loading indicator for genre and personalized pages ([ffe8d9c](https://github.com/KRTirtho/spotube/commit/ffe8d9ca6da25cb3e6fd2c781d5ed3a7b919510e)) -- manual offline detection ([854ab89](https://github.com/KRTirtho/spotube/commit/854ab8910dffb2837c011d3439173a1f0ebe9c6c)) -- show error dialog on failed to login ([101c325](https://github.com/KRTirtho/spotube/commit/101c32523d3be8c05527261f6f63f939d388ad79)) -- sliding up player support ([083319f](https://github.com/KRTirtho/spotube/commit/083319fd2445ab179e3dcda0a6aeaca6f13dda29)) -- swipe to open player view ([#765](https://github.com/KRTirtho/spotube/issues/765)) ([9aee056](https://github.com/KRTirtho/spotube/commit/9aee0568bf42eed9fea8d517e960a010abf0ebf2)) -- thicken the scrollbars & make 'em interactive for mobile ([#764](https://github.com/KRTirtho/spotube/issues/764)) ([84a4bcd](https://github.com/KRTirtho/spotube/commit/84a4bcd948ab459489aaf6f39d6954776c3401d7)) -- **translations:** add Arabic Translations ([#740](https://github.com/KRTirtho/spotube/issues/740)) ([38493f9](https://github.com/KRTirtho/spotube/commit/38493f9dd75303890857a626c0b276ee1ab75bb2)) -- **translations:** add Farsi Translations ([#760](https://github.com/KRTirtho/spotube/issues/760)) ([fe42cfe](https://github.com/KRTirtho/spotube/commit/fe42cfe8430035d9b67dd158fb7b835ee4071497)) +- ability to select/copy + lyrics [#802](https://github.com/KRTirtho/spotube/issues/802) ([0eb9ee8](https://github.com/KRTirtho/spotube/commit/0eb9ee8648bee43a8009e6752674b1be646c0916)) +- add Amoled + theme [#724](https://github.com/KRTirtho/spotube/issues/724) ([5c5dbf6](https://github.com/KRTirtho/spotube/commit/5c5dbf69ecea95c92d3c3900ad690a500d75b4e2)) +- add audio + normalization [#164](https://github.com/KRTirtho/spotube/issues/164) ([da10ab2](https://github.com/KRTirtho/spotube/commit/da10ab2e291d4ba4d3082b9a6ae535639fb8f1b7)) +- add restore default settings + button ([94c3866](https://github.com/KRTirtho/spotube/commit/94c386638f2e5a42d21c8f157835443333ee6d5c)) +- configurable audio normalization + switch ([c325911](https://github.com/KRTirtho/spotube/commit/c325911c0d87758a203a52df02179c1513bad3fd)) +- customizable stream/download file + formats ([#757](https://github.com/KRTirtho/spotube/issues/757)) ([e54762b](https://github.com/KRTirtho/spotube/commit/e54762be6add6524ab614d103fc3557a101c75f4)) +- improve and unify the logging + framework ([#738](https://github.com/KRTirtho/spotube/issues/738)) ([c7432bb](https://github.com/KRTirtho/spotube/commit/c7432bbd986d576a93957f0a22bdbca5c1e87f20)) +- LastFM scrobbling + support ([#761](https://github.com/KRTirtho/spotube/issues/761)) ([f5bd907](https://github.com/KRTirtho/spotube/commit/f5bd90731d9abc19d684c8bcb231eff399e73023)) +- loading indicator for genre and personalized + pages ([ffe8d9c](https://github.com/KRTirtho/spotube/commit/ffe8d9ca6da25cb3e6fd2c781d5ed3a7b919510e)) +- manual offline + detection ([854ab89](https://github.com/KRTirtho/spotube/commit/854ab8910dffb2837c011d3439173a1f0ebe9c6c)) +- show error dialog on failed to + login ([101c325](https://github.com/KRTirtho/spotube/commit/101c32523d3be8c05527261f6f63f939d388ad79)) +- sliding up player + support ([083319f](https://github.com/KRTirtho/spotube/commit/083319fd2445ab179e3dcda0a6aeaca6f13dda29)) +- swipe to open player + view ([#765](https://github.com/KRTirtho/spotube/issues/765)) ([9aee056](https://github.com/KRTirtho/spotube/commit/9aee0568bf42eed9fea8d517e960a010abf0ebf2)) +- thicken the scrollbars & make 'em interactive for + mobile ([#764](https://github.com/KRTirtho/spotube/issues/764)) ([84a4bcd](https://github.com/KRTirtho/spotube/commit/84a4bcd948ab459489aaf6f39d6954776c3401d7)) +- **translations:** add Arabic + Translations ([#740](https://github.com/KRTirtho/spotube/issues/740)) ([38493f9](https://github.com/KRTirtho/spotube/commit/38493f9dd75303890857a626c0b276ee1ab75bb2)) +- **translations:** add Farsi + Translations ([#760](https://github.com/KRTirtho/spotube/issues/760)) ([fe42cfe](https://github.com/KRTirtho/spotube/commit/fe42cfe8430035d9b67dd158fb7b835ee4071497)) ### Bug Fixes -- add libmpv1 for ubuntu-based systems ([#739](https://github.com/KRTirtho/spotube/issues/739)) ([5115e04](https://github.com/KRTirtho/spotube/commit/5115e041e78c20fce798a80f1d844bfc60746958)) -- add xdg-user-dirs as deps ([f3e331e](https://github.com/KRTirtho/spotube/commit/f3e331ecf733995da24c9b907efc5ed4bd02ffdd)) -- **android :** file_selector getDirectoryPath returns unusable content urls [#720](https://github.com/KRTirtho/spotube/issues/720) ([b3cf639](https://github.com/KRTirtho/spotube/commit/b3cf639ee2f970f4df9b394b260c3ad8a5732a9c)) -- **android:** audio doesn't resume on interruption end ([15d466a](https://github.com/KRTirtho/spotube/commit/15d466a04538ec70c3a0c132f2baaaf8690f8d4e)) -- **android:** system navigator back doesn't close player ([20d7092](https://github.com/KRTirtho/spotube/commit/20d70927c909347e84ffa8e456f8fab88d49d179)) -- get rid of overflow errors & status bar dark color ([5bb8231](https://github.com/KRTirtho/spotube/commit/5bb8231782287faf75c778fadb3a03ac774d14f0)) -- keyboard shortcuts changing route but not update sidebar ([2d93441](https://github.com/KRTirtho/spotube/commit/2d934411887bd104d8265236df5bf595c5ad2278)) +- add libmpv1 for ubuntu-based + systems ([#739](https://github.com/KRTirtho/spotube/issues/739)) ([5115e04](https://github.com/KRTirtho/spotube/commit/5115e041e78c20fce798a80f1d844bfc60746958)) +- add xdg-user-dirs as + deps ([f3e331e](https://github.com/KRTirtho/spotube/commit/f3e331ecf733995da24c9b907efc5ed4bd02ffdd)) +- **android :** file_selector getDirectoryPath returns unusable content + urls [#720](https://github.com/KRTirtho/spotube/issues/720) ([b3cf639](https://github.com/KRTirtho/spotube/commit/b3cf639ee2f970f4df9b394b260c3ad8a5732a9c)) +- **android:** audio doesn't resume on interruption + end ([15d466a](https://github.com/KRTirtho/spotube/commit/15d466a04538ec70c3a0c132f2baaaf8690f8d4e)) +- **android:** system navigator back doesn't close + player ([20d7092](https://github.com/KRTirtho/spotube/commit/20d70927c909347e84ffa8e456f8fab88d49d179)) +- get rid of overflow errors & status bar dark + color ([5bb8231](https://github.com/KRTirtho/spotube/commit/5bb8231782287faf75c778fadb3a03ac774d14f0)) +- keyboard shortcuts changing route but not update + sidebar ([2d93441](https://github.com/KRTirtho/spotube/commit/2d934411887bd104d8265236df5bf595c5ad2278)) - last track repeats ([ed6ca00](https://github.com/KRTirtho/spotube/commit/ed6ca006ce237ed8d509cde9ed47cd6ea3396b63)) - minor glitches ([e5d0aaf](https://github.com/KRTirtho/spotube/commit/e5d0aaf80d22b2291b6f7e7c5e18dd99ae1a7a82)) -- not fetching all followed artists ([#759](https://github.com/KRTirtho/spotube/issues/759)) ([c09a572](https://github.com/KRTirtho/spotube/commit/c09a5729251d8df820442d55477455f78c19c52e)) -- use audio_service_mpris plugin ([e29cc25](https://github.com/KRTirtho/spotube/commit/e29cc2578cab36729e235b117c1b5489c3452902)) -- valid non-ASCII characters get removed from downloaded file name [#745](https://github.com/KRTirtho/spotube/issues/745) ([a7e102f](https://github.com/KRTirtho/spotube/commit/a7e102ffc726d00df369560ec9a7f742f9d387bb)) +- not fetching all followed + artists ([#759](https://github.com/KRTirtho/spotube/issues/759)) ([c09a572](https://github.com/KRTirtho/spotube/commit/c09a5729251d8df820442d55477455f78c19c52e)) +- use audio_service_mpris + plugin ([e29cc25](https://github.com/KRTirtho/spotube/commit/e29cc2578cab36729e235b117c1b5489c3452902)) +- valid non-ASCII characters get removed from downloaded file + name [#745](https://github.com/KRTirtho/spotube/issues/745) ([a7e102f](https://github.com/KRTirtho/spotube/commit/a7e102ffc726d00df369560ec9a7f742f9d387bb)) ## [3.1.2](https://github.com/KRTirtho/spotube/compare/v3.1.1...v3.1.2) (2023-09-15) ### Features -- **player_queue:** filtering track support ([d4f99ec](https://github.com/KRTirtho/spotube/commit/d4f99ec89927ea78f070707509ff3222ec402942)) -- right click to open track option ([1540999](https://github.com/KRTirtho/spotube/commit/1540999f50d7ba78d9706d73127483b98d800d86)) -- search loading animation ([b9d5c70](https://github.com/KRTirtho/spotube/commit/b9d5c70301dd33ec26332e5e9a456ce5bfe73da0)) -- show loading indicator on play track ([d12ea48](https://github.com/KRTirtho/spotube/commit/d12ea48b97596205d6309012d561ce83e5cbc9c1)) +- **player_queue:** filtering track + support ([d4f99ec](https://github.com/KRTirtho/spotube/commit/d4f99ec89927ea78f070707509ff3222ec402942)) +- right click to open track + option ([1540999](https://github.com/KRTirtho/spotube/commit/1540999f50d7ba78d9706d73127483b98d800d86)) +- search loading + animation ([b9d5c70](https://github.com/KRTirtho/spotube/commit/b9d5c70301dd33ec26332e5e9a456ce5bfe73da0)) +- show loading indicator on play + track ([d12ea48](https://github.com/KRTirtho/spotube/commit/d12ea48b97596205d6309012d561ce83e5cbc9c1)) ### Bug Fixes -- add missing dependency in debian package ([#704](https://github.com/KRTirtho/spotube/issues/704)) ([c987ea7](https://github.com/KRTirtho/spotube/commit/c987ea78414f094dead2c2b35ddf8ae83a70f2fe)) -- hour not showing for tracks longer than 60 minutes ([#648](https://github.com/KRTirtho/spotube/issues/648)) ([de335f4](https://github.com/KRTirtho/spotube/commit/de335f48342e45a077d6c3202706ef48dfb0a326)) -- liked tracks card play not working ([d3e1cef](https://github.com/KRTirtho/spotube/commit/d3e1cef8a21ef7d64e74ca4e99b4b57b653b60a7)) -- limit cover image upload to allowed 256kb size ([1c50612](https://github.com/KRTirtho/spotube/commit/1c50612559a78dce9c108f7e7b816d1b84540fe4)) -- playlist grey page ([#707](https://github.com/KRTirtho/spotube/issues/707)) ([0df8d9c](https://github.com/KRTirtho/spotube/commit/0df8d9cacee718fbb4cf3ec7b950b489630f3145)) -- rewind breaks track progress bar ([#695](https://github.com/KRTirtho/spotube/issues/695)) ([e321743](https://github.com/KRTirtho/spotube/commit/e3217436c9985b86c68dab93ea65ee414b32fb49)) -- Windows memory leak due refetchOnStale user-liked-tracks ([#705](https://github.com/KRTirtho/spotube/issues/705)) ([142dc49](https://github.com/KRTirtho/spotube/commit/142dc498f8f9d26e6b370c9c52f790a20832fc38)) +- add missing dependency in debian + package ([#704](https://github.com/KRTirtho/spotube/issues/704)) ([c987ea7](https://github.com/KRTirtho/spotube/commit/c987ea78414f094dead2c2b35ddf8ae83a70f2fe)) +- hour not showing for tracks longer than 60 + minutes ([#648](https://github.com/KRTirtho/spotube/issues/648)) ([de335f4](https://github.com/KRTirtho/spotube/commit/de335f48342e45a077d6c3202706ef48dfb0a326)) +- liked tracks card play not + working ([d3e1cef](https://github.com/KRTirtho/spotube/commit/d3e1cef8a21ef7d64e74ca4e99b4b57b653b60a7)) +- limit cover image upload to allowed 256kb + size ([1c50612](https://github.com/KRTirtho/spotube/commit/1c50612559a78dce9c108f7e7b816d1b84540fe4)) +- playlist grey + page ([#707](https://github.com/KRTirtho/spotube/issues/707)) ([0df8d9c](https://github.com/KRTirtho/spotube/commit/0df8d9cacee718fbb4cf3ec7b950b489630f3145)) +- rewind breaks track progress + bar ([#695](https://github.com/KRTirtho/spotube/issues/695)) ([e321743](https://github.com/KRTirtho/spotube/commit/e3217436c9985b86c68dab93ea65ee414b32fb49)) +- Windows memory leak due refetchOnStale + user-liked-tracks ([#705](https://github.com/KRTirtho/spotube/issues/705)) ([142dc49](https://github.com/KRTirtho/spotube/commit/142dc498f8f9d26e6b370c9c52f790a20832fc38)) ## [3.1.1](https://github.com/KRTirtho/spotube/compare/v3.1.0...v3.1.1) (2023-08-28) ### Features -- ability to toggle system title bar & custom title bar ([#185](https://github.com/KRTirtho/spotube/issues/185)) ([8d46029](https://github.com/KRTirtho/spotube/commit/8d4602962be20ea4bafc20db10eae1160f83ac52)) -- jump to specific time on lyric click ([#590](https://github.com/KRTirtho/spotube/issues/590)) ([a14fb9e](https://github.com/KRTirtho/spotube/commit/a14fb9ec389822e5ffa0c537e162b87cbba34e6c)) +- ability to toggle system title bar & custom title + bar ([#185](https://github.com/KRTirtho/spotube/issues/185)) ([8d46029](https://github.com/KRTirtho/spotube/commit/8d4602962be20ea4bafc20db10eae1160f83ac52)) +- jump to specific time on lyric + click ([#590](https://github.com/KRTirtho/spotube/issues/590)) ([a14fb9e](https://github.com/KRTirtho/spotube/commit/a14fb9ec389822e5ffa0c537e162b87cbba34e6c)) - paginated user albums ([d239d64](https://github.com/KRTirtho/spotube/commit/d239d641ff8f1b3edd64243994fd4a58cf71a5d3)) -- **translations:** add Russian translation ([#661](https://github.com/KRTirtho/spotube/issues/661)) ([e9a0911](https://github.com/KRTirtho/spotube/commit/e9a0911bfcea2374ee282aee738c12ad9ed93b02)), closes [#625](https://github.com/KRTirtho/spotube/issues/625) -- **translations:** added Portuguese (Brazil) translation ([#634](https://github.com/KRTirtho/spotube/issues/634)) ([76f30a0](https://github.com/KRTirtho/spotube/commit/76f30a0f20f2b09680d27525cde3d1c9617fad5a)) +- **translations:** add Russian + translation ([#661](https://github.com/KRTirtho/spotube/issues/661)) ([e9a0911](https://github.com/KRTirtho/spotube/commit/e9a0911bfcea2374ee282aee738c12ad9ed93b02)), + closes [#625](https://github.com/KRTirtho/spotube/issues/625) +- **translations:** added Portuguese (Brazil) + translation ([#634](https://github.com/KRTirtho/spotube/issues/634)) ([76f30a0](https://github.com/KRTirtho/spotube/commit/76f30a0f20f2b09680d27525cde3d1c9617fad5a)) ### Bug Fixes -- always fetching SponsorBlock if no segments found & download failing ([6ced0a0](https://github.com/KRTirtho/spotube/commit/6ced0a0fad06f9f431636ca0fe5dae83eafe33ce)) -- debian bookworm invalid dependencies ([633415d](https://github.com/KRTirtho/spotube/commit/633415dd3e702a38c5a7e7d7b3b1c2713d9c9cc9)) -- disable android auto for playstore version :"( ([0f0d240](https://github.com/KRTirtho/spotube/commit/0f0d240c04d77db6f7c127d59ba8b331d5534469)) -- infinite route push glitch ([e90eceb](https://github.com/KRTirtho/spotube/commit/e90eceb285a84028df690c25a687ff9b5168bba8)) -- jump to track going to wrong track ([190df17](https://github.com/KRTirtho/spotube/commit/190df17adcf4c01cb2bcebfdec47908828b33816)) -- last track of queue never plays & repeat playlist never works ([c3c09f5](https://github.com/KRTirtho/spotube/commit/c3c09f5b76c9547a306d15cd3768dacc1622876d)) -- lyrics page text contrast ([179d536](https://github.com/KRTirtho/spotube/commit/179d536ccc10a5e63f11a63680a6e61c2d1314c8)) -- replace connectivity_plus with internet_connection_checker ([f23e871](https://github.com/KRTirtho/spotube/commit/f23e8719eec7f5bed677ea866cb4bfab7aee5373)) -- sanitize song title for file name ([#644](https://github.com/KRTirtho/spotube/issues/644)) ([1a7ea0c](https://github.com/KRTirtho/spotube/commit/1a7ea0ce6aae1a7cbe195f6b2fae7d99082bb828)) -- sorting by date crashes app ([#551](https://github.com/KRTirtho/spotube/issues/551)) ([48e90a4](https://github.com/KRTirtho/spotube/commit/48e90a42294a6287cad65f840a7cc305988d34ff)) -- window size remains same after exiting mini player ([#618](https://github.com/KRTirtho/spotube/issues/618)) ([fb36003](https://github.com/KRTirtho/spotube/commit/fb360035ade09c270b46a0c3b99ab1594ece07c0)) +- always fetching SponsorBlock if no segments found & download + failing ([6ced0a0](https://github.com/KRTirtho/spotube/commit/6ced0a0fad06f9f431636ca0fe5dae83eafe33ce)) +- debian bookworm invalid + dependencies ([633415d](https://github.com/KRTirtho/spotube/commit/633415dd3e702a38c5a7e7d7b3b1c2713d9c9cc9)) +- disable android auto for playstore + version :"( ([0f0d240](https://github.com/KRTirtho/spotube/commit/0f0d240c04d77db6f7c127d59ba8b331d5534469)) +- infinite route push + glitch ([e90eceb](https://github.com/KRTirtho/spotube/commit/e90eceb285a84028df690c25a687ff9b5168bba8)) +- jump to track going to wrong + track ([190df17](https://github.com/KRTirtho/spotube/commit/190df17adcf4c01cb2bcebfdec47908828b33816)) +- last track of queue never plays & repeat playlist never + works ([c3c09f5](https://github.com/KRTirtho/spotube/commit/c3c09f5b76c9547a306d15cd3768dacc1622876d)) +- lyrics page text + contrast ([179d536](https://github.com/KRTirtho/spotube/commit/179d536ccc10a5e63f11a63680a6e61c2d1314c8)) +- replace connectivity_plus with + internet_connection_checker ([f23e871](https://github.com/KRTirtho/spotube/commit/f23e8719eec7f5bed677ea866cb4bfab7aee5373)) +- sanitize song title for file + name ([#644](https://github.com/KRTirtho/spotube/issues/644)) ([1a7ea0c](https://github.com/KRTirtho/spotube/commit/1a7ea0ce6aae1a7cbe195f6b2fae7d99082bb828)) +- sorting by date crashes + app ([#551](https://github.com/KRTirtho/spotube/issues/551)) ([48e90a4](https://github.com/KRTirtho/spotube/commit/48e90a42294a6287cad65f840a7cc305988d34ff)) +- window size remains same after exiting mini + player ([#618](https://github.com/KRTirtho/spotube/issues/618)) ([fb36003](https://github.com/KRTirtho/spotube/commit/fb360035ade09c270b46a0c3b99ab1594ece07c0)) ## [3.1.0](https://github.com/KRTirtho/spotube/compare/v3.0.1...v3.1.0) (2023-08-18) ### Features -- add android auto media session control support ([0f5748a](https://github.com/KRTirtho/spotube/commit/0f5748a24b4b5a32862f7b2f28151e2d42bcce33)) -- better track matching on youtube API ([904a0d3](https://github.com/KRTirtho/spotube/commit/904a0d3e15a8e4a76d0842e978809d2838439f86)) -- blazingly™ fast download manager ([#619](https://github.com/KRTirtho/spotube/issues/619)) ([38dc4be](https://github.com/KRTirtho/spotube/commit/38dc4beb44827a20044afd120d7c32f097938660)) -- paginated user playlists ([e7c6813](https://github.com/KRTirtho/spotube/commit/e7c6813ccb2afcda9a8b044570a1c0a27785a59f)) -- show error dialog on piped API 500 error ([c69f81e](https://github.com/KRTirtho/spotube/commit/c69f81ec6f01f0f67ad06446e890aa1351516626)) -- **translation:** add catalan translations ([#621](https://github.com/KRTirtho/spotube/issues/621)) ([c94e5ba](https://github.com/KRTirtho/spotube/commit/c94e5ba4301ed0cb760daff56c56d2701b35131f)) -- **translations:** add polish translation ([#631](https://github.com/KRTirtho/spotube/issues/631)) ([f90e9be](https://github.com/KRTirtho/spotube/commit/f90e9bee3104a3812c2f775dd16cabbb56f668cb)) +- add android auto media session control + support ([0f5748a](https://github.com/KRTirtho/spotube/commit/0f5748a24b4b5a32862f7b2f28151e2d42bcce33)) +- better track matching on youtube + API ([904a0d3](https://github.com/KRTirtho/spotube/commit/904a0d3e15a8e4a76d0842e978809d2838439f86)) +- blazingly™ fast download + manager ([#619](https://github.com/KRTirtho/spotube/issues/619)) ([38dc4be](https://github.com/KRTirtho/spotube/commit/38dc4beb44827a20044afd120d7c32f097938660)) +- paginated user + playlists ([e7c6813](https://github.com/KRTirtho/spotube/commit/e7c6813ccb2afcda9a8b044570a1c0a27785a59f)) +- show error dialog on piped API 500 + error ([c69f81e](https://github.com/KRTirtho/spotube/commit/c69f81ec6f01f0f67ad06446e890aa1351516626)) +- **translation:** add catalan + translations ([#621](https://github.com/KRTirtho/spotube/issues/621)) ([c94e5ba](https://github.com/KRTirtho/spotube/commit/c94e5ba4301ed0cb760daff56c56d2701b35131f)) +- **translations:** add polish + translation ([#631](https://github.com/KRTirtho/spotube/issues/631)) ([f90e9be](https://github.com/KRTirtho/spotube/commit/f90e9bee3104a3812c2f775dd16cabbb56f668cb)) - web compatibility ([cf7b849](https://github.com/KRTirtho/spotube/commit/cf7b849cddca3260d9c3a6a064418b0ba2d63270)) ### Bug Fixes -- always showing play in playlist/album views ([8521cc5](https://github.com/KRTirtho/spotube/commit/8521cc5c88730caa9db74da6c04b679bf29ed56d)) -- **android:** android 13 local tracks not showing up ([e3f4344](https://github.com/KRTirtho/spotube/commit/e3f4344ae9c1ec93860d4c5d1b8de1a803b29569)) -- default to youtube API by default ([5a8a1e4](https://github.com/KRTirtho/spotube/commit/5a8a1e41e93fb74756b8c88f6325b8b46d7af131)) -- generate playlist page max width ([4adf695](https://github.com/KRTirtho/spotube/commit/4adf6951d9ee78ac4b198d541dada28dc00ca0cb)) -- tracks doesn't change when ended ([aa4ac86](https://github.com/KRTirtho/spotube/commit/aa4ac8641a7dceb4626ab675ba376b24a3480d30)) -- windows media controls not working ([ae5edd1](https://github.com/KRTirtho/spotube/commit/ae5edd17ef24f2a38ec1cc9c9623868b6ee9e352)) +- always showing play in playlist/album + views ([8521cc5](https://github.com/KRTirtho/spotube/commit/8521cc5c88730caa9db74da6c04b679bf29ed56d)) +- **android:** android 13 local tracks not showing + up ([e3f4344](https://github.com/KRTirtho/spotube/commit/e3f4344ae9c1ec93860d4c5d1b8de1a803b29569)) +- default to youtube API by + default ([5a8a1e4](https://github.com/KRTirtho/spotube/commit/5a8a1e41e93fb74756b8c88f6325b8b46d7af131)) +- generate playlist page max + width ([4adf695](https://github.com/KRTirtho/spotube/commit/4adf6951d9ee78ac4b198d541dada28dc00ca0cb)) +- tracks doesn't change when + ended ([aa4ac86](https://github.com/KRTirtho/spotube/commit/aa4ac8641a7dceb4626ab675ba376b24a3480d30)) +- windows media controls not + working ([ae5edd1](https://github.com/KRTirtho/spotube/commit/ae5edd17ef24f2a38ec1cc9c9623868b6ee9e352)) ## [3.0.1](https://github.com/KRTirtho/spotube/compare/v3.0.0...v3.1.0) (2023-08-04) ### Features -- Force High Refresh Rate on some Android devices ([#607](https://github.com/KRTirtho/spotube/issues/607)) ([6dff099](https://github.com/KRTirtho/spotube/commit/6dff0996bdfee603acf242b1316f8793d625267c)) -- **translations:** add spanish translations ([#585](https://github.com/KRTirtho/spotube/issues/585)) ([042d7a4](https://github.com/KRTirtho/spotube/commit/042d7a4a10c78dd93a56a2f32d18a0fb74dbe697)) -- **translations:** add Simplified Chinese translation. ([#556](https://github.com/KRTirtho/spotube/issues/556)) ([26dbd52](https://github.com/KRTirtho/spotube/commit/26dbd523737d868114a47e82acd412cdae622b7c)) +- Force High Refresh Rate on some Android + devices ([#607](https://github.com/KRTirtho/spotube/issues/607)) ([6dff099](https://github.com/KRTirtho/spotube/commit/6dff0996bdfee603acf242b1316f8793d625267c)) +- **translations:** add spanish + translations ([#585](https://github.com/KRTirtho/spotube/issues/585)) ([042d7a4](https://github.com/KRTirtho/spotube/commit/042d7a4a10c78dd93a56a2f32d18a0fb74dbe697)) +- **translations:** add Simplified Chinese + translation. ([#556](https://github.com/KRTirtho/spotube/issues/556)) ([26dbd52](https://github.com/KRTirtho/spotube/commit/26dbd523737d868114a47e82acd412cdae622b7c)) ### Bug Fixes -- alternative track source textfield safe area ([b8c6d7e](https://github.com/KRTirtho/spotube/commit/b8c6d7eb6ae1c54bdc83a455850dfca0f27bd881)) -- avoid sponsor block for first few seconds to not break the stream ([d8cf2ae](https://github.com/KRTirtho/spotube/commit/d8cf2ae1315dc3848fe1ac12286faafe90fdbed7)) -- cache segments casting error ([dfd60bd](https://github.com/KRTirtho/spotube/commit/dfd60bd4cc0fe8fe90e0cbfd26331df505cde2aa)) -- duration is always zero in PlayerView ([4885dca](https://github.com/KRTirtho/spotube/commit/4885dca04f06658391d1063e6c5a009547391a6f)) -- flags not showing up and html in descriptions ([5a563ef](https://github.com/KRTirtho/spotube/commit/5a563ef4289423ceb5c44ba13f3cfda34b2d16dd)) -- **linux:** crash when no secret service provider found ([#608](https://github.com/KRTirtho/spotube/issues/608)) ([888a4b1](https://github.com/KRTirtho/spotube/commit/888a4b1162c25371d7f6e88fae3a2473cabf1434)) -- login dialog stays after login, mention sp_gaid in tutorial ([b492840](https://github.com/KRTirtho/spotube/commit/b4928405122ae5e5d4d4560f316f2a546a2fabe4)) -- **album_sync**: negative index exception in update palette ([#561](https://github.com/KRTirtho/spotube/issues/561)) ([0089d47](https://github.com/KRTirtho/spotube/commit/0089d471ae6d595e058061e3ac44caecdba12f61)) -- remove adaptive widgets ([#520](https://github.com/KRTirtho/spotube/issues/520)) ([e4cbdd3](https://github.com/KRTirtho/spotube/commit/e4cbdd37479a572198c1ca27fcbbba0232275513)) -- shuffle not working ([#562](https://github.com/KRTirtho/spotube/issues/562)) ([dc76634](https://github.com/KRTirtho/spotube/commit/dc76634a6e4ccdca0f09d63a2db82cce53d950d7)) -- track not skipping to next even when source is available ([0b7affd](https://github.com/KRTirtho/spotube/commit/0b7affdc058c028982266d5c93215697301846bd)) +- alternative track source textfield safe + area ([b8c6d7e](https://github.com/KRTirtho/spotube/commit/b8c6d7eb6ae1c54bdc83a455850dfca0f27bd881)) +- avoid sponsor block for first few seconds to not break the + stream ([d8cf2ae](https://github.com/KRTirtho/spotube/commit/d8cf2ae1315dc3848fe1ac12286faafe90fdbed7)) +- cache segments casting + error ([dfd60bd](https://github.com/KRTirtho/spotube/commit/dfd60bd4cc0fe8fe90e0cbfd26331df505cde2aa)) +- duration is always zero in + PlayerView ([4885dca](https://github.com/KRTirtho/spotube/commit/4885dca04f06658391d1063e6c5a009547391a6f)) +- flags not showing up and html in + descriptions ([5a563ef](https://github.com/KRTirtho/spotube/commit/5a563ef4289423ceb5c44ba13f3cfda34b2d16dd)) +- **linux:** crash when no secret service provider + found ([#608](https://github.com/KRTirtho/spotube/issues/608)) ([888a4b1](https://github.com/KRTirtho/spotube/commit/888a4b1162c25371d7f6e88fae3a2473cabf1434)) +- login dialog stays after login, mention sp_gaid in + tutorial ([b492840](https://github.com/KRTirtho/spotube/commit/b4928405122ae5e5d4d4560f316f2a546a2fabe4)) +- **album_sync**: negative index exception in update + palette ([#561](https://github.com/KRTirtho/spotube/issues/561)) ([0089d47](https://github.com/KRTirtho/spotube/commit/0089d471ae6d595e058061e3ac44caecdba12f61)) +- remove adaptive + widgets ([#520](https://github.com/KRTirtho/spotube/issues/520)) ([e4cbdd3](https://github.com/KRTirtho/spotube/commit/e4cbdd37479a572198c1ca27fcbbba0232275513)) +- shuffle not + working ([#562](https://github.com/KRTirtho/spotube/issues/562)) ([dc76634](https://github.com/KRTirtho/spotube/commit/dc76634a6e4ccdca0f09d63a2db82cce53d950d7)) +- track not skipping to next even when source is + available ([0b7affd](https://github.com/KRTirtho/spotube/commit/0b7affdc058c028982266d5c93215697301846bd)) ## [3.0.0](https://github.com/KRTirtho/spotube/compare/v2.7.1...v3.0.0) (2023-07-02) ### Features - adaptive controllers ([c8b7de0](https://github.com/KRTirtho/spotube/commit/c8b7de087917ec3037c015d5b55693cb3dbdecca)) -- adaptive popup and bottom sheet list widget ([ddc1c5f](https://github.com/KRTirtho/spotube/commit/ddc1c5f373a4d72cc231c35dd70c3d577b84f7f5)) -- add generated to playlist(s) ([c91d8c8](https://github.com/KRTirtho/spotube/commit/c91d8c8efa8b526c64881fa829992b8c250e7c89)) +- adaptive popup and bottom sheet list + widget ([ddc1c5f](https://github.com/KRTirtho/spotube/commit/ddc1c5f373a4d72cc231c35dd70c3d577b84f7f5)) +- add generated to playlist( + s) ([c91d8c8](https://github.com/KRTirtho/spotube/commit/c91d8c8efa8b526c64881fa829992b8c250e7c89)) - add german locale ([ba3f428](https://github.com/KRTirtho/spotube/commit/ba3f4281f1a6bc7ddf38775e9d40dad863ed3692)) - add piped search mode ([17a25a5](https://github.com/KRTirtho/spotube/commit/17a25a501e0d5e2512d8de0921fd602ea906d30f)) -- add sleep timer support ([4a75f3d](https://github.com/KRTirtho/spotube/commit/4a75f3dbd1e7e6f68899de001df70e809533f142)) -- adjust lyric page blurriness and player playbutton ([54d5907](https://github.com/KRTirtho/spotube/commit/54d5907f14df04f3f983ba2b0401ba05785da03b)) -- album art dominant color as accent color ([#447](https://github.com/KRTirtho/spotube/issues/447)) ([31b9249](https://github.com/KRTirtho/spotube/commit/31b9249cc8f7313a132a514a9ca825c2ae1e2256)) -- **android:** add splash screen ([c232fcc](https://github.com/KRTirtho/spotube/commit/c232fcc6dd1479ed33a8baa9887de2702a8ea22e)) -- **android:** disable battery optimization for better playback ([fe5b429](https://github.com/KRTirtho/spotube/commit/fe5b429ddacc576fc9fdb5e66718782cda163b27)) +- add sleep timer + support ([4a75f3d](https://github.com/KRTirtho/spotube/commit/4a75f3dbd1e7e6f68899de001df70e809533f142)) +- adjust lyric page blurriness and player + playbutton ([54d5907](https://github.com/KRTirtho/spotube/commit/54d5907f14df04f3f983ba2b0401ba05785da03b)) +- album art dominant color as accent + color ([#447](https://github.com/KRTirtho/spotube/issues/447)) ([31b9249](https://github.com/KRTirtho/spotube/commit/31b9249cc8f7313a132a514a9ca825c2ae1e2256)) +- **android:** add splash + screen ([c232fcc](https://github.com/KRTirtho/spotube/commit/c232fcc6dd1479ed33a8baa9887de2702a8ea22e)) +- **android:** disable battery optimization for better + playback ([fe5b429](https://github.com/KRTirtho/spotube/commit/fe5b429ddacc576fc9fdb5e66718782cda163b27)) - artist card redesign ([92a418c](https://github.com/KRTirtho/spotube/commit/92a418c8a8a9df99e27407b628e5e3cc9ccb4115)) -- Better download manager with download progress ([6752adc](https://github.com/KRTirtho/spotube/commit/6752adc9398818f51b69fced226b4b8410fb9e9b)) -- better language picker, adaptive select tile and settings section contrast ([6430a25](https://github.com/KRTirtho/spotube/commit/6430a2587075aa24483ab26ce6f0f6b2b630e139)) -- cache encryption for sensitive data ([b110d83](https://github.com/KRTirtho/spotube/commit/b110d834561ac53129ac9ec80238c014c84832ec)) -- color scheme picker dialog vertical list view instead of wrap ([bb60b01](https://github.com/KRTirtho/spotube/commit/bb60b01ef2f2ba3da8f6fe3a19add168b2ee8a4e)) -- compact and adaptive playbutton card design ([eeb8cab](https://github.com/KRTirtho/spotube/commit/eeb8cabf491d5242bd434b3c71c39363f24bdcf9)) +- Better download manager with download + progress ([6752adc](https://github.com/KRTirtho/spotube/commit/6752adc9398818f51b69fced226b4b8410fb9e9b)) +- better language picker, adaptive select tile and settings section + contrast ([6430a25](https://github.com/KRTirtho/spotube/commit/6430a2587075aa24483ab26ce6f0f6b2b630e139)) +- cache encryption for sensitive + data ([b110d83](https://github.com/KRTirtho/spotube/commit/b110d834561ac53129ac9ec80238c014c84832ec)) +- color scheme picker dialog vertical list view instead of + wrap ([bb60b01](https://github.com/KRTirtho/spotube/commit/bb60b01ef2f2ba3da8f6fe3a19add168b2ee8a4e)) +- compact and adaptive playbutton card + design ([eeb8cab](https://github.com/KRTirtho/spotube/commit/eeb8cabf491d5242bd434b3c71c39363f24bdcf9)) - compact button tabbar ([67380f6](https://github.com/KRTirtho/spotube/commit/67380f68765f18e4dcd3d60117083c7e9c6761c2)) -- create a basic installer script ([1763a36](https://github.com/KRTirtho/spotube/commit/1763a36a262178306df61d4588c17ff795a32790)) +- create a basic installer + script ([1763a36](https://github.com/KRTirtho/spotube/commit/1763a36a262178306df61d4588c17ff795a32790)) - curved navigation bar ([776edf8](https://github.com/KRTirtho/spotube/commit/776edf84afcf99f96cf6e337b0c84ed89034ca8e)) - custom error toast ([96f04c1](https://github.com/KRTirtho/spotube/commit/96f04c17565c0ab7f115d5c1f167f6660a69480d)) -- custom playlist generator ([f4b0d13](https://github.com/KRTirtho/spotube/commit/f4b0d134ca724b75bf65b885bce4dba206f1e090)) -- desktop mini player support ([471812d](https://github.com/KRTirtho/spotube/commit/471812d789eb2c861268ab8451d50104ac2fbe2e)) -- **desktop:** close button for minimize notification ([1688f99](https://github.com/KRTirtho/spotube/commit/1688f99096af940ead65e67832c6f061a6f635ac)) -- **desktop:** show minimized to system tray notification ([296f96c](https://github.com/KRTirtho/spotube/commit/296f96cf17cf21ff09b406cc24952ff60da52d5e)) -- disable/enable smtc on demand ([7fa50e5](https://github.com/KRTirtho/spotube/commit/7fa50e5c5ee9ca3ba95dca55f8a4831047f17570)) -- download button on each track ([925fa86](https://github.com/KRTirtho/spotube/commit/925fa86271fa10ff77b8137ba8d09b8067d0e819)) -- enable caching of queue ([ec11af5](https://github.com/KRTirtho/spotube/commit/ec11af53a16c435fbea3d0c81910dca371be9ce7)) -- heart button animation ([8432dc6](https://github.com/KRTirtho/spotube/commit/8432dc6286fbdfda52bbeb39c6d4ababa05881bc)) -- improved track item API and UI ([617aa89](https://github.com/KRTirtho/spotube/commit/617aa89409ce29eb3c197aee5c1189d763a3913c)) -- **installer:** get latest version from Github API ([957c085](https://github.com/KRTirtho/spotube/commit/957c085e1243ec0af5bc45d38691c74e2ba91ad8)) -- **local_tracks:** delete local track ([#484](https://github.com/KRTirtho/spotube/issues/484)) ([52835b2](https://github.com/KRTirtho/spotube/commit/52835b2ce2212925f80e1a1595c0ca30e6860a8d)) -- locale category/genre title ([88137f0](https://github.com/KRTirtho/spotube/commit/88137f01b27150b306327a01e67ec8a35a60e82e)) -- **locale:** add bengali translations for search page ([a1cdbad](https://github.com/KRTirtho/spotube/commit/a1cdbad18782a74b43f0625facfe3e35c516bf43)) -- **locale:** localize search, library, lyrics, artist with both Bengali and English ([11fe9ec](https://github.com/KRTirtho/spotube/commit/11fe9ec74462441b67a0ab0df73824f36dd15e2d)) -- **locale:** player, playlist view, track tile bengali and english translations ([c55133d](https://github.com/KRTirtho/spotube/commit/c55133dc8bba307823e5b67a30cfab03c923cb7f)) -- localize settings, about, login, player queue with Bengali and English translations ([a5c36bb](https://github.com/KRTirtho/spotube/commit/a5c36bbb20cc69d609bfb5ab973c7e288c1ea9de)) +- custom playlist + generator ([f4b0d13](https://github.com/KRTirtho/spotube/commit/f4b0d134ca724b75bf65b885bce4dba206f1e090)) +- desktop mini player + support ([471812d](https://github.com/KRTirtho/spotube/commit/471812d789eb2c861268ab8451d50104ac2fbe2e)) +- **desktop:** close button for minimize + notification ([1688f99](https://github.com/KRTirtho/spotube/commit/1688f99096af940ead65e67832c6f061a6f635ac)) +- **desktop:** show minimized to system tray + notification ([296f96c](https://github.com/KRTirtho/spotube/commit/296f96cf17cf21ff09b406cc24952ff60da52d5e)) +- disable/enable smtc on + demand ([7fa50e5](https://github.com/KRTirtho/spotube/commit/7fa50e5c5ee9ca3ba95dca55f8a4831047f17570)) +- download button on each + track ([925fa86](https://github.com/KRTirtho/spotube/commit/925fa86271fa10ff77b8137ba8d09b8067d0e819)) +- enable caching of + queue ([ec11af5](https://github.com/KRTirtho/spotube/commit/ec11af53a16c435fbea3d0c81910dca371be9ce7)) +- heart button + animation ([8432dc6](https://github.com/KRTirtho/spotube/commit/8432dc6286fbdfda52bbeb39c6d4ababa05881bc)) +- improved track item API and + UI ([617aa89](https://github.com/KRTirtho/spotube/commit/617aa89409ce29eb3c197aee5c1189d763a3913c)) +- **installer:** get latest version from Github + API ([957c085](https://github.com/KRTirtho/spotube/commit/957c085e1243ec0af5bc45d38691c74e2ba91ad8)) +- **local_tracks:** delete local + track ([#484](https://github.com/KRTirtho/spotube/issues/484)) ([52835b2](https://github.com/KRTirtho/spotube/commit/52835b2ce2212925f80e1a1595c0ca30e6860a8d)) +- locale category/genre + title ([88137f0](https://github.com/KRTirtho/spotube/commit/88137f01b27150b306327a01e67ec8a35a60e82e)) +- **locale:** add bengali translations for search + page ([a1cdbad](https://github.com/KRTirtho/spotube/commit/a1cdbad18782a74b43f0625facfe3e35c516bf43)) +- **locale:** localize search, library, lyrics, artist with both Bengali and + English ([11fe9ec](https://github.com/KRTirtho/spotube/commit/11fe9ec74462441b67a0ab0df73824f36dd15e2d)) +- **locale:** player, playlist view, track tile bengali and english + translations ([c55133d](https://github.com/KRTirtho/spotube/commit/c55133dc8bba307823e5b67a30cfab03c923cb7f)) +- localize settings, about, login, player queue with Bengali and English + translations ([a5c36bb](https://github.com/KRTirtho/spotube/commit/a5c36bbb20cc69d609bfb5ab973c7e288c1ea9de)) - logs page in settings ([b78e7f5](https://github.com/KRTirtho/spotube/commit/b78e7f57a05db344aae59206cbb0f43b3ee199a9)) -- macos title bar spacing and lyrics page margin separate ([a0b3771](https://github.com/KRTirtho/spotube/commit/a0b377104f9822561d3b46dbc6551bb561842480)) -- make snackbar floating ([9dbb817](https://github.com/KRTirtho/spotube/commit/9dbb8171a6d6b81120ca7ccd74577e5c890ff930)) -- merge floating player with nav bar and nav bar translucent bg ([a90261e](https://github.com/KRTirtho/spotube/commit/a90261ed199f6cff9e8d0fe24934f8f1d8e9ed98)) -- **mini_player:** remove window shadow ([6259014](https://github.com/KRTirtho/spotube/commit/625901482ada4b441b838f640c0ab7167119b321)) -- **mini_player:** show/hide UI on hover toggle ([2e8b647](https://github.com/KRTirtho/spotube/commit/2e8b647a51f87840c2bd39f0a1dc25ddc91528fc)) -- new sidebar widget and translucent bottom player ([4ba1e70](https://github.com/KRTirtho/spotube/commit/4ba1e70636b4ba43697663128fc5422b1d0b2a2f)) -- newly released albums of user followed artist ([33cb794](https://github.com/KRTirtho/spotube/commit/33cb7947d63d0a2692a004f87a2ccd5777bf054e)) -- optimize image load + genre page and reduce page size of loaded categories ([7131efa](https://github.com/KRTirtho/spotube/commit/7131efa07fdbcf17965fc59ff635a6198b0e5e25)) -- persistent volume percentage ([3724bd5](https://github.com/KRTirtho/spotube/commit/3724bd5a10eef7a099d6f596fd038e6fea228359)) -- personal playlist recommendations ([ae820a2](https://github.com/KRTirtho/spotube/commit/ae820a22f291082c49554d621c25cc62212a6708)) -- piped instance picker on settings ([bed0d3b](https://github.com/KRTirtho/spotube/commit/bed0d3bd70438df413633ee03fd258a2ca4a1688)) -- platform specific title bar buttons ([6267720](https://github.com/KRTirtho/spotube/commit/62677209a23172162defb7a8e542d981569eba08)) -- **playback:** integrate android, ios, macos with JustAudio ([d487fe5](https://github.com/KRTirtho/spotube/commit/d487fe55630993e2b729050ebd0bf4e1e4be1fb3)) -- **playback:** use assets_audio_player to fix macos double duration problems and android high loading latency ([1fff0f1](https://github.com/KRTirtho/spotube/commit/1fff0f1bd0d811c348f293f733cbcb7cd57e02f8)) -- player details dialog and separate location of lyrics button in player page ([ce38233](https://github.com/KRTirtho/spotube/commit/ce38233de8f4775018a1d01e951b1635776fe743)) -- **player:** add playlist related methods to audio player ([f1080e1](https://github.com/KRTirtho/spotube/commit/f1080e1675aee1208d05658adfabfbed04ff45b6)) -- **player:** animated gradient background ([49b5d0e](https://github.com/KRTirtho/spotube/commit/49b5d0e6948d80abb8ee09203e0d655d68377245)) -- **player:** custom playlist implementation for media_kit to replace unpredictable playlist of mpv ([eaf65b6](https://github.com/KRTirtho/spotube/commit/eaf65b6db208aaad745821d4d42afc05f51cee7c)) -- **player:** proper coloring of elements ([b2c4ea1](https://github.com/KRTirtho/spotube/commit/b2c4ea13f6157c2b7bec3957e1f7f50fbf0002c7)) -- **player:** replace bg blur with gradient, proper fg color and align title and artist name ([159f03e](https://github.com/KRTirtho/spotube/commit/159f03e7ca62e6b3b86389e2795da84de61fba78)) -- playlist create support for generated playlist ([91c72f9](https://github.com/KRTirtho/spotube/commit/91c72f9ec9556f301c5d129fc82e19e791a02fbe)) -- playlist generation all parameters support ([9877d5f](https://github.com/KRTirtho/spotube/commit/9877d5f51736db03d5839dadf164d11d0cce82f0)) -- **playlist,album page:** play and shuffle take full width on smaller screens, add new xs breakpoint ([dce1b88](https://github.com/KRTirtho/spotube/commit/dce1b88694cfcb6b7e63d6ee614ac1dbbd017f6e)) -- **queue:** add track(s) for playing next ([#460](https://github.com/KRTirtho/spotube/issues/460)) ([cac8ea6](https://github.com/KRTirtho/spotube/commit/cac8ea638812f5d9cb4305144b6351141a2cf407)) -- **queue:** reorder tracks support ([441b43b](https://github.com/KRTirtho/spotube/commit/441b43bef6b92fd7df6c4e1bef39d67b4a76cd22)) -- re-designed playlist/album page ([0cedc7a](https://github.com/KRTirtho/spotube/commit/0cedc7a4187771efce8152003f890e242116c78c)) -- re-introduce youtube API along with piped ([b54ee96](https://github.com/KRTirtho/spotube/commit/b54ee96233b29d7517eba66e3f8dd9270c2790df)) -- reactive volume slider and slicker bottom bar with lowered height ([9d14517](https://github.com/KRTirtho/spotube/commit/9d14517202d5c9d993a947808bf0c6520ed54ea3)) -- remove SponsorBlock in favor of YT Music and remove pocketbase backend track support ([fb780da](https://github.com/KRTirtho/spotube/commit/fb780da327a213d7a82cbc3b567ece858dc2f0e8)) -- repeat button all 3 mode and disable player controls when track is fetching ([1418378](https://github.com/KRTirtho/spotube/commit/14183781dd3f1e16c121e78ad637a326de7b5dcf)) -- replace YouTube API with piped API ([1ecc36d](https://github.com/KRTirtho/spotube/commit/1ecc36da57af61fd9c2ca928589088cd4325f605)) -- responsive playlist generate page and scrollable multi autocomplete ([d57aad5](https://github.com/KRTirtho/spotube/commit/d57aad5612f7622dcd638ea8c0ec4d96f741de2b)) -- search alternative track source ([dfea195](https://github.com/KRTirtho/spotube/commit/dfea195ec178de733717cfe3226cede7521ee2d3)) -- setup localization (l10n) and language switcher, add sidebar and navbar locale ([f12d812](https://github.com/KRTirtho/spotube/commit/f12d81259f9e7005e681a7ca9867291d9228a8b1)) -- show album release year ([#387](https://github.com/KRTirtho/spotube/issues/387)) and fix layout of artist's album ([6a6ddf6](https://github.com/KRTirtho/spotube/commit/6a6ddf6e1f6dc72b794cae49adf8348da272babd)) -- show country code piped instance list ([60328a6](https://github.com/KRTirtho/spotube/commit/60328a6bafcbff1b7d0ee5099825f0e3d545b60f)) -- show loading when track metadata is being fetched, android, ios, macos enable shuffling ([bf59570](https://github.com/KRTirtho/spotube/commit/bf59570251720a80efe0aa6be481899864da5079)) -- sort tracks by newest and oldest dates ([b4713e3](https://github.com/KRTirtho/spotube/commit/b4713e377a938cbebe70089874216f86fe550c34)) +- macos title bar spacing and lyrics page margin + separate ([a0b3771](https://github.com/KRTirtho/spotube/commit/a0b377104f9822561d3b46dbc6551bb561842480)) +- make snackbar + floating ([9dbb817](https://github.com/KRTirtho/spotube/commit/9dbb8171a6d6b81120ca7ccd74577e5c890ff930)) +- merge floating player with nav bar and nav bar translucent + bg ([a90261e](https://github.com/KRTirtho/spotube/commit/a90261ed199f6cff9e8d0fe24934f8f1d8e9ed98)) +- **mini_player:** remove window + shadow ([6259014](https://github.com/KRTirtho/spotube/commit/625901482ada4b441b838f640c0ab7167119b321)) +- **mini_player:** show/hide UI on hover + toggle ([2e8b647](https://github.com/KRTirtho/spotube/commit/2e8b647a51f87840c2bd39f0a1dc25ddc91528fc)) +- new sidebar widget and translucent bottom + player ([4ba1e70](https://github.com/KRTirtho/spotube/commit/4ba1e70636b4ba43697663128fc5422b1d0b2a2f)) +- newly released albums of user followed + artist ([33cb794](https://github.com/KRTirtho/spotube/commit/33cb7947d63d0a2692a004f87a2ccd5777bf054e)) +- optimize image load + genre page and reduce page size of loaded + categories ([7131efa](https://github.com/KRTirtho/spotube/commit/7131efa07fdbcf17965fc59ff635a6198b0e5e25)) +- persistent volume + percentage ([3724bd5](https://github.com/KRTirtho/spotube/commit/3724bd5a10eef7a099d6f596fd038e6fea228359)) +- personal playlist + recommendations ([ae820a2](https://github.com/KRTirtho/spotube/commit/ae820a22f291082c49554d621c25cc62212a6708)) +- piped instance picker on + settings ([bed0d3b](https://github.com/KRTirtho/spotube/commit/bed0d3bd70438df413633ee03fd258a2ca4a1688)) +- platform specific title bar + buttons ([6267720](https://github.com/KRTirtho/spotube/commit/62677209a23172162defb7a8e542d981569eba08)) +- **playback:** integrate android, ios, macos with + JustAudio ([d487fe5](https://github.com/KRTirtho/spotube/commit/d487fe55630993e2b729050ebd0bf4e1e4be1fb3)) +- **playback:** use assets_audio_player to fix macos double duration problems and android high loading + latency ([1fff0f1](https://github.com/KRTirtho/spotube/commit/1fff0f1bd0d811c348f293f733cbcb7cd57e02f8)) +- player details dialog and separate location of lyrics button in player + page ([ce38233](https://github.com/KRTirtho/spotube/commit/ce38233de8f4775018a1d01e951b1635776fe743)) +- **player:** add playlist related methods to audio + player ([f1080e1](https://github.com/KRTirtho/spotube/commit/f1080e1675aee1208d05658adfabfbed04ff45b6)) +- **player:** animated gradient + background ([49b5d0e](https://github.com/KRTirtho/spotube/commit/49b5d0e6948d80abb8ee09203e0d655d68377245)) +- **player:** custom playlist implementation for media_kit to replace unpredictable playlist of + mpv ([eaf65b6](https://github.com/KRTirtho/spotube/commit/eaf65b6db208aaad745821d4d42afc05f51cee7c)) +- **player:** proper coloring of + elements ([b2c4ea1](https://github.com/KRTirtho/spotube/commit/b2c4ea13f6157c2b7bec3957e1f7f50fbf0002c7)) +- **player:** replace bg blur with gradient, proper fg color and align title and artist + name ([159f03e](https://github.com/KRTirtho/spotube/commit/159f03e7ca62e6b3b86389e2795da84de61fba78)) +- playlist create support for generated + playlist ([91c72f9](https://github.com/KRTirtho/spotube/commit/91c72f9ec9556f301c5d129fc82e19e791a02fbe)) +- playlist generation all parameters + support ([9877d5f](https://github.com/KRTirtho/spotube/commit/9877d5f51736db03d5839dadf164d11d0cce82f0)) +- **playlist,album page:** play and shuffle take full width on smaller screens, add new xs + breakpoint ([dce1b88](https://github.com/KRTirtho/spotube/commit/dce1b88694cfcb6b7e63d6ee614ac1dbbd017f6e)) +- **queue:** add track(s) for playing + next ([#460](https://github.com/KRTirtho/spotube/issues/460)) ([cac8ea6](https://github.com/KRTirtho/spotube/commit/cac8ea638812f5d9cb4305144b6351141a2cf407)) +- **queue:** reorder tracks + support ([441b43b](https://github.com/KRTirtho/spotube/commit/441b43bef6b92fd7df6c4e1bef39d67b4a76cd22)) +- re-designed playlist/album + page ([0cedc7a](https://github.com/KRTirtho/spotube/commit/0cedc7a4187771efce8152003f890e242116c78c)) +- re-introduce youtube API along with + piped ([b54ee96](https://github.com/KRTirtho/spotube/commit/b54ee96233b29d7517eba66e3f8dd9270c2790df)) +- reactive volume slider and slicker bottom bar with lowered + height ([9d14517](https://github.com/KRTirtho/spotube/commit/9d14517202d5c9d993a947808bf0c6520ed54ea3)) +- remove SponsorBlock in favor of YT Music and remove pocketbase backend track + support ([fb780da](https://github.com/KRTirtho/spotube/commit/fb780da327a213d7a82cbc3b567ece858dc2f0e8)) +- repeat button all 3 mode and disable player controls when track is + fetching ([1418378](https://github.com/KRTirtho/spotube/commit/14183781dd3f1e16c121e78ad637a326de7b5dcf)) +- replace YouTube API with piped + API ([1ecc36d](https://github.com/KRTirtho/spotube/commit/1ecc36da57af61fd9c2ca928589088cd4325f605)) +- responsive playlist generate page and scrollable multi + autocomplete ([d57aad5](https://github.com/KRTirtho/spotube/commit/d57aad5612f7622dcd638ea8c0ec4d96f741de2b)) +- search alternative track + source ([dfea195](https://github.com/KRTirtho/spotube/commit/dfea195ec178de733717cfe3226cede7521ee2d3)) +- setup localization (l10n) and language switcher, add sidebar and navbar + locale ([f12d812](https://github.com/KRTirtho/spotube/commit/f12d81259f9e7005e681a7ca9867291d9228a8b1)) +- show album release year ([#387](https://github.com/KRTirtho/spotube/issues/387)) and fix layout of artist's + album ([6a6ddf6](https://github.com/KRTirtho/spotube/commit/6a6ddf6e1f6dc72b794cae49adf8348da272babd)) +- show country code piped instance + list ([60328a6](https://github.com/KRTirtho/spotube/commit/60328a6bafcbff1b7d0ee5099825f0e3d545b60f)) +- show loading when track metadata is being fetched, android, ios, macos enable + shuffling ([bf59570](https://github.com/KRTirtho/spotube/commit/bf59570251720a80efe0aa6be481899864da5079)) +- sort tracks by newest and oldest + dates ([b4713e3](https://github.com/KRTirtho/spotube/commit/b4713e377a938cbebe70089874216f86fe550c34)) - supabase integration ([8bcce92](https://github.com/KRTirtho/spotube/commit/8bcce9282eae08c5996a27f16f89cbc187a06823)) -- system tray support ([#31](https://github.com/KRTirtho/spotube/issues/31)) ([06a0437](https://github.com/KRTirtho/spotube/commit/06a043764d9f65fb448fcf088ccf2737145e23e8)) -- track populate sibling support ([3aeb026](https://github.com/KRTirtho/spotube/commit/3aeb026776716b6e2eb89c8406a4996a86c7ca60)) -- **translation:** add hindi and french translations using ChatGPT ([6d836bd](https://github.com/KRTirtho/spotube/commit/6d836bdb658c180ca8e2c71e7e290fafa3520727)) -- **translation:** add Japanase locale ([4b52a71](https://github.com/KRTirtho/spotube/commit/4b52a71c0914bda6c831d8f637a5934f7bcf8fcb)) -- use system color scheme ([862c4b8](https://github.com/KRTirtho/spotube/commit/862c4b8faf2c751d803e373e29981a116bf08ed5)) -- volume slider in player page ([7abe2c1](https://github.com/KRTirtho/spotube/commit/7abe2c10735bc38c644487139557a731d25e80e6)) -- windows OS media control panel support ([f0b426a](https://github.com/KRTirtho/spotube/commit/f0b426ae89f2e01f4a9c8757ef4e0b4a21b50c7b)) +- system tray + support ([#31](https://github.com/KRTirtho/spotube/issues/31)) ([06a0437](https://github.com/KRTirtho/spotube/commit/06a043764d9f65fb448fcf088ccf2737145e23e8)) +- track populate sibling + support ([3aeb026](https://github.com/KRTirtho/spotube/commit/3aeb026776716b6e2eb89c8406a4996a86c7ca60)) +- **translation:** add hindi and french translations using + ChatGPT ([6d836bd](https://github.com/KRTirtho/spotube/commit/6d836bdb658c180ca8e2c71e7e290fafa3520727)) +- **translation:** add Japanase + locale ([4b52a71](https://github.com/KRTirtho/spotube/commit/4b52a71c0914bda6c831d8f637a5934f7bcf8fcb)) +- use system color + scheme ([862c4b8](https://github.com/KRTirtho/spotube/commit/862c4b8faf2c751d803e373e29981a116bf08ed5)) +- volume slider in player + page ([7abe2c1](https://github.com/KRTirtho/spotube/commit/7abe2c10735bc38c644487139557a731d25e80e6)) +- windows OS media control panel + support ([f0b426a](https://github.com/KRTirtho/spotube/commit/f0b426ae89f2e01f4a9c8757ef4e0b4a21b50c7b)) ### Bug Fixes -- add to playlist dialog not showing playlist name ([8944581](https://github.com/KRTirtho/spotube/commit/8944581c09eec0162220e7ff684205484fafb599)) -- album sync not working ([74906f3](https://github.com/KRTirtho/spotube/commit/74906f393250934c36530a73ad7312f59f8627ed)) -- alternative track source not playing new source ([a9b5a71](https://github.com/KRTirtho/spotube/commit/a9b5a714e47d40407d799966ae95f84338f9b59a)) -- **android:** use multi assetAudioPlayer instance fix patch and disable Pre-download and play by default in Android too ([cdb3268](https://github.com/KRTirtho/spotube/commit/cdb32685e4bbb899706ed16d58ef9a3a074e283a)) -- **artist:** follower count shows as float when < 1000 ([#482](https://github.com/KRTirtho/spotube/issues/482)) ([fd1846e](https://github.com/KRTirtho/spotube/commit/fd1846eecf9632e59e4b70fb70e97c556b6374f5)) -- bottom navbar first item icon color not changing on primary color change ([6eb4244](https://github.com/KRTirtho/spotube/commit/6eb4244f3244a96fe6858261534cc03eb3de803c)) -- cached currently playing track infinite loading ([9401718](https://github.com/KRTirtho/spotube/commit/94017189c6b9bf55ec62cbf29cd6b0e9fffca42a)) -- cached queue tracks expired stream ([ed29ab5](https://github.com/KRTirtho/spotube/commit/ed29ab5137416d9fb2e7e9fe840f56ef52df6f61)) -- collection currently playing state persist on restart ([1c89e3e](https://github.com/KRTirtho/spotube/commit/1c89e3efb0f05c648fc1c8e09039e62333de18d1)) -- color not syncing and add new screenshot ([6205501](https://github.com/KRTirtho/spotube/commit/62055018feade0b895663a0bfc5f85f265ae2154)) -- content going below bottom player or nav bar ([1bdce9f](https://github.com/KRTirtho/spotube/commit/1bdce9fe964de88a667bb160846c11dc70b77c00)) -- disable background_downloader due to android build failures ([7d23bee](https://github.com/KRTirtho/spotube/commit/7d23beec5ef07c4d649185a69e7a2b9697dc6953)) -- disable play when loading track and buffering event ([30c933c](https://github.com/KRTirtho/spotube/commit/30c933cdf3d4524be164e171094afdd27b0252b7)) +- add to playlist dialog not showing playlist + name ([8944581](https://github.com/KRTirtho/spotube/commit/8944581c09eec0162220e7ff684205484fafb599)) +- album sync not + working ([74906f3](https://github.com/KRTirtho/spotube/commit/74906f393250934c36530a73ad7312f59f8627ed)) +- alternative track source not playing new + source ([a9b5a71](https://github.com/KRTirtho/spotube/commit/a9b5a714e47d40407d799966ae95f84338f9b59a)) +- **android:** use multi assetAudioPlayer instance fix patch and disable Pre-download and play by default in Android + too ([cdb3268](https://github.com/KRTirtho/spotube/commit/cdb32685e4bbb899706ed16d58ef9a3a074e283a)) +- **artist:** follower count shows as float when < + 1000 ([#482](https://github.com/KRTirtho/spotube/issues/482)) ([fd1846e](https://github.com/KRTirtho/spotube/commit/fd1846eecf9632e59e4b70fb70e97c556b6374f5)) +- bottom navbar first item icon color not changing on primary color + change ([6eb4244](https://github.com/KRTirtho/spotube/commit/6eb4244f3244a96fe6858261534cc03eb3de803c)) +- cached currently playing track infinite + loading ([9401718](https://github.com/KRTirtho/spotube/commit/94017189c6b9bf55ec62cbf29cd6b0e9fffca42a)) +- cached queue tracks expired + stream ([ed29ab5](https://github.com/KRTirtho/spotube/commit/ed29ab5137416d9fb2e7e9fe840f56ef52df6f61)) +- collection currently playing state persist on + restart ([1c89e3e](https://github.com/KRTirtho/spotube/commit/1c89e3efb0f05c648fc1c8e09039e62333de18d1)) +- color not syncing and add new + screenshot ([6205501](https://github.com/KRTirtho/spotube/commit/62055018feade0b895663a0bfc5f85f265ae2154)) +- content going below bottom player or nav + bar ([1bdce9f](https://github.com/KRTirtho/spotube/commit/1bdce9fe964de88a667bb160846c11dc70b77c00)) +- disable background_downloader due to android build + failures ([7d23bee](https://github.com/KRTirtho/spotube/commit/7d23beec5ef07c4d649185a69e7a2b9697dc6953)) +- disable play when loading track and buffering + event ([30c933c](https://github.com/KRTirtho/spotube/commit/30c933cdf3d4524be164e171094afdd27b0252b7)) - error log ([e3d8239](https://github.com/KRTirtho/spotube/commit/e3d8239b9f5700bfb17c4758d95ba1db1f0e718a)) -- excessive repaints caused by Player progress bar ([09b24cf](https://github.com/KRTirtho/spotube/commit/09b24cf1fd1644c549f85904545db54b39cc2431)) -- failed download no error icon ([1266a3f](https://github.com/KRTirtho/spotube/commit/1266a3f1607de11e793a294071850996527d494a)) -- **home:** bottom player transparency ([20c424c](https://github.com/KRTirtho/spotube/commit/20c424c77fe273a693213ebf88d50e4025bc8608)) -- language changer not working ([7b7b1f2](https://github.com/KRTirtho/spotube/commit/7b7b1f2647591b7cd4cc7841526716c6a2877e55)) -- less frequent position updates ([0a49b56](https://github.com/KRTirtho/spotube/commit/0a49b56566abd00cf7703e4207cfa90f93c381fd)) -- linux mpris not showing up and overall media notification service ([1abcad1](https://github.com/KRTirtho/spotube/commit/1abcad1de510c209a34196f2de17045af4dd3bc2)) -- local tracks getting fetched on first load ([73c012c](https://github.com/KRTirtho/spotube/commit/73c012c71ab5050636f79e010d654b4390978ee7)) -- local tracks not working when there's a invalid music file in the folder ([5855820](https://github.com/KRTirtho/spotube/commit/5855820569dfad7cd26f1e0f0c985babd0d9485d)) -- lyrics page blur in player and cut off text when line too big ([6b4584e](https://github.com/KRTirtho/spotube/commit/6b4584e91bd4f4aee0c56e48a7aec7015c7c418b)) -- macos build by removing media_kit native event loop ([62fc773](https://github.com/KRTirtho/spotube/commit/62fc7739b508f0e874978408a2bab0a1d422deb6)) -- macos build error, mobile player duration and playing state and background disposal of player ([be91e33](https://github.com/KRTirtho/spotube/commit/be91e33828630c7062886cd15e4d57496daaa4d5)) -- **macos,ios:** use regular shared prefs ([1b5bfec](https://github.com/KRTirtho/spotube/commit/1b5bfec27fbcfe9faabff64d46296bdeebe00161)) -- memoize child of animated widget and make player bg animation faster ([fcb5c8f](https://github.com/KRTirtho/spotube/commit/fcb5c8f8dabd0d4e3033f80ea3e5d006243cdfb5)) -- mini player not working in release mode ([28ff321](https://github.com/KRTirtho/spotube/commit/28ff3216efee81184798eedfbb10ba66395bbf36)) -- **mkPlayer:** remove method and wrong active index on modifying playlist ([3bafa7b](https://github.com/KRTirtho/spotube/commit/3bafa7b80c963fa52b90ed4cb1393fb121cac713)) -- mobile audio notification not working ([8f9303b](https://github.com/KRTirtho/spotube/commit/8f9303bc0fddb9d179303a1f0eb76dd5b02410e7)) -- multiple instance of theme ([4ec0424](https://github.com/KRTirtho/spotube/commit/4ec04240a5bde6af5c920a61ab6260e7a93bfc54)) -- navigation to settings not working ([ce10aa1](https://github.com/KRTirtho/spotube/commit/ce10aa1fe2c95d4738835687f613930cf7829f3a)) -- no progress update when track changed ([6ae8964](https://github.com/KRTirtho/spotube/commit/6ae896441a787fce1bc6e5eb5379856dc2f4e96d)) -- null exception on proxy playlist and audio player ([a455a89](https://github.com/KRTirtho/spotube/commit/a455a89c5861fd455f6950c7b68beae24bdcc6ed)) -- overflowing clickable artists links ([4077fac](https://github.com/KRTirtho/spotube/commit/4077fac39fb667b87e959e53d2dcaceefb63cd2d)) -- personalized playlists not loading ([caa3408](https://github.com/KRTirtho/spotube/commit/caa340803fdf3859fe5a8a996abae1502ef2e4e7)) -- playback not moving to next track after a track ends ([27e8acb](https://github.com/KRTirtho/spotube/commit/27e8acbfe75a37c0a8fa69a444fdd86e92dbe4f0)) -- **player:** gradient bg not taking full height ([62ad86e](https://github.com/KRTirtho/spotube/commit/62ad86e88d74b5114af78138b221314192e5a801)) -- **player:** playback element placement ([5e47faa](https://github.com/KRTirtho/spotube/commit/5e47faa6060d7a8aa0d143060e812dc06b8dd790)) -- **player:** queue button not showing when not logged in ([6c2d655](https://github.com/KRTirtho/spotube/commit/6c2d65587b0e6e167be1d0b086df103c7e72d4b2)) -- **player:** volume slider, prefetching of media_kit and stuttering on sponsorblock skip ([1f32554](https://github.com/KRTirtho/spotube/commit/1f3255481f058c50968561db88172e56b58494f4)) -- playlist generate slider shape ([2b35c04](https://github.com/KRTirtho/spotube/commit/2b35c044adb15a97a58692e7880694a251899732)) -- pop sheet list not scrollable ([cca5625](https://github.com/KRTirtho/spotube/commit/cca5625df7e432da8581a4504306baad154deb48)) -- re-enable add to queue and play next support, favorite button query exceptions ([e529c79](https://github.com/KRTirtho/spotube/commit/e529c79c4f0cd964b7d89e010d3fe51378ea7222)) -- re-enable download manager ([ea45c4f](https://github.com/KRTirtho/spotube/commit/ea45c4f42ae89b8991e470e84a5290b3be3b0f36)) -- remove unnecessary broadcast stream conversions ([bf04962](https://github.com/KRTirtho/spotube/commit/bf04962e90ea5345a2bc0d4793999f7db712cab2)) -- remove useBreakpoints as it clogs up memory with unnecessary state updates ([e1c0f5c](https://github.com/KRTirtho/spotube/commit/e1c0f5cf1e4cece2c4aa235bfbf8511ad7b1fe59)) -- replace download multiple pops and add translations ([4a21249](https://github.com/KRTirtho/spotube/commit/4a21249ee386426b0974451542a93e84f532fb3f)) -- screen breakpoints and persist lyrics delay across screens ([df79638](https://github.com/KRTirtho/spotube/commit/df79638fb622a55aaa2b36c9a1425c2d9c4a8e52)) -- sidebar task counter badge and bottom player play button progress color ([af278d8](https://github.com/KRTirtho/spotube/commit/af278d8feaa08c14528627766bce6d724b846954)) -- status bar color of playlist/album page ([65fa3cb](https://github.com/KRTirtho/spotube/commit/65fa3cb624c240360de5a06778a1f72ad10bbe2d)) -- system color scheme not persisting on restart when system color scheme changed ([e04515d](https://github.com/KRTirtho/spotube/commit/e04515d8e213b4c7f85d11385959a33b042bd9b1)) -- track collection view status bar not transparent ([9251121](https://github.com/KRTirtho/spotube/commit/9251121ba0154599975e33819a43719477c644f8)) -- track doesn't play after change ([17e5ab6](https://github.com/KRTirtho/spotube/commit/17e5ab611cc417cce7c17cafc7045f5aa2eb970e)) -- track stops at last second ([f554f6d](https://github.com/KRTirtho/spotube/commit/f554f6d43bb714f662a27977f501d7ad44b070c3)) -- **track_collection_view:** keyboard focus on scroll and no space for search results in playlist/album ([7a8bd92](https://github.com/KRTirtho/spotube/commit/7a8bd921047e3766dbbf24449e2873afe3dbecf8)) -- track_table_view table headers ([d88d287](https://github.com/KRTirtho/spotube/commit/d88d287fc586ec33351de9f3b4359f189054868b)) -- track_tile active and blacklist color, playbutton card action positioning ([3f5a1b9](https://github.com/KRTirtho/spotube/commit/3f5a1b9587efe9b7b2c69008345867933f79ec67)) -- use id based source getters instead of index ([a074463](https://github.com/KRTirtho/spotube/commit/a0744630ba2dc713babdb8db6500f9dd0f1e6096)) +- excessive repaints caused by Player progress + bar ([09b24cf](https://github.com/KRTirtho/spotube/commit/09b24cf1fd1644c549f85904545db54b39cc2431)) +- failed download no error + icon ([1266a3f](https://github.com/KRTirtho/spotube/commit/1266a3f1607de11e793a294071850996527d494a)) +- **home:** bottom player + transparency ([20c424c](https://github.com/KRTirtho/spotube/commit/20c424c77fe273a693213ebf88d50e4025bc8608)) +- language changer not + working ([7b7b1f2](https://github.com/KRTirtho/spotube/commit/7b7b1f2647591b7cd4cc7841526716c6a2877e55)) +- less frequent position + updates ([0a49b56](https://github.com/KRTirtho/spotube/commit/0a49b56566abd00cf7703e4207cfa90f93c381fd)) +- linux mpris not showing up and overall media notification + service ([1abcad1](https://github.com/KRTirtho/spotube/commit/1abcad1de510c209a34196f2de17045af4dd3bc2)) +- local tracks getting fetched on first + load ([73c012c](https://github.com/KRTirtho/spotube/commit/73c012c71ab5050636f79e010d654b4390978ee7)) +- local tracks not working when there's a invalid music file in the + folder ([5855820](https://github.com/KRTirtho/spotube/commit/5855820569dfad7cd26f1e0f0c985babd0d9485d)) +- lyrics page blur in player and cut off text when line too + big ([6b4584e](https://github.com/KRTirtho/spotube/commit/6b4584e91bd4f4aee0c56e48a7aec7015c7c418b)) +- macos build by removing media_kit native event + loop ([62fc773](https://github.com/KRTirtho/spotube/commit/62fc7739b508f0e874978408a2bab0a1d422deb6)) +- macos build error, mobile player duration and playing state and background disposal of + player ([be91e33](https://github.com/KRTirtho/spotube/commit/be91e33828630c7062886cd15e4d57496daaa4d5)) +- **macos,ios:** use regular shared + prefs ([1b5bfec](https://github.com/KRTirtho/spotube/commit/1b5bfec27fbcfe9faabff64d46296bdeebe00161)) +- memoize child of animated widget and make player bg animation + faster ([fcb5c8f](https://github.com/KRTirtho/spotube/commit/fcb5c8f8dabd0d4e3033f80ea3e5d006243cdfb5)) +- mini player not working in release + mode ([28ff321](https://github.com/KRTirtho/spotube/commit/28ff3216efee81184798eedfbb10ba66395bbf36)) +- **mkPlayer:** remove method and wrong active index on modifying + playlist ([3bafa7b](https://github.com/KRTirtho/spotube/commit/3bafa7b80c963fa52b90ed4cb1393fb121cac713)) +- mobile audio notification not + working ([8f9303b](https://github.com/KRTirtho/spotube/commit/8f9303bc0fddb9d179303a1f0eb76dd5b02410e7)) +- multiple instance of + theme ([4ec0424](https://github.com/KRTirtho/spotube/commit/4ec04240a5bde6af5c920a61ab6260e7a93bfc54)) +- navigation to settings not + working ([ce10aa1](https://github.com/KRTirtho/spotube/commit/ce10aa1fe2c95d4738835687f613930cf7829f3a)) +- no progress update when track + changed ([6ae8964](https://github.com/KRTirtho/spotube/commit/6ae896441a787fce1bc6e5eb5379856dc2f4e96d)) +- null exception on proxy playlist and audio + player ([a455a89](https://github.com/KRTirtho/spotube/commit/a455a89c5861fd455f6950c7b68beae24bdcc6ed)) +- overflowing clickable artists + links ([4077fac](https://github.com/KRTirtho/spotube/commit/4077fac39fb667b87e959e53d2dcaceefb63cd2d)) +- personalized playlists not + loading ([caa3408](https://github.com/KRTirtho/spotube/commit/caa340803fdf3859fe5a8a996abae1502ef2e4e7)) +- playback not moving to next track after a track + ends ([27e8acb](https://github.com/KRTirtho/spotube/commit/27e8acbfe75a37c0a8fa69a444fdd86e92dbe4f0)) +- **player:** gradient bg not taking full + height ([62ad86e](https://github.com/KRTirtho/spotube/commit/62ad86e88d74b5114af78138b221314192e5a801)) +- **player:** playback element + placement ([5e47faa](https://github.com/KRTirtho/spotube/commit/5e47faa6060d7a8aa0d143060e812dc06b8dd790)) +- **player:** queue button not showing when not logged + in ([6c2d655](https://github.com/KRTirtho/spotube/commit/6c2d65587b0e6e167be1d0b086df103c7e72d4b2)) +- **player:** volume slider, prefetching of media_kit and stuttering on sponsorblock + skip ([1f32554](https://github.com/KRTirtho/spotube/commit/1f3255481f058c50968561db88172e56b58494f4)) +- playlist generate slider + shape ([2b35c04](https://github.com/KRTirtho/spotube/commit/2b35c044adb15a97a58692e7880694a251899732)) +- pop sheet list not + scrollable ([cca5625](https://github.com/KRTirtho/spotube/commit/cca5625df7e432da8581a4504306baad154deb48)) +- re-enable add to queue and play next support, favorite button query + exceptions ([e529c79](https://github.com/KRTirtho/spotube/commit/e529c79c4f0cd964b7d89e010d3fe51378ea7222)) +- re-enable download + manager ([ea45c4f](https://github.com/KRTirtho/spotube/commit/ea45c4f42ae89b8991e470e84a5290b3be3b0f36)) +- remove unnecessary broadcast stream + conversions ([bf04962](https://github.com/KRTirtho/spotube/commit/bf04962e90ea5345a2bc0d4793999f7db712cab2)) +- remove useBreakpoints as it clogs up memory with unnecessary state + updates ([e1c0f5c](https://github.com/KRTirtho/spotube/commit/e1c0f5cf1e4cece2c4aa235bfbf8511ad7b1fe59)) +- replace download multiple pops and add + translations ([4a21249](https://github.com/KRTirtho/spotube/commit/4a21249ee386426b0974451542a93e84f532fb3f)) +- screen breakpoints and persist lyrics delay across + screens ([df79638](https://github.com/KRTirtho/spotube/commit/df79638fb622a55aaa2b36c9a1425c2d9c4a8e52)) +- sidebar task counter badge and bottom player play button progress + color ([af278d8](https://github.com/KRTirtho/spotube/commit/af278d8feaa08c14528627766bce6d724b846954)) +- status bar color of playlist/album + page ([65fa3cb](https://github.com/KRTirtho/spotube/commit/65fa3cb624c240360de5a06778a1f72ad10bbe2d)) +- system color scheme not persisting on restart when system color scheme + changed ([e04515d](https://github.com/KRTirtho/spotube/commit/e04515d8e213b4c7f85d11385959a33b042bd9b1)) +- track collection view status bar not + transparent ([9251121](https://github.com/KRTirtho/spotube/commit/9251121ba0154599975e33819a43719477c644f8)) +- track doesn't play after + change ([17e5ab6](https://github.com/KRTirtho/spotube/commit/17e5ab611cc417cce7c17cafc7045f5aa2eb970e)) +- track stops at last + second ([f554f6d](https://github.com/KRTirtho/spotube/commit/f554f6d43bb714f662a27977f501d7ad44b070c3)) +- **track_collection_view:** keyboard focus on scroll and no space for search results in + playlist/album ([7a8bd92](https://github.com/KRTirtho/spotube/commit/7a8bd921047e3766dbbf24449e2873afe3dbecf8)) +- track_table_view table + headers ([d88d287](https://github.com/KRTirtho/spotube/commit/d88d287fc586ec33351de9f3b4359f189054868b)) +- track_tile active and blacklist color, playbutton card action + positioning ([3f5a1b9](https://github.com/KRTirtho/spotube/commit/3f5a1b9587efe9b7b2c69008345867933f79ec67)) +- use id based source getters instead of + index ([a074463](https://github.com/KRTirtho/spotube/commit/a0744630ba2dc713babdb8db6500f9dd0f1e6096)) ### [2.7.1](https://github.com/KRTirtho/spotube/compare/v2.7.0...v2.7.1) (2023-04-10) ### Bug Fixes -- fallback for lyrics when anonymous ([f160ec7](https://github.com/KRTirtho/spotube/commit/f160ec767d9941d33f83aba1752b28df629d0e10)) -- **android:** audio notification stuck in play state ([448c9b3](https://github.com/KRTirtho/spotube/commit/448c9b39f407668ad92a695afe3c9741baeca20d)) -- **macos:** crashing on startup ([c46b428](https://github.com/KRTirtho/spotube/commit/c46b4284b1d46a614cbcebc8c2f2e52714921b9b)) -- spotify query hooks overriding default query params ([ec9a02e](https://github.com/KRTirtho/spotube/commit/ec9a02e8b8d988e15ed58027054d2a9090d98873)) +- fallback for lyrics when + anonymous ([f160ec7](https://github.com/KRTirtho/spotube/commit/f160ec767d9941d33f83aba1752b28df629d0e10)) +- **android:** audio notification stuck in play + state ([448c9b3](https://github.com/KRTirtho/spotube/commit/448c9b39f407668ad92a695afe3c9741baeca20d)) +- **macos:** crashing on + startup ([c46b428](https://github.com/KRTirtho/spotube/commit/c46b4284b1d46a614cbcebc8c2f2e52714921b9b)) +- spotify query hooks overriding default query + params ([ec9a02e](https://github.com/KRTirtho/spotube/commit/ec9a02e8b8d988e15ed58027054d2a9090d98873)) ## [2.7.0](https://github.com/KRTirtho/spotube/compare/v2.6.0...v2.7.0) (2023-03-07) ### Features -- add or remove track, playlist or album to queue support ([b8f3493](https://github.com/KRTirtho/spotube/commit/b8f3493138a9acd91d19efe67cfd1c0c7c269ae6)) -- basic command line argument support ([025c1ae](https://github.com/KRTirtho/spotube/commit/025c1ae20461c2ac9124b3ef41e21ff01f100498)) -- black list artist or track ([947c143](https://github.com/KRTirtho/spotube/commit/947c14353e15227400a6310673f3b850b2ff024f)) -- bring pre download on desktop, disable pre download for long videos ([1d82bb0](https://github.com/KRTirtho/spotube/commit/1d82bb098717c7321d3e338f071c7661987fc3be)) +- add or remove track, playlist or album to queue + support ([b8f3493](https://github.com/KRTirtho/spotube/commit/b8f3493138a9acd91d19efe67cfd1c0c7c269ae6)) +- basic command line argument + support ([025c1ae](https://github.com/KRTirtho/spotube/commit/025c1ae20461c2ac9124b3ef41e21ff01f100498)) +- black list artist or + track ([947c143](https://github.com/KRTirtho/spotube/commit/947c14353e15227400a6310673f3b850b2ff024f)) +- bring pre download on desktop, disable pre download for long + videos ([1d82bb0](https://github.com/KRTirtho/spotube/commit/1d82bb098717c7321d3e338f071c7661987fc3be)) - category/genre filter ([1dfec05](https://github.com/KRTirtho/spotube/commit/1dfec05eec7ee60cc9f6a3a97af37aef112063f1)) -- centralized icon collection with new icon set and nav bar labels hidden ([e7acb9e](https://github.com/KRTirtho/spotube/commit/e7acb9ed5cb02826b8da559818f1fccfcf7f143c)) -- compact search bar for genres and user_local_tracks page ([c343ccc](https://github.com/KRTirtho/spotube/commit/c343ccc2932868e3c1205d8cc625a9dfe9d78707)) -- compatibility with fl-query nextPage method change ([7617439](https://github.com/KRTirtho/spotube/commit/761743991520609dd2b2dcb12cd6e4e75a8f6925)) -- configure pocketbase, generate dart types, update playback to use server instead of hive cache ([ad90c11](https://github.com/KRTirtho/spotube/commit/ad90c11ab0c9f1aaba9ae9226d6076ea590f1a29)) -- failsafe pocketbase requests, removal of unneeded preferences options & vertical playbutton actions ([d68d150](https://github.com/KRTirtho/spotube/commit/d68d150d3f42260f889d86927378c2f746bb6993)) -- **home:** personalized section ([9080441](https://github.com/KRTirtho/spotube/commit/9080441b875ceb91260bbad79291365a98d5be95)) -- individual shuffle and repeat/loop button of player ([f79223c](https://github.com/KRTirtho/spotube/commit/f79223cd41c61d9836d25e7bc2811c6515ba00c8)) -- **lyrics:** use official spotify API for fetching lyrics and add zoom controls ([10d0660](https://github.com/KRTirtho/spotube/commit/10d0660972f008df0d11c280b681ce3b78f05d0b)) -- **mobile:** pull to refresh support in all refreshable list views ([9f959ce](https://github.com/KRTirtho/spotube/commit/9f959ce77cd95cfc34d01af1f5cf53dd4206b6a6)) -- new logo and compact search in playlist/album in mobile ([dc96cb3](https://github.com/KRTirtho/spotube/commit/dc96cb38cea8dc13738083f4850d22792d071019)) -- search/filter tracks inside playlist or album ([a06cd0d](https://github.com/KRTirtho/spotube/commit/a06cd0da84cc03a2a7cadbc80d70556cb0cf9310)) -- show snackbar on adding playlist or tracks to queue ([6bc1d32](https://github.com/KRTirtho/spotube/commit/6bc1d32a88ae516f77d149b83bcd536d2c888513)) -- **theme:** use material3 monet for colors and remove background color preference ([60ede5f](https://github.com/KRTirtho/spotube/commit/60ede5f92b732691d53850290d9667435298a857)) -- use catcher to handle exceptions ([84d94b0](https://github.com/KRTirtho/spotube/commit/84d94b05bc269a1676a261df2b12e508e10e4c0e)) -- use typed assets instead of hard coded paths ([59561ab](https://github.com/KRTirtho/spotube/commit/59561abdc2540576fc95b34b3b55def63567000a)) -- user local tracks searchbar ([e7f3f4e](https://github.com/KRTirtho/spotube/commit/e7f3f4eae49fe27a52fc3866fa4f6f2efb2aa479)) -- **user-library:** filtering support for user albums and user artists ([0b58155](https://github.com/KRTirtho/spotube/commit/0b58155d434f2de6359be77d7beee4484dbb7b2a)) -- **user-library:** search for user playlists ([af4d56f](https://github.com/KRTirtho/spotube/commit/af4d56fd41e57cbe6d87883e87e6b4469aaba52f)) +- centralized icon collection with new icon set and nav bar labels + hidden ([e7acb9e](https://github.com/KRTirtho/spotube/commit/e7acb9ed5cb02826b8da559818f1fccfcf7f143c)) +- compact search bar for genres and user_local_tracks + page ([c343ccc](https://github.com/KRTirtho/spotube/commit/c343ccc2932868e3c1205d8cc625a9dfe9d78707)) +- compatibility with fl-query nextPage method + change ([7617439](https://github.com/KRTirtho/spotube/commit/761743991520609dd2b2dcb12cd6e4e75a8f6925)) +- configure pocketbase, generate dart types, update playback to use server instead of hive + cache ([ad90c11](https://github.com/KRTirtho/spotube/commit/ad90c11ab0c9f1aaba9ae9226d6076ea590f1a29)) +- failsafe pocketbase requests, removal of unneeded preferences options & vertical playbutton + actions ([d68d150](https://github.com/KRTirtho/spotube/commit/d68d150d3f42260f889d86927378c2f746bb6993)) +- **home:** personalized + section ([9080441](https://github.com/KRTirtho/spotube/commit/9080441b875ceb91260bbad79291365a98d5be95)) +- individual shuffle and repeat/loop button of + player ([f79223c](https://github.com/KRTirtho/spotube/commit/f79223cd41c61d9836d25e7bc2811c6515ba00c8)) +- **lyrics:** use official spotify API for fetching lyrics and add zoom + controls ([10d0660](https://github.com/KRTirtho/spotube/commit/10d0660972f008df0d11c280b681ce3b78f05d0b)) +- **mobile:** pull to refresh support in all refreshable list + views ([9f959ce](https://github.com/KRTirtho/spotube/commit/9f959ce77cd95cfc34d01af1f5cf53dd4206b6a6)) +- new logo and compact search in playlist/album in + mobile ([dc96cb3](https://github.com/KRTirtho/spotube/commit/dc96cb38cea8dc13738083f4850d22792d071019)) +- search/filter tracks inside playlist or + album ([a06cd0d](https://github.com/KRTirtho/spotube/commit/a06cd0da84cc03a2a7cadbc80d70556cb0cf9310)) +- show snackbar on adding playlist or tracks to + queue ([6bc1d32](https://github.com/KRTirtho/spotube/commit/6bc1d32a88ae516f77d149b83bcd536d2c888513)) +- **theme:** use material3 monet for colors and remove background color + preference ([60ede5f](https://github.com/KRTirtho/spotube/commit/60ede5f92b732691d53850290d9667435298a857)) +- use catcher to handle + exceptions ([84d94b0](https://github.com/KRTirtho/spotube/commit/84d94b05bc269a1676a261df2b12e508e10e4c0e)) +- use typed assets instead of hard coded + paths ([59561ab](https://github.com/KRTirtho/spotube/commit/59561abdc2540576fc95b34b3b55def63567000a)) +- user local tracks + searchbar ([e7f3f4e](https://github.com/KRTirtho/spotube/commit/e7f3f4eae49fe27a52fc3866fa4f6f2efb2aa479)) +- **user-library:** filtering support for user albums and user + artists ([0b58155](https://github.com/KRTirtho/spotube/commit/0b58155d434f2de6359be77d7beee4484dbb7b2a)) +- **user-library:** search for user + playlists ([af4d56f](https://github.com/KRTirtho/spotube/commit/af4d56fd41e57cbe6d87883e87e6b4469aaba52f)) ### Bug Fixes -- **about:** license text hidden in the bottom of smaller screen devices ([e158dd0](https://github.com/KRTirtho/spotube/commit/e158dd0cec5657e495b538e86c412b06974a9f49)) -- **about:** wrong link of License ([a4a7f1a](https://github.com/KRTirtho/spotube/commit/a4a7f1a74f9df82927403ca93aec508a13315ae8)) -- genre and sidebar user logo not loading ([710f172](https://github.com/KRTirtho/spotube/commit/710f172dee45f60ed3e5ed83017eb538d6a626bf)) -- lyrics modal sheet out of safe area so use 80% of screen height instead of full ([3db28f4](https://github.com/KRTirtho/spotube/commit/3db28f43b4200d03f7758e8c395d8430e0f89333)) -- lyrics not changing on track change ([c809d2d](https://github.com/KRTirtho/spotube/commit/c809d2daba4beaea7c4f16c6bb0edef9efa825b8)) -- lyrics not refetching when tracked changed while being in another page and sidebar user avatar not showing on startup ([bd12675](https://github.com/KRTirtho/spotube/commit/bd126751e9594fbc926bbcad7b9a2c577fce074a)) +- **about:** license text hidden in the bottom of smaller screen + devices ([e158dd0](https://github.com/KRTirtho/spotube/commit/e158dd0cec5657e495b538e86c412b06974a9f49)) +- **about:** wrong link of + License ([a4a7f1a](https://github.com/KRTirtho/spotube/commit/a4a7f1a74f9df82927403ca93aec508a13315ae8)) +- genre and sidebar user logo not + loading ([710f172](https://github.com/KRTirtho/spotube/commit/710f172dee45f60ed3e5ed83017eb538d6a626bf)) +- lyrics modal sheet out of safe area so use 80% of screen height instead of + full ([3db28f4](https://github.com/KRTirtho/spotube/commit/3db28f43b4200d03f7758e8c395d8430e0f89333)) +- lyrics not changing on track + change ([c809d2d](https://github.com/KRTirtho/spotube/commit/c809d2daba4beaea7c4f16c6bb0edef9efa825b8)) +- lyrics not refetching when tracked changed while being in another page and sidebar user avatar not showing on + startup ([bd12675](https://github.com/KRTirtho/spotube/commit/bd126751e9594fbc926bbcad7b9a2c577fce074a)) - macOS logo placement ([c6a5d5f](https://github.com/KRTirtho/spotube/commit/c6a5d5f7b1b1fad3a0b5e63c02c847a149e72efe)) -- mobile track collection search bar position and page_window_title_bar exception on mobile platforms ([d0aaa97](https://github.com/KRTirtho/spotube/commit/d0aaa971fe358b9cb5dc7a35cc82eaf6520f7ab4)) -- **play_overlay:** show progress indicator on song loading ([7803a48](https://github.com/KRTirtho/spotube/commit/7803a48237c91f2a57bcc86fbd30ad879142c8ff)) -- **playback:** not skipping track's sponsorblock segments ([60a5847](https://github.com/KRTirtho/spotube/commit/60a5847ae68836bbbeef748254c674c81fa5c3ea)) -- playbutton card play state not changing ([ee46d09](https://github.com/KRTirtho/spotube/commit/ee46d0970be9e227793494a41e25c0c469847cd0)) -- **playbutton_card:** play and add to queue needs 2 clicks work ([bdd7098](https://github.com/KRTirtho/spotube/commit/bdd70984e6670813e508786e74cd2ea4a1fe1d53)) -- **playbutton_card:** play and non play state correction ([b327ffb](https://github.com/KRTirtho/spotube/commit/b327ffb1084b43e5c78e13994f65fb30b3a7e67e)) -- **playbutton_card:** title text overflow ([39ee0a9](https://github.com/KRTirtho/spotube/commit/39ee0a92a8f3d74d243db206fe034330f75c0588)) -- **playbutton:** playing state is not updating when playlist is actually playing ([9bad8c9](https://github.com/KRTirtho/spotube/commit/9bad8c9eb88f7c91091a669b642b92474df0f128)) -- **player_queue:** large clear button and macos exception ([0e43504](https://github.com/KRTirtho/spotube/commit/0e43504e18d2315fb1b7975b67bd2c596cbfb1bc)) -- **playlist_queue:** load method not preserving the active track before filtering blacklisted tracks ([42b3e11](https://github.com/KRTirtho/spotube/commit/42b3e111f844f6de6a145de2760ccfd7e97e623b)) -- pre downloading not working properly, audio service circular deps and sibling not loading for backend track ([3ccb525](https://github.com/KRTirtho/spotube/commit/3ccb525260a83ba54021a353b15ed3cda6e9c876)) -- search track play button isn't working ([0751f5e](https://github.com/KRTirtho/spotube/commit/0751f5e3173882f3aeed67027854e5054b689693)) -- **search:** grey screen, only tracks update on new search string, playlists,albums,artists show up before hitting return/submit ([a774817](https://github.com/KRTirtho/spotube/commit/a774817240ef813cb95f82f53ccb798ef9acb51d)) -- **search:** has to submit twice for search results ([f5dc76a](https://github.com/KRTirtho/spotube/commit/f5dc76a98f55f0f032a6fe4208465899f932355a)) -- titlebar maximize+restore button not working and less responsive title bar buttons ([8a6ba3b](https://github.com/KRTirtho/spotube/commit/8a6ba3b35f0b6b42cf60920e945ac2065c886ecb)) -- **track_collection_view:** hide search bar when sliver is collapsed ([3d6d244](https://github.com/KRTirtho/spotube/commit/3d6d2444beed153a2b6663d6153684b2974f4152)) -- **track_tile:** cannot see track index above 99 ([78b3273](https://github.com/KRTirtho/spotube/commit/78b3273e441cdaa6d4a410ddfe29837dc1aa7000)) -- **track_tile:** track action popup not showing on narrow screens ([0c54f2d](https://github.com/KRTirtho/spotube/commit/0c54f2dcd4474b63db4c517b0e7332cbd3ab51e9)) -- **ui:** scaffold exception in fluent_ui ([8ce2192](https://github.com/KRTirtho/spotube/commit/8ce2192e5cb08e3a8be5ead510ab35b274bef2ef)) -- use chosen market for new release ([c6bf9b6](https://github.com/KRTirtho/spotube/commit/c6bf9b67995161a8bf7c3782188d01e8859c18e9)) +- mobile track collection search bar position and page_window_title_bar exception on mobile + platforms ([d0aaa97](https://github.com/KRTirtho/spotube/commit/d0aaa971fe358b9cb5dc7a35cc82eaf6520f7ab4)) +- **play_overlay:** show progress indicator on song + loading ([7803a48](https://github.com/KRTirtho/spotube/commit/7803a48237c91f2a57bcc86fbd30ad879142c8ff)) +- **playback:** not skipping track's sponsorblock + segments ([60a5847](https://github.com/KRTirtho/spotube/commit/60a5847ae68836bbbeef748254c674c81fa5c3ea)) +- playbutton card play state not + changing ([ee46d09](https://github.com/KRTirtho/spotube/commit/ee46d0970be9e227793494a41e25c0c469847cd0)) +- **playbutton_card:** play and add to queue needs 2 clicks + work ([bdd7098](https://github.com/KRTirtho/spotube/commit/bdd70984e6670813e508786e74cd2ea4a1fe1d53)) +- **playbutton_card:** play and non play state + correction ([b327ffb](https://github.com/KRTirtho/spotube/commit/b327ffb1084b43e5c78e13994f65fb30b3a7e67e)) +- **playbutton_card:** title text + overflow ([39ee0a9](https://github.com/KRTirtho/spotube/commit/39ee0a92a8f3d74d243db206fe034330f75c0588)) +- **playbutton:** playing state is not updating when playlist is actually + playing ([9bad8c9](https://github.com/KRTirtho/spotube/commit/9bad8c9eb88f7c91091a669b642b92474df0f128)) +- **player_queue:** large clear button and macos + exception ([0e43504](https://github.com/KRTirtho/spotube/commit/0e43504e18d2315fb1b7975b67bd2c596cbfb1bc)) +- **playlist_queue:** load method not preserving the active track before filtering blacklisted + tracks ([42b3e11](https://github.com/KRTirtho/spotube/commit/42b3e111f844f6de6a145de2760ccfd7e97e623b)) +- pre downloading not working properly, audio service circular deps and sibling not loading for backend + track ([3ccb525](https://github.com/KRTirtho/spotube/commit/3ccb525260a83ba54021a353b15ed3cda6e9c876)) +- search track play button isn't + working ([0751f5e](https://github.com/KRTirtho/spotube/commit/0751f5e3173882f3aeed67027854e5054b689693)) +- **search:** grey screen, only tracks update on new search string, playlists,albums,artists show up before hitting + return/submit ([a774817](https://github.com/KRTirtho/spotube/commit/a774817240ef813cb95f82f53ccb798ef9acb51d)) +- **search:** has to submit twice for search + results ([f5dc76a](https://github.com/KRTirtho/spotube/commit/f5dc76a98f55f0f032a6fe4208465899f932355a)) +- titlebar maximize+restore button not working and less responsive title bar + buttons ([8a6ba3b](https://github.com/KRTirtho/spotube/commit/8a6ba3b35f0b6b42cf60920e945ac2065c886ecb)) +- **track_collection_view:** hide search bar when sliver is + collapsed ([3d6d244](https://github.com/KRTirtho/spotube/commit/3d6d2444beed153a2b6663d6153684b2974f4152)) +- **track_tile:** cannot see track index above + 99 ([78b3273](https://github.com/KRTirtho/spotube/commit/78b3273e441cdaa6d4a410ddfe29837dc1aa7000)) +- **track_tile:** track action popup not showing on narrow + screens ([0c54f2d](https://github.com/KRTirtho/spotube/commit/0c54f2dcd4474b63db4c517b0e7332cbd3ab51e9)) +- **ui:** scaffold exception in + fluent_ui ([8ce2192](https://github.com/KRTirtho/spotube/commit/8ce2192e5cb08e3a8be5ead510ab35b274bef2ef)) +- use chosen market for new + release ([c6bf9b6](https://github.com/KRTirtho/spotube/commit/c6bf9b67995161a8bf7c3782188d01e8859c18e9)) ## [2.6.0](https://github.com/KRTirtho/spotube/compare/v2.5.0...v2.6.0) (2022-12-09) ### Features -- add selected tracks to playlists, optimistic playlist remove track ([3386dac](https://github.com/KRTirtho/spotube/commit/3386dac78ee49b9e3504f5c05bf1e7b362a2e8a2)) -- added shuffle button in playlist and album section ([1fad95f](https://github.com/KRTirtho/spotube/commit/1fad95f6e370606a9faf6f2bb9738dc360e23918)) -- **android-playback:** option to download track bytes and play instead of Streaming ([dcc8ba5](https://github.com/KRTirtho/spotube/commit/dcc8ba5a54286b252d53c9c14918971bf7bea8cc)) -- change default platform option and platform specific back button ([36c5e02](https://github.com/KRTirtho/spotube/commit/36c5e02f18374100f61cc3f2957c27bfc0d8511f)) -- dialog logo for macos, settings more width for country picker ([5e96913](https://github.com/KRTirtho/spotube/commit/5e96913ba34230e7a15d62060d5dae28d80e3630)) -- initial platform_ui integration ([9eee573](https://github.com/KRTirtho/spotube/commit/9eee573ce928aa6c03dcb50bf1521350d2de32cc)) -- libadwaita theming, track tile and PlayButtonCard play button icon fix ([e795e23](https://github.com/KRTirtho/spotube/commit/e795e23e42e5f1f832963b2a4506df89b7df5baa)) -- **lyrics:** tabs for both synced and static lyrics [#182](https://github.com/KRTirtho/spotube/issues/182) ([6b6907a](https://github.com/KRTirtho/spotube/commit/6b6907af3fdb327312ad4dd9e16b3e2a850ed896)) -- new refined about page, update checker only check for same update channel ([4cadfa9](https://github.com/KRTirtho/spotube/commit/4cadfa93750cc9b3f8fbe7b60f8161a77d2a12f6)) -- pause track when seeking forward/back and keep audio session alive when paused/interrupted ([bc8a04e](https://github.com/KRTirtho/spotube/commit/bc8a04e5442ba3abe1b04ab325769559f37d9802)) -- platform bottom navigation bar add ([ff14469](https://github.com/KRTirtho/spotube/commit/ff1446982f0260c6fe231970aa6ed61c273fdf07)) -- platform slider and progress indicator integration ([46b00ba](https://github.com/KRTirtho/spotube/commit/46b00bafdf71a4add61cf50168a32198c3293181)) -- platform title bar buttons add ([54048cb](https://github.com/KRTirtho/spotube/commit/54048cbfc37d9a40c020eb81ab67b9dd5428f0d7)) -- **playback:** change current track youtube source panel and tooltips for player icon buttons ([4b21cc8](https://github.com/KRTirtho/spotube/commit/4b21cc829954fb079d1a0081b9147377063da3ec)) -- Player and Playbutton theme respect to platform ([512446d](https://github.com/KRTirtho/spotube/commit/512446dcab72aa1d7bce18e5a5793f6be8f30fcb)) -- player queue and sibling tracks platform decoration ([39a7794](https://github.com/KRTirtho/spotube/commit/39a77945d132d90ff323b0a22edc2a12a4749888)) -- **PlayerView:** shortcut button for opening lyrics [#273](https://github.com/KRTirtho/spotube/issues/273) ([1d4847a](https://github.com/KRTirtho/spotube/commit/1d4847ab0a0b18d5bc27257b3db863b995dc5843)) -- rename files to snake_case and reorganize folder structure ([7c25e1c](https://github.com/KRTirtho/spotube/commit/7c25e1cc8a35eb8aee2268799c05f299204fa3f5)) -- replace all types of buttons with platform buttons ([69739b4](https://github.com/KRTirtho/spotube/commit/69739b457296a6b209aa6f73beb378ae1f089ac5)) +- add selected tracks to playlists, optimistic playlist remove + track ([3386dac](https://github.com/KRTirtho/spotube/commit/3386dac78ee49b9e3504f5c05bf1e7b362a2e8a2)) +- added shuffle button in playlist and album + section ([1fad95f](https://github.com/KRTirtho/spotube/commit/1fad95f6e370606a9faf6f2bb9738dc360e23918)) +- **android-playback:** option to download track bytes and play instead of + Streaming ([dcc8ba5](https://github.com/KRTirtho/spotube/commit/dcc8ba5a54286b252d53c9c14918971bf7bea8cc)) +- change default platform option and platform specific back + button ([36c5e02](https://github.com/KRTirtho/spotube/commit/36c5e02f18374100f61cc3f2957c27bfc0d8511f)) +- dialog logo for macos, settings more width for country + picker ([5e96913](https://github.com/KRTirtho/spotube/commit/5e96913ba34230e7a15d62060d5dae28d80e3630)) +- initial platform_ui + integration ([9eee573](https://github.com/KRTirtho/spotube/commit/9eee573ce928aa6c03dcb50bf1521350d2de32cc)) +- libadwaita theming, track tile and PlayButtonCard play button icon + fix ([e795e23](https://github.com/KRTirtho/spotube/commit/e795e23e42e5f1f832963b2a4506df89b7df5baa)) +- **lyrics:** tabs for both synced and static + lyrics [#182](https://github.com/KRTirtho/spotube/issues/182) ([6b6907a](https://github.com/KRTirtho/spotube/commit/6b6907af3fdb327312ad4dd9e16b3e2a850ed896)) +- new refined about page, update checker only check for same update + channel ([4cadfa9](https://github.com/KRTirtho/spotube/commit/4cadfa93750cc9b3f8fbe7b60f8161a77d2a12f6)) +- pause track when seeking forward/back and keep audio session alive when + paused/interrupted ([bc8a04e](https://github.com/KRTirtho/spotube/commit/bc8a04e5442ba3abe1b04ab325769559f37d9802)) +- platform bottom navigation bar + add ([ff14469](https://github.com/KRTirtho/spotube/commit/ff1446982f0260c6fe231970aa6ed61c273fdf07)) +- platform slider and progress indicator + integration ([46b00ba](https://github.com/KRTirtho/spotube/commit/46b00bafdf71a4add61cf50168a32198c3293181)) +- platform title bar buttons + add ([54048cb](https://github.com/KRTirtho/spotube/commit/54048cbfc37d9a40c020eb81ab67b9dd5428f0d7)) +- **playback:** change current track youtube source panel and tooltips for player icon + buttons ([4b21cc8](https://github.com/KRTirtho/spotube/commit/4b21cc829954fb079d1a0081b9147377063da3ec)) +- Player and Playbutton theme respect to + platform ([512446d](https://github.com/KRTirtho/spotube/commit/512446dcab72aa1d7bce18e5a5793f6be8f30fcb)) +- player queue and sibling tracks platform + decoration ([39a7794](https://github.com/KRTirtho/spotube/commit/39a77945d132d90ff323b0a22edc2a12a4749888)) +- **PlayerView:** shortcut button for opening + lyrics [#273](https://github.com/KRTirtho/spotube/issues/273) ([1d4847a](https://github.com/KRTirtho/spotube/commit/1d4847ab0a0b18d5bc27257b3db863b995dc5843)) +- rename files to snake_case and reorganize folder + structure ([7c25e1c](https://github.com/KRTirtho/spotube/commit/7c25e1cc8a35eb8aee2268799c05f299204fa3f5)) +- replace all types of buttons with platform + buttons ([69739b4](https://github.com/KRTirtho/spotube/commit/69739b457296a6b209aa6f73beb378ae1f089ac5)) - rpm packaging support ([067e9ac](https://github.com/KRTirtho/spotube/commit/067e9ac53ee85775c9ec35457fac9e064e72e4c0)) -- **search:** infinite scroll for tracks, artists, playlists and albums ([e6761a6](https://github.com/KRTirtho/spotube/commit/e6761a6f8eadf4ab260723253a8e00121b6365b5)) -- set platform to default platform on start up ([472da6b](https://github.com/KRTirtho/spotube/commit/472da6b8b1c3e06b666da58351f3feafbfe6c98a)) -- shuffle keep playing track at top, linux title bar drag no working ([1223cf2](https://github.com/KRTirtho/spotube/commit/1223cf2629c6615b0c48e9e6742b68341f33c7f8)) -- sidebar download count and proper progress color in playbutton ([a10bc5b](https://github.com/KRTirtho/spotube/commit/a10bc5b8d89207ac86872dd25f3258e47c2141a5)) -- static shimmer for track tile, playbutton card and track tile ([3ed8b0f](https://github.com/KRTirtho/spotube/commit/3ed8b0fda2cb8145a2bc6c8f8c6af82db6a40547)) -- tablet mode navigation bar & windows semi transparent bg, ([3282370](https://github.com/KRTirtho/spotube/commit/3282370f74f323c00116fa8626fd1440ee9d4922)) -- **title_bar:** platform specific title bar ([e659e3c](https://github.com/KRTirtho/spotube/commit/e659e3c56fb02ad8a1c5114bf80074f0324cc4f1)) -- titlebar complete compatibility, platform specific login, library tabbar in titlebar ([b3c27d1](https://github.com/KRTirtho/spotube/commit/b3c27d1fca233ea079803fe49134abc528376df3)) +- **search:** infinite scroll for tracks, artists, playlists and + albums ([e6761a6](https://github.com/KRTirtho/spotube/commit/e6761a6f8eadf4ab260723253a8e00121b6365b5)) +- set platform to default platform on start + up ([472da6b](https://github.com/KRTirtho/spotube/commit/472da6b8b1c3e06b666da58351f3feafbfe6c98a)) +- shuffle keep playing track at top, linux title bar drag no + working ([1223cf2](https://github.com/KRTirtho/spotube/commit/1223cf2629c6615b0c48e9e6742b68341f33c7f8)) +- sidebar download count and proper progress color in + playbutton ([a10bc5b](https://github.com/KRTirtho/spotube/commit/a10bc5b8d89207ac86872dd25f3258e47c2141a5)) +- static shimmer for track tile, playbutton card and track + tile ([3ed8b0f](https://github.com/KRTirtho/spotube/commit/3ed8b0fda2cb8145a2bc6c8f8c6af82db6a40547)) +- tablet mode navigation bar & windows semi transparent + bg, ([3282370](https://github.com/KRTirtho/spotube/commit/3282370f74f323c00116fa8626fd1440ee9d4922)) +- **title_bar:** platform specific title + bar ([e659e3c](https://github.com/KRTirtho/spotube/commit/e659e3c56fb02ad8a1c5114bf80074f0324cc4f1)) +- titlebar complete compatibility, platform specific login, library tabbar in + titlebar ([b3c27d1](https://github.com/KRTirtho/spotube/commit/b3c27d1fca233ea079803fe49134abc528376df3)) - use platform checkbox ([2211505](https://github.com/KRTirtho/spotube/commit/2211505d713cef752d07cafb9791a49e8095eee2)) -- window blur effect add ([b0db5e7](https://github.com/KRTirtho/spotube/commit/b0db5e7d8246f98835e7ce6656c8aa7620e46bec)) +- window blur effect + add ([b0db5e7](https://github.com/KRTirtho/spotube/commit/b0db5e7d8246f98835e7ce6656c8aa7620e46bec)) ### Bug Fixes -- **ArtistCard:** linux shadow ([c186881](https://github.com/KRTirtho/spotube/commit/c1868817e5abb8a4152646f00a0395933fee7823)) -- **auth:** refresh access token timer not working ([b3ac5ca](https://github.com/KRTirtho/spotube/commit/b3ac5ca3bbb6d5af154f4b5d715d1f19ca2f46e2)) -- bottom navigation bar settings tile not active when selected ([43557e4](https://github.com/KRTirtho/spotube/commit/43557e40df269757c2d5236a455308ea6478d95a)) -- dialog logo in android, lyrics visible timer adjust button ([3c6803b](https://github.com/KRTirtho/spotube/commit/3c6803bb3fac8eee9166764089724194a48509c6)) -- heart button showing when not logged in, wrong login redirect ([4dc26af](https://github.com/KRTirtho/spotube/commit/4dc26af23d12f76cbfdfbf4e37b0c11fcc484d3f)) -- horizontal infinite lists doesn't fill the screen ([69995be](https://github.com/KRTirtho/spotube/commit/69995bea1c6342c9212e5b22ef50bdfd6e7eba45)) -- ios dialog action buttons, local tracks crashing app, shimmer color and android wrong status bar color ([90c1200](https://github.com/KRTirtho/spotube/commit/90c1200a087f796690de0cfc8cc607d2bff44282)) -- **login:** not working in android in Brazil or Ukraine regions ([0b79a11](https://github.com/KRTirtho/spotube/commit/0b79a1181c37cf06fbfa3bfb3854cfd47097016e)) -- **macos:** black text in dark mode ([fb9c0e4](https://github.com/KRTirtho/spotube/commit/fb9c0e44be93997fc852bf0260e8a8608000c023)) -- **macos:** white text color in dark mode, text field white background ([e086b52](https://github.com/KRTirtho/spotube/commit/e086b520e745e65771136cbfa842ae0693c44872)) -- **mobile:** SafeArea bugs and back button color ([a8330ef](https://github.com/KRTirtho/spotube/commit/a8330ef2e1112012bbae19ee6a5c27a26c5fb719)) -- null exception in themes ([9465d92](https://github.com/KRTirtho/spotube/commit/9465d92fa032b8598a0752767dcec9af2541d222)) -- platform_ui local path ([00d0d38](https://github.com/KRTirtho/spotube/commit/00d0d38b5450aeb877195afdfb9424f83762d178)) -- player view artist link when local playlist is playing, lyric delay adjust button alignment ([ee5c417](https://github.com/KRTirtho/spotube/commit/ee5c417ac396ef0b1796fa74a6a494181e6e0396)) -- remove windows background ([6942964](https://github.com/KRTirtho/spotube/commit/694296418787c460bb3fa63ab30f3b0eed9184dc)) -- search field ios dark icon , lyrics tabbar ios background color ([be56ad4](https://github.com/KRTirtho/spotube/commit/be56ad44773ebcd14777d80b61e26875698dc18a)) -- settings Title alignment and play button card ripple effect in other platforms ([3b6bf27](https://github.com/KRTirtho/spotube/commit/3b6bf27a984f5d4836143638396ed4b467c0eae7)) +- **ArtistCard:** linux + shadow ([c186881](https://github.com/KRTirtho/spotube/commit/c1868817e5abb8a4152646f00a0395933fee7823)) +- **auth:** refresh access token timer not + working ([b3ac5ca](https://github.com/KRTirtho/spotube/commit/b3ac5ca3bbb6d5af154f4b5d715d1f19ca2f46e2)) +- bottom navigation bar settings tile not active when + selected ([43557e4](https://github.com/KRTirtho/spotube/commit/43557e40df269757c2d5236a455308ea6478d95a)) +- dialog logo in android, lyrics visible timer adjust + button ([3c6803b](https://github.com/KRTirtho/spotube/commit/3c6803bb3fac8eee9166764089724194a48509c6)) +- heart button showing when not logged in, wrong login + redirect ([4dc26af](https://github.com/KRTirtho/spotube/commit/4dc26af23d12f76cbfdfbf4e37b0c11fcc484d3f)) +- horizontal infinite lists doesn't fill the + screen ([69995be](https://github.com/KRTirtho/spotube/commit/69995bea1c6342c9212e5b22ef50bdfd6e7eba45)) +- ios dialog action buttons, local tracks crashing app, shimmer color and android wrong status bar + color ([90c1200](https://github.com/KRTirtho/spotube/commit/90c1200a087f796690de0cfc8cc607d2bff44282)) +- **login:** not working in android in Brazil or Ukraine + regions ([0b79a11](https://github.com/KRTirtho/spotube/commit/0b79a1181c37cf06fbfa3bfb3854cfd47097016e)) +- **macos:** black text in dark + mode ([fb9c0e4](https://github.com/KRTirtho/spotube/commit/fb9c0e44be93997fc852bf0260e8a8608000c023)) +- **macos:** white text color in dark mode, text field white + background ([e086b52](https://github.com/KRTirtho/spotube/commit/e086b520e745e65771136cbfa842ae0693c44872)) +- **mobile:** SafeArea bugs and back button + color ([a8330ef](https://github.com/KRTirtho/spotube/commit/a8330ef2e1112012bbae19ee6a5c27a26c5fb719)) +- null exception in + themes ([9465d92](https://github.com/KRTirtho/spotube/commit/9465d92fa032b8598a0752767dcec9af2541d222)) +- platform_ui local + path ([00d0d38](https://github.com/KRTirtho/spotube/commit/00d0d38b5450aeb877195afdfb9424f83762d178)) +- player view artist link when local playlist is playing, lyric delay adjust button + alignment ([ee5c417](https://github.com/KRTirtho/spotube/commit/ee5c417ac396ef0b1796fa74a6a494181e6e0396)) +- remove windows + background ([6942964](https://github.com/KRTirtho/spotube/commit/694296418787c460bb3fa63ab30f3b0eed9184dc)) +- search field ios dark icon , lyrics tabbar ios background + color ([be56ad4](https://github.com/KRTirtho/spotube/commit/be56ad44773ebcd14777d80b61e26875698dc18a)) +- settings Title alignment and play button card ripple effect in other + platforms ([3b6bf27](https://github.com/KRTirtho/spotube/commit/3b6bf27a984f5d4836143638396ed4b467c0eae7)) - shuffle play logic ([65cad07](https://github.com/KRTirtho/spotube/commit/65cad07e3a6e2188c53159057f9c3d4fe89706ea)) -- small minwidth of window in desktop, linux wrong light theme accent color, search field transparent background ([5b0e22c](https://github.com/KRTirtho/spotube/commit/5b0e22c1b639f2f57d92cb70cd11f56e30e0a457)) -- tooltips of menu and adaptive pop up menu ([261aaf1](https://github.com/KRTirtho/spotube/commit/261aaf191c51bc12b28c602ee160d53d3eacf3a5)) -- update download dialog blocking the UI ([3925f74](https://github.com/KRTirtho/spotube/commit/3925f743951e51f138cc3ca865fa167c34e776ef)) -- user playlists not updating after creating/deleting, artist follow not updating after follow/unfollow ([6cc2a18](https://github.com/KRTirtho/spotube/commit/6cc2a185d0c4c19f176e6f65b8ada19ebc76af5e)) -- **windows:** windows global title bar ([bd18f19](https://github.com/KRTirtho/spotube/commit/bd18f198217538f0089d5a1c4288dd97f982661b)) +- small minwidth of window in desktop, linux wrong light theme accent color, search field transparent + background ([5b0e22c](https://github.com/KRTirtho/spotube/commit/5b0e22c1b639f2f57d92cb70cd11f56e30e0a457)) +- tooltips of menu and adaptive pop up + menu ([261aaf1](https://github.com/KRTirtho/spotube/commit/261aaf191c51bc12b28c602ee160d53d3eacf3a5)) +- update download dialog blocking the + UI ([3925f74](https://github.com/KRTirtho/spotube/commit/3925f743951e51f138cc3ca865fa167c34e776ef)) +- user playlists not updating after creating/deleting, artist follow not updating after + follow/unfollow ([6cc2a18](https://github.com/KRTirtho/spotube/commit/6cc2a185d0c4c19f176e6f65b8ada19ebc76af5e)) +- **windows:** windows global title + bar ([bd18f19](https://github.com/KRTirtho/spotube/commit/bd18f198217538f0089d5a1c4288dd97f982661b)) ## [2.5.0](https://github.com/KRTirtho/spotube/compare/v2.4.1...v2.5.0) (2022-10-13) ### Features -- animated transition of root PageWindowTitleBar ([ff35e06](https://github.com/KRTirtho/spotube/commit/ff35e06a6605fc7ec762e716fb7bdf6f7eb45732)) -- **auth:** new authentication flow using cookies and webview in android ([756b910](https://github.com/KRTirtho/spotube/commit/756b91007ee747c10ed10aa7060af49b555a2eaf)) -- **downloader:** replace /skip all choice for downloaded tracks ([88d7ce5](https://github.com/KRTirtho/spotube/commit/88d7ce55a59f673d60cd9e85ab062bcb1b7dcbc3)) -- implemented go_route shell/nested route ([3e498a4](https://github.com/KRTirtho/spotube/commit/3e498a4827a1118e0b23faec7cf114272f7838d4)) -- **keyboard shortcuts:** play/pause on space, seek position on left/right ([2734454](https://github.com/KRTirtho/spotube/commit/2734454717bbfb5d0621c6ea72fa755ef4fc8602)) -- **keyboard-shortcuts:** home sidebar tab navigation and close app ([8f258e7](https://github.com/KRTirtho/spotube/commit/8f258e709ada418dbeef8d272af370b1741afd9c)) -- smoother list using fl_query and waypoint ([c77b0e1](https://github.com/KRTirtho/spotube/commit/c77b0e198b215180d863747e35998a17aff92720)) -- sort tracks in playlist, album and local tracks ([cb4bd25](https://github.com/KRTirtho/spotube/commit/cb4bd25df154455d225c426cfeaaea36ac09e9b7)) -- use of smaller sized images in `TrackTile` ([0ca97b4](https://github.com/KRTirtho/spotube/commit/0ca97b495f2a9ece8356f7813fc0e37d1cdb8608)) -- volume slider mouse scroll and preference for Rotating Album Art [#255](https://github.com/KRTirtho/spotube/issues/255) ([edb6f3c](https://github.com/KRTirtho/spotube/commit/edb6f3cd1c9ee2961040b2fe7a91c48577cee4f7)) +- animated transition of root + PageWindowTitleBar ([ff35e06](https://github.com/KRTirtho/spotube/commit/ff35e06a6605fc7ec762e716fb7bdf6f7eb45732)) +- **auth:** new authentication flow using cookies and webview in + android ([756b910](https://github.com/KRTirtho/spotube/commit/756b91007ee747c10ed10aa7060af49b555a2eaf)) +- **downloader:** replace /skip all choice for downloaded + tracks ([88d7ce5](https://github.com/KRTirtho/spotube/commit/88d7ce55a59f673d60cd9e85ab062bcb1b7dcbc3)) +- implemented go_route shell/nested + route ([3e498a4](https://github.com/KRTirtho/spotube/commit/3e498a4827a1118e0b23faec7cf114272f7838d4)) +- **keyboard shortcuts:** play/pause on space, seek position on + left/right ([2734454](https://github.com/KRTirtho/spotube/commit/2734454717bbfb5d0621c6ea72fa755ef4fc8602)) +- **keyboard-shortcuts:** home sidebar tab navigation and close + app ([8f258e7](https://github.com/KRTirtho/spotube/commit/8f258e709ada418dbeef8d272af370b1741afd9c)) +- smoother list using fl_query and + waypoint ([c77b0e1](https://github.com/KRTirtho/spotube/commit/c77b0e198b215180d863747e35998a17aff92720)) +- sort tracks in playlist, album and local + tracks ([cb4bd25](https://github.com/KRTirtho/spotube/commit/cb4bd25df154455d225c426cfeaaea36ac09e9b7)) +- use of smaller sized images in + `TrackTile` ([0ca97b4](https://github.com/KRTirtho/spotube/commit/0ca97b495f2a9ece8356f7813fc0e37d1cdb8608)) +- volume slider mouse scroll and preference for Rotating Album + Art [#255](https://github.com/KRTirtho/spotube/issues/255) ([edb6f3c](https://github.com/KRTirtho/spotube/commit/edb6f3cd1c9ee2961040b2fe7a91c48577cee4f7)) ### Bug Fixes -- **android:** file_picker and permission_handler failure for sdk < 33 ([139d4dc](https://github.com/KRTirtho/spotube/commit/139d4dc033d9aaa1d6882bf0f53e96a3b1e87c95)) -- cached local track is fetched from network ([abf4a57](https://github.com/KRTirtho/spotube/commit/abf4a5763a2faeedeb93d54e66c1f2482295b326)) -- categories not showing for oauth exception ([4df917e](https://github.com/KRTirtho/spotube/commit/4df917e65ee20cbcf42394cc141b1cdcdd6cc914)) -- **desktop:** maximized window size is stored and window maximized state doesn't persist ([91d5d10](https://github.com/KRTirtho/spotube/commit/91d5d1003b09530ff3bc9a0aa93e382e943977e0)) -- local audio doesn't get refreshed after getting permission ([618c6da](https://github.com/KRTirtho/spotube/commit/618c6da0ebddf3cc8e216743bbbb9220bcf40521)) -- no appropriate output when playlist is empty [#201](https://github.com/KRTirtho/spotube/issues/201) ([dbb81de](https://github.com/KRTirtho/spotube/commit/dbb81de763df60eba62ef1256a7161ea6ca59b66)) -- PlayerOverlay not hiding when not playing and unneeded bottom space in TrackTableView ([0ebac05](https://github.com/KRTirtho/spotube/commit/0ebac05a4be8e8f744a6c672d3bb9807d6f02e10)) -- **web:** not building due to metadata_god ffi ([1191bf2](https://github.com/KRTirtho/spotube/commit/1191bf232d0797aaae7eff2f5d570acd49ce61bd)) +- **android:** file_picker and permission_handler failure for sdk < + 33 ([139d4dc](https://github.com/KRTirtho/spotube/commit/139d4dc033d9aaa1d6882bf0f53e96a3b1e87c95)) +- cached local track is fetched from + network ([abf4a57](https://github.com/KRTirtho/spotube/commit/abf4a5763a2faeedeb93d54e66c1f2482295b326)) +- categories not showing for oauth + exception ([4df917e](https://github.com/KRTirtho/spotube/commit/4df917e65ee20cbcf42394cc141b1cdcdd6cc914)) +- **desktop:** maximized window size is stored and window maximized state doesn't + persist ([91d5d10](https://github.com/KRTirtho/spotube/commit/91d5d1003b09530ff3bc9a0aa93e382e943977e0)) +- local audio doesn't get refreshed after getting + permission ([618c6da](https://github.com/KRTirtho/spotube/commit/618c6da0ebddf3cc8e216743bbbb9220bcf40521)) +- no appropriate output when playlist is + empty [#201](https://github.com/KRTirtho/spotube/issues/201) ([dbb81de](https://github.com/KRTirtho/spotube/commit/dbb81de763df60eba62ef1256a7161ea6ca59b66)) +- PlayerOverlay not hiding when not playing and unneeded bottom space in + TrackTableView ([0ebac05](https://github.com/KRTirtho/spotube/commit/0ebac05a4be8e8f744a6c672d3bb9807d6f02e10)) +- **web:** not building due to metadata_god + ffi ([1191bf2](https://github.com/KRTirtho/spotube/commit/1191bf232d0797aaae7eff2f5d570acd49ce61bd)) ## [2.4.1](https://github.com/KRTirtho/spotube/compare/v2.4.0...v2.4.1) (2022-09-13) ### Features -- add macos audio metadata tags support ([5866b0f](https://github.com/KRTirtho/spotube/commit/5866b0fcd661cf32060bb1485ea81634fbb9b90a)) -- remove macos bounds for reading and writing audio metadata ([16064f6](https://github.com/KRTirtho/spotube/commit/16064f68e882b091401ace4b895e387f46635800)) -- **search:** horizontal swipe scroll support for Desktop platform ([d5ff927](https://github.com/KRTirtho/spotube/commit/d5ff927c7273b6e72c5d775ee777f2cbd0d6d05c)) +- add macos audio metadata tags + support ([5866b0f](https://github.com/KRTirtho/spotube/commit/5866b0fcd661cf32060bb1485ea81634fbb9b90a)) +- remove macos bounds for reading and writing audio + metadata ([16064f6](https://github.com/KRTirtho/spotube/commit/16064f68e882b091401ace4b895e387f46635800)) +- **search:** horizontal swipe scroll support for Desktop + platform ([d5ff927](https://github.com/KRTirtho/spotube/commit/d5ff927c7273b6e72c5d775ee777f2cbd0d6d05c)) ### Bug Fixes -- **artist-page:** SpotubeMarqueeText used in ArtistCard crashes the app ([4279541](https://github.com/KRTirtho/spotube/commit/427954150ab65b250e79fc844fc864abff5b6972)) -- **layout:** Fix adaptive UI not working correctly by providing a overriding option ([8c7adde](https://github.com/KRTirtho/spotube/commit/8c7adde890105e0267b71994b7928277f84553e5)) -- **local-track:** throwing exception when downloadLocation is empty ([1a3556d](https://github.com/KRTirtho/spotube/commit/1a3556d39e8473cadb6143192c48465dc6485599)) +- **artist-page:** SpotubeMarqueeText used in ArtistCard crashes the + app ([4279541](https://github.com/KRTirtho/spotube/commit/427954150ab65b250e79fc844fc864abff5b6972)) +- **layout:** Fix adaptive UI not working correctly by providing a overriding + option ([8c7adde](https://github.com/KRTirtho/spotube/commit/8c7adde890105e0267b71994b7928277f84553e5)) +- **local-track:** throwing exception when downloadLocation is + empty ([1a3556d](https://github.com/KRTirtho/spotube/commit/1a3556d39e8473cadb6143192c48465dc6485599)) ## [2.4.0](https://github.com/KRTirtho/spotube/compare/v2.3.0...v2.4.0) (2022-09-09) ### Features -- Ability to change download location added ([816707c](https://github.com/KRTirtho/spotube/commit/816707c643f8d60d25bc08fd4c8005daa2ba9e63)) -- add download multi tracks support for mobile platform ([0476bf7](https://github.com/KRTirtho/spotube/commit/0476bf7ceece034a927d1df6099d8b33036f8a9b)) -- add download queue for desktop & initial playlist download support ([08f913e](https://github.com/KRTirtho/spotube/commit/08f913e9761d0f5c447af9dfb6eedb44b675498c)) -- add download tab on library ([8d77b69](https://github.com/KRTirtho/spotube/commit/8d77b6900a81aab020e19397e788964b0ac499ff)) -- add web support although nothing works just as expected ([2818ed5](https://github.com/KRTirtho/spotube/commit/2818ed5c9dadb9185a52762599c1dd0acd81e6bf)) -- **broken:** Broken Warning! Initial Local Audio Player ([c3bf511](https://github.com/KRTirtho/spotube/commit/c3bf5119ebb7c17e8c32f149598508674b0acd39)) -- **download:** track table view multi select improvement, tap to play track support, existing track replace confirmation dialog and bulk download confirmation dialog ([e217553](https://github.com/KRTirtho/spotube/commit/e21755322f2cd5f1fba00c5c8cd5c5d1f79e459d)) -- **local-tracks:** complete support for local tracks ([e206f16](https://github.com/KRTirtho/spotube/commit/e206f16723ac989ad58006c1b3c90c6691d8cab3)) -- **mpris:** MPRIS metadata are now updated in realtime ([d9addcd](https://github.com/KRTirtho/spotube/commit/d9addcda8e9562803bd73016148fab22560ee050)) -- **playback:** add repeat track support [#166](https://github.com/KRTirtho/spotube/issues/166) ([cae9993](https://github.com/KRTirtho/spotube/commit/cae99934299bd197c68f626d6c10158d449770b9)) -- **synced-lyrics:** animated active text size ([531fae6](https://github.com/KRTirtho/spotube/commit/531fae64f94b21551a7a0da363a9ab0d44f5d3b1)) -- **ui:** adaptive TrackTile actions & Setting ListTile ([615d5ce](https://github.com/KRTirtho/spotube/commit/615d5ce901eb0512e84a120b7309c9053238ee36)) +- Ability to change download location + added ([816707c](https://github.com/KRTirtho/spotube/commit/816707c643f8d60d25bc08fd4c8005daa2ba9e63)) +- add download multi tracks support for mobile + platform ([0476bf7](https://github.com/KRTirtho/spotube/commit/0476bf7ceece034a927d1df6099d8b33036f8a9b)) +- add download queue for desktop & initial playlist download + support ([08f913e](https://github.com/KRTirtho/spotube/commit/08f913e9761d0f5c447af9dfb6eedb44b675498c)) +- add download tab on + library ([8d77b69](https://github.com/KRTirtho/spotube/commit/8d77b6900a81aab020e19397e788964b0ac499ff)) +- add web support although nothing works just as + expected ([2818ed5](https://github.com/KRTirtho/spotube/commit/2818ed5c9dadb9185a52762599c1dd0acd81e6bf)) +- **broken:** Broken Warning! Initial Local Audio + Player ([c3bf511](https://github.com/KRTirtho/spotube/commit/c3bf5119ebb7c17e8c32f149598508674b0acd39)) +- **download:** track table view multi select improvement, tap to play track support, existing track replace + confirmation dialog and bulk download confirmation + dialog ([e217553](https://github.com/KRTirtho/spotube/commit/e21755322f2cd5f1fba00c5c8cd5c5d1f79e459d)) +- **local-tracks:** complete support for local + tracks ([e206f16](https://github.com/KRTirtho/spotube/commit/e206f16723ac989ad58006c1b3c90c6691d8cab3)) +- **mpris:** MPRIS metadata are now updated in + realtime ([d9addcd](https://github.com/KRTirtho/spotube/commit/d9addcda8e9562803bd73016148fab22560ee050)) +- **playback:** add repeat track + support [#166](https://github.com/KRTirtho/spotube/issues/166) ([cae9993](https://github.com/KRTirtho/spotube/commit/cae99934299bd197c68f626d6c10158d449770b9)) +- **synced-lyrics:** animated active text + size ([531fae6](https://github.com/KRTirtho/spotube/commit/531fae64f94b21551a7a0da363a9ab0d44f5d3b1)) +- **ui:** adaptive TrackTile actions & Setting + ListTile ([615d5ce](https://github.com/KRTirtho/spotube/commit/615d5ce901eb0512e84a120b7309c9053238ee36)) ### Bug Fixes -- **adaptive-list-tile:** dialog content not updating when content has changed ([a1d4230](https://github.com/KRTirtho/spotube/commit/a1d423090c854ebe319a0fa03fd6e5c4007b1387)) -- album & playlist card, player view and album view play button logic ([55852bd](https://github.com/KRTirtho/spotube/commit/55852bd15bc709d61fbba8cbea01ceca791d154c)) +- **adaptive-list-tile:** dialog content not updating when content has + changed ([a1d4230](https://github.com/KRTirtho/spotube/commit/a1d423090c854ebe319a0fa03fd6e5c4007b1387)) +- album & playlist card, player view and album view play button + logic ([55852bd](https://github.com/KRTirtho/spotube/commit/55852bd15bc709d61fbba8cbea01ceca791d154c)) - **docs:** indentions ([4a291d5](https://github.com/KRTirtho/spotube/commit/4a291d5f20dabe68f3ed64071624dcbed8327329)) -- **downloader:** downloaded track is corrupted for tagging ([2ab1fba](https://github.com/KRTirtho/spotube/commit/2ab1fba3d64147e3c5cf34756dce1cf6046d410a)) -- **downloader:** flutter downloader exception on desktop platform and too much width of TrackTile index no. ([d668760](https://github.com/KRTirtho/spotube/commit/d6687603d148ad936530cca4d09e128a59b79b19)) -- dropped flutter_downloader deps due to slow download speed and UserDownloads not showing for anonymous ([307a8e2](https://github.com/KRTirtho/spotube/commit/307a8e21df1e39123a1dca4c1b063eab50359581)) -- flutter_downloader manifest configuration breaking android support ([f3a0f78](https://github.com/KRTirtho/spotube/commit/f3a0f78fb92ff7ee38b5a9ef9954575d4282f954)) -- login screen not using safearea and no dialog bg-color found on light mode in AdaptivePopupMenuButton ([92bc611](https://github.com/KRTirtho/spotube/commit/92bc611c5e901dcabf34086be9287ac20317259a)) -- **performance:** always running marquee text causes high GPU usage [#175](https://github.com/KRTirtho/spotube/issues/175) and UserArtist overflow on smaller displays ([a23ce61](https://github.com/KRTirtho/spotube/commit/a23ce614467b4297f495b824f0958ff07c21ae92)) -- **playback:** shuffle button sometimes gets stuck and stops working [#183](https://github.com/KRTirtho/spotube/issues/183) ([4240433](https://github.com/KRTirtho/spotube/commit/4240433e3dde6ab948d2674e07e41c27c1f6eac8)) -- **player-overlay:** flickering when a track is changed or navigated to another page ([e48b67c](https://github.com/KRTirtho/spotube/commit/e48b67cd47ae54ad9268aead268e444836a67b0d)) -- **sidebar:** user image url ([747efc6](https://github.com/KRTirtho/spotube/commit/747efc6ee66bc6c7c917cc02bd134968a0781701)) -- **synced-lyrics:** active lyrics contrast ratio ([aba1ba9](https://github.com/KRTirtho/spotube/commit/aba1ba932592923720a36395c057f78820dafecf)) -- tabbar overflow in small screen, artist card too small title and synced lyrics contrast increased ([585de8c](https://github.com/KRTirtho/spotube/commit/585de8c1def9750826568317109b242a5e18f28c)) +- **downloader:** downloaded track is corrupted for + tagging ([2ab1fba](https://github.com/KRTirtho/spotube/commit/2ab1fba3d64147e3c5cf34756dce1cf6046d410a)) +- **downloader:** flutter downloader exception on desktop platform and too much width of TrackTile index + no. ([d668760](https://github.com/KRTirtho/spotube/commit/d6687603d148ad936530cca4d09e128a59b79b19)) +- dropped flutter_downloader deps due to slow download speed and UserDownloads not showing for + anonymous ([307a8e2](https://github.com/KRTirtho/spotube/commit/307a8e21df1e39123a1dca4c1b063eab50359581)) +- flutter_downloader manifest configuration breaking android + support ([f3a0f78](https://github.com/KRTirtho/spotube/commit/f3a0f78fb92ff7ee38b5a9ef9954575d4282f954)) +- login screen not using safearea and no dialog bg-color found on light mode in + AdaptivePopupMenuButton ([92bc611](https://github.com/KRTirtho/spotube/commit/92bc611c5e901dcabf34086be9287ac20317259a)) +- **performance:** always running marquee text causes high GPU + usage [#175](https://github.com/KRTirtho/spotube/issues/175) and UserArtist overflow on smaller + displays ([a23ce61](https://github.com/KRTirtho/spotube/commit/a23ce614467b4297f495b824f0958ff07c21ae92)) +- **playback:** shuffle button sometimes gets stuck and stops + working [#183](https://github.com/KRTirtho/spotube/issues/183) ([4240433](https://github.com/KRTirtho/spotube/commit/4240433e3dde6ab948d2674e07e41c27c1f6eac8)) +- **player-overlay:** flickering when a track is changed or navigated to another + page ([e48b67c](https://github.com/KRTirtho/spotube/commit/e48b67cd47ae54ad9268aead268e444836a67b0d)) +- **sidebar:** user image + url ([747efc6](https://github.com/KRTirtho/spotube/commit/747efc6ee66bc6c7c917cc02bd134968a0781701)) +- **synced-lyrics:** active lyrics contrast + ratio ([aba1ba9](https://github.com/KRTirtho/spotube/commit/aba1ba932592923720a36395c057f78820dafecf)) +- tabbar overflow in small screen, artist card too small title and synced lyrics contrast + increased ([585de8c](https://github.com/KRTirtho/spotube/commit/585de8c1def9750826568317109b242a5e18f28c)) # v2.3.0 ### New -- Playback Cache Support. So unfinished playlist and tracks remains cached & starts automatically when application is launched again +- Playback Cache Support. So unfinished playlist and tracks remains cached & starts automatically when application is + launched again - Login Screen guided tutorial about how to obtain Client ID & Client Secret - Signed Android Application so now longer need to uninstall the old version for installing the new one - OS Media controls for Linux. Keyboard media keys now work in Linux -- New better, consistent & predictable Audio engine with proper event firing support (https://github.com/KRTirtho/spotube/pull/131) +- New better, consistent & predictable Audio engine with proper event firing + support (https://github.com/KRTirtho/spotube/pull/131) - Custom Lyrics delay time. Can be used to delay negative amount of time too -- Playback Queue View support. Currently playing tracks or playlist can be viewed or changed from it or for doing other actions too (https://github.com/KRTirtho/spotube/issues/126) +- Playback Queue View support. Currently playing tracks or playlist can be viewed or changed from it or for doing other + actions too (https://github.com/KRTirtho/spotube/issues/126) - Android SeekBar support in Notification Panel & Lock Screen - New Blur background design adapted to multiple components including Floating Player, Player View & Lyrics Tab -- New HighContrast Color Scheme addition which reduces battery consumption on OLED or AMOLED display devices (https://github.com/KRTirtho/spotube/issues/137) +- New HighContrast Color Scheme addition which reduces battery consumption on OLED or AMOLED display + devices (https://github.com/KRTirtho/spotube/issues/137) ### Improved - Loading screens & animations. Now uses Skeleton Loading - Playlist & Album Pages now show Album Art & extra metadata as Header with vibrant gradient background in a Sliver -- Playback is now more consistent & the API is simpler. Also its the single source of truth for AudioPlayback instead of the AudioServiceHandler +- Playback is now more consistent & the API is simpler. Also its the single source of truth for AudioPlayback instead of + the AudioServiceHandler - Android Statusbar background color is now adaptive & less glitchy - Home Genre playlists can be scrolled horizontally by dragging with mouse even in Desktop edition -- Track match Cache support for previously played tracks. This dramatically reduces track change latency & load on the YouTube search engine too +- Track match Cache support for previously played tracks. This dramatically reduces track change latency & load on the + YouTube search engine too ### Bug Fixes @@ -901,7 +1413,8 @@ - Genius lyrics matching algorithm - Download track. Checks if already exists & replaces on user command - Wide screen responsiveness & adaptation -- Bigger Title display (replaced word-break with Marquee Text for better visibility) (https://github.com/KRTirtho/spotube/pull/47) +- Bigger Title display (replaced word-break with Marquee Text for better + visibility) (https://github.com/KRTirtho/spotube/pull/47) ### Bug fixes @@ -966,7 +1479,8 @@ ### New - MacOS support https://github.com/KRTirtho/spotube/pull/7 -- Download currently playing track to `/home//Downloads/Spotube` (Linux, MacOS) or `C:\Users\\Downloads\Spotube` (Windows) +- Download currently playing track to `/home//Downloads/Spotube` (Linux, MacOS) or + `C:\Users\\Downloads\Spotube` (Windows) - Play playlist from any song (index) instead of only the first track - AlbumCard for showing album's metadata - AlbumView aka show album tracks @@ -1054,7 +1568,8 @@ ### Bug Fixes -- `access_token not found` Error after OAuth Login with Spotify credentials (used to need a restart of the app to load the access_token) +- `access_token not found` Error after OAuth Login with Spotify credentials (used to need a restart of the app to load + the access_token) - Volume level wasn't cached even after changing volume # v0.0.1 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f5ec58f7..497e50d5 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,4 +1,4 @@ -# Code of Conduct - Spotube +# Code of Conduct - SpoTube ## Our Pledge @@ -18,20 +18,20 @@ community include: * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, -and learning from the experience + and learning from the experience * Focusing on what is best not just for us as individuals, but for the -overall community + overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or -advances + advances * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email -address, without their explicit permission + address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a -professional setting + professional setting ## Our Responsibilities diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index d4746a1a..cd58478c 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -1,31 +1,40 @@ # Contributing to Spotube -First off, thanks for taking the time to contribute! ❤️ +First off, thanks for taking the time to contribute! -All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉 +All types of contributions are encouraged and valued. +See the [Table of Contents](#table-of-contents) for different ways +to help and details about how this project handles them. +Please make sure to read the relevant section before making +your contribution. +It will make it a lot easier for us maintainers and smooth out the experience for all involved. +The +community looks forward to your contributions. -> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about: +> And if you like the project, but just don't have time to contribute, that's fine. +> There are other easy ways to support +> the project and show your appreciation, which we would also be thrilled about: > > - Star the project > - Tweet about it -> - Refer this project in your project's readme +> - Refer this project to your project's readme > - Mention the project at local meetups and tell your friends/colleagues ## Table of Contents - [Contributing to Spotube](#contributing-to-spotube) - - [Table of Contents](#table-of-contents) - - [Code of Conduct](#code-of-conduct) - - [I Have a Question](#i-have-a-question) - - [I Want To Contribute](#i-want-to-contribute) - - [Reporting Bugs](#reporting-bugs) - - [Before Submitting a Bug Report](#before-submitting-a-bug-report) - - [How Do I Submit a Good Bug Report?](#how-do-i-submit-a-good-bug-report) - - [Suggesting Enhancements](#suggesting-enhancements) - - [Before Submitting an Enhancement](#before-submitting-an-enhancement) - - [How Do I Submit a Good Enhancement Suggestion?](#how-do-i-submit-a-good-enhancement-suggestion) - - [Your First Code Contribution](#your-first-code-contribution) - - [Submit Translations](#submit-translations) + - [Table of Contents](#table-of-contents) + - [Code of Conduct](#code-of-conduct) + - [I Have a Question](#i-have-a-question) + - [I Want To Contribute](#i-want-to-contribute) + - [Reporting Bugs](#reporting-bugs) + - [Before Submitting a Bug Report](#before-submitting-a-bug-report) + - [How Do I Submit a Good Bug Report?](#how-do-i-submit-a-good-bug-report) + - [Suggesting Enhancements](#suggesting-enhancements) + - [Before Submitting an Enhancement](#before-submitting-an-enhancement) + - [How Do I Submit a Good Enhancement Suggestion?](#how-do-i-submit-a-good-enhancement-suggestion) + - [Your First Code Contribution](#your-first-code-contribution) + - [Submit Translations](#submit-translations) ## Code of Conduct @@ -36,13 +45,18 @@ to krtirtho@gmail.com. ## I Have a Question -> If you want to ask a question, we assume that you have read the available [Documentation](https://github.com/KRTirtho/spotube#readme). +> If you want to ask a question, we assume that you have read the +> available [Documentation](https://github.com/KRTirtho/spotube#readme). -Before you ask a question, it is best to search for existing [Issues](https://github.com/KRTirtho/spotube/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first. +Before you ask a question, it is best to search for existing [Issues](https://github.com/KRTirtho/spotube/issues) that +might help you. +In case you have found a suitable issue and still need clarification, you can write your question in +this issue. +It is also advisable to search the internet for answers first. If you then still feel the need to ask a question and need clarification, we recommend the following: -- Open an [Discussion](https://github.com/KRTirtho/spotube/discussions/new) with the question label. +- Open a [Discussion](https://github.com/KRTirtho/spotube/discussions/new) with the question label. - Provide as much context as you can about what you're running into. - Provide project and platform versions (flutter, dart, pub, linux etc..), depending on what seems relevant. @@ -52,18 +66,28 @@ We will then take care of the issue as soon as possible. > ### Legal Notice > -> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license. +> When contributing to this project, you must agree that you have authored 100% of the content, that you have the +> necessary rights to the content and that the content you contribute may be provided under the project license. ### Reporting Bugs #### Before Submitting a Bug Report -A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible. +A good bug report shouldn't leave others needing to chase you up for more information. +Therefore, we ask you to +investigate carefully, collect information and describe the issue in detail in your report. +Please complete the +following steps in advance to help us fix any potential bug as fast as possible. - Make sure that you are using the latest version. -- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](https://github.com/KRTirtho/spotube#readme). If you are looking for support, you might want to check [this section](#i-have-a-question)). -- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/KRTirtho/spotubeissues?q=label%3Abug). -- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue. +- Determine if your bug is really a bug and not an error on your side, e.g., using incompatible environment + components/versions (Make sure that you have read the [documentation](https://github.com/KRTirtho/spotube#readme). If + you are looking for support, you might want to check [this section](#i-have-a-question)). +- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there + is not already a bug report existing for your bug or error in + the [bug tracker](https://github.com/KRTirtho/spotubeissues?q=label%3Abug). +- Also make sure to search the internet (including Stack Overflow) to see if users outside the GitHub community have + discussed the issue. - Collect information about the bug: - Stack trace (Traceback) - OS, Platform and Version (Windows, Linux, macOS, x86, ARM) @@ -73,33 +97,57 @@ A good bug report shouldn't leave others needing to chase you up for more inform #### How Do I Submit a Good Bug Report? -> You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to +> You must never report security related issues, vulnerabilities or bugs, including sensitive information to the issue +> tracker, or elsewhere in public. +> Instead, sensitive bugs must be sent by email to We use GitHub issues to track bugs and errors. If you run into an issue with the project: -- Open an [Issue](https://github.com/KRTirtho/spotube/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.) -- Explain the behavior you would expect and the actual behavior. -- Please provide as much context as possible and describe the _reproduction steps_ that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case. -- Provide the information you collected in the previous section. + +
  • Open an Issue. +(Since we can't be sure at this point whether it is a +bug or not, we ask you not to talk about a bug yet and not to label the issue.)

  • +
  • Explain the behavior you would expect and the actual behavior.

  • +
  • Please provide as much context as possible and describe the reproduction steps that someone else can follow to +recreate the issue on their own. +This usually includes your code. +For good bug reports, you should isolate the problem +and create a reduced test case.

  • +
  • Provide the information you collected in the previous section.

  • +
    Once it's filed: - The project team will label the issue accordingly. -- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced. -- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be [implemented by someone](#your-first-code-contribution). +- A team member will try to reproduce the issue with your provided steps. + If there are no reproduction steps or no + obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. + Bugs + with the `needs-repro` tag will not be addressed until they are reproduced. +- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as + `critical`), and the issue will be left to be [implemented by someone](#your-first-code-contribution). ### Suggesting Enhancements -This section guides you through submitting an enhancement suggestion for Spotube, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions. +This section guides you through submitting an enhancement suggestion for Spotube, **including completely new features +and minor improvements to existing functionality**. +Following these guidelines will help maintainers and the community +to understand your suggestion and find related suggestions. #### Before Submitting an Enhancement -- Make sure that you are using the latest version. -- Read the [documentation](https://github.com/KRTirtho/spotube#readme) carefully and find out if the functionality is already covered, maybe by an individual configuration. -- Perform a [search](https://github.com/KRTirtho/spotube/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. -- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset + +
  • Make sure that you are using the latest version.

  • +
  • Read the documentation carefully and find out if the functionality is +already covered, maybe by an individual configuration.

  • +
  • Perform a search to see if the enhancement has already been suggested. +If it has, add a comment to the existing issue instead of opening a new one.

  • +
  • Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to +convince the project's developers of the merits of this feature. Keep in mind that we want features that will be +useful to the majority of our users and not just a small subset

  • +
    @@ -109,9 +157,19 @@ Enhancement suggestions are tracked as [GitHub issues](https://github.com/KRTirt - Use a **clear and descriptive title** for the issue to identify the suggestion. - Provide a **step-by-step description of the suggested enhancement** in as many details as possible. -- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you. -- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. -- **Explain why this enhancement would be useful** to most Spotube users. You may also want to point out the other projects that solved it better and which could serve as inspiration. +- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. + At this point, + you can also tell which alternatives do not work for you. +- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part + which the suggestion is related to. + You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS + and Windows, and [this tool](https://github.com/colinkeenan/silentcast) + or [this tool](https://github.com/GNOME/byzanz) on + Linux. + +- **Explain why this enhancement would be useful** to most Spotube users. + You may also want to point out the other + projects that solved it better and which could serve as inspiration. ### Your First Code Contribution @@ -121,46 +179,52 @@ Do the following: - Download the latest Flutter SDK (>=3.16.0) & enable desktop support - Install Development dependencies in linux - - Debian (>=12/Bookworm)/Ubuntu - ```bash - $ apt-get install mpv libmpv-dev libappindicator3-1 gir1.2-appindicator3-0.1 libappindicator3-dev libsecret-1-0 libjsoncpp25 libsecret-1-dev libjsoncpp-dev libnotify-bin libnotify-dev avahi-daemon avahi-discover avahi-utils libnss-mdns mdns-scan libwebkit2gtk-4.1-0 libwebkit2gtk-4.1-dev libsoup-3.0-0 libsoup-3.0-dev - ``` - - Use `libjsoncpp1` instead of `libjsoncpp25` (for Ubuntu < 22.04) - - Arch/Manjaro - ```bash - yay -S mpv libappindicator-gtk3 libsecret jsoncpp libnotify avahi nss-mdns mdns-scan webkit2gtk-4.1 libsoup3 - ``` - - Fedora - ```bash - dnf install mpv mpv-devel libappindicator-gtk3 libappindicator-gtk3-devel libsecret libsecret-devel jsoncpp jsoncpp-devel libnotify libnotify-devel avahi mdns-scan nss-mdns webkit2gtk4.1 webkit2gtk4.1-devel libsoup3 libsoup3-devel - ``` + - Debian (>=12/Bookworm)/Ubuntu + ```bash + $ apt-get install mpv libmpv-dev libappindicator3-1 gir1.2-appindicator3-0.1 libappindicator3-dev libsecret-1-0 libjsoncpp25 libsecret-1-dev libjsoncpp-dev libnotify-bin libnotify-dev avahi-daemon avahi-discover avahi-utils libnss-mdns mdns-scan libwebkit2gtk-4.1-0 libwebkit2gtk-4.1-dev libsoup-3.0-0 libsoup-3.0-dev + ``` + - Use `libjsoncpp1` instead of `libjsoncpp25` (for Ubuntu < 22.04) + - Arch/Manjaro + ```bash + yay -S mpv libappindicator-gtk3 libsecret jsoncpp libnotify avahi nss-mdns mdns-scan webkit2gtk-4.1 libsoup3 + ``` + - Fedora + ```bash + dnf install mpv mpv-devel libappindicator-gtk3 libappindicator-gtk3-devel libsecret libsecret-devel jsoncpp jsoncpp-devel libnotify libnotify-devel avahi mdns-scan nss-mdns webkit2gtk4.1 webkit2gtk4.1-devel libsoup3 libsoup3-devel + ``` - Clone the Repo - Create a `.env` in root of the project following the `.env.example` template - Now run the following to bootstrap the project ```bash - flutter pub get && dart run build_runner build --delete-conflicting-outputs --enable-experiment=records,patterns + flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs --enable-experiment=records,patterns ``` -- Finally run these following commands in the root of the project to start the Spotube Locally +- Finally, run these following commands in the root of the project to start the Spotube Locally ```bash - flutter run -d )> + flutter run # -d [device] ``` -Do debugging/testing/build etc then submit to us with PR against the development branch (dev) & we'll review your code - +Do `debugging/testing/build` etc. then submit to us with PR against the `dev` branch, and we'll review your code ### Submit Translations -Make sure you're familiar with [Flutter localization](https://docs.flutter.dev/ui/accessibility-and-localization/internationalization). Then, you can start translating the app by following these steps: +Make sure you're familiar +with [Flutter localization](https://docs.flutter.dev/ui/accessibility-and-localization/internationalization). +Then, you +can start translating the app by following these steps: - Do all the steps in [Your First Code Contribution](#your-first-code-contribution) -- Make sure application starts in debug mode -- Now, in `lib/l10n/app_<2-letter code of your language>.arb` (create if not exists) add necessary translations +- Make sure the application starts in debug mode +- Now, in `lib/l10n/app_<2-letter code of your language>.arb` (create if not exists) add the necessary translations > (You can follow the `lib/l10n/app_en.arb` for reference) -- If you're adding missing translations, you can check the `/untranslated_messages.json` file to see which messages are missing in your native locale -- If you added entirely new translations: - - Add `const Locale('<2-letter language code>', '<2-letter ISO country code>')` in `lib/l10n/l10n.dart`'s `static final all = [...]` variable - - Uncomment the Map entry of your locale from `lib/collections/language_codes.dart`'s `static final Map isoLangs = {` variable -- Now restart (hot restart if running already) the app in debug mode & go to "Settings" > "Language" & see if your locale shows up -- If it does, select it & see if the app is translated properly -- Now git commit the changes & push +- If you're adding missing translations, you can check the `/untranslated_messages.json` file to see which messages are + missing in your native locale +- If you add entirely new translations: + - Add `const Locale('<2-letter language code>', '<2-letter ISO country code>')` in `lib/l10n/l10n.dart`'s + `static final all = [...]` variable + - Uncomment the Map entry of your locale from `lib/collections/language_codes.dart`'s + `static final Map isoLangs = {` variable +- Now restart (hot restart if running already) the app in debug mode & go to "Settings" > "Language" & see if your + locale shows up +- If it does, select it and see if the app is translated properly +- Now git commit changes and push - Finally, submit a PR against the development branch (dev) & we'll review your code diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md index 274abdc8..e945fe5e 100644 --- a/PRIVACY_POLICY.md +++ b/PRIVACY_POLICY.md @@ -1,59 +1,80 @@ **Privacy Policy** -Kingkor Roy Tirtho built the Spotube app as an Open Source app. This SERVICE is provided by Kingkor Roy Tirtho at no cost and is intended for use as is. +Kingkor Roy Tirtho built the Spotube app as an Open Source app. This SERVICE is provided by Kingkor Roy Tirtho at no +cost and is intended for use as is. -This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service. +This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal +Information if anyone decided to use my Service. -If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy. +If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The +Personal Information that I collect is used for providing and improving the Service. I will not use or share your +information with anyone except as described in this Privacy Policy. -The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which are accessible at Spotube unless otherwise defined in this Privacy Policy. +The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which are accessible at +Spotube unless otherwise defined in this Privacy Policy. **Information Collection and Use** -For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information. The information that I request will be retained on your device and is not collected by me in any way. +For a better experience, while using our Service, I may require you to provide us with certain personally identifiable +information. The information that I request will be retained on your device and is not collected by me in any way. The app does use third-party services that may collect information used to identify you. Link to the privacy policy of third-party service providers used by the app -* [Google Play Services](https://www.google.com/policies/privacy/) +* [Google Play Services](https://www.google.com/policies/privacy/) **Log Data** -Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics. But none of this info leaves your device. It's stored in a log-file on your device only accessible to you. +Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system +version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other +statistics. But none of this info leaves your device. It's stored in a log-file on your device only accessible to you. **Cookies** -Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory. +Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to +your browser from the websites that you visit and are stored on your device's internal memory. -This Service does not use these “cookies” explicitly. How ever the some services may use cookies for their cause (e.g. improvement) but you can deny them once asked +This Service does not use these “cookies” explicitly. How ever the some services may use cookies for their cause (e.g. +improvement) but you can deny them once asked **Service Providers** I may employ third-party companies and individuals due to the following reasons: -* To facilitate our Service; -* To provide the Service on our behalf; -* To perform Service-related services; or -* To assist us in analyzing how our Service is used. +* To facilitate our Service; +* To provide the Service on our behalf; +* To perform Service-related services; or +* To assist us in analyzing how our Service is used. -I want to inform users of this Service that these third parties have access to their Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose. +I want to inform users of this Service that these third parties have access to their Personal Information. The reason is +to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information +for any other purpose. **Security** -I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security. +I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means +of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% +secure and reliable, and I cannot guarantee its absolute security. **Links to Other Sites** -This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services. +This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. +Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of +these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of +any third-party sites or services. **Children’s Privacy** -These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13 years of age. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do the necessary actions. +These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information +from children under 13 years of age. In the case I discover that a child under 13 has provided me with personal +information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your +child has provided us with personal information, please contact me so that I will be able to do the necessary actions. **Changes to This Privacy Policy** -I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. +I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any +changes. I will notify you of any changes by posting the new Privacy Policy on this page. This policy is effective as of 2022-04-01 diff --git a/README.md b/README.md index b2c388e4..07c9e8d4 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@
    - Spotube Logo + Spotube Logo An open source, cross-platform Spotify client compatible across multiple platforms
    -utilizing Spotify's data API and YouTube, Piped.video or JioSaavn as an audio source,
    +utilizing Spotify's data API and YouTube, piped.video or JioSaavn as an audio source,
    eliminating the need for Spotify Premium -Btw it's not just another Electron app 😉 +Btw it's not just another Electron app Visit the website Discord Server @@ -19,33 +19,35 @@ Btw it's not just another Electron app 😉 --- -![Spotube Desktop](assets/spotube-screenshot.png) +[//]: # (![SpoTube Desktop]()) -![Spotube Mobile](assets/mobile-screenshots/combined.png) +[//]: # (![SpoTube Mobile](assets/mobile-screenshots/combined.png))
    -## 🌃 Features +## Features -- 🚫 No ads, thanks to the use of public & free Spotify and YT Music APIs¹ -- ⬇️ Freely downloadable tracks -- 🖥️ 📱 Cross-platform support -- 🪶 Small size & less data usage -- 🕵️ Anonymous/guest login -- 🕒 Time synced lyrics -- ✋ No telemetry, diagnostics or user data collection -- 🚀 Native performance -- 📖 Open source/libre software -- 🔉 Playback control is done locally, not on the server +- No ads, thanks to the use of public & free Spotify and YT Music APIs¹ +- Freely downloadable tracks +- Cross-platform support +- Small size & fewer data usage +- Anonymous/guest login +- Time synced lyrics +- No telemetry, diagnostics or user data collection +- Native performance +- Open source/libre software +- Playback control is done locally, not on the server -**¹** It is still **recommended** to support creators by engaging with their YouTube channels/Spotify tracks (or preferably by buying their merch/concert tickets/physical media). +**¹** It is still **recommended** to support creators by engaging with their YouTube channels/Spotify tracks (or +preferably by buying their merch/concert tickets/physical media). -### ❌ Unsupported features +### Unsupported features -- 🗣️ **Spotify Shows & Podcasts:** Shows and Podcasts will **never be supported** because the audio tracks are _only_ available on Spotify and accessing them would require Spotify Premium. -- 🎧 **Spotify Listen Along:** [Coming soon!](https://github.com/KRTirtho/spotube/issues/8) +- **Spotify Shows & Podcasts:** Shows and Podcasts will **never be supported** because the audio tracks + are _only_ available on Spotify and accessing them would require Spotify Premium. +- **Spotify Listen Along:** [Coming soon!](https://github.com/KRTirtho/spotube/issues/8) -## 📜 ⬇️ Installation guide +## Installation guide New versions usually release every 3-4 months.
    This handy table lists all the methods you can use to install Spotube: @@ -176,17 +178,18 @@ brew install --cask spotube -### 🔄 Nightly Builds +### Nightly Builds -Grab the latest nightly builds of Spotube [from the GitHub Releases](https://github.com/KRTirtho/spotube/releases/tag/nightly). +Grab the latest nightly builds of +Spotube [from the GitHub Releases](https://github.com/KRTirtho/spotube/releases/tag/nightly). -## 🕳️ Building from source +## Building from source GitHub Workflow Status -You can compile Spotube's source code by [following these instructions](CONTRIBUTION.md#your-first-code-contribution). +You can compile SpoTube's source code by [following these instructions](CONTRIBUTION.md#your-first-code-contribution). -## 👥 The Spotube team +## The Spotube team - [Kingkor Roy Tirtho](https://github.com/KRTirtho) - The Founder, Maintainer and Lead Developer - [RaptaG](https://github.com/RaptaG) - The GitHub Moderator and Community Manager @@ -195,159 +198,292 @@ You can compile Spotube's source code by [following these instructions](CONTRIBU - [Piotr Rogowski](https://github.com/karniv00l) - The MacOS Developer - [Rusty Apple](https://github.com/RustyApple) - The Mysterious Unknown Guy -## 💼 License +## License Spotube is open source and licensed under the [BSD-4-Clause](/LICENSE) License. -If you are concerned, you can [read the reason of choosing this license](https://dev.to/krtirtho/choosing-open-source-license-wisely-1m3p). +If you are concerned, you +can [read the reason of choosing this license](https://dev.to/krtirtho/choosing-open-source-license-wisely-1m3p).
    -

    [Click to show] 🙏 Services/Package/Plugin Credits

    +

    [Click to show]

    +## Services/Package/Plugin Credits + ### Services -1. [Flutter](https://flutter.dev) - Flutter transforms the app development process. Build, test, and deploy beautiful mobile, web, desktop, and embedded apps from a single codebase -1. [MPV](https://mpv.io) - mpv is a free (as in freedom) media player for the command line. It supports a wide variety of media file formats, audio and video codecs, and subtitle types. -1. [Spotify API](https://developer.spotify.com/documentation/web-api) - The Spotify Web API is a RESTful API that provides access to Spotify data -1. [Piped](https://piped-docs.kavin.rocks/) - Piped is a privacy friendly alternative YouTube frontend, which is efficient and scalable by design. -1. [Invidious](https://invidious.io/) - Invidious is an open source alternative front-end to YouTube. -1. [YouTube](https://youtube.com/) - YouTube is an American online video-sharing platform headquartered in San Bruno, California. Three former PayPal employees—Chad Hurley, Steve Chen, and Jawed Karim—created the service in February 2005 - 1. [yt-dlp](https://github.com/yt-dlp/yt-dlp) - A feature-rich command-line audio/video downloader - 1. [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) - NewPipe's core library for extracting data from streaming sites -1. [JioSaavn](https://www.jiosaavn.com) - JioSaavn is an Indian online music streaming service and a digital distributor of Bollywood, English and other regional Indian music across the world. Since it was founded in 2007 as Saavn, the company has acquired rights to over 5 crore (50 million) music tracks in 15 languages -1. [SongLink](https://song.link) - SongLink is a free smart link service that helps you share music with your audience. It's a one-stop-shop for creating smart links for music, podcasts, and other audio content -1. [LRCLib](https://lrclib.net/) - A public synced lyric API -1. [Linux](https://www.linux.org) - Linux is a family of open-source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically packaged in a Linux distribution -1. [AUR](https://aur.archlinux.org) - AUR stands for Arch User Repository. It is a community-driven repository for Arch-based Linux distributions users -1. [Flatpak](https://flatpak.org) - Flatpak is a utility for software deployment and package management for Linux -1. [SponsorBlock](https://sponsor.ajay.app) - SponsorBlock is an open-source crowdsourced browser extension and open API for skipping sponsor segments in YouTube videos. -1. [Inno Setup](https://jrsoftware.org/isinfo.php) - Inno Setup is a free installer for Windows programs by Jordan Russell and Martijn Laan -1. [F-Droid](https://f-droid.org) - F-Droid is an installable catalogue of FOSS (Free and Open Source Software) applications for the Android platform. The client makes it easy to browse, install, and keep track of updates on your device -1. [LastFM](https://last.fm) - Last.fm is a music streaming and discovery platform that helps users discover and share new music. It tracks users' music listening habits across many devices and platforms. +1. [Flutter](https://flutter.dev) - Flutter transforms the app development process. Build, test, and deploy beautiful + mobile, web, desktop, and embedded apps from a single codebase +2. [MPV](https://mpv.io) - mpv is a free (as in freedom) media player for the command line. It supports a wide variety + of media file formats, audio and video codecs, and subtitle types. +3. [Spotify API](https://developer.spotify.com/documentation/web-api) - The Spotify Web API is a REST API that + provides access to Spotify data +4. [Piped](https://piped-docs.kavin.rocks/) - Piped is a privacy-friendly alternative YouTube frontend, which is + efficient and scalable by design. +5. [Invidious](https://invidious.io/) - Invidious is an open source alternative front-end to YouTube. +6. [YouTube](https://youtube.com/) - YouTube is an American online video-sharing platform headquartered in San Bruno, + California. Three former PayPal employees—Chad Hurley, Steve Chen, and Jawed Karim—created the service in February + 2005 + 1. [yt-dlp](https://github.com/yt-dlp/yt-dlp) - A feature-rich command-line audio/video downloader + 1. [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) - NewPipe's core library for extracting data + from streaming sites +7. [JioSaavn](https://www.jiosaavn.com) - JioSaavn is an Indian online music streaming service and a digital distributor + of Bollywood, English and other regional Indian music across the world. Since it was founded in 2007 as Saavn, the + company has acquired rights to over 5 corer (50 million) music tracks in 15 languages +8. [SongLink](https://song.link) - SongLink is a free smart link service that helps you share music with your audience. + It's a one-stop-shop for creating smart links for music, podcasts, and other audio content +9. [LRCLib](https://lrclib.net/) - A public synced lyric API +10. [Linux](https://www.linux.org) - Linux is a family of open-source Unix-like operating systems based on the Linux + kernel, an operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically + packaged in a Linux distribution +11. [AUR](https://aur.archlinux.org) - AUR stands for Arch User Repository. It is a community-driven repository for + Arch-based Linux distributions users +12. [Flatpak](https://flatpak.org) - Flatpak is a utility for software deployment and package management for Linux +13. [SponsorBlock](https://sponsor.ajay.app) - SponsorBlock is an open-source crowd-sourced browser extension and open API + for skipping sponsor segments in YouTube videos. +14. [Inno Setup](https://jrsoftware.org/isinfo.php) - Inno Setup is a free installer for Windows programs by Jordan + Russell and Martijn Laan +15. [F-Droid](https://f-droid.org) - F-Droid is an installable catalogue of FOSS (Free and Open Source Software) + applications for the Android platform. The client makes it easy to browse, install, and keep track of updates on your + device +16. [LastFM](https://last.fm) - Last.fm is a music streaming and discovery platform that helps users discover and share + new music. It tracks users' music listening habits across many devices and platforms. ### Dependencies -1. [app_links](https://github.com/llfbandit/app_links) - Android App Links, Deep Links, iOs Universal Links and Custom URL schemes handler for Flutter (desktop included). -1. [args](https://pub.dev/packages/args) - Library for defining parsers for parsing raw command-line arguments into a set of options and values using GNU and POSIX style options. -1. [async](https://pub.dev/packages/async) - Utility functions and classes related to the 'dart:async' library. -1. [audio_service](https://pub.dev/packages/audio_service) - Flutter plugin to play audio in the background while the screen is off. -1. [audio_service_mpris](https://github.com/bdrazhzhov/audio-service-mpris) - audio_service platform interface supporting Media Player Remote Interfacing Specification. -1. [audio_session](https://github.com/ryanheise/audio_session) - Sets the iOS audio session category and Android audio attributes for your app, and manages your app's audio focus, mixing and ducking behaviour. -1. [auto_route](https://github.com/Milad-Akarie/auto_route_library) - AutoRoute is a declarative routing solution, where everything needed for navigation is automatically generated for you. -1. [auto_size_text](https://github.com/leisim/auto_size_text) - Flutter widget that automatically resizes text to fit perfectly within its bounds. -1. [bonsoir](https://bonsoir.skyost.eu) - A Zeroconf library that allows you to discover network services and to broadcast your own. Based on Apple Bonjour and Android NSD. -1. [cached_network_image](https://github.com/Baseflow/flutter_cached_network_image) - Flutter library to load and cache network images. Can also be used with placeholder and error widgets. -1. [connectivity_plus](https://github.com/fluttercommunity/plus_plugins) - Flutter plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS. -1. [device_info_plus](https://github.com/fluttercommunity/plus_plugins) - Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on. -1. [dio](https://github.com/cfug/dio) - A powerful HTTP networking package,supports Interceptors,Aborting and canceling a request,Custom adapters, Transformers, etc. -1. [drift](https://drift.simonbinder.eu/) - Drift is a reactive library to store relational data in Dart and Flutter applications. -1. [duration](https://github.com/desktop-dart/duration) - Utilities to make working with 'Duration's easier. Formats duration in human readable form and also parses duration in human readable form to Dart's Duration. -1. [encrypt](https://pub.dev/packages/encrypt) - A set of high-level APIs over PointyCastle for two-way cryptography. -1. [envied](https://github.com/petercinibulk/envied) - Explicitly reads environment variables into a dart file from a .env file for more security and faster start up times. -1. [file_picker](https://github.com/miguelpruivo/plugins_flutter_file_picker) - A package that allows you to use a native file explorer to pick single or multiple absolute file paths, with extension filtering support. -1. [file_selector](https://pub.dev/packages/file_selector) - Flutter plugin for opening and saving files, or selecting directories, using native file selection UI. -1. [fluentui_system_icons](https://github.com/microsoft/fluentui-system-icons/tree/main) - Fluent UI System Icons are a collection of familiar, friendly and modern icons from Microsoft. -1. [flutter_cache_manager](https://github.com/Baseflow/flutter_cache_manager/tree/develop/flutter_cache_manager) - Generic cache manager for flutter. Saves web files on the storages of the device and saves the cache info using sqflite. -1. [flutter_discord_rpc](https://pub.dev/packages/flutter_discord_rpc) - Discord RPC support for Flutter desktop platforms -1. [flutter_displaymode](https://github.com/ajinasokan/flutter_displaymode) - A Flutter plugin to set display mode (resolution, refresh rate) on Android platform. Allows to enable high refresh rate on supported devices. -1. [flutter_feather_icons](https://github.com/muj-programmer/flutter_feather_icons) - Feather is a collection of simply beautiful open source icons. Each icon is designed on a 24x24 grid with an emphasis on simplicity, consistency and usability. -1. [flutter_form_builder](https://github.com/flutter-form-builder-ecosystem) - This package helps in creation of forms in Flutter by removing the boilerplate code, reusing validation, react to changes, and collect final user input. -1. [flutter_hooks](https://github.com/rrousselGit/flutter_hooks) - A flutter implementation of React hooks. It adds a new kind of widget with enhanced code reuse. -1. [flutter_inappwebview](https://inappwebview.dev/) - A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window. -1. [flutter_native_splash](https://pub.dev/packages/flutter_native_splash) - Customize Flutter's default white native splash screen with background color and splash image. Supports dark mode, full screen, and more. -1. [flutter_riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze. -1. [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage) - Flutter Secure Storage provides API to store data in secure storage. Keychain is used in iOS, KeyStore based solution is used in Android. -1. [flutter_sharing_intent](https://github.com/bhagat-techind/flutter_sharing_intent.git) - A flutter plugin that allow flutter apps to receive photos, videos, text, urls or any other file types from another app. -1. [flutter_undraw](https://github.com/KRTirtho/flutter_undraw) - Undraw.co Illustrations for Flutter with customization options -1. [form_builder_validators](https://github.com/flutter-form-builder-ecosystem) - Form Builder Validators set of validators for FlutterFormBuilder. Provides common validators and a way to make your own. -1. [form_validator](https://github.com/TheMisir/form-validator) - Simplest form validation library for flutter's form field widgets -1. [freezed_annotation](https://pub.dev/packages/freezed_annotation) - Annotations for the freezed code-generator. This package does nothing without freezed too. -1. [fuzzywuzzy](https://github.com/sphericalkat/dart-fuzzywuzzy) - An implementation of the popular fuzzywuzzy package in Dart, to suit all your fuzzy string matching/searching needs! -1. [gap](https://github.com/letsar/gap) - Flutter widgets for easily adding gaps inside Flex widgets such as Columns and Rows or scrolling views. -1. [google_fonts](https://pub.dev/packages/google_fonts) - A Flutter package to use fonts from fonts.google.com. Supports HTTP fetching, caching, and asset bundling. -1. [home_widget](https://pub.dev/packages/home_widget) - A plugin to provide a common interface for creating HomeScreen Widgets for Android and iOS. -1. [hooks_riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze. -1. [html](https://pub.dev/packages/html) - APIs for parsing and manipulating HTML content outside the browser. -1. [html_unescape](https://github.com/filiph/html_unescape) - A small library for un-escaping HTML. Supports all Named Character References, Decimal Character References and Hexadecimal Character References. -1. [http](https://pub.dev/packages/http) - A composable, multi-platform, Future-based API for HTTP requests. -1. [image_picker](https://pub.dev/packages/image_picker) - Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. -1. [intl](https://pub.dev/packages/intl) - Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues. -1. [invidious](https://pub.dev/packages/invidious) - Invidious API client for Dart and Flutter. -1. [jiosaavn](https://github.com/KRTirtho/jiosaavn) - Unofficial API client for jiosaavn.com -1. [json_annotation](https://pub.dev/packages/json_annotation) - Classes and helper functions that support JSON code generation via the `json_serializable` package. -1. [local_notifier](https://github.com/leanflutter/local_notifier) - This plugin allows Flutter desktop apps to displaying local notifications. -1. [logger](https://pub.dev/packages/logger) - Small, easy to use and extensible logger which prints beautiful logs. -1. [logging](https://pub.dev/packages/logging) - Provides APIs for debugging and error logging, similar to loggers in other languages, such as the Closure JS Logger and java.util.logging.Logger. -1. [lrc](https://pub.dev/packages/lrc) - A Dart-only package that creates, parses, and handles LRC, which is a format that stores song lyrics. -1. [media_kit](https://github.com/media-kit/media-kit) - A cross-platform video player & audio player for Flutter & Dart. Performant, stable, feature-proof & modular. -1. [media_kit_libs_audio](https://github.com/media-kit/media-kit.git) - package:media_kit audio (only) playback native libraries for all platforms. -1. [metadata_god](https://pub.dev/packages/metadata_god) - Plugin for retrieving and writing audio tags/metadata from audio files -1. [mime](https://pub.dev/packages/mime) - Utilities for handling media (MIME) types, including determining a type from a file extension and file contents. -1. [open_file](https://pub.dev/packages/open_file) - A plug-in that can call native APP to open files with string result in flutter, support iOS(UTI) / android(intent) / PC(ffi) / web(dart:html) -1. [package_info_plus](https://github.com/fluttercommunity/plus_plugins) - Flutter plugin for querying information about the application package, such as CFBundleVersion on iOS or versionCode on Android. -1. [palette_generator](https://pub.dev/packages/palette_generator) - Flutter package for generating palette colors from a source image. -1. [path](https://pub.dev/packages/path) - A string-based path manipulation library. All of the path operations you know and love, with solid support for Windows, POSIX (Linux and Mac OS X), and the web. -1. [path_provider](https://pub.dev/packages/path_provider) - Flutter plugin for getting commonly used locations on host platform file systems, such as the temp and app data directories. -1. [permission_handler](https://pub.dev/packages/permission_handler) - Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions. -1. [piped_client](https://github.com/KRTirtho/piped_client) - API Client for piped.video -1. [riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze. -1. [scroll_to_index](https://github.com/quire-io/scroll-to-index) - Scroll to a specific child of any scrollable widget in Flutter -1. [shadcn_flutter](https://github.com/sunarya-thito/shadcn_flutter) - Beautifully designed components from Shadcn/UI is now available for Flutter -1. [shared_preferences](https://pub.dev/packages/shared_preferences) - Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android. -1. [shelf](https://pub.dev/packages/shelf) - A model for web server middleware that encourages composition and easy reuse. -1. [shelf_router](https://pub.dev/packages/shelf_router) - A convenient request router for the shelf web-framework, with support for URL-parameters, nested routers and routers generated from source annotations. -1. [shelf_web_socket](https://pub.dev/packages/shelf_web_socket) - A shelf handler that wires up a listener for every connection. -1. [simple_icons](https://teavelopment.com/) - The Simple Icon pack available as Flutter Icons. Provides over 1500 Free SVG icons for popular brands. -1. [skeletonizer](https://github.com/Milad-Akarie/skeletonizer) - Converts already built widgets into skeleton loaders with no extra effort. -1. [sliding_up_panel](https://github.com/akshathjain/sliding_up_panel) - A draggable Flutter widget that makes implementing a SlidingUpPanel much easier! -1. [sliver_tools](https://github.com/Kavantix) - A set of useful sliver tools that are missing from the flutter framework -1. [smtc_windows](https://pub.dev/packages/smtc_windows) - Windows `SystemMediaTransportControls` implementation for Flutter giving access to Windows OS Media Control applet. -1. [spotify](https://github.com/rinukkusu/spotify-dart) - An incomplete dart library for interfacing with the Spotify Web API. -1. [sqlite3](https://github.com/simolus3/sqlite3.dart/tree/main/sqlite3) - Provides lightweight yet convenient bindings to SQLite by using dart:ffi -1. [sqlite3_flutter_libs](https://github.com/simolus3/sqlite3.dart/tree/main/sqlite3_flutter_libs) - Flutter plugin to include native sqlite3 libraries with your app -1. [stroke_text](https://github.com/MohamedAbd0/stroke_text) - A Simple Flutter plugin for applying stroke (border) style to a text widget -1. [system_theme](https://github.com/bdlukaa/system_theme/tree/master/system_theme) - A plugin to get the current system theme info. Supports Android, Web, Windows, Linux and macOS -1. [test](https://pub.dev/packages/test) - A full featured library for writing and running Dart tests across platforms. -1. [timezone](https://pub.dev/packages/timezone) - Time zone database and time zone aware DateTime. -1. [titlebar_buttons](https://github.com/gtk-flutter/titlebar_buttons) - A package which provides most of the titlebar buttons from windows, linux and macos. -1. [tray_manager](https://github.com/leanflutter/tray_manager) - This plugin allows Flutter desktop apps to defines system tray. -1. [url_launcher](https://pub.dev/packages/url_launcher) - Flutter plugin for launching a URL. Supports web, phone, SMS, and email schemes. -1. [uuid](https://pub.dev/packages/uuid) - RFC4122 (v1, v4, v5, v6, v7, v8) UUID Generator and Parser for Dart -1. [version](https://github.com/dartninja/version) - Provides a simple class for parsing and comparing semantic versions as defined by http://semver.org/ -1. [very_good_infinite_list](https://github.com/VeryGoodOpenSource/very_good_infinite_list) - A library for easily displaying paginated data, created by Very Good Ventures. Great for activity feeds, news feeds, and more. -1. [visibility_detector](https://pub.dev/packages/visibility_detector) - A widget that detects the visibility of its child and notifies a callback. -1. [web_socket_channel](https://pub.dev/packages/web_socket_channel) - StreamChannel wrappers for WebSockets. Provides a cross-platform WebSocketChannel API, a cross-platform implementation of that API that communicates over an underlying StreamChannel. -1. [wikipedia_api](https://github.com/KRTirtho/wikipedia_api) - Wikipedia API for dart and flutter -1. [win32_registry](https://pub.dev/packages/win32_registry) - A package that provides a friendly Dart API for accessing the Windows Registry. -1. [window_manager](https://github.com/leanflutter/window_manager) - This plugin allows Flutter desktop apps to resizing and repositioning the window. -1. [youtube_explode_dart](https://github.com/Hexer10/youtube_explode_dart) - A port in dart of the youtube explode library. Supports several API functions without the need of Youtube API Key. -1. [http_parser](https://pub.dev/packages/http_parser) - A platform-independent package for parsing and serializing HTTP formats. -1. [collection](https://pub.dev/packages/collection) - Collections and utilities functions and classes related to collections. -1. [otp_util](https://github.com/dushiling) - otp_util is a dart package to generate and verify one-time passwords,it It provides two methods TOPT and HOTP.They are Time-based OTPs and Counter-based OTPs. -1. [dio_http2_adapter](https://github.com/cfug/dio) - An adapter that combines HTTP/2 and dio. Supports reusing connections, header compression, etc. -1. [build_runner](https://pub.dev/packages/build_runner) - A build system for Dart code generation and modular compilation. -1. [envied_generator](https://github.com/petercinibulk/envied) - Generator for the Envied package. See https://pub.dev/packages/envied. -1. [flutter_gen_runner](https://github.com/FlutterGen/flutter_gen) - The Flutter code generator for your assets, fonts, colors, … — Get rid of all String-based APIs. -1. [flutter_launcher_icons](https://github.com/fluttercommunity/flutter_launcher_icons) - A package which simplifies the task of updating your Flutter app's launcher icon. -1. [flutter_lints](https://pub.dev/packages/flutter_lints) - Recommended lints for Flutter apps, packages, and plugins to encourage good coding practices. -1. [json_serializable](https://pub.dev/packages/json_serializable) - Automatically generate code for converting to and from JSON by annotating Dart classes. -1. [freezed](https://pub.dev/packages/freezed) - Code generation for immutable classes that has a simple syntax/API without compromising on the features. -1. [process_run](https://github.com/tekartik/process_run.dart/blob/master/packages/process_run) - Process run helpers for Linux/Win/Mac and which like feature for finding executables. -1. [pubspec_parse](https://pub.dev/packages/pubspec_parse) - Simple package for parsing pubspec.yaml files with a type-safe API and rich error reporting. -1. [pub_api_client](https://github.com/leoafarias/pub_api_client) - An API Client for Pub to interact with public package information. -1. [xml](https://github.com/renggli/dart-xml) - A lightweight library for parsing, traversing, querying, transforming and building XML documents. -1. [io](https://pub.dev/packages/io) - Utilities for the Dart VM Runtime including support for ANSI colors, file copying, and standard exit code values. -1. [drift_dev](https://drift.simonbinder.eu/) - Dev-dependency for users of drift. Contains the generator and development tools. -1. [auto_route_generator](https://github.com/Milad-Akarie/auto_route_library) - AutoRoute is a declarative routing solution, where everything needed for navigation is automatically generated for you. -1. [desktop_webview_window](https://github.com/MixinNetwork/flutter-plugins/tree/main/packages/desktop_webview_window) - Show a webview window on your flutter desktop application. -1. [disable_battery_optimization](https://github.com/pvsvamsi/Disable-Battery-Optimizations) - Flutter plugin to check and disable battery optimizations. Also shows custom steps to disable the optimizations in devices like mi, xiaomi, samsung, oppo, huawei, oneplus etc -1. [draggable_scrollbar](https://github.com/fluttercommunity/flutter-draggable-scrollbar) - A scrollbar that can be dragged for quickly navigation through a vertical list. Additional option is showing label next to scrollthumb with information about current item. -1. [flutter_broadcasts](https://github.com/KRTirtho/flutter_broadcasts.git) - A plugin for sending and receiving broadcasts with Android intents and iOS notifications. -1. [scrobblenaut](https://github.com/Nebulino/Scrobblenaut) - A deadly simple LastFM API Wrapper for Dart. So deadly simple that it's gonna hit the mark. -1. [yt_dlp_dart](https://github.com/KRTirtho/yt_dlp_dart.git) - yt-dlp binding in Dart -1. [flutter_new_pipe_extractor](https://github.com/KRTirtho/flutter_new_pipe_extractor) - NewPipeExtractor binding for Flutter (Android only) +1. [app_links](https://github.com/llfbandit/app_links) - Android App Links, Deep Links, iOs Universal Links and Custom + URL schemes handler for Flutter (desktop included). +2. [args](https://pub.dev/packages/args) - Library for defining parsers for parsing raw command-line arguments into a + set of options and values using GNU and POSIX style options. +3. [async](https://pub.dev/packages/async) - Utility functions and classes related to the 'dart:async' library. +4. [audio_service](https://pub.dev/packages/audio_service) - Flutter plugin to play audio in the background while the + screen is off. +5. [audio_service_mpris](https://github.com/bdrazhzhov/audio-service-mpris) - audio_service platform interface + supporting Media Player Remote Interfacing Specification. +6. [audio_session](https://github.com/ryanheise/audio_session) - Sets the iOS audio session category and Android audio + attributes for your app, and manages your app's audio focus, mixing and ducking behaviour. +7. [auto_route](https://github.com/Milad-Akarie/auto_route_library) - AutoRoute is a declarative routing solution, where + everything needed for navigation is automatically generated for you. +8. [auto_size_text](https://github.com/leisim/auto_size_text) - Flutter widget that automatically resizes text to fit + perfectly within its bounds. +9. [bonsoir](https://bonsoir.skyost.eu) - A Zeroconf library that allows you to discover network services and to + broadcast your own. Based on Apple Bonjour and Android NSD. +10. [cached_network_image](https://github.com/Baseflow/flutter_cached_network_image) - Flutter library to load and cache + network images. Can also be used with placeholder and error widgets. +11. [connectivity_plus](https://github.com/fluttercommunity/plus_plugins) - Flutter plugin for discovering the state of + the network (Wi-Fi & mobile/cellular) connectivity on Android and iOS. +12. [device_info_plus](https://github.com/fluttercommunity/plus_plugins) - Flutter plugin providing detailed information + about the device (make, model, etc.), and Android or iOS version the app is running on. +13. [dio](https://github.com/cfug/dio) - A powerful HTTP networking package,supports Interceptors,Aborting and canceling + a request,Custom adapters, Transformers, etc. +14. [drift](https://drift.simonbinder.eu/) - Drift is a reactive library to store relational data in Dart and Flutter + applications. +15. [duration](https://github.com/desktop-dart/duration) - Utilities to make working with 'Duration's easier. Formats + duration in human-readable form and also parses duration in human-readable form to Dart's Duration. +16. [encrypt](https://pub.dev/packages/encrypt) - A set of high-level APIs over PointyCastle for two-way cryptography. +17. [envied](https://github.com/petercinibulk/envied) - Explicitly reads environment variables into a dart file from a + .env file for more security and faster start up times. +18. [file_picker](https://github.com/miguelpruivo/plugins_flutter_file_picker) - A package that allows you to use a + native file explorer to pick single or multiple absolute file paths, with extension filtering support. +19. [file_selector](https://pub.dev/packages/file_selector) - Flutter plugin for opening and saving files, or selecting + directories, using native file selection UI. +20. [fluentui_system_icons](https://github.com/microsoft/fluentui-system-icons/tree/main) - Fluent UI System Icons are a + collection of familiar, friendly and modern icons from Microsoft. +21. [flutter_cache_manager](https://github.com/Baseflow/flutter_cache_manager/tree/develop/flutter_cache_manager) - + Generic cache manager for flutter. Saves web files on the storages of the device and saves the cache info using + sqlite. +22. [flutter_discord_rpc](https://pub.dev/packages/flutter_discord_rpc) - Discord RPC support for Flutter desktop + platforms +23. [flutter_displaymode](https://github.com/ajinasokan/flutter_displaymode) - A Flutter plugin to set display mode ( + resolution, refresh rate) on Android platform. Allows to enable high refresh rate on supported devices. +24. [flutter_feather_icons](https://github.com/muj-programmer/flutter_feather_icons) - Feather is a collection of simply + beautiful open source icons. Each icon is designed on a 24x24 grid with an emphasis on simplicity, consistency and + usability. +25. [flutter_form_builder](https://github.com/flutter-form-builder-ecosystem) - This package helps in creation of forms + in Flutter by removing the boilerplate code, reusing validation, react to changes, and collect final user input. +26. [flutter_hooks](https://github.com/rrousselGit/flutter_hooks) - A flutter implementation of React hooks. It adds a + new kind of widget with enhanced code reuse. +27. [flutter_inappwebview](https://inappwebview.dev/) - A Flutter plugin that allows you to add an inline webview, to use + a headless webview, and to open an in-app browser window. +28. [flutter_native_splash](https://pub.dev/packages/flutter_native_splash) - Customize Flutter's default white native + splash screen with background color and splash image. Supports dark mode, full screen, and more. +29. [flutter_riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with + asynchronous code a breeze. +30. [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage) - Flutter Secure Storage provides API to + store data in secure storage. Keychain is used in iOS, KeyStore based solution is used in Android. +31. [flutter_sharing_intent](https://github.com/bhagat-techind/flutter_sharing_intent.git) - A flutter plugin that allow + flutter apps to receive photos, videos, text, urls or any other file types from another app. +32. [flutter_undraw](https://github.com/KRTirtho/flutter_undraw) - Undraw.co Illustrations for Flutter with customization + options +33. [form_builder_validators](https://github.com/flutter-form-builder-ecosystem) - Form Builder Validators set of + validators for FlutterFormBuilder. Provides common validators and a way to make your own. +34. [form_validator](https://github.com/TheMisir/form-validator) - Simplest form validation library for flutter's form + field widgets +35. [freezed_annotation](https://pub.dev/packages/freezed_annotation) - Annotations for the freezed code-generator. This + package does nothing without freezed too. +36. [fuzzywuzzy](https://github.com/sphericalkat/dart-fuzzywuzzy) - An implementation of the popular fuzzywuzzy package + in Dart, to suit all your fuzzy string matching/searching needs! +37. [gap](https://github.com/letsar/gap) - Flutter widgets for easily adding gaps inside Flex widgets such as Columns and + Rows or scrolling views. +38. [google_fonts](https://pub.dev/packages/google_fonts) - A Flutter package to use fonts from fonts.google.com. + Supports HTTP fetching, caching, and asset bundling. +39. [home_widget](https://pub.dev/packages/home_widget) - A plugin to provide a common interface for creating HomeScreen + Widgets for Android and iOS. +40. [hooks_riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with + asynchronous code a breeze. +41. [html](https://pub.dev/packages/html) - APIs for parsing and manipulating HTML content outside the browser. +42. [html_unescape](https://github.com/filiph/html_unescape) - A small library for un-escaping HTML. Supports all Named + Character References, Decimal Character References and Hexadecimal Character References. +43. [http](https://pub.dev/packages/http) - A composable, multi-platform, Future-based API for HTTP requests. +44. [image_picker](https://pub.dev/packages/image_picker) - Flutter plugin for selecting images from the Android and iOS + image library, and taking new pictures with the camera. +45. [intl](https://pub.dev/packages/intl) - Contains code to deal with internationalized/localized messages, date and + number formatting and parsing, bidirectional text, and other internationalization issues. +46. [invidious](https://pub.dev/packages/invidious) - Invidious API client for Dart and Flutter. +47. [jiosaavn](https://github.com/KRTirtho/jiosaavn) - Unofficial API client for jiosaavn.com +48. [json_annotation](https://pub.dev/packages/json_annotation) - Classes and helper functions that support JSON code + generation via the `json_serializable` package. +49. [local_notifier](https://github.com/leanflutter/local_notifier) - This plugin allows Flutter desktop apps to + displaying local notifications. +50. [logger](https://pub.dev/packages/logger) - Small, easy to use and extensible logger which prints beautiful logs. +51. [logging](https://pub.dev/packages/logging) - Provides APIs for debugging and error logging, similar to loggers in + other languages, such as the Closure JS Logger and java.util.logging.Logger. +52. [lrc](https://pub.dev/packages/lrc) - A Dart-only package that creates, parses, and handles LRC, which is a format + that stores song lyrics. +53. [media_kit](https://github.com/media-kit/media-kit) - A cross-platform video player & audio player for Flutter & + Dart. Performant, stable, feature-proof & modular. +54. [media_kit_libs_audio](https://github.com/media-kit/media-kit.git) - package:media_kit audio (only) playback native + libraries for all platforms. +55. [metadata_god](https://pub.dev/packages/metadata_god) - Plugin for retrieving and writing audio tags/metadata from + audio files +56. [mime](https://pub.dev/packages/mime) - Utilities for handling media (MIME) types, including determining a type from + a file extension and file contents. +57. [open_file](https://pub.dev/packages/open_file) - A plug-in that can call native APP to open files with string result + in flutter, support iOS(UTI) / android(intent) / PC(ffi) / web(dart:html) +58. [package_info_plus](https://github.com/fluttercommunity/plus_plugins) - Flutter plugin for querying information about + the application package, such as CFBundleVersion on iOS or versionCode on Android. +59. [palette_generator](https://pub.dev/packages/palette_generator) - Flutter package for generating palette colors from + a source image. +60. [path](https://pub.dev/packages/path) - A string-based path manipulation library. All the path operations you know + and love, with solid support for Windows, POSIX (Linux and Mac OS X), and the web. +61. [path_provider](https://pub.dev/packages/path_provider) - Flutter plugin for getting commonly used locations on host + platform file systems, such as the temp and app data directories. +62. [permission_handler](https://pub.dev/packages/permission_handler) - Permission plugin for Flutter. This plugin + provides a cross-platform (iOS, Android) API to request and check permissions. +63. [piped_client](https://github.com/KRTirtho/piped_client) - API Client for piped.video +64. [riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with + asynchronous code a breeze. +65. [scroll_to_index](https://github.com/quire-io/scroll-to-index) - Scroll to a specific child of any scrollable widget + in Flutter +66. [shadcn_flutter](https://github.com/sunarya-thito/shadcn_flutter) - Beautifully designed components from Shadcn/UI is + now available for Flutter +67. [shared_preferences](https://pub.dev/packages/shared_preferences) - Flutter plugin for reading and writing simple + key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android. +68. [shelf](https://pub.dev/packages/shelf) - A model for web server middleware that encourages composition and easy + reuse. +69. [shelf_router](https://pub.dev/packages/shelf_router) - A convenient request router for the shelf web-framework, with + support for URL-parameters, nested routers and routers generated from source annotations. +70. [shelf_web_socket](https://pub.dev/packages/shelf_web_socket) - A shelf handler that wires up a listener for every + connection. +71. [simple_icons](https://teavelopment.com/) - The Simple Icon pack available as Flutter Icons. Provides over 1500 Free + SVG icons for popular brands. +72. [skeletonizer](https://github.com/Milad-Akarie/skeletonizer) - Converts already built widgets into skeleton loaders + with no extra effort. +73. [sliding_up_panel](https://github.com/akshathjain/sliding_up_panel) - A draggable Flutter widget that makes + implementing a SlidingUpPanel much easier! +74. [sliver_tools](https://github.com/Kavantix) - A set of useful sliver tools that are missing from the flutter + framework +75. [smtc_windows](https://pub.dev/packages/smtc_windows) - Windows `SystemMediaTransportControls` implementation for + Flutter giving access to Windows OS Media Control applet. +76. [spotify](https://github.com/rinukkusu/spotify-dart) - An incomplete dart library for interfacing with the Spotify + Web API. +77. [sqlite3](https://github.com/simolus3/sqlite3.dart/tree/main/sqlite3) - Provides lightweight yet convenient bindings + to SQLite by using dart:ffi +78. [sqlite3_flutter_libs](https://github.com/simolus3/sqlite3.dart/tree/main/sqlite3_flutter_libs) - Flutter plugin to + include native sqlite3 libraries with your app +79. [stroke_text](https://github.com/MohamedAbd0/stroke_text) - A Simple Flutter plugin for applying stroke (border) + style to a text widget +80. [system_theme](https://github.com/bdlukaa/system_theme/tree/master/system_theme) - A plugin to get the current system + theme info. Supports Android, Web, Windows, Linux and macOS +81. [test](https://pub.dev/packages/test) - A full featured library for writing and running Dart tests across platforms. +82. [timezone](https://pub.dev/packages/timezone) - Time zone database and time zone aware DateTime. +83. [titlebar_buttons](https://github.com/gtk-flutter/titlebar_buttons) - A package which provides most of the titlebar + buttons from windows, linux and macOS. +84. [tray_manager](https://github.com/leanflutter/tray_manager) - This plugin allows Flutter desktop apps to defines + system tray. +85. [url_launcher](https://pub.dev/packages/url_launcher) - Flutter plugin for launching a URL. Supports web, phone, SMS, + and email schemes. +86. [uuid](https://pub.dev/packages/uuid) - RFC4122 (v1, v4, v5, v6, v7, v8) UUID Generator and Parser for Dart +87. [version](https://github.com/dartninja/version) - Provides a simple class for parsing and comparing semantic versions + as defined by http://semver.org/ +88. [very_good_infinite_list](https://github.com/VeryGoodOpenSource/very_good_infinite_list) - A library for easily + displaying paginated data, created by Very Good Ventures. Great for activity feeds, news feeds, and more. +89. [visibility_detector](https://pub.dev/packages/visibility_detector) - A widget that detects the visibility of its + child and notifies a callback. +90. [web_socket_channel](https://pub.dev/packages/web_socket_channel) - StreamChannel wrappers for WebSockets. Provides a + cross-platform WebSocketChannel API, a cross-platform implementation of that API that communicates over an underlying + StreamChannel. +91. [wikipedia_api](https://github.com/KRTirtho/wikipedia_api) - Wikipedia API for dart and flutter +92. [win32_registry](https://pub.dev/packages/win32_registry) - A package that provides a friendly Dart API for accessing + the Windows Registry. +93. [window_manager](https://github.com/leanflutter/window_manager) - This plugin allows Flutter desktop apps to resizing + and repositioning the window. +94. [youtube_explode_dart](https://github.com/Hexer10/youtube_explode_dart) - A port in dart of the youtube explode + library. Supports several API functions without the need of YouTube API Key. +95. [http_parser](https://pub.dev/packages/http_parser) - A platform-independent package for parsing and serializing HTTP + formats. +96. [collection](https://pub.dev/packages/collection) - Collections and utilities functions and classes related to + collections. +97. [otp_util](https://github.com/dushiling) - otp_util is a dart package to generate and verify one-time passwords, it + provides two methods TOPT and HOTP.They are Time-based OTPs and Counter-based OTPs. +98. [dio_http2_adapter](https://github.com/cfug/dio) - An adapter that combines HTTP/2 and dio. Supports reusing + connections, header compression, etc. +99. [build_runner](https://pub.dev/packages/build_runner) - A build system for Dart code generation and modular + compilation. +100. [envied_generator](https://github.com/petercinibulk/envied) - Generator for the Envied package. + See https://pub.dev/packages/envied. +101. [flutter_gen_runner](https://github.com/FlutterGen/flutter_gen) - The Flutter code generator for your assets, fonts, + colors, … — Get rid of all String-based APIs. +102. [flutter_launcher_icons](https://github.com/fluttercommunity/flutter_launcher_icons) - A package which simplifies the + task of updating your Flutter app's launcher icon. +103. [flutter_lints](https://pub.dev/packages/flutter_lints) - Recommended lints for Flutter apps, packages, and plugins + to encourage good coding practices. +104. [json_serializable](https://pub.dev/packages/json_serializable) - Automatically generate code for converting to and + from JSON by annotating Dart classes. +105. [freezed](https://pub.dev/packages/freezed) - Code generation for immutable classes that has a simple syntax/API + without compromising on the features. +106. [process_run](https://github.com/tekartik/process_run.dart/blob/master/packages/process_run) - Process run helpers + for Linux/Win/Mac and which like feature for finding executables. +107. [pubspec_parse](https://pub.dev/packages/pubspec_parse) - Simple package for parsing pubspec.yaml files with a + type-safe API and rich error reporting. +108. [pub_api_client](https://github.com/leoafarias/pub_api_client) - An API Client for Pub to interact with public + package information. +109. [xml](https://github.com/renggli/dart-xml) - A lightweight library for parsing, traversing, querying, transforming + and building XML documents. +110. [io](https://pub.dev/packages/io) - Utilities for the Dart VM Runtime including support for ANSI colors, file + copying, and standard exit code values. +111. [drift_dev](https://drift.simonbinder.eu/) - Dev-dependency for users of drift. Contains the generator and + development tools. +112. [auto_route_generator](https://github.com/Milad-Akarie/auto_route_library) - AutoRoute is a declarative routing + solution, where everything needed for navigation is automatically generated for you. +113. [desktop_webview_window](https://github.com/MixinNetwork/flutter-plugins/tree/main/packages/desktop_webview_window) - + Show a webview window on your flutter desktop application. +114. [disable_battery_optimization](https://github.com/pvsvamsi/Disable-Battery-Optimizations) - Flutter plugin to check + and disable battery optimizations. Also shows custom steps to disable the optimizations in devices like me, xiaomi, + samsung, oppo, huawei, oneplus etc +115. [draggable_scrollbar](https://github.com/fluttercommunity/flutter-draggable-scrollbar) - A scrollbar that can be + dragged for quickly navigation through a vertical list. Additional option is showing label next to scrollthumb with + information about current item. +116. [flutter_broadcasts](https://github.com/KRTirtho/flutter_broadcasts.git) - A plugin for sending and receiving + broadcasts with Android intents and iOS notifications. +117. [scrobblenaut](https://github.com/Nebulino/Scrobblenaut) - A deadly simple LastFM API Wrapper for Dart. So deadly + simple that it's going to hit the mark. +118. [yt_dlp_dart](https://github.com/KRTirtho/yt_dlp_dart.git) - yt-dlp binding in Dart +119. [flutter_new_pipe_extractor](https://github.com/KRTirtho/flutter_new_pipe_extractor) - NewPipeExtractor binding for + Flutter (Android only) +
    -

    © Copyright Spotube 2024

    +

    © Copyright Spotube 2025

    diff --git a/lib/collections/assets.gen.dart b/lib/collections/assets.gen.dart index 004001f2..c0b2224d 100644 --- a/lib/collections/assets.gen.dart +++ b/lib/collections/assets.gen.dart @@ -136,8 +136,6 @@ class Assets { static const AssetGenImage albumPlaceholder = AssetGenImage('assets/album-placeholder.png'); static const $AssetsBackgroundsGen backgrounds = $AssetsBackgroundsGen(); - static const AssetGenImage bengaliPatternsBg = - AssetGenImage('assets/bengali-patterns-bg.jpg'); static const AssetGenImage branding = AssetGenImage('assets/branding.png'); static const AssetGenImage emptyBox = AssetGenImage('assets/empty_box.png'); static const AssetGenImage invidious = AssetGenImage('assets/invidious.jpg'); @@ -148,38 +146,14 @@ class Assets { static const $AssetsPatternsGen patterns = $AssetsPatternsGen(); static const AssetGenImage placeholder = AssetGenImage('assets/placeholder.png'); - static const AssetGenImage spotubeHeroBanner = - AssetGenImage('assets/spotube-hero-banner.png'); - static const AssetGenImage spotubeLogoForeground = - AssetGenImage('assets/spotube-logo-foreground.jpg'); - static const AssetGenImage spotubeLogoMacos = - AssetGenImage('assets/spotube-logo-macos.png'); - static const AssetGenImage spotubeLogoBmp = - AssetGenImage('assets/spotube-logo.bmp'); - static const String spotubeLogoIco = 'assets/spotube-logo.ico'; - static const AssetGenImage spotubeLogoPng = - AssetGenImage('assets/spotube-logo.png'); - static const String spotubeLogoSvg = 'assets/spotube-logo.svg'; - static const AssetGenImage spotubeLogoAndroid12 = - AssetGenImage('assets/spotube-logo_android12.png'); - static const AssetGenImage spotubeNightlyLogoForeground = - AssetGenImage('assets/spotube-nightly-logo-foreground.jpg'); - static const AssetGenImage spotubeNightlyLogoPng = - AssetGenImage('assets/spotube-nightly-logo.png'); - static const String spotubeNightlyLogoSvg = 'assets/spotube-nightly-logo.svg'; - static const AssetGenImage spotubeNightlyLogoAndroid12 = - AssetGenImage('assets/spotube-nightly-logo_android12.png'); - static const AssetGenImage spotubeScreenshot = - AssetGenImage('assets/spotube-screenshot.png'); - static const AssetGenImage spotubeTallCapsule = - AssetGenImage('assets/spotube-tall-capsule.png'); - static const AssetGenImage spotubeWideCapsuleLarge = - AssetGenImage('assets/spotube-wide-capsule-large.png'); - static const AssetGenImage spotubeWideCapsuleSmall = - AssetGenImage('assets/spotube-wide-capsule-small.png'); - static const AssetGenImage spotubeBanner = - AssetGenImage('assets/spotube_banner.png'); - static const AssetGenImage success = AssetGenImage('assets/success.png'); + static const AssetGenImage spotubeIcon = + AssetGenImage('assets/spotube-icon.png'); + static const AssetGenImage spotubeLogoNightlyNotWallpaper = + AssetGenImage('assets/spotube-logo-nightly-notWallpaper.png'); + static const AssetGenImage spotubeLogoStableNotWallpaper = + AssetGenImage('assets/spotube-logo-stable-notWallpaper.png'); + static const AssetGenImage spotubeLogoStableWallpaper = + AssetGenImage('assets/spotube-logo-stable-wallpaper.png'); static const $AssetsTutorialGen tutorial = $AssetsTutorialGen(); static const AssetGenImage userPlaceholder = AssetGenImage('assets/user-placeholder.png'); @@ -188,31 +162,16 @@ class Assets { static List get values => [ license, albumPlaceholder, - bengaliPatternsBg, branding, emptyBox, invidious, jiosaavn, likedTracks, placeholder, - spotubeHeroBanner, - spotubeLogoForeground, - spotubeLogoMacos, - spotubeLogoBmp, - spotubeLogoIco, - spotubeLogoPng, - spotubeLogoSvg, - spotubeLogoAndroid12, - spotubeNightlyLogoForeground, - spotubeNightlyLogoPng, - spotubeNightlyLogoSvg, - spotubeNightlyLogoAndroid12, - spotubeScreenshot, - spotubeTallCapsule, - spotubeWideCapsuleLarge, - spotubeWideCapsuleSmall, - spotubeBanner, - success, + spotubeIcon, + spotubeLogoNightlyNotWallpaper, + spotubeLogoStableNotWallpaper, + spotubeLogoStableWallpaper, userPlaceholder ]; } diff --git a/lib/collections/intents.dart b/lib/collections/intents.dart index e4e3fa07..c0a325d1 100644 --- a/lib/collections/intents.dart +++ b/lib/collections/intents.dart @@ -12,6 +12,7 @@ import 'package:spotube/utils/platform.dart'; class PlayPauseIntent extends Intent { final WidgetRef ref; + const PlayPauseIntent(this.ref); } @@ -34,6 +35,7 @@ class PlayPauseAction extends Action { class NavigationIntent extends Intent { final AppRouter router; final String path; + const NavigationIntent(this.router, this.path); } @@ -48,7 +50,6 @@ class NavigationAction extends Action { enum HomeTabs { browse, search, - lyrics, userPlaylists, userArtists, @@ -60,6 +61,7 @@ enum HomeTabs { class HomeTabIntent extends Intent { final AppRouter router; final HomeTabs tab; + const HomeTabIntent(this.router, {required this.tab}); } @@ -75,7 +77,7 @@ class HomeTabAction extends Action { router.navigate(const SearchRoute()); break; case HomeTabs.lyrics: - router.navigate(LyricsRoute()); + router.navigate(const LyricsRoute()); break; case HomeTabs.userPlaylists: router.navigate(const UserPlaylistsRoute()); @@ -100,6 +102,7 @@ class HomeTabAction extends Action { class SeekIntent extends Intent { final WidgetRef ref; final bool forward; + const SeekIntent(this.ref, this.forward); } diff --git a/lib/collections/routes.dart b/lib/collections/routes.dart index 543bc471..612c8b72 100644 --- a/lib/collections/routes.dart +++ b/lib/collections/routes.dart @@ -144,10 +144,10 @@ class AppRouter extends RootStackRouter { ), ], ), - AutoRoute( - path: "track/:id", - page: TrackRoute.page, - ), + // AutoRoute( + // path: "track/:id", + // page: TrackRoute.page, + // ), AutoRoute( path: "connect", page: ConnectRoute.page, @@ -214,22 +214,18 @@ class AppRouter extends RootStackRouter { AutoRoute( path: "/mini-player", page: MiniLyricsRoute.page, - // parentNavigatorKey: rootNavigatorKey, ), AutoRoute( path: "/getting-started", page: GettingStartedRoute.page, - // parentNavigatorKey: rootNavigatorKey, ), AutoRoute( path: "/login", page: WebViewLoginRoute.page, - // parentNavigatorKey: rootNavigatorKey, ), AutoRoute( path: "/lastfm-login", page: LastFMLoginRoute.page, - // parentNavigatorKey: rootNavigatorKey, ), ]; } diff --git a/lib/collections/side_bar_tiles.dart b/lib/collections/side_bar_tiles.dart index 80ca7306..f67c355e 100644 --- a/lib/collections/side_bar_tiles.dart +++ b/lib/collections/side_bar_tiles.dart @@ -38,17 +38,17 @@ List getSidebarTileList(AppLocalizations l10n) => [ SideBarTiles( id: "lyrics", pathPrefix: "/lyrics", - route: LyricsRoute(), + route: const LyricsRoute(), icon: SpotubeIcons.music, title: l10n.lyrics, ), - SideBarTiles( - id: "stats", - pathPrefix: "/stats", - route: const StatsRoute(), - icon: SpotubeIcons.chart, - title: l10n.stats, - ), + // SideBarTiles( + // id: "stats", + // pathPrefix: "/stats", + // route: const StatsRoute(), + // icon: SpotubeIcons.chart, + // title: l10n.stats, + // ), ]; List getSidebarLibraryTileList(AppLocalizations l10n) => [ @@ -104,11 +104,11 @@ List getNavbarTileList(AppLocalizations l10n) => [ icon: SpotubeIcons.library, title: l10n.library, ), - SideBarTiles( - id: "stats", - pathPrefix: "/stats", - route: const StatsRoute(), - icon: SpotubeIcons.chart, - title: l10n.stats, - ), + // SideBarTiles( + // id: "stats", + // pathPrefix: "/stats", + // route: const StatsRoute(), + // icon: SpotubeIcons.chart, + // title: l10n.stats, + // ), ]; diff --git a/lib/collections/spotube_icons.dart b/lib/collections/spotube_icons.dart index bd9d037c..7e1d00bf 100644 --- a/lib/collections/spotube_icons.dart +++ b/lib/collections/spotube_icons.dart @@ -1,6 +1,6 @@ import 'package:fluentui_system_icons/fluentui_system_icons.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:simple_icons/simple_icons.dart'; abstract class SpotubeIcons { diff --git a/lib/components/adaptive/adaptive_pop_sheet_list.dart b/lib/components/adaptive/adaptive_pop_sheet_list.dart index 0f02ee73..8c926d81 100644 --- a/lib/components/adaptive/adaptive_pop_sheet_list.dart +++ b/lib/components/adaptive/adaptive_pop_sheet_list.dart @@ -6,6 +6,7 @@ import 'package:spotube/extensions/constrains.dart'; class AdaptiveMenuButton extends MenuButton { final T? value; + const AdaptiveMenuButton({ super.key, this.value, diff --git a/lib/components/adaptive/adaptive_select_tile.dart b/lib/components/adaptive/adaptive_select_tile.dart index afa982af..7753e955 100644 --- a/lib/components/adaptive/adaptive_select_tile.dart +++ b/lib/components/adaptive/adaptive_select_tile.dart @@ -1,8 +1,5 @@ -import 'package:flutter/material.dart' show ListTile, ListTileControlAffinity; +import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; -import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/extensions/constrains.dart'; class AdaptiveSelectTile extends HookWidget { final Widget title; @@ -13,7 +10,7 @@ class AdaptiveSelectTile extends HookWidget { final T value; final ValueChanged? onChanged; - final List> options; + final List> options; /// Show the smaller value when the breakpoint is reached /// @@ -24,8 +21,9 @@ class AdaptiveSelectTile extends HookWidget { final bool? breakLayout; - final BoxConstraints? popupConstraints; - final PopoverConstraint? popupWidthConstraint; + final double? popupMaxWidth; + + final dynamic popup; const AdaptiveSelectTile({ required this.title, @@ -39,87 +37,96 @@ class AdaptiveSelectTile extends HookWidget { this.breakLayout, this.showValueWhenUnfolded = true, super.key, - this.popupConstraints, - this.popupWidthConstraint, + this.popupMaxWidth, + this.popup, }); @override Widget build(BuildContext context) { final theme = Theme.of(context); - final mediaQuery = MediaQuery.sizeOf(context); + final mediaQuery = MediaQuery.of(context); - Widget? control = Select( - itemBuilder: (context, item) { - return options.firstWhere((element) => element.value == item).child; - }, + // Create control widget + Widget? control = DropdownButton( value: value, + items: options, onChanged: onChanged, - popupConstraints: popupConstraints ?? const BoxConstraints(maxWidth: 200), - popupWidthConstraint: popupWidthConstraint ?? PopoverConstraint.flexible, - autoClosePopover: true, - popup: (context) { - return SelectPopup( - autoClose: true, - items: SelectItemBuilder( - childCount: options.length, - builder: (context, index) { - return options[index]; - }, - ), - ); - }, + underline: Container(), ); - if (mediaQuery.smAndDown) { - if (showValueWhenUnfolded) { - control = OutlineBadge( - child: options.firstWhere((element) => element.value == value).child, - ); - } else { - control = null; - } + if (mediaQuery.size.width < 600) { + control = showValueWhenUnfolded + ? Text( + options + .firstWhere((item) => item.value == value) + .child + .toString(), + style: TextStyle(color: theme.colorScheme.primary), + ) + : null; } + // Render the ListTile return ListTile( - title: title, - subtitle: subtitle, - leading: controlAffinity != ListTileControlAffinity.leading - ? secondary - : control, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), + title: DefaultTextStyle( + style: + theme.textTheme.titleMedium!.copyWith(fontWeight: FontWeight.bold), + child: title, + ), + subtitle: subtitle != null + ? Padding( + padding: const EdgeInsets.only(top: 4.0), + child: DefaultTextStyle( + style: theme.textTheme.bodySmall! + .copyWith(color: theme.colorScheme.secondary), + child: subtitle!, + ), + ) + : null, + leading: controlAffinity == ListTileControlAffinity.leading + ? control + : secondary, trailing: Row( mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.end, - spacing: 5, children: [ ...?trailing, - if (controlAffinity == ListTileControlAffinity.leading && - secondary != null) - secondary! - else if (controlAffinity == ListTileControlAffinity.trailing && + if (controlAffinity == ListTileControlAffinity.trailing && control != null) - control, + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: control, + ), ], ), - onTap: breakLayout ?? mediaQuery.mdAndUp + onTap: breakLayout ?? mediaQuery.size.width >= 600 ? null : () { showDialog( context: context, builder: (context) { return AlertDialog( - content: Flexible( + contentPadding: const EdgeInsets.all(16.0), + content: Container( + constraints: + BoxConstraints(maxWidth: popupMaxWidth ?? 300), child: ListView.builder( shrinkWrap: true, itemCount: options.length, itemBuilder: (context, index) { final item = options[index]; - return ListTile( - iconColor: theme.colorScheme.primary, - leading: item.value == value - ? const Icon(SpotubeIcons.radioChecked) - : const Icon(SpotubeIcons.radioUnchecked), - title: item.child, + dense: true, + leading: Icon( + item.value == value + ? Icons.radio_button_checked + : Icons.radio_button_unchecked, + color: item.value == value + ? theme.colorScheme.primary + : theme.colorScheme.secondary, + ), + title: Text(item.child.toString()), onTap: () { onChanged?.call(item.value); Navigator.of(context).pop(); diff --git a/lib/components/button/back_button.dart b/lib/components/button/back_button.dart index 42c952ab..f67d4b9f 100644 --- a/lib/components/button/back_button.dart +++ b/lib/components/button/back_button.dart @@ -4,6 +4,7 @@ import 'package:spotube/collections/spotube_icons.dart'; class BackButton extends StatelessWidget { final Color? color; final IconData icon; + const BackButton({ super.key, this.color, diff --git a/lib/components/dialogs/confirm_download_dialog.dart b/lib/components/dialogs/confirm_download_dialog.dart index a2df0e9c..47ec67a1 100644 --- a/lib/components/dialogs/confirm_download_dialog.dart +++ b/lib/components/dialogs/confirm_download_dialog.dart @@ -78,6 +78,7 @@ class ConfirmDownloadDialog extends StatelessWidget { class BulletPoint extends StatelessWidget { final String text; + const BulletPoint(this.text, {super.key}); @override diff --git a/lib/components/dialogs/playlist_add_track_dialog.dart b/lib/components/dialogs/playlist_add_track_dialog.dart index 5098bf9d..81542336 100644 --- a/lib/components/dialogs/playlist_add_track_dialog.dart +++ b/lib/components/dialogs/playlist_add_track_dialog.dart @@ -1,18 +1,18 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotify/spotify.dart'; -import 'package:spotube/modules/playlist/playlist_create_dialog.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; +import 'package:spotube/modules/playlist/playlist_create_dialog.dart'; import 'package:spotube/provider/spotify/spotify.dart'; class PlaylistAddTrackDialog extends HookConsumerWidget { /// The id of the playlist this dialog was opened from final String? openFromPlaylist; final List tracks; + const PlaylistAddTrackDialog({ required this.tracks, required this.openFromPlaylist, diff --git a/lib/components/dialogs/replace_downloaded_dialog.dart b/lib/components/dialogs/replace_downloaded_dialog.dart index 3a0f3a1d..27437048 100644 --- a/lib/components/dialogs/replace_downloaded_dialog.dart +++ b/lib/components/dialogs/replace_downloaded_dialog.dart @@ -1,6 +1,5 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotify/spotify.dart'; import 'package:spotube/extensions/context.dart'; @@ -8,6 +7,7 @@ final replaceDownloadedFileState = StateProvider((ref) => null); class ReplaceDownloadedDialog extends ConsumerWidget { final Track track; + const ReplaceDownloadedDialog({required this.track, super.key}); @override diff --git a/lib/components/dialogs/track_details_dialog.dart b/lib/components/dialogs/track_details_dialog.dart index bfb4a318..845ec94e 100644 --- a/lib/components/dialogs/track_details_dialog.dart +++ b/lib/components/dialogs/track_details_dialog.dart @@ -8,11 +8,12 @@ import 'package:spotube/components/links/hyper_link.dart'; import 'package:spotube/components/links/link_text.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; -import 'package:spotube/services/sourced_track/sourced_track.dart'; import 'package:spotube/extensions/duration.dart'; +import 'package:spotube/services/sourced_track/sourced_track.dart'; class TrackDetailsDialog extends HookWidget { final Track track; + const TrackDetailsDialog({ super.key, required this.track, diff --git a/lib/components/fallbacks/anonymous_fallback.dart b/lib/components/fallbacks/anonymous_fallback.dart index 293df932..818b08f0 100644 --- a/lib/components/fallbacks/anonymous_fallback.dart +++ b/lib/components/fallbacks/anonymous_fallback.dart @@ -5,12 +5,12 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/extensions/context.dart'; - import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/utils/platform.dart'; class AnonymousFallback extends ConsumerWidget { final Widget? child; + const AnonymousFallback({ super.key, this.child, diff --git a/lib/components/fallbacks/not_found.dart b/lib/components/fallbacks/not_found.dart index 9a994446..219efed1 100644 --- a/lib/components/fallbacks/not_found.dart +++ b/lib/components/fallbacks/not_found.dart @@ -16,7 +16,7 @@ class NotFound extends StatelessWidget { height: 200 * context.theme.scaling, color: context.theme.colorScheme.primary, ), - const Gap(10), + const Gap(16), Text( context.l10n.nothing_found, textAlign: TextAlign.center, diff --git a/lib/components/form/checkbox_form_field.dart b/lib/components/form/checkbox_form_field.dart index 0e794833..1c25b374 100644 --- a/lib/components/form/checkbox_form_field.dart +++ b/lib/components/form/checkbox_form_field.dart @@ -9,6 +9,7 @@ class CheckboxFormBuilderField extends StatelessWidget { final Widget? leading; final Widget? trailing; final bool tristate; + const CheckboxFormBuilderField({ super.key, required this.name, diff --git a/lib/components/form/text_form_field.dart b/lib/components/form/text_form_field.dart index 56ef34a5..97647ae5 100644 --- a/lib/components/form/text_form_field.dart +++ b/lib/components/form/text_form_field.dart @@ -11,6 +11,7 @@ class TextFormBuilderField extends StatelessWidget { final TextEditingController? controller; final bool filled; final Widget? placeholder; + // final AlignmentGeometry? placeholderAlignment; // final AlignmentGeometry? leadingAlignment; // final AlignmentGeometry? trailingAlignment; @@ -41,6 +42,7 @@ class TextFormBuilderField extends StatelessWidget { final void Function(PointerDownEvent event)? onTapOutside; final List? inputFormatters; final TextStyle? style; + // final EditableTextContextMenuBuilder? contextMenuBuilder; // final bool useNativeContextMenu; // final bool? isCollapsed; diff --git a/lib/components/heart_button/heart_button.dart b/lib/components/heart_button/heart_button.dart index 56cb22ab..902bb9b6 100644 --- a/lib/components/heart_button/heart_button.dart +++ b/lib/components/heart_button/heart_button.dart @@ -1,6 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotify/spotify.dart'; import 'package:spotube/components/heart_button/use_track_toggle_like.dart'; import 'package:spotube/extensions/context.dart'; @@ -15,6 +14,7 @@ class HeartButton extends HookConsumerWidget { final String? tooltip; final ButtonVariance variance; final ButtonSize size; + const HeartButton({ required this.isLiked, required this.onPressed, @@ -64,6 +64,7 @@ class HeartButton extends HookConsumerWidget { class TrackHeartButton extends HookConsumerWidget { final Track track; + const TrackHeartButton({ super.key, required this.track, diff --git a/lib/components/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart b/lib/components/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart index 47fb0f33..3b90621d 100644 --- a/lib/components/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart +++ b/lib/components/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart @@ -93,7 +93,7 @@ class HorizontalPlaybuttonCardView extends HookWidget { ), isLoading: isLoadingNextPage, hasReachedMax: !hasNextPage, - separatorBuilder: (context, index) => Gap(12 * scale), + separatorBuilder: (context, index) => Gap(24 * scale), itemBuilder: (context, index) { final item = items[index]; diff --git a/lib/components/hover_builder.dart b/lib/components/hover_builder.dart index 7793e744..2c186166 100644 --- a/lib/components/hover_builder.dart +++ b/lib/components/hover_builder.dart @@ -4,6 +4,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; class HoverBuilder extends HookWidget { final bool? permanentState; final Widget Function(BuildContext context, bool isHovering) builder; + const HoverBuilder({ required this.builder, this.permanentState, diff --git a/lib/components/image/universal_image.dart b/lib/components/image/universal_image.dart index d8902e63..8ac3226f 100644 --- a/lib/components/image/universal_image.dart +++ b/lib/components/image/universal_image.dart @@ -13,6 +13,7 @@ class UniversalImage extends HookWidget { final double scale; final String? placeholder; final BoxFit? fit; + const UniversalImage({ required this.path, this.height, diff --git a/lib/components/inter_scrollbar/inter_scrollbar.dart b/lib/components/inter_scrollbar/inter_scrollbar.dart index 415ba6da..a7de0249 100644 --- a/lib/components/inter_scrollbar/inter_scrollbar.dart +++ b/lib/components/inter_scrollbar/inter_scrollbar.dart @@ -1,6 +1,6 @@ import 'package:draggable_scrollbar/draggable_scrollbar.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/utils/platform.dart'; class InterScrollbar extends HookWidget { diff --git a/lib/components/links/artist_link.dart b/lib/components/links/artist_link.dart index 9467cb38..4194ca97 100644 --- a/lib/components/links/artist_link.dart +++ b/lib/components/links/artist_link.dart @@ -61,13 +61,12 @@ class ArtistLink extends StatelessWidget { if (hideOverflowArtist && artists.length > 3) AnchorButton( context.l10n.and_n_more(artists.length - 3), - onTap: () { - onOverflowArtistClick?.call(); - }, + // onTap: () { + // onOverflowArtistClick; + // }, overflow: TextOverflow.ellipsis, style: textStyle.copyWith( - color: colorScheme.secondary, - decoration: TextDecoration.underline, + color: Colors.white, ), ), ], diff --git a/lib/components/links/link_text.dart b/lib/components/links/link_text.dart index c64ae93d..4553f839 100644 --- a/lib/components/links/link_text.dart +++ b/lib/components/links/link_text.dart @@ -11,6 +11,7 @@ class LinkText extends StatelessWidget { final int? maxLines; final bool push; + const LinkText( this.text, this.route, { diff --git a/lib/components/playbutton_view/playbutton_card.dart b/lib/components/playbutton_view/playbutton_card.dart index 0b47ae28..90e8e514 100644 --- a/lib/components/playbutton_view/playbutton_card.dart +++ b/lib/components/playbutton_view/playbutton_card.dart @@ -99,7 +99,7 @@ class PlaybuttonCard extends StatelessWidget { ), ), ), - const Gap(5), + const Gap(8), AnimatedScale( curve: Curves.easeOutBack, duration: const Duration(milliseconds: 150), diff --git a/lib/components/playbutton_view/playbutton_view.dart b/lib/components/playbutton_view/playbutton_view.dart index 7880bb8c..48cbac68 100644 --- a/lib/components/playbutton_view/playbutton_view.dart +++ b/lib/components/playbutton_view/playbutton_view.dart @@ -102,7 +102,7 @@ class PlaybuttonView extends StatelessWidget { ], ), ), - const SliverGap(10), + const SliverGap(16), // Toggle between grid and list view switch ((isGrid.value, isLoading)) { (true, _) => !isLoading && itemCount == 0 diff --git a/lib/components/shimmers/shimmer_lyrics.dart b/lib/components/shimmers/shimmer_lyrics.dart index f8d29722..b176028e 100644 --- a/lib/components/shimmers/shimmer_lyrics.dart +++ b/lib/components/shimmers/shimmer_lyrics.dart @@ -1,7 +1,5 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:gap/gap.dart'; - +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; class ShimmerLyrics extends HookWidget { @@ -27,7 +25,7 @@ class ShimmerLyrics extends HookWidget { children: [ for (final text in texts) ...[ Text(text), - if (text != texts.last) const Gap(10), + if (text != texts.last) const Gap(16), ], ], ); diff --git a/lib/components/titlebar/titlebar_buttons.dart b/lib/components/titlebar/titlebar_buttons.dart index 30d88508..8e09babf 100644 --- a/lib/components/titlebar/titlebar_buttons.dart +++ b/lib/components/titlebar/titlebar_buttons.dart @@ -1,11 +1,10 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/components/hover_builder.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/components/titlebar/titlebar_icon_buttons.dart'; - import 'package:spotube/hooks/configurators/use_window_listener.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/platform.dart'; @@ -14,6 +13,7 @@ import 'package:window_manager/window_manager.dart'; class WindowTitleBarButtons extends HookConsumerWidget { final Color? foregroundColor; + const WindowTitleBarButtons({ super.key, this.foregroundColor, @@ -78,9 +78,7 @@ class WindowTitleBarButtons extends HookConsumerWidget { HoverBuilder(builder: (context, isHovered) { return ShadcnWindowButton( icon: CloseIcon( - color: isHovered - ? Colors.white - : context.theme.colorScheme.foreground, + color: isHovered ? Colors.white : Colors.red, ), onPressed: onClose, hoverBackgroundColor: const Color(0xFFD32F2F), diff --git a/lib/components/titlebar/titlebar_icon_buttons.dart b/lib/components/titlebar/titlebar_icon_buttons.dart index 481a22ce..17ed8e87 100644 --- a/lib/components/titlebar/titlebar_icon_buttons.dart +++ b/lib/components/titlebar/titlebar_icon_buttons.dart @@ -48,7 +48,9 @@ class ShadcnWindowButton extends StatelessWidget { /// Close class CloseIcon extends StatelessWidget { final Color color; + const CloseIcon({super.key, required this.color}); + @override Widget build(BuildContext context) => Align( alignment: Alignment.topLeft, @@ -69,13 +71,16 @@ class CloseIcon extends StatelessWidget { /// Maximize class MaximizeIcon extends StatelessWidget { final Color color; + const MaximizeIcon({super.key, required this.color}); + @override Widget build(BuildContext context) => _AlignedPaint(_MaximizePainter(color)); } class _MaximizePainter extends _IconPainter { _MaximizePainter(super.color); + @override void paint(Canvas canvas, Size size) { Paint p = getPaint(color); @@ -86,16 +91,19 @@ class _MaximizePainter extends _IconPainter { /// Restore class RestoreIcon extends StatelessWidget { final Color color; + const RestoreIcon({ super.key, required this.color, }); + @override Widget build(BuildContext context) => _AlignedPaint(_RestorePainter(color)); } class _RestorePainter extends _IconPainter { _RestorePainter(super.color); + @override void paint(Canvas canvas, Size size) { Paint p = getPaint(color); @@ -112,13 +120,16 @@ class _RestorePainter extends _IconPainter { /// Minimize class MinimizeIcon extends StatelessWidget { final Color color; + const MinimizeIcon({super.key, required this.color}); + @override Widget build(BuildContext context) => _AlignedPaint(_MinimizePainter(color)); } class _MinimizePainter extends _IconPainter { _MinimizePainter(super.color); + @override void paint(Canvas canvas, Size size) { Paint p = getPaint(color); @@ -130,6 +141,7 @@ class _MinimizePainter extends _IconPainter { /// Helpers abstract class _IconPainter extends CustomPainter { _IconPainter(this.color); + final Color color; @override @@ -138,6 +150,7 @@ abstract class _IconPainter extends CustomPainter { class _AlignedPaint extends StatelessWidget { const _AlignedPaint(this.painter); + final CustomPainter painter; @override diff --git a/lib/components/track_presentation/presentation_actions.dart b/lib/components/track_presentation/presentation_actions.dart index 4948cf69..2f2cee19 100644 --- a/lib/components/track_presentation/presentation_actions.dart +++ b/lib/components/track_presentation/presentation_actions.dart @@ -10,9 +10,9 @@ import 'package:spotube/components/track_presentation/presentation_props.dart'; import 'package:spotube/components/track_presentation/presentation_state.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/database/database.dart'; +import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/download_manager_provider.dart'; import 'package:spotube/provider/history/history.dart'; -import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; class TrackPresentationActionsSection extends HookConsumerWidget { @@ -165,7 +165,7 @@ class TrackPresentationActionsSection extends HookConsumerWidget { if (!context.mounted) return; }, icon: const Icon(SpotubeIcons.moreVertical), - variance: ButtonVariance.outline, + // variance: ButtonVariance.outline, items: (context) => [ AdaptiveMenuButton( value: "download", diff --git a/lib/components/track_presentation/presentation_list.dart b/lib/components/track_presentation/presentation_list.dart index dda7dffa..c0e1c4e6 100644 --- a/lib/components/track_presentation/presentation_list.dart +++ b/lib/components/track_presentation/presentation_list.dart @@ -7,9 +7,9 @@ import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/fake.dart'; import 'package:spotube/components/track_presentation/presentation_props.dart'; import 'package:spotube/components/track_presentation/presentation_state.dart'; +import 'package:spotube/components/track_presentation/use_is_user_playlist.dart'; import 'package:spotube/components/track_presentation/use_track_tile_play_callback.dart'; import 'package:spotube/components/track_tile/track_tile.dart'; -import 'package:spotube/components/track_presentation/use_is_user_playlist.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart'; diff --git a/lib/components/track_presentation/presentation_modifiers.dart b/lib/components/track_presentation/presentation_modifiers.dart index c46fef3f..a3b0b450 100644 --- a/lib/components/track_presentation/presentation_modifiers.dart +++ b/lib/components/track_presentation/presentation_modifiers.dart @@ -2,16 +2,17 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/components/track_presentation/sort_tracks_dropdown.dart'; import 'package:spotube/components/track_presentation/presentation_actions.dart'; import 'package:spotube/components/track_presentation/presentation_props.dart'; import 'package:spotube/components/track_presentation/presentation_state.dart'; +import 'package:spotube/components/track_presentation/sort_tracks_dropdown.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart'; class TrackPresentationModifiersSection extends HookConsumerWidget { final FocusNode? focusNode; + const TrackPresentationModifiersSection({ super.key, this.focusNode, diff --git a/lib/components/track_presentation/presentation_top.dart b/lib/components/track_presentation/presentation_top.dart index 8da2f51c..5ec89d6e 100644 --- a/lib/components/track_presentation/presentation_top.dart +++ b/lib/components/track_presentation/presentation_top.dart @@ -144,7 +144,7 @@ class TrackPresentationTopSection extends HookConsumerWidget { return SurfaceCard( child: Text( context.l10n - .copied_shareurl_to_clipboard(options.shareUrl!), + .copied_share_url_to_clipboard(options.shareUrl!), ).small(), ); }, diff --git a/lib/components/track_presentation/sort_tracks_dropdown.dart b/lib/components/track_presentation/sort_tracks_dropdown.dart index 0a07cbad..32679012 100644 --- a/lib/components/track_presentation/sort_tracks_dropdown.dart +++ b/lib/components/track_presentation/sort_tracks_dropdown.dart @@ -1,12 +1,13 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/pages/library/user_local_tracks/user_local_tracks.dart'; import 'package:spotube/components/adaptive/adaptive_pop_sheet_list.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/pages/library/user_local_tracks/user_local_tracks.dart'; class SortTracksDropdown extends StatelessWidget { final SortBy? value; final void Function(SortBy)? onChanged; + const SortTracksDropdown({ this.onChanged, this.value, diff --git a/lib/components/track_presentation/track_presentation.dart b/lib/components/track_presentation/track_presentation.dart index 47089bd6..388e5cbf 100644 --- a/lib/components/track_presentation/track_presentation.dart +++ b/lib/components/track_presentation/track_presentation.dart @@ -4,15 +4,16 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/components/track_presentation/presentation_list.dart'; +import 'package:spotube/components/track_presentation/presentation_modifiers.dart'; import 'package:spotube/components/track_presentation/presentation_props.dart'; import 'package:spotube/components/track_presentation/presentation_top.dart'; -import 'package:spotube/components/track_presentation/presentation_modifiers.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/utils/platform.dart'; class TrackPresentation extends HookConsumerWidget { final TrackPresentationOptions options; + const TrackPresentation({ super.key, required this.options, @@ -88,7 +89,7 @@ class TrackPresentation extends HookConsumerWidget { }, ), const PresentationListSection(), - const SliverSafeArea(sliver: SliverGap(10)), + const SliverSafeArea(sliver: SliverGap(16)), ], ), ), diff --git a/lib/components/track_presentation/use_action_callbacks.dart b/lib/components/track_presentation/use_action_callbacks.dart index 0012594a..18943cd4 100644 --- a/lib/components/track_presentation/use_action_callbacks.dart +++ b/lib/components/track_presentation/use_action_callbacks.dart @@ -5,7 +5,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/components/dialogs/select_device_dialog.dart'; import 'package:spotube/components/track_presentation/presentation_props.dart'; - import 'package:spotube/models/connect/connect.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/connect/connect.dart'; diff --git a/lib/components/track_presentation/use_track_tile_play_callback.dart b/lib/components/track_presentation/use_track_tile_play_callback.dart index b519f781..2a4cf3e2 100644 --- a/lib/components/track_presentation/use_track_tile_play_callback.dart +++ b/lib/components/track_presentation/use_track_tile_play_callback.dart @@ -1,12 +1,10 @@ -import 'package:hooks_riverpod/hooks_riverpod.dart'; - import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/components/dialogs/select_device_dialog.dart'; import 'package:spotube/components/track_presentation/presentation_props.dart'; import 'package:spotube/components/track_presentation/presentation_state.dart'; import 'package:spotube/extensions/list.dart'; - import 'package:spotube/models/connect/connect.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/connect/connect.dart'; diff --git a/lib/components/track_tile/track_options.dart b/lib/components/track_tile/track_options.dart index 05e67d02..9001e711 100644 --- a/lib/components/track_tile/track_options.dart +++ b/lib/components/track_tile/track_options.dart @@ -3,10 +3,8 @@ import 'dart:io'; import 'package:auto_route/auto_route.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotify/spotify.dart' hide Offset; import 'package:spotube/collections/assets.gen.dart'; @@ -17,20 +15,17 @@ import 'package:spotube/components/dialogs/playlist_add_track_dialog.dart'; import 'package:spotube/components/dialogs/prompt_dialog.dart'; import 'package:spotube/components/dialogs/track_details_dialog.dart'; import 'package:spotube/components/heart_button/use_track_toggle_like.dart'; -import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/links/artist_link.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; -import 'package:spotube/extensions/image.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/models/local_track.dart'; +import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/blacklist_provider.dart'; import 'package:spotube/provider/download_manager_provider.dart'; import 'package:spotube/provider/local_tracks/local_tracks_provider.dart'; -import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/spotify/spotify.dart'; - import 'package:url_launcher/url_launcher_string.dart'; enum TrackOptionValue { @@ -56,6 +51,7 @@ class TrackOptions extends HookConsumerWidget { final String? playlistId; final ObjectRef?>? showMenuCbRef; final Widget? icon; + const TrackOptions({ super.key, required this.track, @@ -99,7 +95,7 @@ class TrackOptions extends HookConsumerWidget { return FadeTransition(opacity: animation, child: child); }, context: context, - barrierColor: Colors.black.withValues(alpha: 0.5), + // barrierColor: Colors.white.withValues(alpha: 0.5), builder: (context) { return Center( child: PlaylistAddTrackDialog( @@ -159,7 +155,6 @@ class TrackOptions extends HookConsumerWidget { await playback.stop(); await playback.load([track], autoPlay: true); - // we don't have to add those tracks as useEndlessPlayback will do it for us return; } else { await playback.addTrack(track); @@ -337,19 +332,20 @@ class TrackOptions extends HookConsumerWidget { break; } }, - icon: icon ?? const Icon(SpotubeIcons.moreHorizontal), + icon: + icon ?? const Icon(SpotubeIcons.moreHorizontal, color: Colors.white), headings: [ Basic( - leading: AspectRatio( + leading: const AspectRatio( aspectRatio: 1, - child: ClipRRect( - borderRadius: BorderRadius.circular(10), - child: UniversalImage( - path: track.album!.images - .asUrlString(placeholder: ImagePlaceholder.albumArt), - fit: BoxFit.cover, - ), - ), + // child: ClipRRect( + // borderRadius: BorderRadius.circular(10), + // child: UniversalImage( + // path: track.album!.images + // .asUrlString(placeholder: ImagePlaceholder.albumArt), + // fit: BoxFit.cover, + // ), + // ), ), title: Text( track.name!, diff --git a/lib/components/track_tile/track_tile.dart b/lib/components/track_tile/track_tile.dart index 524575e5..8a83f3cc 100644 --- a/lib/components/track_tile/track_tile.dart +++ b/lib/components/track_tile/track_tile.dart @@ -3,7 +3,6 @@ import 'dart:async'; import 'package:auto_route/auto_route.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -307,7 +306,7 @@ class TrackTile extends HookConsumerWidget { userPlaylist: userPlaylist, showMenuCbRef: showOptionCbRef, ), - if (kIsDesktop) const Gap(10), + if (kIsDesktop) const Gap(16), ], ), ), diff --git a/lib/extensions/constrains.dart b/lib/extensions/constrains.dart index b7353c4f..fc77a58f 100644 --- a/lib/extensions/constrains.dart +++ b/lib/extensions/constrains.dart @@ -10,8 +10,11 @@ enum Breakpoint { xxl; bool operator <=(Breakpoint other) => index <= other.index; + bool operator <(Breakpoint other) => index < other.index; + bool operator >(Breakpoint other) => index > other.index; + bool operator >=(Breakpoint other) => index >= other.index; } @@ -26,14 +29,19 @@ const Breakpoints = ( extension SliverBreakpoints on SliverConstraints { bool get isXs => crossAxisExtent <= Breakpoints.xs; + bool get isSm => crossAxisExtent > Breakpoints.xs && crossAxisExtent <= Breakpoints.sm; + bool get isMd => crossAxisExtent > Breakpoints.sm && crossAxisExtent <= Breakpoints.md; + bool get isLg => crossAxisExtent > Breakpoints.md && crossAxisExtent <= Breakpoints.lg; + bool get isXl => crossAxisExtent > Breakpoints.lg && crossAxisExtent <= Breakpoints.xl; + bool get is2Xl => crossAxisExtent > Breakpoints.xl; Breakpoint get breakpoint { @@ -46,26 +54,37 @@ extension SliverBreakpoints on SliverConstraints { } bool get smAndUp => isSm || isMd || isLg || isXl || is2Xl; + bool get mdAndUp => isMd || isLg || isXl || is2Xl; + bool get lgAndUp => isLg || isXl || is2Xl; + bool get xlAndUp => isXl || is2Xl; bool get smAndDown => isXs || isSm; + bool get mdAndDown => isXs || isSm || isMd; + bool get lgAndDown => isXs || isSm || isMd || isLg; + bool get xlAndDown => isXs || isSm || isMd || isLg || isXl; } extension ContainerBreakpoints on BoxConstraints { bool get isXs => biggest.width <= Breakpoints.xs; + bool get isSm => biggest.width > Breakpoints.xs && biggest.width <= Breakpoints.sm; + bool get isMd => biggest.width > Breakpoints.sm && biggest.width <= Breakpoints.md; + bool get isLg => biggest.width > Breakpoints.md && biggest.width <= Breakpoints.lg; + bool get isXl => biggest.width > Breakpoints.lg && biggest.width <= Breakpoints.xl; + bool get is2Xl => biggest.width > Breakpoints.xl; Breakpoint get breakpoint { @@ -78,50 +97,78 @@ extension ContainerBreakpoints on BoxConstraints { } bool get smAndUp => isSm || isMd || isLg || isXl || is2Xl; + bool get mdAndUp => isMd || isLg || isXl || is2Xl; + bool get lgAndUp => isLg || isXl || is2Xl; + bool get xlAndUp => isXl || is2Xl; bool get smAndDown => isXs || isSm; + bool get mdAndDown => isXs || isSm || isMd; + bool get lgAndDown => isXs || isSm || isMd || isLg; + bool get xlAndDown => isXs || isSm || isMd || isLg || isXl; } extension ScreenBreakpoints on MediaQueryData { bool get isXs => size.width <= Breakpoints.xs; + bool get isSm => size.width > Breakpoints.xs && size.width <= Breakpoints.sm; + bool get isMd => size.width > Breakpoints.sm && size.width <= Breakpoints.md; + bool get isLg => size.width > Breakpoints.md && size.width <= Breakpoints.lg; + bool get isXl => size.width > Breakpoints.lg && size.width <= Breakpoints.xl; + bool get is2Xl => size.width > Breakpoints.xl; bool get smAndUp => isSm || isMd || isLg || isXl || is2Xl; + bool get mdAndUp => isMd || isLg || isXl || is2Xl; + bool get lgAndUp => isLg || isXl || is2Xl; + bool get xlAndUp => isXl || is2Xl; bool get smAndDown => isXs || isSm; + bool get mdAndDown => isXs || isSm || isMd; + bool get lgAndDown => isXs || isSm || isMd || isLg; + bool get xlAndDown => isXs || isSm || isMd || isLg || isXl; } extension SizeBreakpoints on Size { bool get isXs => width <= Breakpoints.xs; + bool get isSm => width > Breakpoints.xs && width <= Breakpoints.sm; + bool get isMd => width > Breakpoints.sm && width <= Breakpoints.md; + bool get isLg => width > Breakpoints.md && width <= Breakpoints.lg; + bool get isXl => width > Breakpoints.lg && width <= Breakpoints.xl; + bool get is2Xl => width > Breakpoints.xl; bool get smAndUp => isSm || isMd || isLg || isXl || is2Xl; + bool get mdAndUp => isMd || isLg || isXl || is2Xl; + bool get lgAndUp => isLg || isXl || is2Xl; + bool get xlAndUp => isXl || is2Xl; bool get smAndDown => isXs || isSm; + bool get mdAndDown => isXs || isSm || isMd; + bool get lgAndDown => isXs || isSm || isMd || isLg; + bool get xlAndDown => isXs || isSm || isMd || isLg || isXl; } diff --git a/lib/extensions/duration.dart b/lib/extensions/duration.dart index ff670b1a..963833fb 100644 --- a/lib/extensions/duration.dart +++ b/lib/extensions/duration.dart @@ -1,5 +1,5 @@ -import 'package:duration/locale.dart'; import 'package:duration/duration.dart'; +import 'package:duration/locale.dart'; extension DurationToHumanReadableString on Duration { String toHumanReadableString({padZero = true}) { diff --git a/lib/extensions/image.dart b/lib/extensions/image.dart index ee78653a..240a8d27 100644 --- a/lib/extensions/image.dart +++ b/lib/extensions/image.dart @@ -1,7 +1,7 @@ +import 'package:collection/collection.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/utils/primitive_utils.dart'; -import 'package:collection/collection.dart'; enum ImagePlaceholder { albumArt, diff --git a/lib/extensions/string.dart b/lib/extensions/string.dart index 94123fe3..6241f905 100644 --- a/lib/extensions/string.dart +++ b/lib/extensions/string.dart @@ -1,15 +1,17 @@ -import 'package:html_unescape/html_unescape.dart'; import 'package:html/parser.dart'; +import 'package:html_unescape/html_unescape.dart'; final htmlEscape = HtmlUnescape(); extension UnescapeHtml on String { String cleanHtml() => parse("

    $this

    ").documentElement!.text; + String unescapeHtml() => htmlEscape.convert(this); } extension NullableUnescapeHtml on String? { String? cleanHtml() => this?.cleanHtml(); + String? unescapeHtml() => this?.unescapeHtml(); } diff --git a/lib/generated_plugin_registrant.dart b/lib/generated_plugin_registrant.dart deleted file mode 100644 index a25a1f5f..00000000 --- a/lib/generated_plugin_registrant.dart +++ /dev/null @@ -1,23 +0,0 @@ -// -// Generated file. Do not edit. -// - -// ignore_for_file: directives_ordering -// ignore_for_file: lines_longer_than_80_chars -// ignore_for_file: depend_on_referenced_packages - -import 'package:audio_service_web/audio_service_web.dart'; -import 'package:audio_session/audio_session_web.dart'; -import 'package:shared_preferences_web/shared_preferences_web.dart'; -import 'package:url_launcher_web/url_launcher_web.dart'; - -import 'package:flutter_web_plugins/flutter_web_plugins.dart'; - -// ignore: public_member_api_docs -void registerPlugins(Registrar registrar) { - AudioServiceWeb.registerWith(registrar); - AudioSessionWeb.registerWith(registrar); - SharedPreferencesPlugin.registerWith(registrar); - UrlLauncherPlugin.registerWith(registrar); - registrar.registerMessageHandler(); -} diff --git a/lib/hooks/configurators/use_close_behavior.dart b/lib/hooks/configurators/use_close_behavior.dart index 2bdc65ef..5d30fa0a 100644 --- a/lib/hooks/configurators/use_close_behavior.dart +++ b/lib/hooks/configurators/use_close_behavior.dart @@ -1,11 +1,10 @@ import 'dart:io'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:local_notifier/local_notifier.dart'; import 'package:spotube/hooks/configurators/use_window_listener.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; - -import 'package:local_notifier/local_notifier.dart'; import 'package:spotube/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/hooks/configurators/use_deep_linking.dart b/lib/hooks/configurators/use_deep_linking.dart index a141a21d..5384ec68 100644 --- a/lib/hooks/configurators/use_deep_linking.dart +++ b/lib/hooks/configurators/use_deep_linking.dart @@ -2,12 +2,12 @@ import 'dart:async'; import 'package:app_links/app_links.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_sharing_intent/flutter_sharing_intent.dart'; +import 'package:flutter_sharing_intent/model/sharing_file.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotube/collections/routes.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:flutter_sharing_intent/flutter_sharing_intent.dart'; -import 'package:flutter_sharing_intent/model/sharing_file.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/utils/platform.dart'; diff --git a/lib/hooks/configurators/use_disable_battery_optimizations.dart b/lib/hooks/configurators/use_disable_battery_optimizations.dart index 4aa51b74..1afb0ed4 100644 --- a/lib/hooks/configurators/use_disable_battery_optimizations.dart +++ b/lib/hooks/configurators/use_disable_battery_optimizations.dart @@ -1,5 +1,4 @@ import 'package:disable_battery_optimization/disable_battery_optimization.dart'; - import 'package:spotube/hooks/utils/use_async_effect.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; import 'package:spotube/utils/platform.dart'; diff --git a/lib/hooks/configurators/use_endless_playback.dart b/lib/hooks/configurators/use_endless_playback.dart index b86a4865..2a6b00ce 100644 --- a/lib/hooks/configurators/use_endless_playback.dart +++ b/lib/hooks/configurators/use_endless_playback.dart @@ -1,12 +1,12 @@ -import 'package:spotube/services/logger/logger.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:spotify/spotify.dart'; -import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; +import 'package:spotube/services/logger/logger.dart'; void useEndlessPlayback(WidgetRef ref) { final auth = ref.watch(authenticationProvider); diff --git a/lib/hooks/configurators/use_fix_window_stretching.dart b/lib/hooks/configurators/use_fix_window_stretching.dart index b94098ab..d03d62b6 100644 --- a/lib/hooks/configurators/use_fix_window_stretching.dart +++ b/lib/hooks/configurators/use_fix_window_stretching.dart @@ -1,5 +1,5 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/hooks/configurators/use_get_storage_perms.dart b/lib/hooks/configurators/use_get_storage_perms.dart index f860aaa7..1719c52b 100644 --- a/lib/hooks/configurators/use_get_storage_perms.dart +++ b/lib/hooks/configurators/use_get_storage_perms.dart @@ -1,5 +1,4 @@ import 'package:device_info_plus/device_info_plus.dart'; - import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:permission_handler/permission_handler.dart'; diff --git a/lib/hooks/configurators/use_has_touch.dart b/lib/hooks/configurators/use_has_touch.dart index 5ce309b8..a7adf302 100644 --- a/lib/hooks/configurators/use_has_touch.dart +++ b/lib/hooks/configurators/use_has_touch.dart @@ -1,6 +1,6 @@ import 'package:flutter/gestures.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/utils/platform.dart'; bool useHasTouch() { diff --git a/lib/hooks/configurators/use_window_listener.dart b/lib/hooks/configurators/use_window_listener.dart index 5977ea8e..6229c827 100644 --- a/lib/hooks/configurators/use_window_listener.dart +++ b/lib/hooks/configurators/use_window_listener.dart @@ -1,5 +1,4 @@ import 'package:flutter/widgets.dart'; - import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:spotube/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/hooks/controllers/use_auto_scroll_controller.dart b/lib/hooks/controllers/use_auto_scroll_controller.dart index befc4351..ff526539 100644 --- a/lib/hooks/controllers/use_auto_scroll_controller.dart +++ b/lib/hooks/controllers/use_auto_scroll_controller.dart @@ -1,6 +1,6 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; /// Creates [AutoScrollController] that will be disposed automatically. /// diff --git a/lib/hooks/controllers/use_package_info.dart b/lib/hooks/controllers/use_package_info.dart index 07b53af6..14f0841b 100644 --- a/lib/hooks/controllers/use_package_info.dart +++ b/lib/hooks/controllers/use_package_info.dart @@ -1,6 +1,6 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:package_info_plus/package_info_plus.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; PackageInfo usePackageInfo({ /// The app name. `CFBundleDisplayName` on iOS, `application/label` on Android. diff --git a/lib/hooks/utils/use_breakpoint_value.dart b/lib/hooks/utils/use_breakpoint_value.dart index 74b2f860..05edd569 100644 --- a/lib/hooks/utils/use_breakpoint_value.dart +++ b/lib/hooks/utils/use_breakpoint_value.dart @@ -1,5 +1,5 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/extensions/constrains.dart'; T useBreakpointValue({ diff --git a/lib/hooks/utils/use_brightness_value.dart b/lib/hooks/utils/use_brightness_value.dart index 64e3f27c..2ff44f10 100644 --- a/lib/hooks/utils/use_brightness_value.dart +++ b/lib/hooks/utils/use_brightness_value.dart @@ -1,6 +1,6 @@ import 'package:flutter/services.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; T useBrightnessValue( T lightValue, diff --git a/lib/hooks/utils/use_custom_status_bar_color.dart b/lib/hooks/utils/use_custom_status_bar_color.dart index f34ae7a8..e4eb00eb 100644 --- a/lib/hooks/utils/use_custom_status_bar_color.dart +++ b/lib/hooks/utils/use_custom_status_bar_color.dart @@ -1,6 +1,6 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; VoidCallback useCustomStatusBarColor( Color color, diff --git a/lib/hooks/utils/use_palette_color.dart b/lib/hooks/utils/use_palette_color.dart index c70bcf72..e82c9889 100644 --- a/lib/hooks/utils/use_palette_color.dart +++ b/lib/hooks/utils/use_palette_color.dart @@ -1,8 +1,8 @@ import 'package:flutter/services.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:palette_generator/palette_generator.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/components/image/universal_image.dart'; final _paletteColorState = StateProvider( diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index f4cbde9b..dec36071 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -90,7 +90,7 @@ "mini_player": "مشغل مصغر", "slide_to_seek": "قم بالتمرير للبحث للأمام أو للخلف", "shuffle_playlist": "قائمة تشغيل عشوائية", - "unshuffle_playlist": "إلغاء ترتيب قائمة التشغيل", + "not_shuffle_playlist": "إلغاء ترتيب قائمة التشغيل", "previous_track": "المقطوعة السابقة", "next_track": "مقطوعة جديدة", "pause_playback": "إيقاف التشغيل مؤقتًا", @@ -175,7 +175,7 @@ "first_go_to": "أولا، اذهب إلى", "login_if_not_logged_in": "وتسجيل الدخول/الاشتراك إذا لم تقم بتسجيل الدخول", "step_2": "الخطوة 2", - "step_2_steps": "1. بمجرد تسجيل الدخول، اضغط على F12 أو انقر بزر الماوس الأيمن > فحص لفتح أدوات تطوير المتصفح.\n2. ثم انتقل إلى علامة التبويب \"التطبيقات\" (Chrome وEdge وBrave وما إلى ذلك.) أو علامة التبويب \"التخزين\" (Firefox وPalemoon وما إلى ذلك..)\n3. انتقل إلى قسم \"ملفات تعريف الارتباط\" ثم القسم الفرعي \"https://accounts.spotify.com\"", + "step_2_steps": "1. بمجرد تسجيل الدخول، اضغط على F12 أو انقر بزر الماوس الأيمن > فحص لفتح أدوات تطوير المتصفح.\n2. ثم انتقل إلى علامة التبويب \"التطبيقات\" (Chrome وEdge وBrave وما إلى ذلك.) أو علامة التبويب \"التخزين\" (Firefox وPale Moon وما إلى ذلك..)\n3. انتقل إلى قسم \"ملفات تعريف الارتباط\" ثم القسم الفرعي \"https://accounts.spotify.com\"", "step_3": "الخطوة 3", "success_emoji": "نجاح 🥳", "success_message": "لقد قمت الآن بتسجيل الدخول بنجاح باستخدام حساب Spotify الخاص بك. عمل جيد يا صديقي!", @@ -196,13 +196,13 @@ "add_genres": "أضف الأنواع", "country": "دولة", "number_of_tracks_generate": "عدد المسارات المقطوعات المراد توليدها", - "acousticness": "صوتية", - "danceability": "قدرة على الرقص", + "not_acoustic": "صوتية", + "dance_ability": "قدرة على الرقص", "energy": "طاقة", - "instrumentalness": "نفعية", + "not_instrumental": "نفعية", "liveness": "حيوية", "loudness": "بريق", - "speechiness": "كلام", + "talkative": "كلام", "valence": "تكافؤ", "popularity": "شعبية", "key": "مفتاح", @@ -241,7 +241,7 @@ "sort_newest": "الترتيب حسب الأقدم", "sort_oldest": "الترتيب حسب الأقدم", "sleep_timer": "مؤقت النوم", - "mins": "{minutes} دقائق", + "minutes": "{minutes} دقائق", "hours": "{hours} ساعات", "hour": "{hours} ساعة", "custom_hours": "ساعات مخصصة", @@ -252,7 +252,7 @@ "audio_source": "مصدر الصوت", "ok": "حسسناً", "failed_to_encrypt": "فشل في التشفير", - "encryption_failed_warning": "يستخدم Spotube التشفير لتخزين بياناتك بشكل آمن. لكنها فشلت في القيام بذلك. لذلك سيعود الأمر إلى التخزين غير الآمن\nإذا كنت تستخدم Linux، فيرجى التأكد من تثبيت أي خدمة سرية (gnome-keyring، kde-wallet، keepassxc، إلخ)", + "encryption_failed_warning": "يستخدم Spotube التشفير لتخزين بياناتك بشكل آمن. لكنها فشلت في القيام بذلك. لذلك سيعود الأمر إلى التخزين غير الآمن\nإذا كنت تستخدم Linux، فيرجى التأكد من تثبيت أي خدمة سرية (gnome-keyring، kde-wallet، KeePassXC، إلخ)", "querying_info": "جارٍ الاستعلام عن معلومات...", "piped_api_down": "Piped API معطلة", "piped_down_error_instructions": "المثيل الموجه {pipedInstance} معطل حاليًا\n\nيمكنك إما تغيير المثيل أو تغيير 'نوع API' إلى YouTube API الرسمي\n\nتأكد من إعادة تشغيل التطبيق بعد التغيير", @@ -370,9 +370,9 @@ "streamed_songs": "الأغاني المذاعة", "count_streams": "{count} بث", "owned_by_you": "مملوك لك", - "copied_shareurl_to_clipboard": "تم نسخ {shareUrl} إلى الحافظة", - "spotify_hipotetical_calculation": "*هذا محسوب بناءً على الدفع لكل بث من سبوتيفاي\nبقيمة 0.003 إلى 0.005 دولار. هذا حساب افتراضي\nلإعطاء المستخدم فكرة عن المبلغ الذي\nكان سيدفعه للفنانين إذا كانوا قد استمعوا\nإلى أغنيتهم على سبوتيفاي.", - "count_mins": "{minutes} دقيقة", + "copied_share_url_to_clipboard": "تم نسخ {shareUrl} إلى الحافظة", + "spotify_hypothetical_calculation": "*هذا محسوب بناءً على الدفع لكل بث من سبوتيفاي\nبقيمة 0.003 إلى 0.005 دولار. هذا حساب افتراضي\nلإعطاء المستخدم فكرة عن المبلغ الذي\nكان سيدفعه للفنانين إذا كانوا قد استمعوا\nإلى أغنيتهم على سبوتيفاي.", + "count_minutes": "{minutes} دقيقة", "summary_minutes": "الدقائق", "summary_listened_to_music": "استمعت إلى الموسيقى", "summary_songs": "أغاني", diff --git a/lib/l10n/app_bn.arb b/lib/l10n/app_bn.arb index cc2971ce..b5bad6a9 100644 --- a/lib/l10n/app_bn.arb +++ b/lib/l10n/app_bn.arb @@ -88,7 +88,7 @@ "mini_player": "মিনি প্লেয়ার", "slide_to_seek": "গান সামনে বা পিছনে নিতে স্লাইড করুন", "shuffle_playlist": "প্লেলিস্ট এলোমেলো করুন", - "unshuffle_playlist": "প্লেলিস্ট আগের মতো করুন", + "not_shuffle_playlist": "প্লেলিস্ট আগের মতো করুন", "previous_track": "আগের গানের ট্র্যাক", "next_track": "পরের গানের ট্র্যাক", "pause_playback": "গান বন্ধ করুন", @@ -173,7 +173,7 @@ "first_go_to": "প্রথমে যান", "login_if_not_logged_in": "এবং যদি আপনি লগইন/সাইন-আপ না থাকেন তবে লগইন/সাইন-আপ করুন", "step_2": "ধাপ 2", - "step_2_steps": "১. একবার আপনি লগ ইন করলে, ব্রাউজার ডেভটুল খুলতে F12 বা মাউসের রাইট ক্লিক > \"Inspect to open Browser DevTools\" টিপুন।\n২. তারপর \"Application\" ট্যাবে যান (Chrome, Edge, Brave etc..) অথবা \"Storage\" Tab (Firefox, Palemoon etc..)\n৩. \"Cookies \" বিভাগে যান তারপর \"https://accounts.spotify.com\" উপবিভাগে যান", + "step_2_steps": "১. একবার আপনি লগ ইন করলে, ব্রাউজার ডেভটুল খুলতে F12 বা মাউসের রাইট ক্লিক > \"Inspect to open Browser DevTools\" টিপুন।\n২. তারপর \"Application\" ট্যাবে যান (Chrome, Edge, Brave etc..) অথবা \"Storage\" Tab (Firefox, Pale Moon etc..)\n৩. \"Cookies \" বিভাগে যান তারপর \"https://accounts.spotify.com\" উপবিভাগে যান", "step_3": "ধাপ 3", "success_emoji": "আমরা সফল🥳", "success_message": "এখন আপনি সফলভাবে আপনার Spotify অ্যাকাউন্ট দিয়ে লগ ইন করেছেন। সাধুভাত আপনাকে", @@ -194,13 +194,13 @@ "add_genres": "গানের ধরণ যুক্ত করুন", "country": "দেশ", "number_of_tracks_generate": "উত্পাদিত ট্র্যাকের সংখ্যা", - "acousticness": "অধ্যাত্মিকতা", - "danceability": "নৃত্যমূলকতা", + "not_acoustic": "অধ্যাত্মিকতা", + "dance_ability": "নৃত্যমূলকতা", "energy": "শক্তি", - "instrumentalness": "সাধারণতা", + "not_instrumental": "সাধারণতা", "liveness": "জীবনমুক্ততা", "loudness": "স্বরের উচ্চতা", - "speechiness": "বক্তব্যমূলকতা", + "talkative": "বক্তব্যমূলকতা", "valence": "সন্তোষমূলকতা", "popularity": "জনপ্রিয়তা", "key": "কী", @@ -239,7 +239,7 @@ "sort_newest": "নতুনতম অনুসারে সাজান", "sort_oldest": "পুরানোতম অনুসারে সাজান", "sleep_timer": "স্লীপ টাইমার", - "mins": "{minutes} মিনিট", + "minutes": "{minutes} মিনিট", "hours": "{hours} ঘন্টা", "hour": "{hours} ঘন্টা", "custom_hours": "কাস্টম ঘন্টা", @@ -250,7 +250,7 @@ "audio_source": "অডিও উৎস", "ok": "ঠিক আছে", "failed_to_encrypt": "এনক্রিপ্ট করা ব্যর্থ হয়েছে", - "encryption_failed_warning": "Spotube আপনার তথ্যগুলি নিরাপদভাবে স্টোর করতে এনক্রিপশন ব্যবহার করে। কিন্তু এটি ব্যর্থ হয়েছে। তাই এটি অনিরাপদ স্টোরে ফলফল হবে\nযদি আপনি Linux ব্যবহার করেন, তবে দয়া করে নিশ্চিত হউন যে আপনার কোনও সিক্রেট-সার্ভিস gnome-keyring, kde-wallet, keepassxc ইত্যাদি ইনস্টল করা আছে", + "encryption_failed_warning": "Spotube আপনার তথ্যগুলি নিরাপদভাবে স্টোর করতে এনক্রিপশন ব্যবহার করে। কিন্তু এটি ব্যর্থ হয়েছে। তাই এটি অনিরাপদ স্টোরে ফলফল হবে\nযদি আপনি Linux ব্যবহার করেন, তবে দয়া করে নিশ্চিত হউন যে আপনার কোনও সিক্রেট-সার্ভিস gnome-keyring, kde-wallet, KeePassXC ইত্যাদি ইনস্টল করা আছে", "querying_info": "তথ্য অনুসন্ধান করা হচ্ছে", "piped_api_down": "পাইপড API ডাউন আছে", "piped_down_error_instructions": "বর্তমানে পাইপড ইনস্ট্যান্স {pipedInstance} ডাউন আছে\n\nইনস্ট্যান্স পরিবর্তন করুন অথবা 'API টাইপ' পরিবর্তন করুন অফিসিয়াল ইউটিউব API হতে\n\nপরিবর্তনের পরে অ্যাপটি পুনরায় চালানোর নিশ্চিত করুন", @@ -370,9 +370,9 @@ "streamed_songs": "স্ট্রিম করা গান", "count_streams": "{count} বার স্ট্রিম", "owned_by_you": "আপনার মালিকানাধীন", - "copied_shareurl_to_clipboard": "{shareUrl} ক্লিপবোর্ডে কপি করা হয়েছে", - "spotify_hipotetical_calculation": "*এটি স্পোটিফাইয়ের প্রতি স্ট্রিম\n$0.003 থেকে $0.005 পেআউটের ভিত্তিতে গণনা করা হয়েছে। এটি একটি ধারণাগত\nগণনা ব্যবহারকারীদেরকে জানাতে দেয় যে কত টাকা\nতারা শিল্পীদের দিতো যদি তারা স্পোটিফাইতে\nতাদের গান শুনতেন।", - "count_mins": "{minutes} মিনিট", + "copied_share_url_to_clipboard": "{shareUrl} ক্লিপবোর্ডে কপি করা হয়েছে", + "spotify_hypothetical_calculation": "*এটি স্পোটিফাইয়ের প্রতি স্ট্রিম\n$0.003 থেকে $0.005 পেআউটের ভিত্তিতে গণনা করা হয়েছে। এটি একটি ধারণাগত\nগণনা ব্যবহারকারীদেরকে জানাতে দেয় যে কত টাকা\nতারা শিল্পীদের দিতো যদি তারা স্পোটিফাইতে\nতাদের গান শুনতেন।", + "count_minutes": "{minutes} মিনিট", "summary_minutes": "মিনিট", "summary_listened_to_music": "সঙ্গীত শুনেছেন", "summary_songs": "গান", diff --git a/lib/l10n/app_ca.arb b/lib/l10n/app_ca.arb index 7cb007c4..a89b24c5 100644 --- a/lib/l10n/app_ca.arb +++ b/lib/l10n/app_ca.arb @@ -88,7 +88,7 @@ "mini_player": "Reproductor Petit", "slide_to_seek": "Lliscar per cercar endavant o endarrere", "shuffle_playlist": "Mesclar la llista de reproducció", - "unshuffle_playlist": "No mesclar la llista de reproducció", + "not_shuffle_playlist": "No mesclar la llista de reproducció", "previous_track": "Cançó anterior", "next_track": "Canço següent", "pause_playback": "Pausar reproducció", @@ -173,7 +173,7 @@ "first_go_to": "Primer, vagi a", "login_if_not_logged_in": "i iniciï sessió/registri el seu compte si no ho ha fet encara", "step_2": "Pas 2", - "step_2_steps": "1. Una vegada que hagi iniciat sessió, premi F12 o faci clic dret amb el ratolí > Inspeccionar per obrir les eines de desenvolulpador del navegador.\n2. Després vagi a la pestanya \"Application\" (Chrome, Edge, Brave, etc.) o \"Storage\" (Firefox, Palemoon, etc.)\n3. Vagi a la secció \"Cookies\" i després a la subsecció \"https://accounts.spotify.com\"", + "step_2_steps": "1. Una vegada que hagi iniciat sessió, premi F12 o faci clic dret amb el ratolí > Inspeccionar per obrir les eines de desenvolulpador del navegador.\n2. Després vagi a la pestanya \"Application\" (Chrome, Edge, Brave, etc.) o \"Storage\" (Firefox, Pale Moon, etc.)\n3. Vagi a la secció \"Cookies\" i després a la subsecció \"https://accounts.spotify.com\"", "step_3": "Pas 3", "success_emoji": "Èxit! 🥳", "success_message": "Ara has iniciat sessió amb èxit al teu compte de Spotify. Bona feina!", @@ -194,13 +194,13 @@ "add_genres": "Afegir Gèneres", "country": "País", "number_of_tracks_generate": "Número de cançons a generar", - "acousticness": "Acústica", - "danceability": "Ballabilitat", + "not_acoustic": "Acústica", + "dance_ability": "Ballabilitat", "energy": "Energia", - "instrumentalness": "Instrumental", + "not_instrumental": "Instrumental", "liveness": "En viu", "loudness": "Sonoritat", - "speechiness": "Parla", + "talkative": "Parla", "valence": "Valencia", "popularity": "Popularidad", "key": "To", @@ -239,7 +239,7 @@ "sort_newest": "Ordenar per més noves", "sort_oldest": "Ordenar per més antigues", "sleep_timer": "Temporitzador d'apagat", - "mins": "{minutes} minuts", + "minutes": "{minutes} minuts", "hours": "{hours} hores", "hour": "{hours} hora", "custom_hours": "Hores personalitzades", @@ -250,7 +250,7 @@ "audio_source": "Font d'àudio", "ok": "OK", "failed_to_encrypt": "Error al xifrar", - "encryption_failed_warning": "Spotube utilitza el xifrado per emmagatzemar les seves dades de forma segura. Però ha fallat. Per tant, tornarà a un emmagatzament no segur\nSi estè utilizant Linux, asseguri's de tenir instal·lats els serveis secrets com gnome-keyring, kde-wallet i keepassxc", + "encryption_failed_warning": "Spotube utilitza el xifrado per emmagatzemar les seves dades de forma segura. Però ha fallat. Per tant, tornarà a un emmagatzament no segur\nSi estè utilizant Linux, asseguri's de tenir instal·lats els serveis secrets com gnome-keyring, kde-wallet i KeePassXC", "piped_api_down": "La API de Piped no està operativa", "piped_down_error_instructions": "La instància de Piped {pipedInstance} no està operativa en aquest moment\n\nCanvieu la instància o canvieu el 'Tipus d'API' a l'API oficial de YouTube\n\nAssegureu-vos de reiniciar l'aplicació després del canvi", "you_are_offline": "Actualment no teniu connexió a internet", @@ -370,9 +370,9 @@ "streamed_songs": "cançons reproduïdes", "count_streams": "{count} reproduccions", "owned_by_you": "De la teva propietat", - "copied_shareurl_to_clipboard": "S'ha copiat {shareUrl} al porta-retalls", - "spotify_hipotetical_calculation": "*Això es calcula basant-se en els\npagaments per reproducció de Spotify de $0.003 a $0.005.\nAquest és un càlcul hipotètic per\ndonar als usuaris una idea de quant\nhaurien pagat als artistes si haguessin escoltat\nla seva cançó a Spotify.", - "count_mins": "{minutes} minuts", + "copied_share_url_to_clipboard": "S'ha copiat {shareUrl} al porta-retalls", + "spotify_hypothetical_calculation": "*Això es calcula basant-se en els\npagaments per reproducció de Spotify de $0.003 a $0.005.\nAquest és un càlcul hipotètic per\ndonar als usuaris una idea de quant\nhaurien pagat als artistes si haguessin escoltat\nla seva cançó a Spotify.", + "count_minutes": "{minutes} minuts", "summary_minutes": "minuts", "summary_listened_to_music": "has escoltat música", "summary_songs": "cançons", diff --git a/lib/l10n/app_cs.arb b/lib/l10n/app_cs.arb index a6fdf25c..84f4ca56 100644 --- a/lib/l10n/app_cs.arb +++ b/lib/l10n/app_cs.arb @@ -91,7 +91,7 @@ "mini_player": "Mini přehrávač", "slide_to_seek": "Táhněte pro posunutí vpřed nebo vzad", "shuffle_playlist": "Zamíchat playlist", - "unshuffle_playlist": "Zrušit zamíchání playlistu", + "not_shuffle_playlist": "Zrušit zamíchání playlistu", "previous_track": "Předchozí skladba", "next_track": "Další skladba", "pause_playback": "Pozastavit přehrávání", @@ -176,7 +176,7 @@ "first_go_to": "Nejprve jděte na", "login_if_not_logged_in": "a přihlašte se nebo se zaregistrujte, pokud nejste přihlášeni", "step_2": "Krok 2", - "step_2_steps": "1. Jakmile jste přihlášeni, stiskněte F12 nebo pravé tlačítko myši > Prozkoumat, abyste otevřeli nástroje pro vývojáře prohlížeče.\n2. Poté přejděte na kartu \"Aplikace\" (Chrome, Edge, Brave atd.) nebo kartu \"Úložiště\" (Firefox, Palemoon atd.)\n3. Přejděte do sekce \"Cookies\" a pak do podsekce \"https://accounts.spotify.com\"", + "step_2_steps": "1. Jakmile jste přihlášeni, stiskněte F12 nebo pravé tlačítko myši > Prozkoumat, abyste otevřeli nástroje pro vývojáře prohlížeče.\n2. Poté přejděte na kartu \"Aplikace\" (Chrome, Edge, Brave atd.) nebo kartu \"Úložiště\" (Firefox, Pale Moon atd.)\n3. Přejděte do sekce \"Cookies\" a pak do podsekce \"https://accounts.spotify.com\"", "step_3": "Krok 3", "step_3_steps": "Zkopírujte hodnotu cookie \"sp_dc\"", "success_emoji": "Úspěch🥳", @@ -199,13 +199,13 @@ "add_genres": "Přidat žánry", "country": "Země", "number_of_tracks_generate": "Počet skladeb k vygenerování", - "acousticness": "Akustičnost", - "danceability": "Tanečnost", + "not_acoustic": "Akustičnost", + "dance_ability": "Tanečnost", "energy": "Energie", - "instrumentalness": "Instrumentálnost", + "not_instrumental": "Instrumentálnost", "liveness": "Živost", "loudness": "Hlasitost", - "speechiness": "Mluvnost", + "talkative": "Mluvnost", "valence": "Valence", "popularity": "Popularita", "key": "Klíč", @@ -244,7 +244,7 @@ "sort_newest": "Seřadit od nejnovějších", "sort_oldest": "Seřadit od nejstarších", "sleep_timer": "Časovač spánku", - "mins": "{minutes} Minut", + "minutes": "{minutes} Minut", "hours": "{hours} Hodin", "hour": "{hours} Hodina", "custom_hours": "Vlastní hodiny", @@ -255,7 +255,7 @@ "audio_source": "Zdroj zvuku", "ok": "Ok", "failed_to_encrypt": "Šifrování selhalo", - "encryption_failed_warning": "Spotube používá šifrování k bezpečnému ukládání vašich dat. Ale selhalo. Takže se vrátí k nezabezpečenému úložišti\nPokud používáte linux, ujistěte se, že máte nainstalovanou jakoukoli službu k ukládání bezpečnostních pověření (gnome-keyring, kde-wallet, keepassxc atd.)", + "encryption_failed_warning": "Spotube používá šifrování k bezpečnému ukládání vašich dat. Ale selhalo. Takže se vrátí k nezabezpečenému úložišti\nPokud používáte linux, ujistěte se, že máte nainstalovanou jakoukoli službu k ukládání bezpečnostních pověření (gnome-keyring, kde-wallet, KeePassXC atd.)", "querying_info": "Získávání informací...", "piped_api_down": "Piped API je mimo provoz", "piped_down_error_instructions": "Instance Piped {pipedInstance} je momentálně mimo provoz\n\nBuď změňte instanci nebo změňte 'Typ API' na oficiální YouTube API\n\nPo změně se ujistěte, že aplikaci restartujete", @@ -370,9 +370,9 @@ "streamed_songs": "Streamované skladby", "count_streams": "{count} streamů", "owned_by_you": "Vlastněno vámi", - "copied_shareurl_to_clipboard": "Zkopírováno {shareUrl} do schránky", - "spotify_hipotetical_calculation": "*Toto je vypočítáno na základě výplaty\nza stream Spotify od $0.003 do $0.005.\nToto je hypotetický výpočet,\nabyste měli představu o tom, kolik\nbyste zaplatili umělcům,\npokud byste poslouchali jejich píseň na Spotify.", - "count_mins": "{minutes} minut", + "copied_share_url_to_clipboard": "Zkopírováno {shareUrl} do schránky", + "spotify_hypothetical_calculation": "*Toto je vypočítáno na základě výplaty\nza stream Spotify od $0.003 do $0.005.\nToto je hypotetický výpočet,\nabyste měli představu o tom, kolik\nbyste zaplatili umělcům,\npokud byste poslouchali jejich píseň na Spotify.", + "count_minutes": "{minutes} minut", "summary_minutes": "minuty", "summary_listened_to_music": "Poslouchal(a) hudbu", "summary_songs": "písně", diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index af2b26ad..ea28b23c 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -88,7 +88,7 @@ "mini_player": "Mini-Player", "slide_to_seek": "Zum Vor- oder Zurückspulen ziehen", "shuffle_playlist": "Playlist mischen", - "unshuffle_playlist": "Playlist nicht mehr mischen", + "not_shuffle_playlist": "Playlist nicht mehr mischen", "previous_track": "Vorheriger Track", "next_track": "Nächster Track", "pause_playback": "Wiedergabe pausieren", @@ -173,7 +173,7 @@ "first_go_to": "Gehe zuerst zu", "login_if_not_logged_in": "und melde dich an/registriere dich, falls du nicht angemeldet bist", "step_2": "Schritt 2", - "step_2_steps": "1. Wenn du angemeldet bist, drücke F12 oder klicke mit der rechten Maustaste > Inspektion, um die Browser-Entwicklertools zu öffnen.\n2. Gehe dann zum \"Anwendungs\"-Tab (Chrome, Edge, Brave usw.) oder zum \"Storage\"-Tab (Firefox, Palemoon usw.)\n3. Gehe zum Abschnitt \"Cookies\" und dann zum Unterabschnitt \"https://accounts.spotify.com\"", + "step_2_steps": "1. Wenn du angemeldet bist, drücke F12 oder klicke mit der rechten Maustaste > Inspektion, um die Browser-Entwicklertools zu öffnen.\n2. Gehe dann zum \"Anwendungs\"-Tab (Chrome, Edge, Brave usw.) oder zum \"Storage\"-Tab (Firefox, Pale Moon usw.)\n3. Gehe zum Abschnitt \"Cookies\" und dann zum Unterabschnitt \"https://accounts.spotify.com\"", "step_3": "Schritt 3", "success_emoji": "Erfolg🥳", "success_message": "Jetzt bist du erfolgreich mit deinem Spotify-Konto angemeldet. Gut gemacht, Kumpel!", @@ -194,13 +194,13 @@ "add_genres": "Genres hinzufügen", "country": "Land", "number_of_tracks_generate": "Anzahl der zu generierenden Titel", - "acousticness": "Akustik", - "danceability": "Tanzbarkeit", + "not_acoustic": "Akustik", + "dance_ability": "Tanzbarkeit", "energy": "Energie", - "instrumentalness": "Instrumentalität", + "not_instrumental": "Instrumentalität", "liveness": "Lebendigkeit", "loudness": "Lautstärke", - "speechiness": "Sprechanteil", + "talkative": "Sprechanteil", "valence": "Stimmung", "popularity": "Beliebtheit", "key": "Tonart", @@ -239,7 +239,7 @@ "sort_newest": "Nach neuesten Hinzufügungen sortieren", "sort_oldest": "Nach ältesten Hinzufügungen sortieren", "sleep_timer": "Schlaftimer", - "mins": "{minutes} Minuten", + "minutes": "{minutes} Minuten", "hours": "{hours} Stunden", "hour": "{hours} Stunde", "custom_hours": "Benutzerdefinierte Stunden", @@ -250,7 +250,7 @@ "audio_source": "Audioquelle", "ok": "OK", "failed_to_encrypt": "Verschlüsselung fehlgeschlagen", - "encryption_failed_warning": "Spotube verwendet Verschlüsselung, um Ihre Daten sicher zu speichern. Dies ist jedoch fehlgeschlagen. Daher wird es auf unsichere Speicherung zurückgreifen\nWenn Sie Linux verwenden, stellen Sie bitte sicher, dass Sie Secret-Services wie gnome-keyring, kde-wallet und keepassxc installiert haben", + "encryption_failed_warning": "Spotube verwendet Verschlüsselung, um Ihre Daten sicher zu speichern. Dies ist jedoch fehlgeschlagen. Daher wird es auf unsichere Speicherung zurückgreifen\nWenn Sie Linux verwenden, stellen Sie bitte sicher, dass Sie Secret-Services wie gnome-keyring, kde-wallet und KeePassXC installiert haben", "querying_info": "Abfrageinformationen...", "piped_api_down": "Die Piped API ist ausgefallen", "piped_down_error_instructions": "Die Piped-Instanz {pipedInstance} ist derzeit nicht verfügbar\n\nEntweder ändern Sie die Instanz oder wechseln Sie den 'API-Typ' zur offiziellen YouTube API\n\nStellen Sie sicher, dass Sie die App nach der Änderung neu starten", @@ -370,9 +370,9 @@ "streamed_songs": "Gestreamte Lieder", "count_streams": "{count} Streams", "owned_by_you": "In Ihrem Besitz", - "copied_shareurl_to_clipboard": "{shareUrl} in die Zwischenablage kopiert", - "spotify_hipotetical_calculation": "*Dies ist basierend auf Spotifys\npro Stream Auszahlung von $0,003 bis $0,005\nberechnet. Dies ist eine hypothetische Berechnung,\num dem Benutzer Einblick zu geben,\nwieviel sie den Künstlern gezahlt hätten,\nwenn sie ihren Song auf Spotify gehört hätten.", - "count_mins": "{minutes} Minuten", + "copied_share_url_to_clipboard": "{shareUrl} in die Zwischenablage kopiert", + "spotify_hypothetical_calculation": "*Dies ist basierend auf Spotifys\npro Stream Auszahlung von $0,003 bis $0,005\nberechnet. Dies ist eine hypothetische Berechnung,\num dem Benutzer Einblick zu geben,\nwieviel sie den Künstlern gezahlt hätten,\nwenn sie ihren Song auf Spotify gehört hätten.", + "count_minutes": "{minutes} Minuten", "summary_minutes": "Minuten", "summary_listened_to_music": "Hat Musik gehört", "summary_songs": "Lieder", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index e3e6d330..14a06982 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1,428 +1,428 @@ { - "guest": "Guest", - "browse": "Browse", - "search": "Search", - "library": "Library", - "lyrics": "Lyrics", - "settings": "Settings", - "genre_categories_filter": "Filter categories or genres...", - "genre": "Genre", - "personalized": "Personalized", - "featured": "Featured", - "new_releases": "New Releases", - "songs": "Songs", - "playing_track": "Playing {track}", - "queue_clear_alert": "This will clear the current queue. {track_length} tracks will be removed\nDo you want to continue?", - "load_more": "Load more", - "playlists": "Playlists", - "artists": "Artists", - "albums": "Albums", - "tracks": "Tracks", - "downloads": "Downloads", - "filter_playlists": "Filter your playlists...", - "liked_tracks": "Liked Tracks", - "liked_tracks_description": "All your liked tracks", - "playlist": "Playlist", - "create_a_playlist": "Create a playlist", - "update_playlist": "Update playlist", - "create": "Create", - "cancel": "Cancel", - "update": "Update", - "playlist_name": "Playlist Name", - "name_of_playlist": "Name of the playlist", - "description": "Description", - "public": "Public", - "collaborative": "Collaborative", - "search_local_tracks": "Search local tracks...", - "play": "Play", - "delete": "Delete", - "none": "None", - "sort_a_z": "Sort by A-Z", - "sort_z_a": "Sort by Z-A", - "sort_artist": "Sort by Artist", - "sort_album": "Sort by Album", - "sort_duration": "Sort by Duration", - "sort_tracks": "Sort Tracks", - "currently_downloading": "Currently Downloading ({tracks_length})", - "cancel_all": "Cancel All", - "filter_artist": "Filter artists...", - "followers": "{followers} Followers", - "add_artist_to_blacklist": "Add artist to blacklist", - "top_tracks": "Top Tracks", - "fans_also_like": "Fans also like", - "loading": "Loading...", - "artist": "Artist", - "blacklisted": "Blacklisted", - "following": "Following", - "follow": "Follow", - "artist_url_copied": "Artist URL copied to clipboard", - "added_to_queue": "Added {tracks} tracks to queue", - "filter_albums": "Filter albums...", - "synced": "Synced", - "plain": "Plain", - "shuffle": "Shuffle", - "search_tracks": "Search tracks...", - "released": "Released", - "error": "Error {error}", - "title": "Title", - "time": "Time", - "more_actions": "More actions", - "download_count": "Download ({count})", - "add_count_to_playlist": "Add ({count}) to Playlist", - "add_count_to_queue": "Add ({count}) to Queue", - "play_count_next": "Play ({count}) next", - "album": "Album", - "copied_to_clipboard": "Copied {data} to clipboard", - "add_to_following_playlists": "Add {track} to following Playlists", - "add": "Add", - "added_track_to_queue": "Added {track} to queue", - "add_to_queue": "Add to queue", - "track_will_play_next": "{track} will play next", - "play_next": "Play next", - "removed_track_from_queue": "Removed {track} from queue", - "remove_from_queue": "Remove from queue", - "remove_from_favorites": "Remove from favorites", - "save_as_favorite": "Save as favorite", - "add_to_playlist": "Add to playlist", - "remove_from_playlist": "Remove from playlist", - "add_to_blacklist": "Add to blacklist", - "remove_from_blacklist": "Remove from blacklist", - "share": "Share", - "mini_player": "Mini Player", - "slide_to_seek": "Slide to seek forward or backward", - "shuffle_playlist": "Shuffle playlist", - "unshuffle_playlist": "Unshuffle playlist", - "previous_track": "Previous track", - "next_track": "Next track", - "pause_playback": "Pause Playback", - "resume_playback": "Resume Playback", - "loop_track": "Loop track", - "no_loop": "No loop", - "repeat_playlist": "Repeat playlist", - "queue": "Queue", - "alternative_track_sources": "Alternative track sources", - "download_track": "Download track", - "tracks_in_queue": "{tracks} tracks in queue", - "clear_all": "Clear all", - "show_hide_ui_on_hover": "Show/Hide UI on hover", - "always_on_top": "Always on top", - "exit_mini_player": "Exit Mini player", - "download_location": "Download location", - "local_library": "Local library", - "add_library_location": "Add to library", - "remove_library_location": "Remove from library", - "account": "Account", - "login_with_spotify": "Login with your Spotify account", - "connect_with_spotify": "Connect with Spotify", - "logout": "Logout", - "logout_of_this_account": "Logout of this account", - "language_region": "Language & Region", - "language": "Language", - "system_default": "System Default", - "market_place_region": "Marketplace Region", - "recommendation_country": "Recommendation Country", - "appearance": "Appearance", - "layout_mode": "Layout Mode", - "override_layout_settings": "Override responsive layout mode settings", - "adaptive": "Adaptive", - "compact": "Compact", - "extended": "Extended", - "theme": "Theme", - "dark": "Dark", - "light": "Light", - "system": "System", - "accent_color": "Accent Color", - "sync_album_color": "Sync album color", - "sync_album_color_description": "Uses the dominant color of the album art as the accent color", - "playback": "Playback", - "audio_quality": "Audio Quality", - "high": "High", - "low": "Low", - "pre_download_play": "Pre-download and play", - "pre_download_play_description": "Instead of streaming audio, download bytes and play instead (Recommended for higher bandwidth users)", - "skip_non_music": "Skip non-music segments (SponsorBlock)", - "blacklist_description": "Blacklisted tracks and artists", - "wait_for_download_to_finish": "Please wait for the current download to finish", - "desktop": "Desktop", - "close_behavior": "Close Behavior", - "close": "Close", - "minimize_to_tray": "Minimize to tray", - "show_tray_icon": "Show System tray icon", - "about": "About", - "u_love_spotube": "We know you love Spotube", - "check_for_updates": "Check for updates", - "about_spotube": "About Spotube", - "blacklist": "Blacklist", - "please_sponsor": "Please Sponsor/Donate", - "spotube_description": "Spotube, a lightweight, cross-platform, free-for-all spotify client", - "version": "Version", - "build_number": "Build Number", - "founder": "Founder", - "repository": "Repository", - "bug_issues": "Bug+Issues", - "made_with": "Made with ❤️ in Bangladesh🇧🇩", - "kingkor_roy_tirtho": "Kingkor Roy Tirtho", - "copyright": "© 2021-{current_year} Kingkor Roy Tirtho", - "license": "License", - "add_spotify_credentials": "Add your spotify credentials to get started", - "credentials_will_not_be_shared_disclaimer": "Don't worry, any of your credentials won't be collected or shared with anyone", - "know_how_to_login": "Don't know how to do this?", - "follow_step_by_step_guide": "Follow along the Step by Step guide", - "spotify_cookie": "Spotify {name} Cookie", - "cookie_name_cookie": "{name} Cookie", - "fill_in_all_fields": "Please fill in all the fields", - "submit": "Submit", - "exit": "Exit", - "previous": "Previous", - "next": "Next", - "done": "Done", - "step_1": "Step 1", - "first_go_to": "First, Go to", - "login_if_not_logged_in": "and Login/Signup if you are not logged in", - "step_2": "Step 2", - "step_2_steps": "1. Once you're logged in, press F12 or Mouse Right Click > Inspect to Open the Browser devtools.\n2. Then go the \"Application\" Tab (Chrome, Edge, Brave etc..) or \"Storage\" Tab (Firefox, Palemoon etc..)\n3. Go to the \"Cookies\" section then the \"https://accounts.spotify.com\" subsection", - "step_3": "Step 3", - "step_3_steps": "Copy the value of \"sp_dc\" Cookie", - "success_emoji": "Success🥳", - "success_message": "Now you've successfully Logged in with your Spotify account. Good Job, mate!", - "step_4": "Step 4", - "step_4_steps": "Paste the copied \"sp_dc\" value", - "something_went_wrong": "Something went wrong", - "piped_instance": "Piped Server Instance", - "piped_description": "The Piped server instance to use for track matching", - "piped_warning": "Some of them might not work well. So use at your own risk", - "invidious_instance": "Invidious Server Instance", - "invidious_description": "The Invidious server instance to use for track matching", - "invidious_warning": "Some of them might not work well. So use at your own risk", - "generate": "Generate", - "track_exists": "Track {track} already exists", - "replace_downloaded_tracks": "Replace all downloaded tracks", - "skip_download_tracks": "Skip downloading all downloaded tracks", - "do_you_want_to_replace": "Do you want to replace the existing track??", - "replace": "Replace", - "skip": "Skip", - "select_up_to_count_type": "Select up to {count} {type}", - "select_genres": "Select Genres", - "add_genres": "Add Genres", - "country": "Country", - "number_of_tracks_generate": "Number of tracks to generate", - "acousticness": "Acousticness", - "danceability": "Danceability", - "energy": "Energy", - "instrumentalness": "Instrumentalness", - "liveness": "Liveness", - "loudness": "Loudness", - "speechiness": "Speechiness", - "valence": "Valence", - "popularity": "Popularity", - "key": "Key", - "duration": "Duration (s)", - "tempo": "Tempo (BPM)", - "mode": "Mode", - "time_signature": "Time Signature", - "short": "Short", - "medium": "Medium", - "long": "Long", - "min": "Min", - "max": "Max", - "target": "Target", - "moderate": "Moderate", - "deselect_all": "Deselect All", - "select_all": "Select All", - "are_you_sure": "Are you sure?", - "generating_playlist": "Generating your custom playlist...", - "selected_count_tracks": "Selected {count} tracks", - "download_warning": "If you download all Tracks at bulk you're clearly pirating Music & causing damage to the creative society of Music. I hope you are aware of this. Always, try respecting & supporting Artist's hard work", - "download_ip_ban_warning": "BTW, your IP can get blocked on YouTube due excessive download requests than usual. IP block means you can't use YouTube (even if you're logged in) for at least 2-3 months from that IP device. And Spotube doesn't hold any responsibility if this ever happens", - "by_clicking_accept_terms": "By clicking 'accept' you agree to following terms:", - "download_agreement_1": "I know I'm pirating Music. I'm bad", - "download_agreement_2": "I'll support the Artist wherever I can and I'm only doing this because I don't have money to buy their art", - "download_agreement_3": "I'm completely aware that my IP can get blocked on YouTube & I don't hold Spotube or his owners/contributors responsible for any accidents caused by my current action", - "decline": "Decline", - "accept": "Accept", - "details": "Details", - "youtube": "YouTube", - "channel": "Channel", - "likes": "Likes", - "dislikes": "Dislikes", - "views": "Views", - "streamUrl": "Stream URL", - "stop": "Stop", - "sort_newest": "Sort by newest added", - "sort_oldest": "Sort by oldest added", - "sleep_timer": "Sleep Timer", - "mins": "{minutes} Minutes", - "hours": "{hours} Hours", - "hour": "{hours} Hour", - "custom_hours": "Custom Hours", - "logs": "Logs", - "developers": "Developers", - "not_logged_in": "You're not logged in", - "search_mode": "Search Mode", - "audio_source": "Audio Source", - "ok": "Ok", - "failed_to_encrypt": "Failed to encrypt", - "encryption_failed_warning": "Spotube uses encryption to securely store your data. But failed to do so. So it'll fallback to insecure storage\nIf you're using linux, please make sure you've any secret-service (gnome-keyring, kde-wallet, keepassxc etc) installed", - "querying_info": "Querying info...", - "piped_api_down": "Piped API is down", - "piped_down_error_instructions": "The Piped instance {pipedInstance} is currently down\n\nEither change the instance or change the 'API type' to official YouTube API\n\nMake sure to restart the app after change", - "you_are_offline": "You are currently offline", - "connection_restored": "Your internet connection was restored", - "use_system_title_bar": "Use system title bar", - "crunching_results": "Crunching results...", - "search_to_get_results": "Search to get results", - "use_amoled_mode": "Pitch black dark theme", - "pitch_dark_theme": "AMOLED Mode", - "normalize_audio": "Normalize audio", - "change_cover": "Change cover", - "add_cover": "Add cover", - "restore_defaults": "Restore defaults", - "download_music_codec": "Download music codec", - "streaming_music_codec": "Streaming music codec", - "login_with_lastfm": "Login with Last.fm", - "connect": "Connect", - "disconnect_lastfm": "Disconnect Last.fm", - "disconnect": "Disconnect", - "username": "Username", - "password": "Password", - "login": "Login", - "login_with_your_lastfm": "Login with your Last.fm account", - "scrobble_to_lastfm": "Scrobble to Last.fm", - "go_to_album": "Go to Album", - "discord_rich_presence": "Discord Rich Presence", - "browse_all": "Browse All", - "genres": "Genres", - "explore_genres": "Explore Genres", - "friends": "Friends", - "no_lyrics_available": "Sorry, unable find lyrics for this track", - "start_a_radio": "Start a Radio", - "how_to_start_radio": "How do you want to start the radio?", - "replace_queue_question": "Do you want to replace the current queue or append to it?", - "endless_playback": "Endless Playback", - "delete_playlist": "Delete Playlist", - "delete_playlist_confirmation": "Are you sure you want to delete this playlist?", - "local_tracks": "Local Tracks", - "local_tab": "Local", - "song_link": "Song Link", - "skip_this_nonsense": "Skip this nonsense", - "freedom_of_music": "“Freedom of Music”", - "freedom_of_music_palm": "“Freedom of Music in the palm of your hand”", - "get_started": "Let's get started", - "youtube_source_description": "Recommended and works best.", - "piped_source_description": "Feeling free? Same as YouTube but a lot free.", - "jiosaavn_source_description": "Best for South Asian region.", - "invidious_source_description": "Similar to Piped but with higher availability.", - "highest_quality": "Highest Quality: {quality}", - "select_audio_source": "Select Audio Source", - "endless_playback_description": "Automatically append new songs\nto the end of the queue", - "choose_your_region": "Choose your region", - "choose_your_region_description": "This will help Spotube show you the right content\nfor your location.", - "choose_your_language": "Choose your language", - "help_project_grow": "Help this project grow", - "help_project_grow_description": "Spotube is an open-source project. You can help this project grow by contributing to the project, reporting bugs, or suggesting new features.", - "contribute_on_github": "Contribute on GitHub", - "donate_on_open_collective": "Donate on Open Collective", - "browse_anonymously": "Browse Anonymously", - "enable_connect": "Enable Connect", - "enable_connect_description": "Control Spotube from other devices", - "devices": "Devices", - "select": "Select", - "connect_client_alert": "You're being controlled by {client}", - "this_device": "This Device", - "remote": "Remote", - "stats": "Stats", - "and_n_more": "and {count} more", - "recently_played": "Recently Played", - "browse_more": "Browse More", - "no_title": "No Title", - "not_playing": "Not playing", - "epic_failure": "Epic failure!", - "added_num_tracks_to_queue": "Added {tracks_length} tracks to queue", - "spotube_has_an_update": "Spotube has an update", - "download_now": "Download Now", - "nightly_version": "Spotube Nightly {nightlyBuildNum} has been released", - "release_version": "Spotube v{version} has been released", - "read_the_latest": "Read the latest ", - "release_notes": "release notes", - "pick_color_scheme": "Pick color scheme", - "save": "Save", - "choose_the_device": "Choose the device:", - "multiple_device_connected": "There are multiple device connected.\nChoose the device you want this action to take place", - "nothing_found": "Nothing found", - "the_box_is_empty": "The box is empty", - "top_artists": "Top Artists", - "top_albums": "Top Albums", - "this_week": "This week", - "this_month": "This month", - "last_6_months": "Last 6 months", - "this_year": "This year", - "last_2_years": "Last 2 years", - "all_time": "All time", - "powered_by_provider": "Powered by {providerName}", - "email": "Email", - "profile_followers": "Followers", - "birthday": "Birthday", - "subscription": "Subscription", - "not_born": "Not born", - "hacker": "Hacker", - "profile": "Profile", - "no_name": "No Name", - "edit": "Edit", - "user_profile": "User Profile", - "count_plays": "{count} plays", - "streaming_fees_hypothetical": "Streaming fees (hypothetical)", - "minutes_listened": "Minutes listened", - "streamed_songs": "Streamed songs", - "count_streams": "{count} streams", - "owned_by_you": "Owned by you", - "copied_shareurl_to_clipboard": "Copied {shareUrl} to clipboard", - "spotify_hipotetical_calculation": "*This is calculated based on Spotify's per stream\npayout of $0.003 to $0.005. This is a hypothetical\ncalculation to give user insight about how much they\nwould have paid to the artists if they were to listen\ntheir song in Spotify.", - "count_mins": "{minutes} mins", - "summary_minutes": "minutes", - "summary_listened_to_music": "Listened to music", - "summary_songs": "songs", - "summary_streamed_overall": "Streamed overall", - "summary_owed_to_artists": "Owed to artists\nthis month", - "summary_artists": "artist's", - "summary_music_reached_you": "Music reached you", - "summary_full_albums": "full albums", - "summary_got_your_love": "Got your love", - "summary_playlists": "playlists", - "summary_were_on_repeat": "Were on repeat", - "total_money": "Total {money}", - "webview_not_found": "Webview not found", - "webview_not_found_description": "No webview runtime is installed in your device.\nIf it's installed make sure it's in the Environment PATH\n\nAfter installing, restart the app", - "unsupported_platform": "Unsupported platform", - "cache_music": "Cache music", - "open": "Open", - "cache_folder": "Cache folder", - "export": "Export", - "clear_cache": "Clear cache", - "clear_cache_confirmation": "Do you want to clear the cache?", - "export_cache_files": "Export Cached Files", - "found_n_files": "Found {count} files", - "export_cache_confirmation": "Do you want to export these files to", - "exported_n_out_of_m_files": "Exported {filesExported} out of {files} files", - "undo": "Undo", - "download_all": "Download all", - "add_all_to_playlist": "Add all to playlist", - "add_all_to_queue": "Add all to queue", - "play_all_next": "Play all next", - "pause": "Pause", - "view_all": "View all", - "no_tracks_added_yet": "Looks like you haven't added any tracks yet", - "no_tracks": "Looks like there are no tracks here", - "no_tracks_listened_yet": "Looks like you haven't listened to anything yet", - "not_following_artists": "You're not following any artists", - "no_favorite_albums_yet": "Looks like you haven't added any albums to your favorites yet", - "no_logs_found": "No logs found", - "youtube_engine": "YouTube Engine", - "youtube_engine_not_installed_title": "{engine} is not installed", - "youtube_engine_not_installed_message": "{engine} is not installed in your system.", - "youtube_engine_set_path": "Make sure it's available in the PATH variable or\nset the absolute path to the {engine} executable below", - "youtube_engine_unix_issue_message": "In macOS/Linux/unix like OS's, setting path on .zshrc/.bashrc/.bash_profile etc. won't work.\nYou need to set the path in the shell configuration file", - "download": "Download", - "file_not_found": "File not found", - "custom": "Custom", - "add_custom_url": "Add custom URL" + "guest": "Guest", + "browse": "Browse", + "search": "Search", + "library": "Library", + "lyrics": "Lyrics", + "settings": "Settings", + "genre_categories_filter": "Filter categories or genres...", + "genre": "Genre", + "personalized": "Personalized", + "featured": "Featured", + "new_releases": "New Releases", + "songs": "Songs", + "playing_track": "Playing {track}", + "queue_clear_alert": "This will clear the current queue. {track_length} tracks will be removed\nDo you want to continue?", + "load_more": "Load more", + "playlists": "Playlists", + "artists": "Artists", + "albums": "Albums", + "tracks": "Tracks", + "downloads": "Downloads", + "filter_playlists": "Filter your playlists...", + "liked_tracks": "Liked Tracks", + "liked_tracks_description": "All your liked tracks", + "playlist": "Playlist", + "create_a_playlist": "Create a playlist", + "update_playlist": "Update playlist", + "create": "Create", + "cancel": "Cancel", + "update": "Update", + "playlist_name": "Playlist Name", + "name_of_playlist": "Name of the playlist", + "description": "Description", + "public": "Public", + "collaborative": "Collaborative", + "search_local_tracks": "Search local tracks...", + "play": "Play", + "delete": "Delete", + "none": "None", + "sort_a_z": "Sort by A-Z", + "sort_z_a": "Sort by Z-A", + "sort_artist": "Sort by Artist", + "sort_album": "Sort by Album", + "sort_duration": "Sort by Duration", + "sort_tracks": "Sort Tracks", + "currently_downloading": "Currently Downloading ({tracks_length})", + "cancel_all": "Cancel All", + "filter_artist": "Filter artists...", + "followers": "{followers} Followers", + "add_artist_to_blacklist": "Add artist to blacklist", + "top_tracks": "Top Tracks", + "fans_also_like": "Fans also like", + "loading": "Loading...", + "artist": "Artist", + "blacklisted": "Blacklisted", + "following": "Following", + "follow": "Follow", + "artist_url_copied": "Artist URL copied to clipboard", + "added_to_queue": "Added {tracks} tracks to queue", + "filter_albums": "Filter albums...", + "synced": "Synced", + "plain": "Plain", + "shuffle": "Shuffle", + "search_tracks": "Search tracks...", + "released": "Released", + "error": "Error {error}", + "title": "Title", + "time": "Time", + "more_actions": "More actions", + "download_count": "Download ({count})", + "add_count_to_playlist": "Add ({count}) to Playlist", + "add_count_to_queue": "Add ({count}) to Queue", + "play_count_next": "Play ({count}) next", + "album": "Album", + "copied_to_clipboard": "Copied {data} to clipboard", + "add_to_following_playlists": "Add {track} to following Playlists", + "add": "Add", + "added_track_to_queue": "Added {track} to queue", + "add_to_queue": "Add to queue", + "track_will_play_next": "{track} will play next", + "play_next": "Play next", + "removed_track_from_queue": "Removed {track} from queue", + "remove_from_queue": "Remove from queue", + "remove_from_favorites": "Remove from favorites", + "save_as_favorite": "Save as favorite", + "add_to_playlist": "Add to playlist", + "remove_from_playlist": "Remove from playlist", + "add_to_blacklist": "Add to blacklist", + "remove_from_blacklist": "Remove from blacklist", + "share": "Share", + "mini_player": "Mini Player", + "slide_to_seek": "Slide to seek forward or backward", + "shuffle_playlist": "Shuffle playlist", + "not_shuffle_playlist": "Unshuffle playlist", + "previous_track": "Previous track", + "next_track": "Next track", + "pause_playback": "Pause Playback", + "resume_playback": "Resume Playback", + "loop_track": "Loop track", + "no_loop": "No loop", + "repeat_playlist": "Repeat playlist", + "queue": "Queue", + "alternative_track_sources": "Alternative track sources", + "download_track": "Download track", + "tracks_in_queue": "{tracks} tracks in queue", + "clear_all": "Clear all", + "show_hide_ui_on_hover": "Show/Hide UI on hover", + "always_on_top": "Always on top", + "exit_mini_player": "Exit Mini player", + "download_location": "Download location", + "local_library": "Local library", + "add_library_location": "Add to library", + "remove_library_location": "Remove from library", + "account": "Account", + "login_with_spotify": "Login with your Spotify account", + "connect_with_spotify": "Connect with Spotify", + "logout": "Logout", + "logout_of_this_account": "Logout of this account", + "language_region": "Language & Region", + "language": "Language", + "system_default": "System Default", + "market_place_region": "Marketplace Region", + "recommendation_country": "Recommendation Country", + "appearance": "Appearance", + "layout_mode": "Layout Mode", + "override_layout_settings": "Override responsive layout mode settings", + "adaptive": "Adaptive", + "compact": "Compact", + "extended": "Extended", + "theme": "Theme", + "dark": "Dark", + "light": "Light", + "system": "System", + "accent_color": "Accent Color", + "sync_album_color": "Sync album color", + "sync_album_color_description": "Uses the dominant color of the album art as the accent color", + "playback": "Playback", + "audio_quality": "Audio Quality", + "high": "High", + "low": "Low", + "pre_download_play": "Pre-download and play", + "pre_download_play_description": "Instead of streaming audio, download bytes and play instead (Recommended for higher bandwidth users)", + "skip_non_music": "Skip non-music segments (SponsorBlock)", + "blacklist_description": "Blacklisted tracks and artists", + "wait_for_download_to_finish": "Please wait for the current download to finish", + "desktop": "Desktop", + "close_behavior": "Close Behavior", + "close": "Close", + "minimize_to_tray": "Minimize to tray", + "show_tray_icon": "Show System tray icon", + "about": "About", + "u_love_spotube": "We know you love Spotube", + "check_for_updates": "Check for updates", + "about_spotube": "About Spotube", + "blacklist": "Blacklist", + "please_sponsor": "Please Sponsor/Donate", + "spotube_description": "Spotube, a lightweight, cross-platform, free-for-all spotify client", + "version": "Version", + "build_number": "Build Number", + "founder": "Founder", + "repository": "Repository", + "bug_issues": "Bug+Issues", + "made_with": "Made with ❤️ in Bangladesh🇧🇩", + "kingkor_roy_tirtho": "Kingkor Roy Tirtho", + "copyright": "© 2021-{current_year} Kingkor Roy Tirtho", + "license": "License", + "add_spotify_credentials": "Add your spotify credentials to get started", + "credentials_will_not_be_shared_disclaimer": "Don't worry, any of your credentials won't be collected or shared with anyone", + "know_how_to_login": "Don't know how to do this?", + "follow_step_by_step_guide": "Follow along the Step by Step guide", + "spotify_cookie": "Spotify {name} Cookie", + "cookie_name_cookie": "{name} Cookie", + "fill_in_all_fields": "Please fill in all the fields", + "submit": "Submit", + "exit": "Exit", + "previous": "Previous", + "next": "Next", + "done": "Done", + "step_1": "Step 1", + "first_go_to": "First, Go to", + "login_if_not_logged_in": "and Login/Signup if you are not logged in", + "step_2": "Step 2", + "step_2_steps": "1. Once you're logged in, press F12 or Mouse Right Click > Inspect to Open the Browser devtools.\n2. Then go the \"Application\" Tab (Chrome, Edge, Brave etc..) or \"Storage\" Tab (Firefox, Pale Moon etc..)\n3. Go to the \"Cookies\" section then the \"https://accounts.spotify.com\" subsection", + "step_3": "Step 3", + "step_3_steps": "Copy the value of \"sp_dc\" Cookie", + "success_emoji": "Success🥳", + "success_message": "Now you've successfully Logged in with your Spotify account. Good Job, mate!", + "step_4": "Step 4", + "step_4_steps": "Paste the copied \"sp_dc\" value", + "something_went_wrong": "Something went wrong", + "piped_instance": "Piped Server Instance", + "piped_description": "The Piped server instance to use for track matching", + "piped_warning": "Some of them might not work well. So use at your own risk", + "invidious_instance": "Invidious Server Instance", + "invidious_description": "The Invidious server instance to use for track matching", + "invidious_warning": "Some of them might not work well. So use at your own risk", + "generate": "Generate", + "track_exists": "Track {track} already exists", + "replace_downloaded_tracks": "Replace all downloaded tracks", + "skip_download_tracks": "Skip downloading all downloaded tracks", + "do_you_want_to_replace": "Do you want to replace the existing track??", + "replace": "Replace", + "skip": "Skip", + "select_up_to_count_type": "Select up to {count} {type}", + "select_genres": "Select Genres", + "add_genres": "Add Genres", + "country": "Country", + "number_of_tracks_generate": "Number of tracks to generate", + "not_acoustic": "not_acoustic", + "dance_ability": "dance_ability", + "energy": "Energy", + "not_instrumental": "not_instrumental", + "liveness": "Liveness", + "loudness": "Loudness", + "talkative": "talkative", + "valence": "Valence", + "popularity": "Popularity", + "key": "Key", + "duration": "Duration (s)", + "tempo": "Tempo (BPM)", + "mode": "Mode", + "time_signature": "Time Signature", + "short": "Short", + "medium": "Medium", + "long": "Long", + "min": "Min", + "max": "Max", + "target": "Target", + "moderate": "Moderate", + "deselect_all": "Deselect All", + "select_all": "Select All", + "are_you_sure": "Are you sure?", + "generating_playlist": "Generating your custom playlist...", + "selected_count_tracks": "Selected {count} tracks", + "download_warning": "If you download all Tracks at bulk you're clearly pirating Music & causing damage to the creative society of Music. I hope you are aware of this. Always, try respecting & supporting Artist's hard work", + "download_ip_ban_warning": "BTW, your IP can get blocked on YouTube due excessive download requests than usual. IP block means you can't use YouTube (even if you're logged in) for at least 2-3 months from that IP device. And Spotube doesn't hold any responsibility if this ever happens", + "by_clicking_accept_terms": "By clicking 'accept' you agree to following terms:", + "download_agreement_1": "I know I'm pirating Music. I'm bad", + "download_agreement_2": "I'll support the Artist wherever I can and I'm only doing this because I don't have money to buy their art", + "download_agreement_3": "I'm completely aware that my IP can get blocked on YouTube & I don't hold Spotube or his owners/contributors responsible for any accidents caused by my current action", + "decline": "Decline", + "accept": "Accept", + "details": "Details", + "youtube": "YouTube", + "channel": "Channel", + "likes": "Likes", + "dislikes": "Dislikes", + "views": "Views", + "streamUrl": "Stream URL", + "stop": "Stop", + "sort_newest": "Sort by newest added", + "sort_oldest": "Sort by oldest added", + "sleep_timer": "Sleep Timer", + "minutes": "{minutes} Minutes", + "hours": "{hours} Hours", + "hour": "{hours} Hour", + "custom_hours": "Custom Hours", + "logs": "Logs", + "developers": "Developers", + "not_logged_in": "You're not logged in", + "search_mode": "Search Mode", + "audio_source": "Audio Source", + "ok": "Ok", + "failed_to_encrypt": "Failed to encrypt", + "encryption_failed_warning": "Spotube uses encryption to securely store your data. But failed to do so. So it'll fallback to insecure storage\nIf you're using linux, please make sure you've any secret-service (gnome-keyring, kde-wallet, KeePassXC etc) installed", + "querying_info": "Querying info...", + "piped_api_down": "Piped API is down", + "piped_down_error_instructions": "The Piped instance {pipedInstance} is currently down\n\nEither change the instance or change the 'API type' to official YouTube API\n\nMake sure to restart the app after change", + "you_are_offline": "You are currently offline", + "connection_restored": "Your internet connection was restored", + "use_system_title_bar": "Use system title bar", + "crunching_results": "Crunching results...", + "search_to_get_results": "Search to get results", + "use_amoled_mode": "Pitch black dark theme", + "pitch_dark_theme": "AMOLED Mode", + "normalize_audio": "Normalize audio", + "change_cover": "Change cover", + "add_cover": "Add cover", + "restore_defaults": "Restore defaults", + "download_music_codec": "Download music codec", + "streaming_music_codec": "Streaming music codec", + "login_with_lastfm": "Login with Last.fm", + "connect": "Connect", + "disconnect_lastfm": "Disconnect Last.fm", + "disconnect": "Disconnect", + "username": "Username", + "password": "Password", + "login": "Login", + "login_with_your_lastfm": "Login with your Last.fm account", + "scrobble_to_lastfm": "Scrobble to Last.fm", + "go_to_album": "Go to Album", + "discord_rich_presence": "Discord Rich Presence", + "browse_all": "Browse All", + "genres": "Genres", + "explore_genres": "Explore Genres", + "friends": "Friends", + "no_lyrics_available": "Sorry, unable find lyrics for this track", + "start_a_radio": "Start a Radio", + "how_to_start_radio": "How do you want to start the radio?", + "replace_queue_question": "Do you want to replace the current queue or append to it?", + "endless_playback": "Endless Playback", + "delete_playlist": "Delete Playlist", + "delete_playlist_confirmation": "Are you sure you want to delete this playlist?", + "local_tracks": "Local Tracks", + "local_tab": "Local", + "song_link": "Song Link", + "skip_this_nonsense": "Skip this nonsense", + "freedom_of_music": "“Freedom of Music”", + "freedom_of_music_palm": "“Freedom of Music in the palm of your hand”", + "get_started": "Let's get started", + "youtube_source_description": "Recommended and works best.", + "piped_source_description": "Feeling free? Same as YouTube but a lot free.", + "jiosaavn_source_description": "Best for South Asian region.", + "invidious_source_description": "Similar to Piped but with higher availability.", + "highest_quality": "Highest Quality: {quality}", + "select_audio_source": "Select Audio Source", + "endless_playback_description": "Automatically append new songs\nto the end of the queue", + "choose_your_region": "Choose your region", + "choose_your_region_description": "This will help Spotube show you the right content\nfor your location.", + "choose_your_language": "Choose your language", + "help_project_grow": "Help this project grow", + "help_project_grow_description": "Spotube is an open-source project. You can help this project grow by contributing to the project, reporting bugs, or suggesting new features.", + "contribute_on_github": "Contribute on GitHub", + "donate_on_open_collective": "Donate on Open Collective", + "browse_anonymously": "Browse Anonymously", + "enable_connect": "Enable Connect", + "enable_connect_description": "Control Spotube from other devices", + "devices": "Devices", + "select": "Select", + "connect_client_alert": "You're being controlled by {client}", + "this_device": "This Device", + "remote": "Remote", + "stats": "Stats", + "and_n_more": "and {count} more", + "recently_played": "Recently Played", + "browse_more": "Browse More", + "no_title": "No Title", + "not_playing": "Not playing", + "epic_failure": "Epic failure!", + "added_num_tracks_to_queue": "Added {tracks_length} tracks to queue", + "spotube_has_an_update": "Spotube has an update", + "download_now": "Download Now", + "nightly_version": "Spotube Nightly {nightlyBuildNum} has been released", + "release_version": "Spotube v{version} has been released", + "read_the_latest": "Read the latest ", + "release_notes": "release notes", + "pick_color_scheme": "Pick color scheme", + "save": "Save", + "choose_the_device": "Choose the device:", + "multiple_device_connected": "There are multiple device connected.\nChoose the device you want this action to take place", + "nothing_found": "Nothing found", + "the_box_is_empty": "The box is empty", + "top_artists": "Top Artists", + "top_albums": "Top Albums", + "this_week": "This week", + "this_month": "This month", + "last_6_months": "Last 6 months", + "this_year": "This year", + "last_2_years": "Last 2 years", + "all_time": "All time", + "powered_by_provider": "Powered by {providerName}", + "email": "Email", + "profile_followers": "Followers", + "birthday": "Birthday", + "subscription": "Subscription", + "not_born": "Not born", + "hacker": "Hacker", + "profile": "Profile", + "no_name": "No Name", + "edit": "Edit", + "user_profile": "User Profile", + "count_plays": "{count} plays", + "streaming_fees_hypothetical": "Streaming fees (hypothetical)", + "minutes_listened": "Minutes listened", + "streamed_songs": "Streamed songs", + "count_streams": "{count} streams", + "owned_by_you": "Owned by you", + "copied_share_url_to_clipboard": "Copied {shareUrl} to clipboard", + "spotify_hypothetical_calculation": "*This is calculated based on Spotify's per stream\npayout of $0.003 to $0.005. This is a hypothetical\ncalculation to give user insight about how much they\nwould have paid to the artists if they were to listen\ntheir song in Spotify.", + "count_minutes": "{minutes} minutes", + "summary_minutes": "minutes", + "summary_listened_to_music": "Listened to music", + "summary_songs": "songs", + "summary_streamed_overall": "Streamed overall", + "summary_owed_to_artists": "Owed to artists\nthis month", + "summary_artists": "artist's", + "summary_music_reached_you": "Music reached you", + "summary_full_albums": "full albums", + "summary_got_your_love": "Got your love", + "summary_playlists": "playlists", + "summary_were_on_repeat": "Were on repeat", + "total_money": "Total {money}", + "webview_not_found": "Webview not found", + "webview_not_found_description": "No webview runtime is installed in your device.\nIf it's installed make sure it's in the Environment PATH\n\nAfter installing, restart the app", + "unsupported_platform": "Unsupported platform", + "cache_music": "Cache music", + "open": "Open", + "cache_folder": "Cache folder", + "export": "Export", + "clear_cache": "Clear cache", + "clear_cache_confirmation": "Do you want to clear the cache?", + "export_cache_files": "Export Cached Files", + "found_n_files": "Found {count} files", + "export_cache_confirmation": "Do you want to export these files to", + "exported_n_out_of_m_files": "Exported {filesExported} out of {files} files", + "undo": "Undo", + "download_all": "Download all", + "add_all_to_playlist": "Add all to playlist", + "add_all_to_queue": "Add all to queue", + "play_all_next": "Play all next", + "pause": "Pause", + "view_all": "View all", + "no_tracks_added_yet": "Looks like you haven't added any tracks yet", + "no_tracks": "Looks like there are no tracks here", + "no_tracks_listened_yet": "Looks like you haven't listened to anything yet", + "not_following_artists": "You're not following any artists", + "no_favorite_albums_yet": "Looks like you haven't added any albums to your favorites yet", + "no_logs_found": "No logs found", + "youtube_engine": "YouTube Engine", + "youtube_engine_not_installed_title": "{engine} is not installed", + "youtube_engine_not_installed_message": "{engine} is not installed in your system.", + "youtube_engine_set_path": "Make sure it's available in the PATH variable or\nset the absolute path to the {engine} executable below", + "youtube_engine_unix_issue_message": "In macOS/Linux/unix like OS's, setting path on .zshrc/.bashrc/.bash_profile etc. won't work.\nYou need to set the path in the shell configuration file", + "download": "Download", + "file_not_found": "File not found", + "custom": "Custom", + "add_custom_url": "Add custom URL" } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 565c786a..89db443b 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -88,7 +88,7 @@ "mini_player": "Reproductor Mini", "slide_to_seek": "Desliza para buscar adelante o atrás", "shuffle_playlist": "Reproducir lista en orden aleatorio", - "unshuffle_playlist": "Desactivar reproducción aleatoria", + "not_shuffle_playlist": "Desactivar reproducción aleatoria", "previous_track": "Pista anterior", "next_track": "Pista siguiente", "pause_playback": "Pausar reproducción", @@ -173,7 +173,7 @@ "first_go_to": "Primero, ve a", "login_if_not_logged_in": "e inicia sesión/registra tu cuenta si no lo has hecho aún", "step_2": "Paso 2", - "step_2_steps": "1. Una vez que hayas iniciado sesión, presiona F12 o haz clic derecho con el ratón > Inspeccionar para abrir las herramientas de desarrollo del navegador.\n2. Luego ve a la pestaña \"Application\" (Chrome, Edge, Brave, etc.) o \"Storage\" (Firefox, Palemoon, etc.)\n3. Ve a la sección \"Cookies\" y luego la subsección \"https://accounts.spotify.com\"", + "step_2_steps": "1. Una vez que hayas iniciado sesión, presiona F12 o haz clic derecho con el ratón > Inspeccionar para abrir las herramientas de desarrollo del navegador.\n2. Luego ve a la pestaña \"Application\" (Chrome, Edge, Brave, etc.) o \"Storage\" (Firefox, Pale Moon, etc.)\n3. Ve a la sección \"Cookies\" y luego la subsección \"https://accounts.spotify.com\"", "step_3": "Paso 3", "success_emoji": "¡Éxito! 🥳", "success_message": "Ahora has iniciado sesión con éxito en tu cuenta de Spotify. ¡Buen trabajo!", @@ -194,13 +194,13 @@ "add_genres": "Agregar Géneros", "country": "País", "number_of_tracks_generate": "Número de canciones a generar", - "acousticness": "Acousticness", - "danceability": "Danceability", + "not_acoustic": "not_acoustic", + "dance_ability": "dance_ability", "energy": "Energía", - "instrumentalness": "Instrumentalidad", + "not_instrumental": "Instrumentalidad", "liveness": "En vivo", "loudness": "Volumen", - "speechiness": "Habla", + "talkative": "Habla", "valence": "Valencia", "popularity": "Popularidad", "key": "Tono", @@ -239,7 +239,7 @@ "sort_newest": "Ordenar por más recientes", "sort_oldest": "Ordenar por más antiguos", "sleep_timer": "Temporizador de apagado", - "mins": "{minutes} minutos", + "minutes": "{minutes} minutos", "hours": "{hours} horas", "hour": "{hours} hora", "custom_hours": "Horas personalizadas", @@ -250,7 +250,7 @@ "audio_source": "Fuente de audio", "ok": "OK", "failed_to_encrypt": "Error al cifrar", - "encryption_failed_warning": "Spotube utiliza el cifrado para almacenar sus datos de forma segura. Pero ha fallado. Por lo tanto, volverá a un almacenamiento no seguro\nSi está utilizando Linux, asegúrese de tener instalados servicios secretos como gnome-keyring, kde-wallet y keepassxc", + "encryption_failed_warning": "Spotube utiliza el cifrado para almacenar sus datos de forma segura. Pero ha fallado. Por lo tanto, volverá a un almacenamiento no seguro\nSi está utilizando Linux, asegúrese de tener instalados servicios secretos como gnome-keyring, kde-wallet y KeePassXC", "querying_info": "Consultando información...", "piped_api_down": "La API de Piped no está disponible", "piped_down_error_instructions": "La instancia de Piped {pipedInstance} no está funcionando en este momento\n\nCambie la instancia o cambie el 'Tipo de API' a la API oficial de YouTube\n\nAsegúrese de reiniciar la aplicación después del cambio", @@ -370,9 +370,9 @@ "streamed_songs": "Canciones reproducidas", "count_streams": "{count} streams", "owned_by_you": "En tu posesión", - "copied_shareurl_to_clipboard": "Copiado {shareUrl} al portapapeles", - "spotify_hipotetical_calculation": "*Esto se calcula en base al\npago por stream de Spotify de $0.003 a $0.005.\nEs un cálculo hipotético para dar\nuna idea de cuánto habría\npagado a los artistas si hubieras escuchado\nsu canción en Spotify.", - "count_mins": "{minutes} minutos", + "copied_share_url_to_clipboard": "Copiado {shareUrl} al portapapeles", + "spotify_hypothetical_calculation": "*Esto se calcula en base al\npago por stream de Spotify de $0.003 a $0.005.\nEs un cálculo hipotético para dar\nuna idea de cuánto habría\npagado a los artistas si hubieras escuchado\nsu canción en Spotify.", + "count_minutes": "{minutes} minutos", "summary_minutes": "minutos", "summary_listened_to_music": "Escuchó música", "summary_songs": "canciones", diff --git a/lib/l10n/app_eu.arb b/lib/l10n/app_eu.arb index 70a581a7..f68f0e25 100644 --- a/lib/l10n/app_eu.arb +++ b/lib/l10n/app_eu.arb @@ -91,7 +91,7 @@ "mini_player": "Mini Erreproduzitzailea", "slide_to_seek": "Arrastatu aurrerantz edo atzearantz bilatzeko", "shuffle_playlist": "Erreproduzitu zerrenda ausazko ordenean", - "unshuffle_playlist": "Desgaitu ausazko erreprodukzioa", + "not_shuffle_playlist": "Desgaitu ausazko erreprodukzioa", "previous_track": "Aurreko pista", "next_track": "Hurrengo pista", "pause_playback": "Pausatu erreprodukzioa", @@ -179,7 +179,7 @@ "first_go_to": "Hasteko, joan hona", "login_if_not_logged_in": "eta hasi saioa/sortu kontua lehendik ez baduzu eginda", "step_2": "2. pausua", - "step_2_steps": "1. Saioa hasita duzularik, sakatu F12 edo saguaren eskuineko botoia klikatu > Ikuskatu nabigatzaileko garapen tresnak irekitzeko.\n2. Joan \"Aplikazio\" (Chrome, Edge, Brave, etab.) edo \"Biltegiratzea\" (Firefox, Palemoon, etab.)\n3. Joan \"Cookieak\" atalera eta gero \"https://accounts.spotify.com\" azpiatalera", + "step_2_steps": "1. Saioa hasita duzularik, sakatu F12 edo saguaren eskuineko botoia klikatu > Ikuskatu nabigatzaileko garapen tresnak irekitzeko.\n2. Joan \"Aplikazio\" (Chrome, Edge, Brave, etab.) edo \"Biltegiratzea\" (Firefox, Pale Moon, etab.)\n3. Joan \"Cookieak\" atalera eta gero \"https://accounts.spotify.com\" azpiatalera", "step_3": "3. pausua", "step_3_steps": "Kopiatu \"sp_dc\" cookiearen balioa", "success_emoji": "Eginda! 🥳", @@ -202,13 +202,13 @@ "add_genres": "Gehitu Generoak", "country": "Herrialdea", "number_of_tracks_generate": "Sortzeko kanta kopurua", - "acousticness": "Akustikotasuna", - "danceability": "Dantzagarritasuna", + "not_acoustic": "Akustikotasuna", + "dance_ability": "Dantzagarritasuna", "energy": "Energia", - "instrumentalness": "Instrumentaltasuna", + "not_instrumental": "Instrumentaltasuna", "liveness": "Zuzenean", "loudness": "Ozentasuna", - "speechiness": "Hitzaldia", + "talkative": "Hitzaldia", "valence": "Balentzia", "popularity": "Populartasuna", "key": "Tonua", @@ -247,7 +247,7 @@ "sort_newest": "Ordenatu gehitu berrienetik", "sort_oldest": "Ordenatu gehitu zaharrenetik", "sleep_timer": "Itzaltzeko tenporizadorea", - "mins": "{minutes} minutu", + "minutes": "{minutes} minutu", "hours": "{hours} ordu", "hour": "{hours} ordu", "custom_hours": "Ordu pertsonalizatuak", @@ -258,7 +258,7 @@ "audio_source": "Audio Iturria", "ok": "OK", "failed_to_encrypt": "Errorea zifratzean", - "encryption_failed_warning": "Spotube-ek zifratzea darabil datuak modu seguruan biltegiratzeko. Baina huts egin du. Hori dela eta, biltegiratzea ez da segurua izango\nLinux erabiltzen ari bazara, ziurtatu edozein sekretu-zerbitzu (gnome-keyring, kde-wallet, keepassxc etab.) instalatuta duzula", + "encryption_failed_warning": "Spotube-ek zifratzea darabil datuak modu seguruan biltegiratzeko. Baina huts egin du. Hori dela eta, biltegiratzea ez da segurua izango\nLinux erabiltzen ari bazara, ziurtatu edozein sekretu-zerbitzu (gnome-keyring, kde-wallet, KeePassXC etab.) instalatuta duzula", "querying_info": "Informazioa egiaztatzen...", "piped_api_down": "Piped-en APIa ez dago eskuragarri", "piped_down_error_instructions": "Piped-en {pipedInstance} instantzia ez dago martxan une honetan\n\nAldatu instantzia edo aldatu 'API mota' YouTuberen API ofizialera\n\nZiurtatu aplikazioa berrabiarazten duzula aldaketa eta gero", @@ -370,9 +370,9 @@ "streamed_songs": "Streaming-ez entzundako kantak", "count_streams": "{count} stream", "owned_by_you": "Zure jabetzakoa", - "copied_shareurl_to_clipboard": "{shareUrl} arbelera kopiatua", - "spotify_hipotetical_calculation": "*Sportify-k stream bakoitzeko duen $0.003 eta $0.005\nordainsarian oinarritua da. Kalkulu hipotetiko bat,\nkanta hauek Spotify-n entzun bazenitu,\nberaiek artistari zenbat ordaiduko lioketen jakin dezazun.", - "count_mins": "{minutes} minutu", + "copied_share_url_to_clipboard": "{shareUrl} arbelera kopiatua", + "spotify_hypothetical_calculation": "*Sportify-k stream bakoitzeko duen $0.003 eta $0.005\nordainsarian oinarritua da. Kalkulu hipotetiko bat,\nkanta hauek Spotify-n entzun bazenitu,\nberaiek artistari zenbat ordaiduko lioketen jakin dezazun.", + "count_minutes": "{minutes} minutu", "summary_minutes": "minutu", "summary_listened_to_music": "Musika entzuten", "summary_songs": "kanta", diff --git a/lib/l10n/app_fa.arb b/lib/l10n/app_fa.arb index d3918e55..02847136 100644 --- a/lib/l10n/app_fa.arb +++ b/lib/l10n/app_fa.arb @@ -90,7 +90,7 @@ "mini_player": "پخش کننده ", "slide_to_seek": "برای جستجو عقب یا جلو بکشید", "shuffle_playlist": "پخش تصادفی", - "unshuffle_playlist": "خاموش کردن پخش تصادفی", + "not_shuffle_playlist": "خاموش کردن پخش تصادفی", "previous_track": "آهنگ قبلی", "next_track": "آهنگ بعدی", "pause_playback": "توقف آهنگ", @@ -175,7 +175,7 @@ "first_go_to": "اول برو داخل ", "login_if_not_logged_in": "و اگر وارد نشده اید، وارد/ثبت نام کنید", "step_2": "گام 2", - "step_2_steps": "1. پس از ورود به سیستم، F12 یا کلیک راست ماوس > Inspect را فشار دهید تا ابزارهای توسعه مرورگر باز شود..\n2. سپس به تب \"Application\" (Chrome, Edge, Brave etc..) یا \"Storage\" Tab (Firefox, Palemoon etc..)\n3. به قسمت \"Cookies\" و به پخش \"https://accounts.spotify.com\" بروید", + "step_2_steps": "1. پس از ورود به سیستم، F12 یا کلیک راست ماوس > Inspect را فشار دهید تا ابزارهای توسعه مرورگر باز شود..\n2. سپس به تب \"Application\" (Chrome, Edge, Brave etc..) یا \"Storage\" Tab (Firefox, Pale Moon etc..)\n3. به قسمت \"Cookies\" و به پخش \"https://accounts.spotify.com\" بروید", "step_3": "گام 3", "success_emoji": "موفقیت🥳", "success_message": "اکنون با موفقیت با حساب اسپوتیفای خود وارد شده اید", @@ -196,13 +196,13 @@ "add_genres": "ژانر را اطافه کنید", "country": "کشور", "number_of_tracks_generate": "تعداد آهنگ های ساخته شده", - "acousticness": "آکوستیک", - "danceability": "رقصیدن", + "not_acoustic": "آکوستیک", + "dance_ability": "رقصیدن", "energy": "انرژی", - "instrumentalness": "بی کلام", + "not_instrumental": "بی کلام", "liveness": "حس زندگی", "loudness": "صدای بلند", - "speechiness": "دکلمه", + "talkative": "دکلمه", "valence": "ظرفیت", "popularity": "محبوبیت", "key": "کلید", @@ -241,7 +241,7 @@ "sort_newest": "مرتب سازی بر اساس جدید ترین اضافه شده", "sort_oldest": "مرتب سازی بر اساس قدیمی ترین اضافه شده", "sleep_timer": "زمان خواب", - "mins": "{minutes} دقیقه", + "minutes": "{minutes} دقیقه", "hours": "{hours} ساعت", "hour": "{hours} ساعت", "custom_hours": "ساعت سفارشی", @@ -252,7 +252,7 @@ "audio_source": "منبع صدا", "ok": "باشد", "failed_to_encrypt": "رمز گذاری نشده", - "encryption_failed_warning": "Spotube از رمزگذاری برای ذخیره ایمن داده های شما استفاده می کند. اما موفق به انجام این کار نشد. بنابراین به فضای ذخیره‌سازی ناامن تبدیل می‌شود\nاگر از لینوکس استفاده می‌کنید، لطفاً مطمئن شوید که سرویس مخفی (gnome-keyring، kde-wallet، keepassxc و غیره) را نصب کرده‌اید.", + "encryption_failed_warning": "Spotube از رمزگذاری برای ذخیره ایمن داده های شما استفاده می کند. اما موفق به انجام این کار نشد. بنابراین به فضای ذخیره‌سازی ناامن تبدیل می‌شود\nاگر از لینوکس استفاده می‌کنید، لطفاً مطمئن شوید که سرویس مخفی (gnome-keyring، kde-wallet، KeePassXC و غیره) را نصب کرده‌اید.", "querying_info": "جستجو درباره ", "piped_api_down": "ایراد در سرور", "piped_down_error_instructions": "به دلیل مشکل {pipedInstance} ارتباط با سرور مقدور نیست\n\nنمونه را تغییر دهید یا «نوع API» را به API رسمی YouTube تغییر دهید\n\nحتماً پس از تغییر، برنامه را دوباره راه‌اندازی کنید", @@ -370,9 +370,9 @@ "streamed_songs": "ترانه‌های پخش شده", "count_streams": "{count} پخش", "owned_by_you": "توسط شما مالکیت شده", - "copied_shareurl_to_clipboard": "{shareUrl} به کلیپ‌بورد کپی شد", - "spotify_hipotetical_calculation": "*این بر اساس پرداخت هر پخش اسپاتیفای\nبه مبلغ 0.003 تا 0.005 دلار محاسبه شده است.\nاین یک محاسبه فرضی است که به کاربران نشان دهد چقدر ممکن است\nبه هنرمندان پرداخت می‌کردند اگر ترانه آنها را در اسپاتیفای گوش می‌دادند.", - "count_mins": "{minutes} دقیقه", + "copied_share_url_to_clipboard": "{shareUrl} به کلیپ‌بورد کپی شد", + "spotify_hypothetical_calculation": "*این بر اساس پرداخت هر پخش اسپاتیفای\nبه مبلغ 0.003 تا 0.005 دلار محاسبه شده است.\nاین یک محاسبه فرضی است که به کاربران نشان دهد چقدر ممکن است\nبه هنرمندان پرداخت می‌کردند اگر ترانه آنها را در اسپاتیفای گوش می‌دادند.", + "count_minutes": "{minutes} دقیقه", "summary_minutes": "دقیقه‌ها", "summary_listened_to_music": "به موسیقی گوش داده شده", "summary_songs": "ترانه‌ها", diff --git a/lib/l10n/app_fi.arb b/lib/l10n/app_fi.arb index 797c36f7..18f2871e 100644 --- a/lib/l10n/app_fi.arb +++ b/lib/l10n/app_fi.arb @@ -91,7 +91,7 @@ "mini_player": "Minisoitin", "slide_to_seek": "Liu'uta mennäkseen eteenpäin tai taaksepäin", "shuffle_playlist": "Sekoita soittolista", - "unshuffle_playlist": "Poista sekoitus soittolistasta", + "not_shuffle_playlist": "Poista sekoitus soittolistasta", "previous_track": "Äskeinen kappale", "next_track": "Seuraava kappale", "pause_playback": "Pysäytä soittolistan toisto", @@ -176,7 +176,7 @@ "first_go_to": "Ensiksi, mene", "login_if_not_logged_in": "ja Kirjaudu/Tee tili jos et ole kirjautunut sisään", "step_2": "Vaihe 2", - "step_2_steps": "1. Kun olet kirjautunut, paina F12 tai oikeaa hiiren näppäintä > Tarkista ja avaa selaimen kehittäjä työkalut.\n2. Mene sitten \"Application\"-välilehteen (Chrome, Edge, Brave jne..) tai \"Storage\"-välilehteen (Firefox, Palemoon jne..)\n3. Mene \"Cookies\"-osastoon, sitten \"https://accounts.spotify.com\" alakohtaan.", + "step_2_steps": "1. Kun olet kirjautunut, paina F12 tai oikeaa hiiren näppäintä > Tarkista ja avaa selaimen kehittäjä työkalut.\n2. Mene sitten \"Application\"-välilehteen (Chrome, Edge, Brave jne..) tai \"Storage\"-välilehteen (Firefox, Pale Moon jne..)\n3. Mene \"Cookies\"-osastoon, sitten \"https://accounts.spotify.com\" alakohtaan.", "step_3": "Vaihe 3", "step_3_steps": "Kopioi Keksin \"sp_dc\" arvo", "success_emoji": "Onnistuit🥳", @@ -199,13 +199,13 @@ "add_genres": "Lisää Genrejä", "country": "Maa", "number_of_tracks_generate": "Numero tuotettavia kappaleita", - "acousticness": "Akustisuus", - "danceability": "Tanssittavuus", + "not_acoustic": "Akustisuus", + "dance_ability": "Tanssittavuus", "energy": "Energia", - "instrumentalness": "Instrumentaalisuus", + "not_instrumental": "Instrumentaalisuus", "liveness": "Elävyyttä", "loudness": "Äänekkyys", - "speechiness": "Puheisuus", + "talkative": "Puheisuus", "valence": "Valenssi", "popularity": "Suosio", "key": "Sävellaji", @@ -244,7 +244,7 @@ "sort_newest": "Suodata uusimmista", "sort_oldest": "Suodata vanhimmista", "sleep_timer": "Uniajastin", - "mins": "{minutes} Minuuttia", + "minutes": "{minutes} Minuuttia", "hours": "{hours} Tuntia", "hour": "{hours} Tunti", "custom_hours": "Mukautetut tunnit", @@ -255,7 +255,7 @@ "audio_source": "Äänilähde", "ok": "Ok", "failed_to_encrypt": "Salaaminen epäonnistui", - "encryption_failed_warning": "Spotube käyttää salausta tallentaakseen tietosi, mutta epäonnistui, joten se palaa epäturvalliseen tallennukseen\nJos käytät Linuxia, varmista että sinulla on turvallisuuspalvelu (gnome-keyring, kde-wallet, keepassxc jne) asennettu", + "encryption_failed_warning": "Spotube käyttää salausta tallentaakseen tietosi, mutta epäonnistui, joten se palaa epäturvalliseen tallennukseen\nJos käytät Linuxia, varmista että sinulla on turvallisuuspalvelu (gnome-keyring, kde-wallet, KeePassXC jne) asennettu", "querying_info": "Hankitaan tietoa...", "piped_api_down": "Johdettu palvelinesiintymä on alhaalla", "piped_down_error_instructions": "Johdettu palvelinesiintymä {pipedInstance} on alhaalla.\n\nVaihda joko ilmeytymä tia vahda 'API tyyppi' YouTuben viralliseen API\n\nKäynnistä sovellus uudestaan vaihdon jälkeen", @@ -370,9 +370,9 @@ "streamed_songs": "Suoratoistettuja kappaleita", "count_streams": "{count} suoratoistoa", "owned_by_you": "Sinun omistama", - "copied_shareurl_to_clipboard": "{shareUrl} kopioitu leikepöydälle", - "spotify_hipotetical_calculation": "*Tämä on laskettu Spotifyn suoratoiston\nmaksun perusteella, joka on 0,003–0,005 dollaria.\nTämä on hypoteettinen laskelma, joka antaa käyttäjälle käsityksen\nsiitä, kuinka paljon he olisivat maksaneet artisteille,\njollei heidän kappaleensa olisi kuunneltu Spotifyssa.", - "count_mins": "{minutes} min", + "copied_share_url_to_clipboard": "{shareUrl} kopioitu leikepöydälle", + "spotify_hypothetical_calculation": "*Tämä on laskettu Spotifyn suoratoiston\nmaksun perusteella, joka on 0,003–0,005 dollaria.\nTämä on hypoteettinen laskelma, joka antaa käyttäjälle käsityksen\nsiitä, kuinka paljon he olisivat maksaneet artisteille,\njollei heidän kappaleensa olisi kuunneltu Spotifyssa.", + "count_minutes": "{minutes} min", "summary_minutes": "minuuttia", "summary_listened_to_music": "Kuunneltu musiikkia", "summary_songs": "kappaletta", diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 636cffec..9dd3db39 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -88,7 +88,7 @@ "mini_player": "Lecteur mini", "slide_to_seek": "Faites glisser pour avancer ou reculer", "shuffle_playlist": "Lecture aléatoire de la liste de lecture", - "unshuffle_playlist": "Annuler la lecture aléatoire de la liste de lecture", + "not_shuffle_playlist": "Annuler la lecture aléatoire de la liste de lecture", "previous_track": "Piste précédente", "next_track": "Piste suivante", "pause_playback": "Mettre en pause la lecture", @@ -173,7 +173,7 @@ "first_go_to": "Tout d'abord, allez sur", "login_if_not_logged_in": "et connectez-vous/inscrivez-vous si vous n'êtes pas connecté", "step_2": "Étape 2", - "step_2_steps": "1. Une fois connecté, appuyez sur F12 ou clic droit de la souris > Inspecter pour ouvrir les outils de développement du navigateur.\n2. Ensuite, allez dans l'onglet \"Application\" (Chrome, Edge, Brave, etc.) ou l'onglet \"Stockage\" (Firefox, Palemoon, etc.)\n3. Allez dans la section \"Cookies\", puis dans la sous-section \"https://accounts.spotify.com\"", + "step_2_steps": "1. Une fois connecté, appuyez sur F12 ou clic droit de la souris > Inspecter pour ouvrir les outils de développement du navigateur.\n2. Ensuite, allez dans l'onglet \"Application\" (Chrome, Edge, Brave, etc.) ou l'onglet \"Stockage\" (Firefox, Pale Moon, etc.)\n3. Allez dans la section \"Cookies\", puis dans la sous-section \"https://accounts.spotify.com\"", "step_3": "Étape 3", "success_emoji": "Succès🥳", "success_message": "Vous êtes maintenant connecté avec succès à votre compte Spotify. Bon travail, mon ami!", @@ -194,13 +194,13 @@ "add_genres": "Ajouter des genres", "country": "Pays", "number_of_tracks_generate": "Nombre de pistes à générer", - "acousticness": "Acoustique", - "danceability": "Dansabilité", + "not_acoustic": "Acoustique", + "dance_ability": "Dansabilité", "energy": "Énergie", - "instrumentalness": "Instrumentalité", + "not_instrumental": "Instrumentalité", "liveness": "Interprétation en direct", "loudness": "Sonorité", - "speechiness": "Parlé", + "talkative": "Parlé", "valence": "Valeur émotionnelle", "popularity": "Popularité", "key": "Clé", @@ -239,7 +239,7 @@ "sort_newest": "Trier par les plus récents", "sort_oldest": "Trier par les plus anciens", "sleep_timer": "Minuteur de veille", - "mins": "{minutes} minutes", + "minutes": "{minutes} minutes", "hours": "{hours} heures", "hour": "{hours} heure", "custom_hours": "Heures personnalisées", @@ -250,7 +250,7 @@ "audio_source": "Source audio", "ok": "OK", "failed_to_encrypt": "Échec de la cryptage", - "encryption_failed_warning": "Spotube utilise le cryptage pour stocker vos données en toute sécurité. Mais cela a échoué. Il basculera donc vers un stockage non sécurisé\nSi vous utilisez Linux, assurez-vous d'avoir installé des services secrets tels que gnome-keyring, kde-wallet et keepassxc", + "encryption_failed_warning": "Spotube utilise le cryptage pour stocker vos données en toute sécurité. Mais cela a échoué. Il basculera donc vers un stockage non sécurisé\nSi vous utilisez Linux, assurez-vous d'avoir installé des services secrets tels que gnome-keyring, kde-wallet et KeePassXC", "querying_info": "Interrogation des info...", "piped_api_down": "L'API Piped est hors service", "piped_down_error_instructions": "L'instance Piped {pipedInstance} est actuellement indisponible\n\nChangez soit l'instance, soit le 'Type d'API' pour utiliser l'API officielle de YouTube\n\nN'oubliez pas de redémarrer l'application après la modification", @@ -370,9 +370,9 @@ "streamed_songs": "Morceaux diffusés", "count_streams": "{count} streams", "owned_by_you": "Possédé par vous", - "copied_shareurl_to_clipboard": "{shareUrl} copié dans le presse-papier", - "spotify_hipotetical_calculation": "*Cela est calculé en fonction du\npaiement par stream de Spotify de 0,003 $ à 0,005 $.\nIl s'agit d'un calcul hypothétique pour donner\nune idée de combien vous auriez\npayé aux artistes si vous aviez\nécouté leur chanson sur Spotify.", - "count_mins": "{minutes} minutes", + "copied_share_url_to_clipboard": "{shareUrl} copié dans le presse-papier", + "spotify_hypothetical_calculation": "*Cela est calculé en fonction du\npaiement par stream de Spotify de 0,003 $ à 0,005 $.\nIl s'agit d'un calcul hypothétique pour donner\nune idée de combien vous auriez\npayé aux artistes si vous aviez\nécouté leur chanson sur Spotify.", + "count_minutes": "{minutes} minutes", "summary_minutes": "minutes", "summary_listened_to_music": "A écouté de la musique", "summary_songs": "morceaux", diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index fc59d31a..4c84c39d 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -88,7 +88,7 @@ "mini_player": "मिनी प्लेयर", "slide_to_seek": "आगे या पीछे खोजने के लिए स्लाइड करें", "shuffle_playlist": "प्लेलिस्ट शफल करें", - "unshuffle_playlist": "अनशफल प्लेलिस्ट", + "not_shuffle_playlist": "अनशफल प्लेलिस्ट", "previous_track": "पिछला ट्रैक", "next_track": "अगला ट्रैक", "pause_playback": "वापसी बंद करें", @@ -173,7 +173,7 @@ "first_go_to": "पहले, जाएं", "login_if_not_logged_in": "और यदि आप लॉगिन नहीं हैं तो लॉगिन / साइनअप करें", "step_2": "2 चरण", - "step_2_steps": "1. जब आप लॉगिन हो जाएँ, तो F12 दबाएं या माउस राइट क्लिक> निरीक्षण करें ताकि ब्राउज़र डेवटूल्स खुलें।\n2. फिर ब्राउज़र के \"एप्लिकेशन\" टैब (Chrome, Edge, Brave आदि) या \"स्टोरेज\" टैब (Firefox, Palemoon आदि) में जाएं\n3. \"कुकीज़\" अनुभाग में जाएं फिर \"https: //accounts.spotify.com\" उप-अनुभाग में जाएं", + "step_2_steps": "1. जब आप लॉगिन हो जाएँ, तो F12 दबाएं या माउस राइट क्लिक> निरीक्षण करें ताकि ब्राउज़र डेवटूल्स खुलें।\n2. फिर ब्राउज़र के \"एप्लिकेशन\" टैब (Chrome, Edge, Brave आदि) या \"स्टोरेज\" टैब (Firefox, Pale Moon आदि) में जाएं\n3. \"कुकीज़\" अनुभाग में जाएं फिर \"https: //accounts.spotify.com\" उप-अनुभाग में जाएं", "step_3": "स्टेप 3", "success_emoji": "सफलता🥳", "success_message": "अब आप अपने स्पॉटिफाई अकाउंट से सफलतापूर्वक लॉगइन हो गए हैं। अच्छा काम किया!", @@ -194,13 +194,13 @@ "add_genres": "जान्र जोड़ें", "country": "देश", "number_of_tracks_generate": "उत्पन्न करने के लिए ट्रैक की संख्या", - "acousticness": "ध्वनिकता", - "danceability": "नृत्यता", + "not_acoustic": "ध्वनिकता", + "dance_ability": "नृत्यता", "energy": "ऊर्जा", - "instrumentalness": "आलापिकता", + "not_instrumental": "आलापिकता", "liveness": "जीवंतता", "loudness": "शोर", - "speechiness": "बोलचालता", + "talkative": "बोलचालता", "valence": "मनोदयता", "popularity": "लोकप्रियता", "key": "कुंजी", @@ -239,7 +239,7 @@ "sort_newest": "नवीनतम जोड़े गए के अनुसार क्रमबद्ध करें", "sort_oldest": "सबसे पुराने जोड़े गए के अनुसार क्रमबद्ध करें", "sleep_timer": "स्लीप टाइमर", - "mins": "{minutes} मिनट", + "minutes": "{minutes} मिनट", "hours": "{hours} घंटे", "hour": "{hours} घंटा", "custom_hours": "कस्टम घंटे", @@ -250,7 +250,7 @@ "audio_source": "ऑडियो स्रोत", "ok": "ठीक है", "failed_to_encrypt": "एन्क्रिप्ट करने में विफल रहा", - "encryption_failed_warning": "Spotube आपके डेटा को सुरक्षित रूप से स्टोर करने के लिए एन्क्रिप्शन का उपयोग करता है। लेकिन इसमें विफल रहा। इसलिए, यह असुरक्षित स्टोरेज पर फॉलबैक करेगा\nयदि आप Linux का उपयोग कर रहे हैं, तो कृपया सुनिश्चित करें कि आपके पास gnome-keyring, kde-wallet, keepassxc आदि जैसी कोई सीक्रेट-सर्विस इंस्टॉल की गई है", + "encryption_failed_warning": "Spotube आपके डेटा को सुरक्षित रूप से स्टोर करने के लिए एन्क्रिप्शन का उपयोग करता है। लेकिन इसमें विफल रहा। इसलिए, यह असुरक्षित स्टोरेज पर फॉलबैक करेगा\nयदि आप Linux का उपयोग कर रहे हैं, तो कृपया सुनिश्चित करें कि आपके पास gnome-keyring, kde-wallet, KeePassXC आदि जैसी कोई सीक्रेट-सर्विस इंस्टॉल की गई है", "querying_info": "जानकारी प्राप्त करना", "piped_api_down": "पाइप्ड एपीआई डाउन है", "piped_down_error_instructions": "पाइप्ड इंस्टेंस {pipedInstance} वर्तमान में डाउन है\n\nइंस्टेंस बदलें या 'एपीआई प्रकार' को आधिकृत YouTube एपीआई में बदलें\n\nपरिवर्तन के बाद ऐप को फिर से चालने की सुनिश्चित करें", @@ -366,7 +366,7 @@ "user_profile": "उपयोगकर्ता प्रोफ़ाइल", "count_plays": "{count} प्ले", "streaming_fees_hypothetical": "*Spotify की प्रति स्ट्रीम भुगतान के आधार पर\n$0.003 से $0.005 तक गणना की गई है। यह एक काल्पनिक\nगणना है जो उपयोगकर्ता को यह जानकारी देती है कि वे कितना भुगतान\nकरते यदि वे Spotify पर गाने सुनते।", - "count_mins": "{minutes} मिनट", + "count_minutes": "{minutes} मिनट", "summary_minutes": "मिनट", "summary_listened_to_music": "सुनी गई संगीत", "summary_songs": "गाने", @@ -383,8 +383,8 @@ "streamed_songs": "स्ट्रीम गरिएका गीतहरू", "count_streams": "{count} स्ट्रिम", "owned_by_you": "तपाईंले स्वामित्व गरेको", - "copied_shareurl_to_clipboard": "{shareUrl} क्लिपबोर्डमा कपी गरियो", - "spotify_hipotetical_calculation": "*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n$0.003 देखि $0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।", + "copied_share_url_to_clipboard": "{shareUrl} क्लिपबोर्डमा कपी गरियो", + "spotify_hypothetical_calculation": "*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n$0.003 देखि $0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।", "webview_not_found": "वेबव्यू नहीं मिला", "webview_not_found_description": "आपके डिवाइस पर वेबव्यू रनटाइम इंस्टॉल नहीं है।\nअगर इंस्टॉल है, तो सुनिश्चित करें कि यह environment PATH में है\n\nइंस्टॉल करने के बाद, ऐप को पुनः शुरू करें", "unsupported_platform": "असमर्थित प्लेटफार्म", diff --git a/lib/l10n/app_id.arb b/lib/l10n/app_id.arb index 91bc9aef..f714f05e 100644 --- a/lib/l10n/app_id.arb +++ b/lib/l10n/app_id.arb @@ -91,7 +91,7 @@ "mini_player": "Pemutar Mini", "slide_to_seek": "Geser untuk maju atau mundur", "shuffle_playlist": "Acak daftar putar", - "unshuffle_playlist": "Batalkan pengacakan daftar putar", + "not_shuffle_playlist": "Batalkan pengacakan daftar putar", "previous_track": "Lagu sebelumnya", "next_track": "Lagu berikutnya", "pause_playback": "Jeda Pemutaran", @@ -176,7 +176,7 @@ "first_go_to": "Pertama, Pergi ke", "login_if_not_logged_in": "dan Masuk/Daftar jika Anda belum masuk", "step_2": "Langkah 2", - "step_2_steps": "1. Setelah Anda masuk, tekan F12 atau Klik Kanan Mouse > Buka Browser Devtools.\n2. Lalu buka Tab \"Aplikasi\" (Chrome, Edge, Brave, dll.) atau Tab \"Penyimpanan\" (Firefox, Palemoon, dll.)\n3. Buka bagian \"Cookie\" lalu subbagian \"https://accounts.spotify.com\"", + "step_2_steps": "1. Setelah Anda masuk, tekan F12 atau Klik Kanan Mouse > Buka Browser Devtools.\n2. Lalu buka Tab \"Aplikasi\" (Chrome, Edge, Brave, dll.) atau Tab \"Penyimpanan\" (Firefox, Pale Moon, dll.)\n3. Buka bagian \"Cookie\" lalu subbagian \"https://accounts.spotify.com\"", "step_3": "Langkah 3", "step_3_steps": "Salin nilai Cookie \"sp_dc\" ", "success_emoji": "Berhasil🥳", @@ -199,13 +199,13 @@ "add_genres": "Tambah Genre", "country": "Negara", "number_of_tracks_generate": "Jumlah trek yang akan dihasilkan", - "acousticness": "Akustik", - "danceability": "Menari", + "not_acoustic": "Akustik", + "dance_ability": "Menari", "energy": "Energi", - "instrumentalness": "Instrumentalitas", + "not_instrumental": "Instrumentalitas", "liveness": "Kehidupan", "loudness": "Kekerasan", - "speechiness": "Berbicara", + "talkative": "Berbicara", "valence": "Valensi", "popularity": "Popularitas", "key": "Kunci", @@ -244,7 +244,7 @@ "sort_newest": "Urutkan yang baru ditambah", "sort_oldest": "Urutkan yang paling lama ditambah", "sleep_timer": "Pengatur Waktu Tidur", - "mins": "{minutes} Menit", + "minutes": "{minutes} Menit", "hours": "{hours} Jam", "hour": "{hours} Jam", "custom_hours": "Jam Kostum", @@ -255,7 +255,7 @@ "audio_source": "Sumber Suara", "ok": "OK", "failed_to_encrypt": "Gagal mengenkripsi", - "encryption_failed_warning": "Spotube menggunakan enkripsi untuk menyimpan data Anda dengan aman. Namun gagal melakukannya. Jadi itu akan kembali ke penyimpanan yang tidak aman\nJika Anda menggunakan linux, pastikan Anda telah menginstal layanan rahasia (gnome-keyring, kde-wallet, keepassxc, dll)", + "encryption_failed_warning": "Spotube menggunakan enkripsi untuk menyimpan data Anda dengan aman. Namun gagal melakukannya. Jadi itu akan kembali ke penyimpanan yang tidak aman\nJika Anda menggunakan linux, pastikan Anda telah menginstal layanan rahasia (gnome-keyring, kde-wallet, KeePassXC, dll)", "querying_info": "Mencari informasi...", "piped_api_down": "Piped API tidak aktif", "piped_down_error_instructions": "Piped Instance {pipedInstance} saat ini tidak aktif\n\nUbah instance atau ubah 'jenis API' menjadi API YouTube resmi\n\nPastikan untuk memulai ulang aplikasi setelah perubahan", @@ -370,9 +370,9 @@ "streamed_songs": "Lagu yang disiarkan", "count_streams": "{count} streams", "owned_by_you": "Dimiliki oleh Anda", - "copied_shareurl_to_clipboard": "{shareUrl} disalin ke clipboard", - "spotify_hipotetical_calculation": "*Ini dihitung berdasarkan pembayaran\nper stream Spotify dari $0,003 hingga $0,005.\nIni adalah perhitungan hipotetis untuk memberi\npengguna gambaran tentang berapa banyak\nmereka akan membayar kepada artis jika\nmereka mendengarkan lagu mereka di Spotify.", - "count_mins": "{minutes} menit", + "copied_share_url_to_clipboard": "{shareUrl} disalin ke clipboard", + "spotify_hypothetical_calculation": "*Ini dihitung berdasarkan pembayaran\nper stream Spotify dari $0,003 hingga $0,005.\nIni adalah perhitungan hipotetis untuk memberi\npengguna gambaran tentang berapa banyak\nmereka akan membayar kepada artis jika\nmereka mendengarkan lagu mereka di Spotify.", + "count_minutes": "{minutes} menit", "summary_minutes": "menit", "summary_listened_to_music": "Mendengarkan musik", "summary_songs": "lagu", diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index f598d363..172e19f1 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -18,7 +18,7 @@ "artists": "Artisti", "albums": "Album", "tracks": "Tracce", - "downloads": "Downloads", + "downloads": "Scaricati", "filter_playlists": "Filtra le tue playlist...", "liked_tracks": "Tracce piaciute", "liked_tracks_description": "Tutte le tracce piaciute", @@ -90,12 +90,12 @@ "mini_player": "Mini Riproduttore", "slide_to_seek": "Scorri per cercare avanti o indietro", "shuffle_playlist": "Playlist casuale", - "unshuffle_playlist": "Ordina playlist", + "not_shuffle_playlist": "Ordina playlist", "previous_track": "Traccia precedente", "next_track": "Traccia successiva", "pause_playback": "Pausa Playback", "resume_playback": "Riprendi Playback", - "loop_track": "Cicla traccia", + "loop_track": "Itera traccia", "repeat_playlist": "Ripeti playlist", "queue": "Coda", "alternative_track_sources": "Sorgenti traccia alternative", @@ -126,8 +126,8 @@ "dark": "Scuro", "light": "Chiaro", "system": "Sistema", - "accent_color": "Colore accento", - "sync_album_color": "Syncronizza colore album", + "accent_color": "Colore principale", + "sync_album_color": "Sincronizza colore album", "sync_album_color_description": "Usa il colore dominante della copertina dell'album come colore accento", "playback": "Riproduzione", "audio_quality": "Qualità Audio", @@ -149,7 +149,7 @@ "about_spotube": "A proposito di Spotube", "blacklist": "Blacklist", "please_sponsor": "Per favore sponsorizza/dona", - "spotube_description": "Spotube, un client spotify gratis per tutti, multipiattaforma e leggero", + "spotube_description": "Spotube, un client spotify gratis per tutti, multi-piattaforma e leggero", "version": "Versione", "build_number": "Numero Build", "founder": "Fondatore", @@ -175,15 +175,15 @@ "first_go_to": "Prim, vai a", "login_if_not_logged_in": "ed effettua il login o iscrizione se non sei già acceduto", "step_2": "Passo 2", - "step_2_steps": "1. Quando sei acceduto premi F12 o premi il tasto destro del Mouse > Ispeziona per aprire gli strumenti di sviluppo del browser.\n2. Vai quindi nel tab \"Applicazione\" (Chrome, Edge, Brave etc..) o tab \"Archiviazione\" (Firefox, Palemoon etc..)\n3. Vai nella sezione \"Cookies\" quindi nella sezione \"https://accounts.spotify.com\"", + "step_2_steps": "1. Quando sei acceduto premi F12 o premi il tasto destro del Mouse > Ispeziona per aprire gli strumenti di sviluppo del browser.\n2. Vai quindi nel tab \"Applicazione\" (Chrome, Edge, Brave etc..) o tab \"Archiviazione\" (Firefox, Pale Moon etc..)\n3. Vai nella sezione \"Cookies\" quindi nella sezione \"https://accounts.spotify.com\"", "step_3": "Passo 3", "success_emoji": "Successo🥳", "success_message": "Ora hai correttamente effettuato il login al tuo account Spotify. Bel lavoro, amico!", "step_4": "Passo 4", "something_went_wrong": "Qualcosa è andato storto", "piped_instance": "Istanza Server Piped", - "piped_description": "L'istanza server Piped da usare per il match della tracccia", - "piped_warning": "Alcune di queste non funzioneranno benen. Usa quindi a tuo rischio", + "piped_description": "L'istanza server Piped da usare per il match della traccia", + "piped_warning": "Alcune di queste non funzioneranno bene. Usa quindi a tuo rischio", "generate_playlist": "Genera Playlist", "track_exists": "La traccia {track} esiste già", "replace_downloaded_tracks": "Sostituisci tutte le tracce scaricate", @@ -195,14 +195,14 @@ "select_genres": "Seleziona Generi", "add_genres": "Aggiungi Generi", "country": "Paese", - "number_of_tracks_generate": "Nnumero di tracce da generare", - "acousticness": "Acustica", - "danceability": "Ballabilità", + "number_of_tracks_generate": "Numero di tracce da generare", + "not_acoustic": "Acustica", + "dance_ability": "Ballabile", "energy": "Energia", - "instrumentalness": "Strumentalità", + "not_instrumental": "Strumentalità", "liveness": "Vitalità", "loudness": "Sonorità", - "speechiness": "Loquacità", + "talkative": "Loquacità", "valence": "Valenza", "popularity": "Popolarità", "key": "Chiave", @@ -222,11 +222,11 @@ "are_you_sure": "Sei certo?", "generating_playlist": "Generazione delle tue playlist custom...", "selected_count_tracks": "{count} tracce selezionate", - "download_warning": "Se scarichi tutte le Tracce in massa stai chiaramente piratando Musica e causando un danno alla società creativa della Musica. Spero che tu sia cosciente di questo. Cerca di rispettare e supportare sempre il duro lavoro degli Artisti", - "download_ip_ban_warning": "A proposito, il tuo IP può essere bloccato da YouTube per il numero di richieste di download eccessive rispetto la norma. Il blocco IP significa che non puoi usare YoutTube (anche hai effettuato l'accesso) per almeno 2-3 mesi dal dispositivo con questo IP. Spotube non ha responsabilità se questo dovesse accadere", + "download_warning": "Se scarichi tutte le Tracce in massa stai chiaramente scaricando illegalmente Musica e causando un danno alla società creativa della Musica. Spero che tu sia cosciente di questo. Cerca di rispettare e supportare sempre il duro lavoro degli Artisti", + "download_ip_ban_warning": "A proposito, il tuo IP può essere bloccato da YouTube per il numero di richieste di download eccessive rispetto la norma. Il blocco IP significa che non puoi usare YouTube (anche hai effettuato l'accesso) per almeno 2-3 mesi dal dispositivo con questo IP. Spotube non ha responsabilità se questo dovesse accadere", "by_clicking_accept_terms": "Cliccando su 'accetta' concordi con i seguenti termini:", - "download_agreement_1": "So che sto piratando Musica. Sono cattivo", - "download_agreement_2": "Supporterò l'Artista come potrò e sto facendo questo solo perchè non ho denaro per acquistare il suo prodotto dell'ingegno", + "download_agreement_1": "So che sto scaricando illegalmente Musica. Sono cattivo", + "download_agreement_2": "Supporterò l'Artista come potrò e sto facendo questo solo perché non ho denaro per acquistare il suo prodotto dell'ingegno", "download_agreement_3": "Sono completamente cosciente che il mio IP può essere bloccato da YouTube & non riterrò responsabili Spotube o i suoi autori/contributori per ogni inconveniente causato dalla mia azione corrente", "decline": "Declino", "accept": "Accetto", @@ -241,7 +241,7 @@ "sort_newest": "Ordina per nuovi aggiunti", "sort_oldest": "Ordina per aggiunta più vecchia", "sleep_timer": "Timer Dormire", - "mins": "{minutes} Minuti", + "minutes": "{minutes} Minuti", "hours": "{hours} Ore", "hour": "{hours} Ora", "custom_hours": "Orari Personalizzati", @@ -252,7 +252,7 @@ "youtube_api_type": "Tipo API", "ok": "Ok", "failed_to_encrypt": "Criptazione fallita", - "encryption_failed_warning": "Spotube usa la criptazione per memorizzare in modo sicuro i dati. Ma ha fallito a farlo. Passerà quindi in ripiego alla memorizzazione non siscura\nSe stai usando Linux assicurati di avere un servizio di segretezza installato (gnome-keyring, kde-wallet, keepassxc etc)", + "encryption_failed_warning": "Spotube usa la criptazione per memorizzare in modo sicuro i dati. Ma ha fallito a farlo. Passerà quindi in ripiego alla memorizzazione non sicura\n Se stai usando Linux assicurati di avere un servizio di segretezza installato (gnome-keyring, kde-wallet, KeePassXC etc)", "querying_info": "Richiesta informazioni...", "piped_api_down": "Le Piped API non funzionano", "piped_down_error_instructions": "L'istanza di Piped {pipedInstance} è correntemente offline\n\nCambia istanza o cambia 'Tipo API' alle API ufficiali YouTube\n\nAssicurati di riavviare l'app dopo il cambio", @@ -271,8 +271,8 @@ "streaming_music_codec": "Codec musicale streaming", "login_with_lastfm": "Accesso a Last.fm", "connect": "Connetti", - "disconnect_lastfm": "Disconnetti Last.fm", - "disconnect": "Disconnetti", + "disconnect_lastfm": "Scollega Last.fm", + "disconnect": "Scollega", "username": "Nome utente", "password": "Password", "login": "Accesso", @@ -371,9 +371,9 @@ "streamed_songs": "Brani in streaming", "count_streams": "{count} streaming", "owned_by_you": "Di tua proprietà", - "copied_shareurl_to_clipboard": "Copiato {shareUrl} negli appunti", - "spotify_hipotetical_calculation": "*Questo è calcolato in base al pagamento per streaming di Spotify\nche va da $0.003 a $0.005. Questo è un calcolo ipotetico\nper dare all'utente un'idea di quanto avrebbe pagato agli artisti se avesse ascoltato\ne loro canzoni su Spotify.", - "count_mins": "{minutes} min", + "copied_share_url_to_clipboard": "Copiato {shareUrl} negli appunti", + "spotify_hypothetical_calculation": "*Questo è calcolato in base al pagamento per streaming di Spotify\nche va da $0.003 a $0.005. Questo è un calcolo ipotetico\nper dare all'utente un'idea di quanto avrebbe pagato agli artisti se avesse ascoltato\ne loro canzoni su Spotify.", + "count_minutes": "{minutes} min", "summary_minutes": "minuti", "summary_listened_to_music": "Musica ascoltata", "summary_songs": "brani", diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index b885fa59..6dd9e21e 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -88,7 +88,7 @@ "mini_player": "ミニプレイヤー", "slide_to_seek": "前後にスライドしてシーク", "shuffle_playlist": "再生リストをシャッフル", - "unshuffle_playlist": "再生リストのシャッフル解除", + "not_shuffle_playlist": "再生リストのシャッフル解除", "previous_track": "前の曲", "next_track": "次の曲", "pause_playback": "再生を停止", @@ -173,7 +173,7 @@ "first_go_to": "最初にここを開き", "login_if_not_logged_in": "、ログインしてないならログインまたは登録します", "step_2": "ステップ 2", - "step_2_steps": "1. ログインしたら、F12を押すか、マウス右クリック > 調査(検証)でブラウザの開発者ツール (devtools) を開きます。\n2. アプリケーション (Application) タブ (Chrome, Edge, Brave など) またはストレージタブ (Firefox, Palemoon など)\n3. Cookies 欄を選択し、https://accounts.spotify.com の枝を選びます", + "step_2_steps": "1. ログインしたら、F12を押すか、マウス右クリック > 調査(検証)でブラウザの開発者ツール (devtools) を開きます。\n2. アプリケーション (Application) タブ (Chrome, Edge, Brave など) またはストレージタブ (Firefox, Pale Moon など)\n3. Cookies 欄を選択し、https://accounts.spotify.com の枝を選びます", "step_3": "ステップ 3", "success_emoji": "成功🥳", "success_message": "アカウントへのログインに成功しました。よくできました!", @@ -194,13 +194,13 @@ "add_genres": "ジャンルを追加", "country": "国", "number_of_tracks_generate": "生成する曲数", - "acousticness": "アコースティック感", - "danceability": "ダンス感", + "not_acoustic": "アコースティック感", + "dance_ability": "ダンス感", "energy": "エネルギー", - "instrumentalness": "インストゥルメンタル", + "not_instrumental": "インストゥルメンタル", "liveness": "ライブ感", "loudness": "ラウドネス", - "speechiness": "会話感", + "talkative": "会話感", "valence": "多幸性", "popularity": "人気度", "key": "キー", @@ -239,7 +239,7 @@ "sort_newest": "追加日の新しい順に並び替え", "sort_oldest": "追加日の古い順に並び替え", "sleep_timer": "スリープタイマー", - "mins": "{minutes} 分", + "minutes": "{minutes} 分", "hours": "{hours} 時間", "hour": "{hours} 時間", "custom_hours": "時間を指定", @@ -250,7 +250,7 @@ "audio_source": "音声ソース", "ok": "分かりました", "failed_to_encrypt": "暗号化に失敗しました", - "encryption_failed_warning": "Spotubeはデータを安全に保存するために暗号化を使用しています。しかし、失敗しました。したがって、安全でないストレージにフォールバックします\nLinuxを使用している場合は、gnome-keyring、kde-wallet、keepassxcなどのシークレットサービスがインストールされていることを確認してください", + "encryption_failed_warning": "Spotubeはデータを安全に保存するために暗号化を使用しています。しかし、失敗しました。したがって、安全でないストレージにフォールバックします\nLinuxを使用している場合は、gnome-keyring、kde-wallet、KeePassXCなどのシークレットサービスがインストールされていることを確認してください", "querying_info": "情報を取得中...", "piped_api_down": "Piped APIがダウンしています", "piped_down_error_instructions": "Pipedインスタンス{pipedInstance}は現在ダウンしています\n\nインスタンスを変更するか、'APIタイプ'を公式のYouTube APIに変更してください\n\n変更後にアプリを再起動してください", @@ -366,7 +366,7 @@ "user_profile": "ユーザープロフィール", "count_plays": "{count} 回再生", "streaming_fees_hypothetical": "*これは Spotify のストリームあたりの支払い\nが $0.003 から $0.005 であると仮定して計算されています。\nこれは、Spotify でその曲を聴いた場合にアーティストにいくら支払ったかの\n洞察を得るための仮定の計算です。", - "count_mins": "{minutes} 分", + "count_minutes": "{minutes} 分", "summary_minutes": "分", "summary_listened_to_music": "音楽を聴いた", "summary_songs": "曲", @@ -383,8 +383,8 @@ "streamed_songs": "ストリーミングされた曲", "count_streams": "{count} 回のストリーム", "owned_by_you": "あなたが所有", - "copied_shareurl_to_clipboard": "{shareUrl} をクリップボードにコピーしました", - "spotify_hipotetical_calculation": "*これは、Spotifyのストリームごとの支払い\nが $0.003 から $0.005 の範囲で計算されています。これは仮想的な\n計算で、Spotify で曲を聴いた場合に、アーティストに\nどれくらい支払ったかをユーザーに示すためのものです。", + "copied_share_url_to_clipboard": "{shareUrl} をクリップボードにコピーしました", + "spotify_hypothetical_calculation": "*これは、Spotifyのストリームごとの支払い\nが $0.003 から $0.005 の範囲で計算されています。これは仮想的な\n計算で、Spotify で曲を聴いた場合に、アーティストに\nどれくらい支払ったかをユーザーに示すためのものです。", "webview_not_found": "Webviewが見つかりません", "webview_not_found_description": "デバイスにWebviewランタイムがインストールされていません。\nインストールされている場合は、environment PATHにあることを確認してください\n\nインストール後、アプリを再起動してください", "unsupported_platform": "サポートされていないプラットフォーム", diff --git a/lib/l10n/app_ka.arb b/lib/l10n/app_ka.arb index 8bc9cf36..76fde2ee 100644 --- a/lib/l10n/app_ka.arb +++ b/lib/l10n/app_ka.arb @@ -91,7 +91,7 @@ "mini_player": "მინი დამკვრელი", "slide_to_seek": "გადახვევისთვის გაასრიალეთ წინ ან უკან", "shuffle_playlist": "ფლეილისტის არევა", - "unshuffle_playlist": "ფლეილისტის დალაგება", + "not_shuffle_playlist": "ფლეილისტის დალაგება", "previous_track": "წინა ტრეკი", "next_track": "შემდეგი ტრეკი", "pause_playback": "დაკვრის გაჩერება", @@ -176,7 +176,7 @@ "first_go_to": "პირველი, გადადით", "login_if_not_logged_in": "და შესვლა/რეგისტრაცია, თუ არ ხართ შესული", "step_2": "ნაბიჯი 2", - "step_2_steps": "1. როცა შეხვალთ, დააჭირეთ F12-ს ან მაუსის მარჯვენა ღილაკს > Inspect to Open the Browser devtools.\n2. შემდეგ გახსენით \"Application\" განყოფილება (Chrome, Edge, Brave etc..) ან \"Storage\" განყოფილება (Firefox, Palemoon etc..)\n3. შედით \"Cookies\" სექციაში და შემდეგ \"https://accounts.spotify.com\" სუბსექციაში", + "step_2_steps": "1. როცა შეხვალთ, დააჭირეთ F12-ს ან მაუსის მარჯვენა ღილაკს > Inspect to Open the Browser devtools.\n2. შემდეგ გახსენით \"Application\" განყოფილება (Chrome, Edge, Brave etc..) ან \"Storage\" განყოფილება (Firefox, Pale Moon etc..)\n3. შედით \"Cookies\" სექციაში და შემდეგ \"https://accounts.spotify.com\" სუბსექციაში", "step_3": "ნაბიჯი 3", "step_3_steps": "დააკოპირეთ \"sp_dc\" ქუქი-ფაილის მნიშვნელობა", "success_emoji": "წარმატება🥳", @@ -199,13 +199,13 @@ "add_genres": "ჟანრების დამატება", "country": "ქვეყანა", "number_of_tracks_generate": "დასაგენერირებელი ტრეკების რაოდენობა", - "acousticness": "Acousticness", - "danceability": "Danceability", + "not_acoustic": "not_acoustic", + "dance_ability": "dance_ability", "energy": "Energy", - "instrumentalness": "Instrumentalness", + "not_instrumental": "not_instrumental", "liveness": "Liveness", "loudness": "Loudness", - "speechiness": "Speechiness", + "talkative": "talkative", "valence": "Valence", "popularity": "Popularity", "key": "Key", @@ -244,7 +244,7 @@ "sort_newest": "ფალაგება სიახლის მიხედიტ", "sort_oldest": "დალაგება სიძველის მიხედვით", "sleep_timer": "ძილის ტაიმერი", - "mins": "{minutes} წუთი", + "minutes": "{minutes} წუთი", "hours": "{hours} საათი", "hour": "{hours} საათი", "custom_hours": "მორგებული საათები", @@ -255,7 +255,7 @@ "audio_source": "აუდიოს წყარო", "ok": "ოკ", "failed_to_encrypt": "დაშიფვრა ვერ მოხერხდა", - "encryption_failed_warning": "Spotube uses encryption to securely store your data. But failed to do so. So it'll fallback to insecure storage\nIf you're using linux, please make sure you've any secret-service (gnome-keyring, kde-wallet, keepassxc etc) installed", + "encryption_failed_warning": "Spotube uses encryption to securely store your data. But failed to do so. So it'll fallback to insecure storage\nIf you're using linux, please make sure you've any secret-service (gnome-keyring, kde-wallet, KeePassXC etc) installed", "querying_info": "Querying info...", "piped_api_down": "Piped API is down", "piped_down_error_instructions": "The Piped instance {pipedInstance} is currently down\n\nEither change the instance or change the 'API type' to official YouTube API\n\nMake sure to restart the app after change", @@ -366,7 +366,7 @@ "user_profile": "მომხმარებლის პროფილი", "count_plays": "{count} გაწვდვა", "streaming_fees_hypothetical": "*ეს рассчитывается на основе выплат за поток от Spotify\nот $0.003 до $0.005. ეს ჰიპოთეტური გამოთვლა იძლევა მომხმარებელს წარმოდგენას იმაზე, რამდენად\nგადახდილი იქნებოდა არტისტებისთვის, თუ მათ მოუსმინოს Spotify-ს ტრეკებს.", - "count_mins": "{minutes} წუთი", + "count_minutes": "{minutes} წუთი", "summary_minutes": "წუთები", "summary_listened_to_music": "მუსიკა გაწვდილი", "summary_songs": "მელოდია", @@ -383,8 +383,8 @@ "streamed_songs": "სტრიმირებული სიმღერები", "count_streams": "{count} სტრიმი", "owned_by_you": "შენ მიერ საკუთრებული", - "copied_shareurl_to_clipboard": "{shareUrl} აიღო კლიპბორდზე", - "spotify_hipotetical_calculation": "*ეს გამოითვლება Spotify-ის თითოეულ სტრიმზე\nგადახდის შესაბამისად, რომელიც $0.003 დან $0.005-მდეა. ეს არის ჰიპოთეტური\nგამოთვლა, რომელიც აჩვენებს მომხმარებელს რამდენი გადაიხდიდა\nარტისტებს, თუკი ისინი უსმენდნენ მათ სიმღერებს Spotify-ზე.", + "copied_share_url_to_clipboard": "{shareUrl} აიღო კლიპბორდზე", + "spotify_hypothetical_calculation": "*ეს გამოითვლება Spotify-ის თითოეულ სტრიმზე\nგადახდის შესაბამისად, რომელიც $0.003 დან $0.005-მდეა. ეს არის ჰიპოთეტური\nგამოთვლა, რომელიც აჩვენებს მომხმარებელს რამდენი გადაიხდიდა\nარტისტებს, თუკი ისინი უსმენდნენ მათ სიმღერებს Spotify-ზე.", "webview_not_found": "ვებვიუ ვერ მოიძებნა", "webview_not_found_description": "თქვენს მოწყობილობაზე ვებვიუის შესრულების დრო არ არის დაყენებული.\nთუ დაყენებულია, დარწმუნდით, რომ ის environment PATH-შია\n\nდაყენების შემდეგ, გადატვირთეთ აპი", "unsupported_platform": "მოუხერხებელი პლატფორმა", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 6c8031b5..fe98c4ed 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -88,7 +88,7 @@ "mini_player": "미니 플레이어", "slide_to_seek": "앞뒤로 슬라이드하여 탐색", "shuffle_playlist": "플레이리스트를 섞기", - "unshuffle_playlist": "플레이리스트를 섞지 않기", + "not_shuffle_playlist": "플레이리스트를 섞지 않기", "previous_track": "이전 곡", "next_track": "다음 곡", "pause_playback": "일시정지", @@ -173,7 +173,7 @@ "first_go_to": "가장 먼저 먼저 들어갈 곳은 ", "login_if_not_logged_in": "그리고 로그인을 하지 않았다면 로그인해주세요", "step_2": "2단계", - "step_2_steps": "1. 로그인에 성공하면、F12나 마우스 우클릭 > 검사(Inspect)을 눌러 브라우저의 개발자 도구(devtools)를 열어주세요.\n2. 애플리케이션 (Application) 탭 (Chrome, Edge, Brave 등) 또는 스토리지 탭 (Firefox, Palemoon 등)을 열어주세요.\n3. 쿠키 (Cookies) 섹션으로 들어가서, https://accounts.spotify.com 서브섹션으로 들어가주세요.", + "step_2_steps": "1. 로그인에 성공하면、F12나 마우스 우클릭 > 검사(Inspect)을 눌러 브라우저의 개발자 도구(devtools)를 열어주세요.\n2. 애플리케이션 (Application) 탭 (Chrome, Edge, Brave 등) 또는 스토리지 탭 (Firefox, Pale Moon 등)을 열어주세요.\n3. 쿠키 (Cookies) 섹션으로 들어가서, https://accounts.spotify.com 서브섹션으로 들어가주세요.", "step_3": "3단계", "success_emoji": "성공🥳", "success_message": "성공적으로 스포티파이 게정으로 로그인했습니다. 잘했어요!", @@ -194,13 +194,13 @@ "add_genres": "장르 추가", "country": "국가", "number_of_tracks_generate": "생성할 곡 수", - "acousticness": "반주 구간 (Acousticness)", - "danceability": "흥겨운 정도 (Danceability)", + "not_acoustic": "반주 구간 (not_acoustic)", + "dance_ability": "흥겨운 정도 (dance_ability)", "energy": "에너지 (Energy)", - "instrumentalness": "기악성 (Instrumentalness)", + "not_instrumental": "기악성 (not_instrumental)", "liveness": "생동감 (Liveness)", "loudness": "라우드니스 (Loudness)", - "speechiness": "회화성 (Speechniss)", + "talkative": "회화성 (Speechniss)", "valence": "감정가 (Valence)", "popularity": "인기도 (Popularity)", "key": "조성 (키)", @@ -239,7 +239,7 @@ "sort_newest": "최근에 추가된 순으로 정렬", "sort_oldest": "예전에 추가된 순으로 정렬", "sleep_timer": "취침 타이머", - "mins": "{minutes} 분", + "minutes": "{minutes} 분", "hours": "{hours} 시간", "hour": "{hours} 시간", "custom_hours": "시간 설정", @@ -250,7 +250,7 @@ "audio_source": "오디오 출처", "ok": "알겠습니다", "failed_to_encrypt": "암호화에 실패했습니다", - "encryption_failed_warning": "Spotube는 암호화를 사용하여 데이터를 안전하게 저장합니다. 하지만 그렇게 하지 못했습니다. 따라서 안전하지 않은 저장소로 대체됩니다.\n리눅스를 사용하는 경우, 비밀 서비스(gnome-keyring, kde-wallet, keepassxc 등)가 설치되어 있는지 확인하세요.", + "encryption_failed_warning": "Spotube는 암호화를 사용하여 데이터를 안전하게 저장합니다. 하지만 그렇게 하지 못했습니다. 따라서 안전하지 않은 저장소로 대체됩니다.\n리눅스를 사용하는 경우, 비밀 서비스(gnome-keyring, kde-wallet, KeePassXC 등)가 설치되어 있는지 확인하세요.", "querying_info": "정보를 얻는 중...", "piped_api_down": "Piped API가 응답하지 않습니다", "piped_down_error_instructions": "Piped 인스턴스 {pipedInstance}가 현재 다운되었습니다.\n\n인스턴스를 변경하거나 'API 유형'을 공식 YouTube API로 변경하세요.\n\n변경 후 앱을 다시 시작해야 합니다.", @@ -367,7 +367,7 @@ "user_profile": "사용자 프로필", "count_plays": "{count} 재생", "streaming_fees_hypothetical": "*이것은 Spotify의 스트림당 지급액\n$0.003에서 $0.005를 기준으로 계산된 것입니다.\n이것은 사용자가 Spotify에서 곡을 들었을 때\n아티스트에게 지불했을 금액에 대한 통찰을 제공하기 위한\n가상의 계산입니다.", - "count_mins": "{minutes} 분", + "count_minutes": "{minutes} 분", "summary_minutes": "분", "summary_listened_to_music": "듣는 음악", "summary_songs": "곡", @@ -384,8 +384,8 @@ "streamed_songs": "스트리밍된 곡", "count_streams": "{count} 스트림", "owned_by_you": "당신이 소유", - "copied_shareurl_to_clipboard": "{shareUrl}를 클립보드에 복사했습니다", - "spotify_hipotetical_calculation": "*Spotify의 스트림당 지불금 $0.003에서 $0.005까지의\n기준으로 계산되었습니다. 이는 사용자가 Spotify에서\n곡을 들을 때 아티스트에게 얼마를 지불했을지를\n알려주기 위한 가상의 계산입니다.", + "copied_share_url_to_clipboard": "{shareUrl}를 클립보드에 복사했습니다", + "spotify_hypothetical_calculation": "*Spotify의 스트림당 지불금 $0.003에서 $0.005까지의\n기준으로 계산되었습니다. 이는 사용자가 Spotify에서\n곡을 들을 때 아티스트에게 얼마를 지불했을지를\n알려주기 위한 가상의 계산입니다.", "webview_not_found": "웹뷰를 찾을 수 없음", "webview_not_found_description": "기기에 웹뷰 런타임이 설치되지 않았습니다.\n설치되어 있으면 environment PATH에 있는지 확인하십시오\n\n설치 후 앱을 다시 시작하세요", "unsupported_platform": "지원되지 않는 플랫폼", diff --git a/lib/l10n/app_ne.arb b/lib/l10n/app_ne.arb index beddc3ad..eb0eb6a2 100644 --- a/lib/l10n/app_ne.arb +++ b/lib/l10n/app_ne.arb @@ -90,7 +90,7 @@ "mini_player": "मिनि प्लेयर", "slide_to_seek": "अगाडि वा पछाडि खोजी गर्नका लागि स्लाइड गर्नुहोस्", "shuffle_playlist": "प्लेलिस्ट शफल गर्नुहोस्", - "unshuffle_playlist": "प्लेलिस्ट शफल नगर्नुहोस्", + "not_shuffle_playlist": "प्लेलिस्ट शफल नगर्नुहोस्", "previous_track": "पूर्व ट्र्याक", "next_track": "अरू ट्र्याक", "pause_playback": "प्लेब्याक रोक्नुहोस्", @@ -175,7 +175,7 @@ "first_go_to": "पहिलो, जानुहोस्", "login_if_not_logged_in": "र लगइन/साइनअप गर्नुहोस् जुन तपाईंले लगइन गरेनन्", "step_2": "कदम 2", - "step_2_steps": "1. एकबार तपाईं लगइन गरे पछि, F12 थिच्नुहोस् वा माउस राइट क्लिक गर्नुहोस् > इन्स्पेक्ट गर्नुहोस् भने ब्राउजर डेभटुलहरू खुलाउनका लागि।\n2. तपाईंको \"एप्लिकेसन\" ट्याबमा जानुहोस् (Chrome, Edge, Brave इत्यादि) वा \"स्टोरेज\" ट्याबमा जानुहोस् (Firefox, Palemoon इत्यादि)\n3. तपाईंको इन्सेक्ट गरेको ब्राउजर डेभटुलहरूमा \"कुकीहरू\" खण्डमा जानुहोस् अनि \"https://accounts.spotify.com\" उपकोणमा जानुहोस्", + "step_2_steps": "1. एकबार तपाईं लगइन गरे पछि, F12 थिच्नुहोस् वा माउस राइट क्लिक गर्नुहोस् > इन्स्पेक्ट गर्नुहोस् भने ब्राउजर डेभटुलहरू खुलाउनका लागि।\n2. तपाईंको \"एप्लिकेसन\" ट्याबमा जानुहोस् (Chrome, Edge, Brave इत्यादि) वा \"स्टोरेज\" ट्याबमा जानुहोस् (Firefox, Pale Moon इत्यादि)\n3. तपाईंको इन्सेक्ट गरेको ब्राउजर डेभटुलहरूमा \"कुकीहरू\" खण्डमा जानुहोस् अनि \"https://accounts.spotify.com\" उपकोणमा जानुहोस्", "step_3": "कदम 3", "step_3_steps": "\"sp_dc\" र \"sp_key\" (वा sp_gaid) कुकीहरूको मानहरू प्रतिलिपि गर्नुहोस्", "success_emoji": "सफलता 🥳", @@ -198,13 +198,13 @@ "add_genres": "जनरहरू थप्नुहोस्", "country": "देश", "number_of_tracks_generate": "बनाउनका लागि ट्र्याकहरूको संख्या", - "acousticness": "एकोस्टिकनेस", - "danceability": "नृत्यक्षमता", + "not_acoustic": "एकोस्टिकनेस", + "dance_ability": "नृत्यक्षमता", "energy": "ऊर्जा", - "instrumentalness": "साजा रहेकोता", + "not_instrumental": "साजा रहेकोता", "liveness": "प्राणिकता", "loudness": "शोर", - "speechiness": "भाषण", + "talkative": "भाषण", "valence": "मानसिक स्वभाव", "popularity": "लोकप्रियता", "key": "कुञ्जी", @@ -243,7 +243,7 @@ "sort_newest": "नयाँ थपिएकोमा क्रमबद्ध गर्नुहोस्", "sort_oldest": "पुरानो थपिएकोमा क्रमबद्ध गर्नुहोस्", "sleep_timer": "सुत्ने टाइमर", - "mins": "{minutes} मिनेटहरू", + "minutes": "{minutes} मिनेटहरू", "hours": "{hours} घण्टाहरू", "hour": "{hours} घण्टा", "custom_hours": "कस्टम घण्टाहरू", @@ -366,7 +366,7 @@ "user_profile": "प्रयोगकर्ता प्रोफाइल", "count_plays": "{count} खेलाइन्छ", "streaming_fees_hypothetical": "*यो Spotify को प्रति स्ट्रिमको आधारमा गणना गरिएको छ\n$0.003 देखि $0.005 बीचको भुक्तानी। यो एक काल्पनिक गणना हो\nउपयोगकर्तालाई यो थाहा दिनको लागि कि उनीहरूले अर्टिस्टहरूलाई\nSpotify मा गीत सुनेको भए कति भुक्तानी गर्ने थिए।", - "count_mins": "{minutes} मिनेट", + "count_minutes": "{minutes} मिनेट", "summary_minutes": "मिनेट", "summary_listened_to_music": "सङ्गीत सुन्नु", "summary_songs": "गीतहरू", @@ -383,8 +383,8 @@ "streamed_songs": "स्ट्रीम गरिएका गीतहरू", "count_streams": "{count} स्ट्रिम", "owned_by_you": "तपाईंले स्वामित्व गरेको", - "copied_shareurl_to_clipboard": "{shareUrl} क्लिपबोर्डमा कपी गरियो", - "spotify_hipotetical_calculation": "*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n$0.003 देखि $0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।", + "copied_share_url_to_clipboard": "{shareUrl} क्लिपबोर्डमा कपी गरियो", + "spotify_hypothetical_calculation": "*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n$0.003 देखि $0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।", "webview_not_found": "वेबभ्यू फेला परेन", "webview_not_found_description": "तपाईंको उपकरणमा कुनै वेबभ्यू रनटाइम स्थापना गरिएको छैन।\nयदि स्थापना गरिएको छ भने, environment PATH मा छ कि छैन भनेर सुनिश्चित गर्नुहोस्\n\nस्थापना पछि, अनुप्रयोग पुनः सुरु गर्नुहोस्", "unsupported_platform": "असमर्थित प्लेटफार्म", diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 2127b382..1ebef413 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -90,7 +90,7 @@ "mini_player": "Minispeler", "slide_to_seek": "Schuiven om vooruit of achteruit te zoeken", "shuffle_playlist": "Afspeellijst schuifelen", - "unshuffle_playlist": "Afspeellijst onschuifelen", + "not_shuffle_playlist": "Afspeellijst onschuifelen", "previous_track": "Vorige nummer", "next_track": "Volgende nummer", "pause_playback": "Afspelen pauzeren", @@ -175,7 +175,7 @@ "first_go_to": "Ga eerst naar", "login_if_not_logged_in": "en Inloggen/Aanmelden als je niet bent ingelogd", "step_2": "Stap 2", - "step_2_steps": "1. Zodra je bent aangemeld, druk je op F12 of klik je met de rechtermuisknop > Inspect om de Browser devtools te openen.\n2. Ga vervolgens naar het tabblad \"Toepassing\" (Chrome, Edge, Brave enz..) of naar het tabblad \"Opslag\" (Firefox, Palemoon enz..).\n3. Ga naar de sectie \"Cookies\" en vervolgens naar de subsectie \"https://accounts.spotify.com\".", + "step_2_steps": "1. Zodra je bent aangemeld, druk je op F12 of klik je met de rechtermuisknop > Inspect om de Browser devtools te openen.\n2. Ga vervolgens naar het tabblad \"Toepassing\" (Chrome, Edge, Brave enz..) of naar het tabblad \"Opslag\" (Firefox, Pale Moon enz..).\n3. Ga naar de sectie \"Cookies\" en vervolgens naar de subsectie \"https://accounts.spotify.com\".", "step_3": "Stap 3", "step_3_steps": "De waarde van cookie \"sp_dc\" kopiëren", "success_emoji": "Succes🥳", @@ -198,13 +198,13 @@ "add_genres": "Genres toevoegen", "country": "Land", "number_of_tracks_generate": "Aantal nummers om te genereren", - "acousticness": "Akoestiek", - "danceability": "Dansbaarheid", + "not_acoustic": "Akoestiek", + "dance_ability": "Dansbaarheid", "energy": "Energie", - "instrumentalness": "Instrumentaliteit", + "not_instrumental": "Instrumentaliteit", "liveness": "Levendigheid", "loudness": "Luidheid", - "speechiness": "Spraak", + "talkative": "Spraak", "valence": "Valentie", "popularity": "Populariteit", "key": "Sleutel", @@ -225,7 +225,7 @@ "generating_playlist": "Aangepaste afspeellijst genereren…", "selected_count_tracks": "{count} nummers geselecteerd", "download_warning": "Als je alle nummers in bulk downloadt, ben je duidelijk bezig met muziekpiraterij en breng je schade toe aan de creatieve muziekmaatschappij. Ik hoop dat je je hiervan bewust bent. Probeer altijd het harde werk van artiesten te respecteren en te steunen.", - "download_ip_ban_warning": "BTW, je IP-adres kan worden geblokkeerd op YouTube als gevolg van buitensporige downloadverzoeken. IP-blokkering betekent dat je YouTube niet kunt gebruiken (zelfs als je ingelogd bent) voor tenminste 2-3 maanden vanaf dat IP-apparaat. Spotube is niet verantwoordelijk als dit ooit gebeurt.", + "download_ip_ban_warning": "BTW, je IP-adres kan worden geblokkeerd op YouTube als gevolg van buitensporige downloadverzoeken. IP-blokkering betekent dat je YouTube niet kunt gebruiken (zelfs als je ingelogd bent) voor tenminuteste 2-3 maanden vanaf dat IP-apparaat. Spotube is niet verantwoordelijk als dit ooit gebeurt.", "by_clicking_accept_terms": "Door op 'accepteren' te klikken ga je akkoord met de volgende voorwaarden:", "download_agreement_1": "Ik weet dat ik muziek illegaal donload. Ik ben slecht.", "download_agreement_2": "Ik steun de artiest waar ik kan en ik doe dit alleen omdat ik geen geld heb om hun kunst te kopen.", @@ -243,7 +243,7 @@ "sort_newest": "Sorteren op nieuwste toegevoegd", "sort_oldest": "Sorteren op oudste toegevoegd", "sleep_timer": "Slaaptimer", - "mins": "{minutes} minuten", + "minutes": "{minutes} minuten", "hours": "{hours} uren", "hour": "{hours} uur", "custom_hours": "Aangepaste uren", @@ -254,7 +254,7 @@ "youtube_api_type": "API-type", "ok": "Oké", "failed_to_encrypt": "Versleuteling mislukt", - "encryption_failed_warning": "Spotube gebruikt versleuteling om je gegevens veilig op te slaan. Maar dat is niet gelukt. Dus zal het terugvallen op onveilige opslag.\nAls je linux gebruikt, zorg er dan voor dat je een geheim-dienst (gnome-keyring, kde-wallet, keepassxc etc) hebt geïnstalleerd.", + "encryption_failed_warning": "Spotube gebruikt versleuteling om je gegevens veilig op te slaan. Maar dat is niet gelukt. Dus zal het terugvallen op onveilige opslag.\nAls je linux gebruikt, zorg er dan voor dat je een geheim-dienst (gnome-keyring, kde-wallet, KeePassXC etc) hebt geïnstalleerd.", "querying_info": "Info opvragen…", "piped_api_down": "Piped API is uit", "piped_down_error_instructions": "De Piped-instantie {pipedInstance} is momenteel uitgevallen\n\nVerander de instantie of verander het 'API-type' naar de officiële YouTube API.\n\nZorg ervoor dat u de app herstart na de wijziging", @@ -367,7 +367,7 @@ "user_profile": "Gebruikersprofiel", "count_plays": "{count} afspeelbeurten", "streaming_fees_hypothetical": "*Dit is berekend op basis van Spotify's uitbetaling per stream\nvan $0.003 tot $0.005. Dit is een hypothetische\nberekening om gebruikers inzicht te geven in hoeveel ze\naan de artiesten zouden hebben betaald als ze hun lied op Spotify zouden hebben beluisterd.", - "count_mins": "{minutes} min", + "count_minutes": "{minutes} min", "summary_minutes": "minuten", "summary_listened_to_music": "Beluisterde muziek", "summary_songs": "nummers", @@ -384,8 +384,8 @@ "streamed_songs": "Gestreamde nummers", "count_streams": "{count} streams", "owned_by_you": "Bezit door jou", - "copied_shareurl_to_clipboard": "{shareUrl} gekopieerd naar klembord", - "spotify_hipotetical_calculation": "*Dit is berekend op basis van Spotify's betaling per stream\nvan $0.003 tot $0.005. Dit is een hypothetische\nberekening om de gebruiker inzicht te geven in hoeveel ze\naan de artiesten zouden hebben betaald als ze hun liedjes op Spotify\nzouden luisteren.", + "copied_share_url_to_clipboard": "{shareUrl} gekopieerd naar klembord", + "spotify_hypothetical_calculation": "*Dit is berekend op basis van Spotify's betaling per stream\nvan $0.003 tot $0.005. Dit is een hypothetische\nberekening om de gebruiker inzicht te geven in hoeveel ze\naan de artiesten zouden hebben betaald als ze hun liedjes op Spotify\nzouden luisteren.", "webview_not_found": "Webview niet gevonden", "webview_not_found_description": "Er is geen Webview-runtime geïnstalleerd op uw apparaat.\nAls het is geïnstalleerd, zorg ervoor dat het in het environment PATH staat\n\nHerstart de app na installatie", "unsupported_platform": "Niet ondersteund platform", diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index ade74c90..182fea51 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -88,7 +88,7 @@ "mini_player": "Mały odwarzacz", "slide_to_seek": "Przesuń, aby przewinąć do przodu lub do tyłu.", "shuffle_playlist": "Odtwarzaj losowo z playlisty", - "unshuffle_playlist": "Nie odtwarzaj losowo z playlisty", + "not_shuffle_playlist": "Nie odtwarzaj losowo z playlisty", "previous_track": "Poprzedni utwór", "next_track": "Następny utwór", "pause_playback": "Zatrzymaj odwarzanie", @@ -173,7 +173,7 @@ "first_go_to": "Po pierwsze przejdź do", "login_if_not_logged_in": "i Zaloguj się/Zarejestruj jeśli nie jesteś zalogowany", "step_2": "Krok 2", - "step_2_steps": "1. Jeśli jesteś zalogowany, naciśnij klawisz F12 lub Kliknij prawym przyciskiem myszy > Zbadaj, aby odtworzyć narzędzia developerskie.\n2. Następnie przejdź do zakładki \"Application\" (Chrome, Edge, Brave etc..) lub zakładki \"Storage\" (Firefox, Palemoon etc..)\n3. Przejdź do sekcji \"Cookies\" a następnie do pod-sekcji \"https://accounts.spotify.com\"", + "step_2_steps": "1. Jeśli jesteś zalogowany, naciśnij klawisz F12 lub Kliknij prawym przyciskiem myszy > Zbadaj, aby odtworzyć narzędzia developerskie.\n2. Następnie przejdź do zakładki \"Application\" (Chrome, Edge, Brave etc..) lub zakładki \"Storage\" (Firefox, Pale Moon etc..)\n3. Przejdź do sekcji \"Cookies\" a następnie do pod-sekcji \"https://accounts.spotify.com\"", "step_3": "Krok 3", "success_emoji": "Sukces!🥳", "success_message": "Udało ci się zalogować! Dobra robota, stary!", @@ -194,13 +194,13 @@ "add_genres": "Dodaj Gatunki", "country": "Kraj", "number_of_tracks_generate": "Liczba utworów do wygenerowania", - "acousticness": "Akustyczna", - "danceability": "Taneczna", + "not_acoustic": "Akustyczna", + "dance_ability": "Taneczna", "energy": "Energiczna", - "instrumentalness": "Instrumentalna", + "not_instrumental": "Instrumentalna", "liveness": "Żywa", "loudness": "Głośna", - "speechiness": "Wymowna", + "talkative": "Wymowna", "valence": "Wartościowa", "popularity": "Popularność", "key": "Kluczowa", @@ -239,7 +239,7 @@ "sort_newest": "Sortuj według ostatnio dodanych", "sort_oldest": "Sortuj według najstarszych dodanych", "sleep_timer": "Minutnik", - "mins": "{minutes} Minuty", + "minutes": "{minutes} Minuty", "hours": "{hours} Godziny", "hour": "{hours} Godzina", "custom_hours": "Własne godziny", @@ -250,7 +250,7 @@ "audio_source": "Źródło dźwięku", "ok": "Ok", "failed_to_encrypt": "Nie można zaszyfrować :(", - "encryption_failed_warning": "Spotube używa szyfrowania do bezpiecznego przechowywania danych. Ale nie udało się tego zrobić. Więc powróci do niezabezpieczonego przechowywania\nJeśli używasz Linuksa, upewnij się, że masz zainstalowane jakieś usługi do szyfrowania (gnome-keyring, kde-wallet, keepassxc itp.)", + "encryption_failed_warning": "Spotube używa szyfrowania do bezpiecznego przechowywania danych. Ale nie udało się tego zrobić. Więc powróci do niezabezpieczonego przechowywania\nJeśli używasz Linuksa, upewnij się, że masz zainstalowane jakieś usługi do szyfrowania (gnome-keyring, kde-wallet, KeePassXC itp.)", "querying_info": "Szukam informacji...", "piped_api_down": "API Piped jest niedostępne", "piped_down_error_instructions": "Instancja Piped {pipedInstance} jest obecnie niedostępna\n\nZmień instancję lub zmień 'Rodzaj API' na oficjalne API YouTube\n\nUpewnij się, że po zmianie zrestartujesz aplikację", @@ -366,7 +366,7 @@ "user_profile": "Profil użytkownika", "count_plays": "{count} odtworzeń", "streaming_fees_hypothetical": "*Obliczone na podstawie wypłaty Spotify za stream\nod $0.003 do $0.005. Jest to hipotetyczne\nobliczenie, które ma na celu pokazanie, ile\nużytkownik zapłaciłby artystom, gdyby odsłuchał\ntych utworów na Spotify.", - "count_mins": "{minutes} min", + "count_minutes": "{minutes} min", "summary_minutes": "minuty", "summary_listened_to_music": "Słuchana muzyka", "summary_songs": "utwory", @@ -383,8 +383,8 @@ "streamed_songs": "Strumieniowane utwory", "count_streams": "{count} strumieni", "owned_by_you": "Własność Twoja", - "copied_shareurl_to_clipboard": "{shareUrl} skopiowano do schowka", - "spotify_hipotetical_calculation": "*Obliczone na podstawie płatności Spotify za strumień\nw zakresie od $0.003 do $0.005. Jest to hipotetyczne\nobliczenie mające na celu pokazanie użytkownikowi, ile\nzapłaciliby artystom, gdyby słuchali ich utworów na Spotify.", + "copied_share_url_to_clipboard": "{shareUrl} skopiowano do schowka", + "spotify_hypothetical_calculation": "*Obliczone na podstawie płatności Spotify za strumień\nw zakresie od $0.003 do $0.005. Jest to hipotetyczne\nobliczenie mające na celu pokazanie użytkownikowi, ile\nzapłaciliby artystom, gdyby słuchali ich utworów na Spotify.", "webview_not_found": "Nie znaleziono Webview", "webview_not_found_description": "Na twoim urządzeniu nie zainstalowano środowiska uruchomieniowego Webview.\nJeśli jest zainstalowany, upewnij się, że jest w environment PATH\n\nPo instalacji uruchom ponownie aplikację", "unsupported_platform": "Nieobsługiwana platforma", diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 6b1098a9..9a05a15f 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -88,7 +88,7 @@ "mini_player": "Mini Player", "slide_to_seek": "Arraste para avançar ou retroceder", "shuffle_playlist": "Embaralhar playlist", - "unshuffle_playlist": "Desembaralhar playlist", + "not_shuffle_playlist": "Desembaralhar playlist", "previous_track": "Faixa anterior", "next_track": "Próxima faixa", "pause_playback": "Pausar Reprodução", @@ -173,7 +173,7 @@ "first_go_to": "Primeiro, vá para", "login_if_not_logged_in": "e faça login/cadastro se ainda não estiver logado", "step_2": "Passo 2", - "step_2_steps": "1. Uma vez logado, pressione F12 ou clique com o botão direito do mouse > Inspecionar para abrir as ferramentas de desenvolvimento do navegador.\n2. Em seguida, vá para a guia \"Aplicativo\" (Chrome, Edge, Brave, etc.) ou \"Armazenamento\" (Firefox, Palemoon, etc.)\n3. Acesse a seção \"Cookies\" e depois a subseção \"https://accounts.spotify.com\"", + "step_2_steps": "1. Uma vez logado, pressione F12 ou clique com o botão direito do mouse > Inspecionar para abrir as ferramentas de desenvolvimento do navegador.\n2. Em seguida, vá para a guia \"Aplicativo\" (Chrome, Edge, Brave, etc.) ou \"Armazenamento\" (Firefox, Pale Moon, etc.)\n3. Acesse a seção \"Cookies\" e depois a subseção \"https://accounts.spotify.com\"", "step_3": "Passo 3", "success_emoji": "Sucesso🥳", "success_message": "Agora você está logado com sucesso em sua conta do Spotify. Bom trabalho!", @@ -194,13 +194,13 @@ "add_genres": "Adicionar Gêneros", "country": "País", "number_of_tracks_generate": "Número de faixas a gerar", - "acousticness": "Acústica", - "danceability": "Dançabilidade", + "not_acoustic": "Acústica", + "dance_ability": "Dançabilidade", "energy": "Energia", - "instrumentalness": "Instrumentalidade", + "not_instrumental": "Instrumentalidade", "liveness": "Vivacidade", "loudness": "Volume", - "speechiness": "Discurso", + "talkative": "Discurso", "valence": "Valência", "popularity": "Popularidade", "key": "Tonalidade", @@ -239,7 +239,7 @@ "sort_newest": "Ordenar por mais recente adicionado", "sort_oldest": "Ordenar por mais antigo adicionado", "sleep_timer": "Temporizador de Sono", - "mins": "{minutes} Minutos", + "minutes": "{minutes} Minutos", "hours": "{hours} Horas", "hour": "{hours} Hora", "custom_hours": "Horas Personalizadas", @@ -250,7 +250,7 @@ "audio_source": "Fonte de Áudio", "ok": "Ok", "failed_to_encrypt": "Falha ao criptografar", - "encryption_failed_warning": "O Spotube usa criptografia para armazenar seus dados com segurança, mas falhou em fazê-lo. Portanto, ele voltará para o armazenamento não seguro.\nSe você estiver usando o Linux, certifique-se de ter algum serviço secreto (gnome-keyring, kde-wallet, keepassxc, etc.) instalado", + "encryption_failed_warning": "O Spotube usa criptografia para armazenar seus dados com segurança, mas falhou em fazê-lo. Portanto, ele voltará para o armazenamento não seguro.\nSe você estiver usando o Linux, certifique-se de ter algum serviço secreto (gnome-keyring, kde-wallet, KeePassXC, etc.) instalado", "querying_info": "Consultando informações...", "piped_api_down": "A API do Piped está indisponível", "piped_down_error_instructions": "A instância do Piped {pipedInstance} está atualmente indisponível\n\nMude a instância ou mude o 'Tipo de API' para a API oficial do YouTube\n\nCertifique-se de reiniciar o aplicativo após a alteração", @@ -366,7 +366,7 @@ "user_profile": "Perfil do Usuário", "count_plays": "{count} reproduzidos", "streaming_fees_hypothetical": "*Calculado com base no pagamento por stream do Spotify\nque varia de $0.003 a $0.005. Isso é um cálculo hipotético\npara fornecer uma visão ao usuário sobre quanto eles\nteriam pago aos artistas se estivessem ouvindo\no seu som no Spotify.", - "count_mins": "{minutes} min", + "count_minutes": "{minutes} min", "summary_minutes": "minutos", "summary_listened_to_music": "Música ouvida", "summary_songs": "faixas", @@ -383,8 +383,8 @@ "streamed_songs": "Músicas transmitidas", "count_streams": "{count} streams", "owned_by_you": "De sua propriedade", - "copied_shareurl_to_clipboard": "{shareUrl} copiado para a área de transferência", - "spotify_hipotetical_calculation": "*Isso é calculado com base no pagamento por stream do Spotify\nque varia de $0.003 a $0.005. Esta é uma cálculo hipotético\npara dar ao usuário uma visão de quanto teriam pago aos artistas\nse eles ouvissem suas músicas no Spotify.", + "copied_share_url_to_clipboard": "{shareUrl} copiado para a área de transferência", + "spotify_hypothetical_calculation": "*Isso é calculado com base no pagamento por stream do Spotify\nque varia de $0.003 a $0.005. Esta é uma cálculo hipotético\npara dar ao usuário uma visão de quanto teriam pago aos artistas\nse eles ouvissem suas músicas no Spotify.", "webview_not_found": "Webview não encontrado", "webview_not_found_description": "Nenhum runtime Webview está instalado no seu dispositivo.\nSe estiver instalado, certifique-se de que está no environment PATH\n\nApós a instalação, reinicie o aplicativo", "unsupported_platform": "Plataforma não suportada", diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 461e8da8..18a3c9b0 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -90,7 +90,7 @@ "mini_player": "Мини-плеер", "slide_to_seek": "Потяните для перемотки вперед или назад", "shuffle_playlist": "Перемешать плейлист", - "unshuffle_playlist": "Снять перемешивание плейлиста", + "not_shuffle_playlist": "Снять перемешивание плейлиста", "previous_track": "Предыдущий трек", "next_track": "Следующий трек", "pause_playback": "Пауза воспроизведения", @@ -178,7 +178,7 @@ "first_go_to": "Сначала перейдите в", "login_if_not_logged_in": "и войдите или зарегистрируйтесь, если вы не вошли в систему", "step_2": "Шаг 2", - "step_2_steps": "1. После входа в систему нажмите F12 или щелкните правой кнопкой мыши > «Проверить», чтобы открыть инструменты разработчика браузера.\n2. Затем перейдите на вкладку \"Application\" (Chrome, Edge, Brave и т.д..) or \"Storage\" (Firefox, Palemoon и т.д..)\n3. Перейдите в раздел \"Cookies\", а затем в подраздел \"https://accounts.spotify.com\"", + "step_2_steps": "1. После входа в систему нажмите F12 или щелкните правой кнопкой мыши > «Проверить», чтобы открыть инструменты разработчика браузера.\n2. Затем перейдите на вкладку \"Application\" (Chrome, Edge, Brave и т.д..) or \"Storage\" (Firefox, Pale Moon и т.д..)\n3. Перейдите в раздел \"Cookies\", а затем в подраздел \"https://accounts.spotify.com\"", "step_3": "Шаг 3", "step_3_steps": "Скопируйте значение Cookie \"sp_dc\"", "success_emoji": "Успешно🥳", @@ -201,13 +201,13 @@ "add_genres": "Добавить жанр", "country": "Страна", "number_of_tracks_generate": "Количество треков для создания", - "acousticness": "Акустичность", - "danceability": "Ритмичность", + "not_acoustic": "Акустичность", + "dance_ability": "Ритмичность", "energy": "Энергичность", - "instrumentalness": "Инструментальность", + "not_instrumental": "Инструментальность", "liveness": "Живость", "loudness": "Громкость", - "speechiness": "Речевой характер", + "talkative": "Речевой характер", "valence": "Значимость", "popularity": "Популярность", "key": "Ключ", @@ -246,7 +246,7 @@ "sort_newest": "Сортировать по самым новым добавленным", "sort_oldest": "Сортировать по самым старым добавленным", "sleep_timer": "Таймер сна", - "mins": "{minutes} Минут", + "minutes": "{minutes} Минут", "hours": "{hours} Часы", "hour": "{hours} Час", "custom_hours": "Пользовательские часы", @@ -257,7 +257,7 @@ "audio_source": "Источник аудио", "ok": "Ок", "failed_to_encrypt": "Не удалось зашифровать", - "encryption_failed_warning": "Spotube использует шифрование для безопасного хранения ваших данных. Однако в этом случае произошла ошибка. Поэтому будет использовано небезопасное хранилище.\nЕсли вы используете Linux, убедитесь, что у вас установлен какой-либо инструмент для работы с секретами (gnome-keyring, kde-wallet, keepassxc и т.д.)", + "encryption_failed_warning": "Spotube использует шифрование для безопасного хранения ваших данных. Однако в этом случае произошла ошибка. Поэтому будет использовано небезопасное хранилище.\nЕсли вы используете Linux, убедитесь, что у вас установлен какой-либо инструмент для работы с секретами (gnome-keyring, kde-wallet, KeePassXC и т.д.)", "querying_info": "Запрос информации...", "piped_api_down": "Piped API не отвечает", "piped_down_error_instructions": "Экземпляр Piped {pipedInstance} в данный момент недоступен.\n\nВы можете либо изменить экземпляр, либо переключиться на использование официального API YouTube.\n\nНе забудьте перезапустить приложение после внесенных изменений", @@ -366,7 +366,7 @@ "user_profile": "Профиль пользователя", "count_plays": "{count} воспроизведений", "streaming_fees_hypothetical": "*Рассчитано на основе выплат Spotify за стрим\nот $0.003 до $0.005. Это гипотетический\nрасчет, чтобы показать пользователю, сколько бы он\nзаплатил артистам, если бы слушал их песни на Spotify.", - "count_mins": "{minutes} мин", + "count_minutes": "{minutes} мин", "summary_minutes": "минуты", "summary_listened_to_music": "Слушанная музыка", "summary_songs": "песни", @@ -383,8 +383,8 @@ "streamed_songs": "Стримленные песни", "count_streams": "{count} стримов", "owned_by_you": "Ваша собственность", - "copied_shareurl_to_clipboard": "{shareUrl} скопировано в буфер обмена", - "spotify_hipotetical_calculation": "*Это рассчитано на основе выплат Spotify за стрим\nот $0.003 до $0.005. Это гипотетический расчет,\nчтобы дать пользователю представление о том, сколько бы он\nзаплатил артистам, если бы слушал их песни на Spotify.", + "copied_share_url_to_clipboard": "{shareUrl} скопировано в буфер обмена", + "spotify_hypothetical_calculation": "*Это рассчитано на основе выплат Spotify за стрим\nот $0.003 до $0.005. Это гипотетический расчет,\nчтобы дать пользователю представление о том, сколько бы он\nзаплатил артистам, если бы слушал их песни на Spotify.", "webview_not_found": "Webview не найден", "webview_not_found_description": "На вашем устройстве не установлена среда выполнения Webview.\nЕсли он установлен, убедитесь, что он находится в environment PATH\n\nПосле установки перезапустите приложение", "unsupported_platform": "Платформа не поддерживается", diff --git a/lib/l10n/app_ta.arb b/lib/l10n/app_ta.arb index 396a16fb..e8bf013f 100644 --- a/lib/l10n/app_ta.arb +++ b/lib/l10n/app_ta.arb @@ -1,428 +1,428 @@ { - "guest": "விருந்தினர்", - "browse": "உலாவு", - "search": "தேடுக", - "library": "நூலகம்", - "lyrics": "பாடல் வரிகள்", - "settings": "அமைப்புகள்", - "genre_categories_filter": "வகைகள் அல்லது பாணிகளை வடிகட்டுக...", - "genre": "பாணி", - "personalized": "தனிப்பயனாக்கப்பட்ட", - "featured": "சிறப்பிடம் பெற்ற", - "new_releases": "புதிய வெளியீடுகள்", - "songs": "பாடல்கள்", - "playing_track": "{track} இயங்குகிறது", - "queue_clear_alert": "இது தற்போதைய வரிசையை அழிக்கும். {track_length} பாடல்கள் நீக்கப்படும்\nதொடர விரும்புகிறீர்களா?", - "load_more": "மேலும் ஏற்றுக", - "playlists": "பாடல் பட்டியல்கள்", - "artists": "கலைஞர்கள்", - "albums": "ஆல்பங்கள்", - "tracks": "பாடல்கள்", - "downloads": "பதிவிறக்கங்கள்", - "filter_playlists": "உங்கள் பாடல் பட்டியல்களை வடிகட்டுக...", - "liked_tracks": "விரும்பிய பாடல்கள்", - "liked_tracks_description": "உங்கள் விரும்பிய பாடல்கள் அனைத்தும்", - "playlist": "பாடல் பட்டியல்", - "create_a_playlist": "பாடல் பட்டியலை உருவாக்குக", - "update_playlist": "பாடல் பட்டியலைப் புதுப்பிக்க", - "create": "உருவாக்கு", - "cancel": "ரத்து செய்", - "update": "புதுப்பி", - "playlist_name": "பாடல் பட்டியல் பெயர்", - "name_of_playlist": "பாடல் பட்டியலின் பெயர்", - "description": "விளக்கம்", - "public": "பொது", - "collaborative": "கூட்டு", - "search_local_tracks": "உள்ளூர் பாடல்களைத் தேடுக...", - "play": "இயக்கு", - "delete": "அழி", - "none": "எதுவுமில்லை", - "sort_a_z": "A-Z வரிசைப்படுத்து", - "sort_z_a": "Z-A வரிசைப்படுத்து", - "sort_artist": "கலைஞர் மூலம் வரிசைப்படுத்து", - "sort_album": "ஆல்பம் மூலம் வரிசைப்படுத்து", - "sort_duration": "கால அளவு மூலம் வரிசைப்படுத்து", - "sort_tracks": "பாடல்களை வரிசைப்படுத்து", - "currently_downloading": "தற்போது பதிவிறக்குகிறது ({tracks_length})", - "cancel_all": "அனைத்தையும் ரத்து செய்", - "filter_artist": "கலைஞர்களை வடிகட்டுக...", - "followers": "{followers} பின்தொடர்பவர்கள்", - "add_artist_to_blacklist": "கலைஞரை தடைப்பட்டியலில் சேர்க்க", - "top_tracks": "சிறந்த பாடல்கள்", - "fans_also_like": "ரசிகர்கள் விரும்புவது", - "loading": "ஏற்றுகிறது...", - "artist": "கலைஞர்", - "blacklisted": "தடைப்பட்டியலில் உள்ளது", - "following": "பின்தொடர்கிறது", - "follow": "பின்தொடர்", - "artist_url_copied": "கலைஞர் URL கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது", - "added_to_queue": "{tracks} பாடல்கள் வரிசையில் சேர்க்கப்பட்டன", - "filter_albums": "ஆல்பங்களை வடிகட்டுக...", - "synced": "ஒத்திசைக்கப்பட்டது", - "plain": "சாதாரண", - "shuffle": "கலக்கு", - "search_tracks": "பாடல்களைத் தேடுக...", - "released": "வெளியிடப்பட்டது", - "error": "பிழை {error}", - "title": "தலைப்பு", - "time": "நேரம்", - "more_actions": "மேலும் செயல்கள்", - "download_count": "பதிவிறக்கு ({count})", - "add_count_to_playlist": "({count}) பாடல் பட்டியலில் சேர்", - "add_count_to_queue": "({count}) வரிசையில் சேர்", - "play_count_next": "({count}) அடுத்து இயக்கு", - "album": "ஆல்பம்", - "copied_to_clipboard": "{data} கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது", - "add_to_following_playlists": "{track} பின்வரும் பாடல் பட்டியல்களில் சேர்", - "add": "சேர்", - "added_track_to_queue": "{track} வரிசையில் சேர்க்கப்பட்டது", - "add_to_queue": "வரிசையில் சேர்", - "track_will_play_next": "{track} அடுத்து இயக்கப்படும்", - "play_next": "அடுத்து இயக்கு", - "removed_track_from_queue": "{track} வரிசையிலிருந்து நீக்கப்பட்டது", - "remove_from_queue": "வரிசையிலிருந்து நீக்கு", - "remove_from_favorites": "பிடித்தவையிலிருந்து நீக்கு", - "save_as_favorite": "பிடித்தவையாக சேமி", - "add_to_playlist": "பாடல் பட்டியலில் சேர்", - "remove_from_playlist": "பாடல் பட்டியலிலிருந்து நீக்கு", - "add_to_blacklist": "தடைப்பட்டியலில் சேர்", - "remove_from_blacklist": "தடைப்பட்டியலிலிருந்து நீக்கு", - "share": "பகிர்", - "mini_player": "சிறிய இயக்கி", - "slide_to_seek": "முன்னோக்கி அல்லது பின்னோக்கி செல்ல சறுக்கவும்", - "shuffle_playlist": "பாடல் பட்டியலை கலக்கு", - "unshuffle_playlist": "பாடல் பட்டியலை கலக்காதே", - "previous_track": "முந்தைய பாடல்", - "next_track": "அடுத்த பாடல்", - "pause_playback": "இயக்கத்தை நிறுத்து", - "resume_playback": "இயக்கத்தை தொடர்", - "loop_track": "பாடலை சுழற்று", - "no_loop": "சுழற்சி இல்லை", - "repeat_playlist": "பாடல் பட்டியலை மீண்டும் இயக்கு", - "queue": "வரிசை", - "alternative_track_sources": "மாற்று பாடல் மூலங்கள்", - "download_track": "பாடலைப் பதிவிறக்கு", - "tracks_in_queue": "வரிசையில் {tracks} பாடல்கள்", - "clear_all": "அனைத்தையும் அழி", - "show_hide_ui_on_hover": "மேலே வரும்போது UI ஐக் காட்டு/மறை", - "always_on_top": "எப்போதும் மேலே", - "exit_mini_player": "சிறிய இயக்கியிலிருந்து வெளியேறு", - "download_location": "பதிவிறக்க இடம்", - "local_library": "உள்ளூர் நூலகம்", - "add_library_location": "நூலகத்தில் சேர்", - "remove_library_location": "நூலகத்திலிருந்து நீக்கு", - "account": "கணக்கு", - "login_with_spotify": "உங்கள் Spotify கணக்கில் உள்நுழைக", - "connect_with_spotify": "Spotify உடன் இணைக்கவும்", - "logout": "வெளியேறு", - "logout_of_this_account": "இந்த கணக்கிலிருந்து வெளியேறு", - "language_region": "மொழி & பிராந்தியம்", - "language": "மொழி", - "system_default": "கணினி இயல்புநிலை", - "market_place_region": "சந்தை பிராந்தியம்", - "recommendation_country": "பரிந்துரை நாடு", - "appearance": "தோற்றம்", - "layout_mode": "அமைப்பு முறை", - "override_layout_settings": "தளவமைப்பு அமைப்புகளை மாற்றியமை", - "adaptive": "தகவமைப்பு", - "compact": "சுருக்கமான", - "extended": "விரிவான", - "theme": "தீம்", - "dark": "இருள்", - "light": "வெளிர்", - "system": "கணினி வழி", - "accent_color": "அழுத்த நிறம்", - "sync_album_color": "ஆல்பம் நிறத்தை ஒத்திசை", - "sync_album_color_description": "ஆல்பம் படத்தின் முக்கிய நிறத்தை அழுத்த நிறமாகப் பயன்படுத்துகிறது", - "playback": "பின்னணி", - "audio_quality": "ஒலி தரம்", - "high": "உயர்", - "low": "குறைந்த", - "pre_download_play": "முன்பதிவிறக்கம் மற்றும் இயக்கம்", - "pre_download_play_description": "ஒலியை ஸ்ட்ரீம் செய்வதற்குப் பதிலாக, பைட்டுகளைப் பதிவிறக்கி இயக்கவும் (அதிக பேண்ட்விட்த் பயனர்களுக்கு பரிந்துரைக்கப்படுகிறது)", - "skip_non_music": "இசையல்லாத பகுதிகளைத் தவிர் (SponsorBlock)", - "blacklist_description": "தடைசெய்யப்பட்ட பாடல்கள் மற்றும் கலைஞர்கள்", - "wait_for_download_to_finish": "தற்போதைய பதிவிறக்கம் முடியும் வரை காத்திருக்கவும்", - "desktop": "கணினி", - "close_behavior": "மூடும் நடத்தை", - "close": "மூடு", - "minimize_to_tray": "ட்ரேயை குறைக்கவும்", - "show_tray_icon": "ட்ரே ஐகானைக் காட்டு", - "about": "பற்றி", - "u_love_spotube": "நீங்கள் Spotube ஐ நேசிக்கிறீர்கள் என்பது எங்களுக்குத் தெரியும்", - "check_for_updates": "புதுப்பிப்புகளைச் சரிபார்", - "about_spotube": "Spotube பற்றி", - "blacklist": "தடைப்பட்டியல்", - "please_sponsor": "தயவுசெய்து ஆதரவு/நன்கொடை அளியுங்கள்", - "spotube_description": "Spotube, ஒரு லேசான, பல தளங்களில் இயங்கும், அனைவருக்கும் இலவசமான spotify கிளையன்ட்", - "version": "பதிப்பு", - "build_number": "கட்டமைப்பு எண்", - "founder": "நிறுவனர்", - "repository": "களஞ்சியம்", - "bug_issues": "பிழை_சிக்கல்கள்", - "made_with": "வங்காளதேசத்திலிருந்து🇧🇩 ❤️ உருவாக்கப்பட்டது", - "kingkor_roy_tirtho": "கிங்கர் ராய் திர்தோ", - "copyright": "© 2021-{current_year} கிங்கர் ராய் திர்தோ", - "license": "உரிமம்", - "add_spotify_credentials": "தொடங்குவதற்கு உங்கள் spotify சான்றுகளைச் சேர்க்கவும்", - "credentials_will_not_be_shared_disclaimer": "கவலைப்பட வேண்டாம், உங்கள் சான்றுகள் எதுவும் சேகரிக்கப்படாது அல்லது யாருடனும் பகிரப்படாது", - "know_how_to_login": "இதை எப்படி செய்வது என்று தெரியவில்லையா?", - "follow_step_by_step_guide": "படிப்படியான வழிகாட்டியைப் பின்பற்றவும்", - "spotify_cookie": "Spotify {name} நட்புநிரல்", - "cookie_name_cookie": "{name} நட்புநிரல்", - "fill_in_all_fields": "அனைத்து களங்களையும் நிரப்பவும்", - "submit": "சமர்ப்பி", - "exit": "வெளியேறு", - "previous": "முந்தைய", - "next": "அடுத்து", - "done": "முடிந்தது", - "step_1": "முதல் படி", - "first_go_to": "முதலில், செல்லவேண்டியது", - "login_if_not_logged_in": "நீங்கள் உள்நுழையவில்லை என்றால் உள்நுழைக/பதிவுசெய்க", - "step_2": "இரண்டாம் படி", - "step_2_steps": "1. நீங்கள் உள்நுழைந்தவுடன், F12 ஐ அழுத்தவும் அல்லது வலது கிளிக் செய்து > ஆய்வு செய்யவும் உலாவி டெவ்டூல்களைத் திறக்கவும்.\n2. பின்னர் \"பயன்பாடு\" தாவலுக்குச் செல்லவும் (Chrome, Edge, Brave போன்றவை) அல்லது \"சேமிப்பகம்\" தாவல் (Firefox, Palemoon போன்றவை)\n3. \"குக்கிகள்\" பிரிவுக்குச் சென்று பின்னர் \"https://accounts.spotify.com\" பிரிவுக்குச் செல்லவும்", - "step_3": "மூன்றாம் படி", - "step_3_steps": "\"sp_dc\" நட்புநிரலின் மதிப்பை நகலெடுக்கவும்", - "success_emoji": "வெற்றி🥳", - "success_message": "இப்போது நீங்கள் உங்கள் Spotify கணக்கில் வெற்றிகரமாக உள்நுழைந்துள்ளீர்கள். நல்லது, நண்பரே!", - "step_4": "நான்காம் படி", - "step_4_steps": "நகலெடுக்கப்பட்ட \"sp_dc\" மதிப்பை ஒட்டவும்", - "something_went_wrong": "ஏதோ தவறு நடந்துவிட்டது", - "piped_instance": "Piped சேவையகம் நிகழ்வு", - "piped_description": "பாடல் பொருத்தத்திற்குப் பயன்படுத்த வேண்டிய Piped சேவையகம் நிகழ்வு", - "piped_warning": "அவற்றில் சில நன்றாக வேலை செய்யாமல் இருக்கலாம். எனவே உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்", - "invidious_instance": "Invidious சேவையக நிகழ்வு", - "invidious_description": "பாடல் பொருத்தத்திற்குப் பயன்படுத்த வேண்டிய Invidious சேவையக நிகழ்வு", - "invidious_warning": "அவற்றில் சில நன்றாக வேலை செய்யாமல் இருக்கலாம். எனவே உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்", - "generate": "உருவாக்கு", - "track_exists": "பாடல் {track} ஏற்கனவே உள்ளது", - "replace_downloaded_tracks": "பதிவிறக்கம் செய்யப்பட்ட அனைத்து பாடல்களையும் மாற்றவும்", - "skip_download_tracks": "பதிவிறக்கம் செய்யப்பட்ட அனைத்து பாடல்களையும் தவிர்க்கவும்", - "do_you_want_to_replace": "ஏற்கனவே உள்ள பாடலை மாற்ற விரும்புகிறீர்களா?", - "replace": "மாற்று", - "skip": "தவிர்", - "select_up_to_count_type": "{count} {type} வரை தேர்ந்தெடுக்கவும்", - "select_genres": "வகைகளைத் தேர்ந்தெடுக்கவும்", - "add_genres": "வகைகளைச் சேர்க்கவும்", - "country": "நாடு", - "number_of_tracks_generate": "உருவாக்க வேண்டிய பாடல்களின் எண்ணிக்கை", - "acousticness": "அகவுஸ்டிக்னெஸ்", - "danceability": "நடனத்தன்மை", - "energy": "ஆற்றல்", - "instrumentalness": "கருவித்தன்மை", - "liveness": "உயிர்ப்புத்தன்மை", - "loudness": "ஒலி அளவு", - "speechiness": "பேச்சுத்தன்மை", - "valence": "உணர்வு", - "popularity": "பிரபலம்", - "key": "இசை குறிப்பு", - "duration": "கால அளவு (வினாடிகள்)", - "tempo": "வேகம் (BPM)", - "mode": "முறை", - "time_signature": "நேர கையொப்பம்", - "short": "குறுகிய", - "medium": "நடுத்தர", - "long": "நீண்ட", - "min": "குறைந்தபட்சம்", - "max": "அதிகபட்சம்", - "target": "இலக்கு", - "moderate": "மிதமான", - "deselect_all": "அனைத்தையும் தேர்வுநீக்கு", - "select_all": "அனைத்தையும் தேர்ந்தெடு", - "are_you_sure": "உறுதியாக இருக்கிறீர்களா?", - "generating_playlist": "உங்கள் தனிப்பயன்பாட்டிற்கான பாடல் பட்டியலை உருவாக்குகிறது...", - "selected_count_tracks": "{count} பாடல்கள் தேர்ந்தெடுக்கப்பட்டன", - "download_warning": "நீங்கள் அனைத்து பாடல்களையும் மொத்தமாக பதிவிறக்கினால், நீங்கள் தெளிவாக இசையைத் திருடுகிறீர்கள் மற்றும் இசையின் படைப்பாற்றல் சமூகத்திற்கு சேதம் விளைவிக்கிறீர்கள். நீங்கள் இதை அறிந்திருக்கிறீர்கள் என்று நம்புகிறேன். எப்போதும், கலைஞரின் கடின உழைப்பை மதித்து ஆதரிக்க முயற்சி செய்யுங்கள்", - "download_ip_ban_warning": "மேலும், அதிகப்படியான பதிவிறக்க கோரிக்கைகள் காரணமாக உங்கள் IP YouTube இல் தடைசெய்யப்படலாம். IP தடை என்பது குறைந்தது 2-3 மாதங்களுக்கு அந்த IP சாதனத்திலிருந்து YouTube ஐப் பயன்படுத்த முடியாது (நீங்கள் உள்நுழைந்திருந்தாலும் கூட). இது ஒருபோதும் நடந்தால் Spotube பொறுப்பேற்காது", - "by_clicking_accept_terms": "'ஏற்றுக்கொள்' என்பதைக் கிளிக் செய்வதன் மூலம் பின்வரும் விதிமுறைகளுக்கு நீங்கள் ஒப்புக்கொள்கிறீர்கள்:", - "download_agreement_1": "நான் இசையைத் திருடுகிறேன் என்பது எனக்குத் தெரியும். நான் கெட்டவன்", - "download_agreement_2": "நான் கலைஞரை முடிந்தவரை ஆதரிப்பேன், அவர்களின் கலைக்கு பணம் செலுத்த எனக்கு பணம் இல்லாததால் மட்டுமே இதைச் செய்கிறேன்", - "download_agreement_3": "என் IP YouTube இல் தடைசெய்யப்படலாம் என்பதை நான் முழுமையாக அறிவேன், மேலும் என் தற்போதைய செயலால் ஏற்படும் எந்த விபத்துகளுக்கும் Spotube அல்லது அதன் உரிமையாளர்கள்/பங்களிப்பாளர்களை பொறுப்பாக்க மாட்டேன்", - "decline": "மறு", - "accept": "ஏற்றுக்கொள்", - "details": "விவரங்கள்", - "youtube": "YouTube", - "channel": "சேனல்", - "likes": "விருப்பங்கள்", - "dislikes": "விருப்பமில்லாதவை", - "views": "பார்வைகள்", - "streamUrl": "ஸ்ட்ரீம் URL", - "stop": "நிறுத்து", - "sort_newest": "புதிதாக சேர்க்கப்பட்டவற்றை வரிசைப்படுத்து", - "sort_oldest": "பழமையானவற்றை வரிசைப்படுத்து", - "sleep_timer": "உறக்க நேரம்", - "mins": "{minutes} நிமிடங்கள்", - "hours": "{hours} மணிநேரங்கள்", - "hour": "{hours} மணிநேரம்", - "custom_hours": "தனிப்பயன் மணிநேரங்கள்", - "logs": "பதிவுகள்", - "developers": "உருவாக்குநர்கள்", - "not_logged_in": "நீங்கள் உள்நுழையவில்லை", - "search_mode": "தேடல் முறை", - "audio_source": "ஒலி மூலம்", - "ok": "சரி", - "failed_to_encrypt": "குறியாக்கம் தோல்வியடைந்தது", - "encryption_failed_warning": "Spotube உங்கள் தரவை பாதுகாப்பாக சேமிக்க குறியாக்கத்தைப் பயன்படுத்துகிறது. ஆனால் அவ்வாறு செய்ய முடியவில்லை. எனவே இது பாதுகாப்பற்ற சேமிப்பகத்திற்கு மாறும்\nநீங்கள் லினக்ஸ் பயன்படுத்துகிறீர்கள் என்றால், எந்த ரகசிய சேவையும் (gnome-keyring, kde-wallet, keepassxc போன்றவை) நிறுவப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும்", - "querying_info": "தகவலைக் கேட்கிறது...", - "piped_api_down": "Piped API செயலிழந்துள்ளது", - "piped_down_error_instructions": "Piped நிகழ்வு {pipedInstance} தற்போது செயலிழந்துள்ளது\n\nநிகழ்வை மாற்றவும் அல்லது 'API வகை'யை அதிகாரப்பூர்வ YouTube API க்கு மாற்றவும்\n\nமாற்றத்திற்குப் பிறகு பயன்பாட்டை மறுதொடக்கம் செய்வதை உறுதிப்படுத்தவும்", - "you_are_offline": "நீங்கள் தற்போது ஆஃப்லைனில் உள்ளீர்கள்", - "connection_restored": "உங்கள் இணைய இணைப்பு மீட்டெடுக்கப்பட்டது", - "use_system_title_bar": "கணினி தலைப்புப் பட்டியைப் பயன்படுத்தவும்", - "crunching_results": "முடிவுகளை செயலாக்குகிறது...", - "search_to_get_results": "முடிவுகளைப் பெற தேடவும்", - "use_amoled_mode": "கருமை நிற இருண்ட தீம்", - "pitch_dark_theme": "AMOLED முறை", - "normalize_audio": "ஒலியை சீரமை", - "change_cover": "அட்டையை மாற்று", - "add_cover": "அட்டையைச் சேர்", - "restore_defaults": "இயல்புநிலைகளை மீட்டமை", - "download_music_codec": "இசை கோடெக்கை பதிவிறக்கு", - "streaming_music_codec": "இசை கோடெக்கை ஸ்ட்ரீம் செய்", - "login_with_lastfm": "Last.fm உடன் உள்நுழைக", - "connect": "இணை", - "disconnect_lastfm": "Last.fm இலிருந்து துண்டி", - "disconnect": "துண்டி", - "username": "பயனர்பெயர்", - "password": "கடவுச்சொல்", - "login": "உள்நுழைக", - "login_with_your_lastfm": "உங்கள் Last.fm கணக்குடன் உள்நுழைக", - "scrobble_to_lastfm": "Last.fm க்கு ஸ்க்ரோபிள் செய்", - "go_to_album": "ஆல்பத்திற்குச் செல்", - "discord_rich_presence": "Discord செழுமையான தோற்றம்", - "browse_all": "அனைத்தையும் உலாவு", - "genres": "வகைகள்", - "explore_genres": "வகைகளை ஆராயுங்கள்", - "friends": "நண்பர்கள்", - "no_lyrics_available": "மன்னிக்கவும், இந்தப் பாடலுக்கான பாடல் வரிகளைக் கண்டுபிடிக்க முடியவில்லை", - "start_a_radio": "வானொலியைத் தொடங்கு", - "how_to_start_radio": "வானொலியை எவ்வாறு தொடங்க விரும்புகிறீர்கள்?", - "replace_queue_question": "தற்போதைய வரிசையை மாற்ற விரும்புகிறீர்களா அல்லது அதனுடன் சேர்க்க விரும்புகிறீர்களா?", - "endless_playback": "முடிவற்ற இயக்கம்", - "delete_playlist": "பாடல் பட்டியலை நீக்கு", - "delete_playlist_confirmation": "இந்த பாடல் பட்டியலை நீக்க விரும்புகிறீர்களா?", - "local_tracks": "உள்ளூர் பாடல்கள்", - "local_tab": "உள்ளூர்", - "song_link": "பாடல் இணைப்பு", - "skip_this_nonsense": "இந்த அர்த்தமற்றதைத் தவிர்", - "freedom_of_music": "\"இசையின் சுதந்திரம்\"", - "freedom_of_music_palm": "\"உங்கள் கைகளில் இசையின் சுதந்திரம்\"", - "get_started": "தொடங்குவோம்", - "youtube_source_description": "பரிந்துரைக்கப்படுகிறது மற்றும் சிறப்பாக செயல்படுகிறது.", - "piped_source_description": "சுதந்திரமாக உணர்கிறீர்களா? YouTube போலவே ஆனால் மிகவும் சுதந்திரமானது.", - "jiosaavn_source_description": "தெற்காசியப் பிராந்தியத்திற்கு சிறந்தது.", - "invidious_source_description": "Piped ஐப் போன்றது ஆனால் அதிக கிடைக்கும் தன்மையுடன்.", - "highest_quality": "உயர்ந்த தரம்: {quality}", - "select_audio_source": "ஒலி மூலத்தைத் தேர்ந்தெடுக்கவும்", - "endless_playback_description": "வரிசையின் இறுதியில் புதிய பாடல்களை\nதானாகவே சேர்க்கவும்", - "choose_your_region": "உங்கள் பிராந்தியத்தைத் தேர்ந்தெடுக்கவும்", - "choose_your_region_description": "இது உங்கள் இருப்பிடத்திற்கான சரியான உள்ளடக்கத்தை\nSpotube காட்ட உதவும்.", - "choose_your_language": "உங்கள் மொழியைத் தேர்ந்தெடுக்கவும்", - "help_project_grow": "இந்த திட்டம் வளர உதவுங்கள்", - "help_project_grow_description": "Spotube ஒரு திறந்த மூல திட்டம். திட்டத்திற்கு பங்களிப்பு செய்வதன் மூலம், பிழைகளைப் புகாரளிப்பதன் மூலம் அல்லது புதிய அம்சங்களைப் பரிந்துரைப்பதன் மூலம் இந்தத் திட்டம் வளர உதவலாம்.", - "contribute_on_github": "GitHub இல் பங்களியுங்கள்", - "donate_on_open_collective": "Open Collective இல் நன்கொடை அளியுங்கள்", - "browse_anonymously": "அநாமதேயமாக உலாவுக", - "enable_connect": "இணைப்பை இயக்கு", - "enable_connect_description": "மற்ற சாதனங்களிலிருந்து Spotube ஐக் கட்டுப்படுத்தவும்", - "devices": "சாதனங்கள்", - "select": "தேர்ந்தெடு", - "connect_client_alert": "நீங்கள் {client} ஆல் கட்டுப்படுத்தப்படுகிறீர்கள்", - "this_device": "இந்த சாதனம்", - "remote": "தொலைநிலை", - "stats": "புள்ளிவிவரங்கள்", - "and_n_more": "மற்றும் {count} கூடுதலாக", - "recently_played": "சமீபத்தில் இயக்கியவை", - "browse_more": "மேலும் உலாவு", - "no_title": "தலைப்பு இல்லை", - "not_playing": "இயக்கப்படவில்லை", - "epic_failure": "மோசமான தோல்வி!", - "added_num_tracks_to_queue": "{tracks_length} பாடல்கள் வரிசையில் சேர்க்கப்பட்டன", - "spotube_has_an_update": "Spotube க்கு ஒரு புதுப்பிப்பு உள்ளது", - "download_now": "இப்போது பதிவிறக்கு", - "nightly_version": "Spotube Nightly {nightlyBuildNum} வெளியிடப்பட்டுள்ளது", - "release_version": "Spotube v{version} வெளியிடப்பட்டுள்ளது", - "read_the_latest": "சமீபத்திய ", - "release_notes": "வெளியீட்டு குறிப்புகளைப் படிக்கவும்", - "pick_color_scheme": "வண்ணத் திட்டத்தைத் தேர்ந்தெடுக்கவும்", - "save": "சேமி", - "choose_the_device": "சாதனத்தைத் தேர்ந்தெடுக்கவும்:", - "multiple_device_connected": "பல சாதனங்கள் இணைக்கப்பட்டுள்ளன.\nஇந்த செயல் நடைபெற வேண்டிய சாதனத்தைத் தேர்ந்தெடுக்கவும்", - "nothing_found": "எதுவும் கிடைக்கவில்லை", - "the_box_is_empty": "பெட்டி காலியாக உள்ளது", - "top_artists": "சிறந்த கலைஞர்கள்", - "top_albums": "சிறந்த ஆல்பங்கள்", - "this_week": "இந்த வாரம்", - "this_month": "இந்த மாதம்", - "last_6_months": "கடந்த 6 மாதங்கள்", - "this_year": "இந்த ஆண்டு", - "last_2_years": "கடந்த 2 ஆண்டுகள்", - "all_time": "எல்லா நேரமும்", - "powered_by_provider": "{providerName} ஆல் இயக்கப்படுகிறது", - "email": "மின்னஞ்சல்", - "profile_followers": "பின்தொடர்பவர்கள்", - "birthday": "பிறந்த நாள்", - "subscription": "சந்தா", - "not_born": "பிறக்கவில்லை", - "hacker": "ஹேக்கர்", - "profile": "சுயவிவரம்", - "no_name": "பெயர் இல்லை", - "edit": "திருத்து", - "user_profile": "பயனர் சுயவிவரம்", - "count_plays": "{count} முறை இசைக்கப்பட்டது", - "streaming_fees_hypothetical": "ஸ்ட்ரீமிங் கட்டணங்கள் (கற்பனை)", - "minutes_listened": "காலம் கேட்டது", - "streamed_songs": "ஸ்ட்ரீமிங் செய்யப்பட்ட பாடல்கள்", - "count_streams": "{count} ஸ்ட்ரீம்கள்", - "owned_by_you": "உங்களால் கொண்டது", - "copied_shareurl_to_clipboard": "நகலெடுக்கப்பட்டது {shareUrl} கிளிப்போர்டுக்காக", - "spotify_hipotetical_calculation": "*இது Spotify இன் ஒவ்வொரு ஸ்ட்ரீமிற்கும்\n$0.003 முதல் $0.005 வரை அளவீடு அடிப்படையில் கணக்கிடப்படுகிறது. இது ஒரு கற்பனை\nகணக்கீடு ஆகும், பயனர் எந்த அளவிற்கு கலைஞர்களுக்கு\nஅதோர் பாடலை Spotify மென்பொருளில் கேட்டால் எவ்வளவு பணம் செலுத்தினார்கள் என்பதைக் கண்டுபிடிக்க.", - "count_mins": "{minutes} நிமிடங்கள்", - "summary_minutes": "நிமிடங்கள்", - "summary_listened_to_music": "இசை கேட்டது", - "summary_songs": "பாடல்கள்", - "summary_streamed_overall": "மொத்தமாக ஸ்ட்ரீமிங்", - "summary_owed_to_artists": "கலைஞர்களுக்கு\nஇந்த மாதம் சொந்தமானது", - "summary_artists": "கலைஞர்கள்", - "summary_music_reached_you": "இசை உங்களுக்கு வந்தது", - "summary_full_albums": "முழு ஆல்பங்கள்", - "summary_got_your_love": "உங்கள் அன்பை பெற்றுக்கொண்டேன்", - "summary_playlists": "பாடல் பட்டியல்கள்", - "summary_were_on_repeat": "மீண்டும் மீண்டும் இருந்தன", - "total_money": "மொத்தம் {money}", - "webview_not_found": "வெப்வியூ கிடைக்கவில்லை", - "webview_not_found_description": "உங்கள் சாதனத்தில் எந்தவொரு வெப்வியூ இயக்கத்தை நிறுவவில்லை.\nஇது நிறுவப்பட்டிருந்தால், சுற்றுச்சூழல் பாதையில் PATH உள்ளது என்பதை உறுதிபடுத்தவும்\n\nநிறுவித்த பிறகு, செயலியை மறுதொடக்கம் செய்யவும்", - "unsupported_platform": "அதிர்ஷ்டகாத உருப்படியை ஆதரிக்கவில்லை", - "cache_music": "இசையை கேஷ் செய்", - "open": "திறக்கவும்", - "cache_folder": "கேஷ் அடைவு", - "export": "ஏற்றுமதி", - "clear_cache": "கேஷ் அழிக்கவும்", - "clear_cache_confirmation": "கேஷைப் அழிக்க விரும்புகிறீர்களா?", - "export_cache_files": "கேஷில் உள்ள கோப்புகளை ஏற்றுமதி செய்யவும்", - "found_n_files": "{count} கோப்புகள் கிடைத்தன", - "export_cache_confirmation": "இந்த கோப்புகளை ஏற்றுமதி செய்ய விரும்புகிறீர்களா?", - "exported_n_out_of_m_files": "{filesExported} கோப்புகள் ஏற்றுமதி செய்யப்பட்டன, {files} கோப்புகளில்", - "undo": "செயல்தவிர்", - "download_all": "அனைத்தையும் பதிவிறக்குக", - "add_all_to_playlist": "அனைத்தையும் பாடல் பட்டியலில் சேர்க்கவும்", - "add_all_to_queue": "அனைத்தையும் வரிசைப்படுத்து", - "play_all_next": "அடுத்த உள்ள அனைத்தையும் இயக்கு", - "pause": "நிறுத்து", - "view_all": "அனைத்தையும் காண்க", - "no_tracks_added_yet": "உங்கள் பாடல்களை இன்னும் சேர்க்கவில்லை என்றால் தெரியாதே", - "no_tracks": "இங்கு பாடல்கள் எதுவும் இல்லை", - "no_tracks_listened_yet": "இன்னும் எதையும் கேள்வியில்லை", - "not_following_artists": "நீங்கள் எந்த கலைஞரையும் பின்தொடரவில்லை", - "no_favorite_albums_yet": "நீங்கள் இன்னும் எந்த ஆல்பங்களையும் பிடித்தவையாகச் சேர்க்கவில்லை", - "no_logs_found": "பதிவுகள் எதுவும் கிடைக்கவில்லை", - "youtube_engine": "YouTube இயந்திரம்", - "youtube_engine_not_installed_title": "{engine} நிறுவியதில்லை", - "youtube_engine_not_installed_message": "{engine} உங்கள் கணினியில் நிறுவியதில்லை.", - "youtube_engine_set_path": "PATH மாறியில் கிடைக்கிறதா என்பதை உறுதிப்படுத்தவும் அல்லது\n{engine} செயல் செய்யக்கூடிய முறையை கீழே அமைக்கவும்", - "youtube_engine_unix_issue_message": "macOS/Linux/unix போல் OS இல், .zshrc/.bashrc/.bash_profile போன்றவை அமைப்பில் பாதையை PATH அமைப்பது இயலாது.\nநீங்கள்.shell configuration file இல் பாதையை அமைக்க வேண்டும்", - "download": "பதிவிறக்கு", - "file_not_found": "கோப்பு கிடைக்கவில்லை", - "custom": "தனிப்பயன்", - "add_custom_url": "தனிப்பயன் URL ஐச் சேர்க்கவும்" + "guest": "விருந்தினர்", + "browse": "உலாவு", + "search": "தேடுக", + "library": "நூலகம்", + "lyrics": "பாடல் வரிகள்", + "settings": "அமைப்புகள்", + "genre_categories_filter": "வகைகள் அல்லது பாணிகளை வடிகட்டுக...", + "genre": "பாணி", + "personalized": "தனிப்பயனாக்கப்பட்ட", + "featured": "சிறப்பிடம் பெற்ற", + "new_releases": "புதிய வெளியீடுகள்", + "songs": "பாடல்கள்", + "playing_track": "{track} இயங்குகிறது", + "queue_clear_alert": "இது தற்போதைய வரிசையை அழிக்கும். {track_length} பாடல்கள் நீக்கப்படும்\nதொடர விரும்புகிறீர்களா?", + "load_more": "மேலும் ஏற்றுக", + "playlists": "பாடல் பட்டியல்கள்", + "artists": "கலைஞர்கள்", + "albums": "ஆல்பங்கள்", + "tracks": "பாடல்கள்", + "downloads": "பதிவிறக்கங்கள்", + "filter_playlists": "உங்கள் பாடல் பட்டியல்களை வடிகட்டுக...", + "liked_tracks": "விரும்பிய பாடல்கள்", + "liked_tracks_description": "உங்கள் விரும்பிய பாடல்கள் அனைத்தும்", + "playlist": "பாடல் பட்டியல்", + "create_a_playlist": "பாடல் பட்டியலை உருவாக்குக", + "update_playlist": "பாடல் பட்டியலைப் புதுப்பிக்க", + "create": "உருவாக்கு", + "cancel": "ரத்து செய்", + "update": "புதுப்பி", + "playlist_name": "பாடல் பட்டியல் பெயர்", + "name_of_playlist": "பாடல் பட்டியலின் பெயர்", + "description": "விளக்கம்", + "public": "பொது", + "collaborative": "கூட்டு", + "search_local_tracks": "உள்ளூர் பாடல்களைத் தேடுக...", + "play": "இயக்கு", + "delete": "அழி", + "none": "எதுவுமில்லை", + "sort_a_z": "A-Z வரிசைப்படுத்து", + "sort_z_a": "Z-A வரிசைப்படுத்து", + "sort_artist": "கலைஞர் மூலம் வரிசைப்படுத்து", + "sort_album": "ஆல்பம் மூலம் வரிசைப்படுத்து", + "sort_duration": "கால அளவு மூலம் வரிசைப்படுத்து", + "sort_tracks": "பாடல்களை வரிசைப்படுத்து", + "currently_downloading": "தற்போது பதிவிறக்குகிறது ({tracks_length})", + "cancel_all": "அனைத்தையும் ரத்து செய்", + "filter_artist": "கலைஞர்களை வடிகட்டுக...", + "followers": "{followers} பின்தொடர்பவர்கள்", + "add_artist_to_blacklist": "கலைஞரை தடைப்பட்டியலில் சேர்க்க", + "top_tracks": "சிறந்த பாடல்கள்", + "fans_also_like": "ரசிகர்கள் விரும்புவது", + "loading": "ஏற்றுகிறது...", + "artist": "கலைஞர்", + "blacklisted": "தடைப்பட்டியலில் உள்ளது", + "following": "பின்தொடர்கிறது", + "follow": "பின்தொடர்", + "artist_url_copied": "கலைஞர் URL கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது", + "added_to_queue": "{tracks} பாடல்கள் வரிசையில் சேர்க்கப்பட்டன", + "filter_albums": "ஆல்பங்களை வடிகட்டுக...", + "synced": "ஒத்திசைக்கப்பட்டது", + "plain": "சாதாரண", + "shuffle": "கலக்கு", + "search_tracks": "பாடல்களைத் தேடுக...", + "released": "வெளியிடப்பட்டது", + "error": "பிழை {error}", + "title": "தலைப்பு", + "time": "நேரம்", + "more_actions": "மேலும் செயல்கள்", + "download_count": "பதிவிறக்கு ({count})", + "add_count_to_playlist": "({count}) பாடல் பட்டியலில் சேர்", + "add_count_to_queue": "({count}) வரிசையில் சேர்", + "play_count_next": "({count}) அடுத்து இயக்கு", + "album": "ஆல்பம்", + "copied_to_clipboard": "{data} கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது", + "add_to_following_playlists": "{track} பின்வரும் பாடல் பட்டியல்களில் சேர்", + "add": "சேர்", + "added_track_to_queue": "{track} வரிசையில் சேர்க்கப்பட்டது", + "add_to_queue": "வரிசையில் சேர்", + "track_will_play_next": "{track} அடுத்து இயக்கப்படும்", + "play_next": "அடுத்து இயக்கு", + "removed_track_from_queue": "{track} வரிசையிலிருந்து நீக்கப்பட்டது", + "remove_from_queue": "வரிசையிலிருந்து நீக்கு", + "remove_from_favorites": "பிடித்தவையிலிருந்து நீக்கு", + "save_as_favorite": "பிடித்தவையாக சேமி", + "add_to_playlist": "பாடல் பட்டியலில் சேர்", + "remove_from_playlist": "பாடல் பட்டியலிலிருந்து நீக்கு", + "add_to_blacklist": "தடைப்பட்டியலில் சேர்", + "remove_from_blacklist": "தடைப்பட்டியலிலிருந்து நீக்கு", + "share": "பகிர்", + "mini_player": "சிறிய இயக்கி", + "slide_to_seek": "முன்னோக்கி அல்லது பின்னோக்கி செல்ல சறுக்கவும்", + "shuffle_playlist": "பாடல் பட்டியலை கலக்கு", + "not_shuffle_playlist": "பாடல் பட்டியலை கலக்காதே", + "previous_track": "முந்தைய பாடல்", + "next_track": "அடுத்த பாடல்", + "pause_playback": "இயக்கத்தை நிறுத்து", + "resume_playback": "இயக்கத்தை தொடர்", + "loop_track": "பாடலை சுழற்று", + "no_loop": "சுழற்சி இல்லை", + "repeat_playlist": "பாடல் பட்டியலை மீண்டும் இயக்கு", + "queue": "வரிசை", + "alternative_track_sources": "மாற்று பாடல் மூலங்கள்", + "download_track": "பாடலைப் பதிவிறக்கு", + "tracks_in_queue": "வரிசையில் {tracks} பாடல்கள்", + "clear_all": "அனைத்தையும் அழி", + "show_hide_ui_on_hover": "மேலே வரும்போது UI ஐக் காட்டு/மறை", + "always_on_top": "எப்போதும் மேலே", + "exit_mini_player": "சிறிய இயக்கியிலிருந்து வெளியேறு", + "download_location": "பதிவிறக்க இடம்", + "local_library": "உள்ளூர் நூலகம்", + "add_library_location": "நூலகத்தில் சேர்", + "remove_library_location": "நூலகத்திலிருந்து நீக்கு", + "account": "கணக்கு", + "login_with_spotify": "உங்கள் Spotify கணக்கில் உள்நுழைக", + "connect_with_spotify": "Spotify உடன் இணைக்கவும்", + "logout": "வெளியேறு", + "logout_of_this_account": "இந்த கணக்கிலிருந்து வெளியேறு", + "language_region": "மொழி & பிராந்தியம்", + "language": "மொழி", + "system_default": "கணினி இயல்புநிலை", + "market_place_region": "சந்தை பிராந்தியம்", + "recommendation_country": "பரிந்துரை நாடு", + "appearance": "தோற்றம்", + "layout_mode": "அமைப்பு முறை", + "override_layout_settings": "தளவமைப்பு அமைப்புகளை மாற்றியமை", + "adaptive": "தகவமைப்பு", + "compact": "சுருக்கமான", + "extended": "விரிவான", + "theme": "தீம்", + "dark": "இருள்", + "light": "வெளிர்", + "system": "கணினி வழி", + "accent_color": "அழுத்த நிறம்", + "sync_album_color": "ஆல்பம் நிறத்தை ஒத்திசை", + "sync_album_color_description": "ஆல்பம் படத்தின் முக்கிய நிறத்தை அழுத்த நிறமாகப் பயன்படுத்துகிறது", + "playback": "பின்னணி", + "audio_quality": "ஒலி தரம்", + "high": "உயர்", + "low": "குறைந்த", + "pre_download_play": "முன்பதிவிறக்கம் மற்றும் இயக்கம்", + "pre_download_play_description": "ஒலியை ஸ்ட்ரீம் செய்வதற்குப் பதிலாக, பைட்டுகளைப் பதிவிறக்கி இயக்கவும் (அதிக பேண்ட்விட்த் பயனர்களுக்கு பரிந்துரைக்கப்படுகிறது)", + "skip_non_music": "இசையல்லாத பகுதிகளைத் தவிர் (SponsorBlock)", + "blacklist_description": "தடைசெய்யப்பட்ட பாடல்கள் மற்றும் கலைஞர்கள்", + "wait_for_download_to_finish": "தற்போதைய பதிவிறக்கம் முடியும் வரை காத்திருக்கவும்", + "desktop": "கணினி", + "close_behavior": "மூடும் நடத்தை", + "close": "மூடு", + "minimize_to_tray": "ட்ரேயை குறைக்கவும்", + "show_tray_icon": "ட்ரே ஐகானைக் காட்டு", + "about": "பற்றி", + "u_love_spotube": "நீங்கள் Spotube ஐ நேசிக்கிறீர்கள் என்பது எங்களுக்குத் தெரியும்", + "check_for_updates": "புதுப்பிப்புகளைச் சரிபார்", + "about_spotube": "Spotube பற்றி", + "blacklist": "தடைப்பட்டியல்", + "please_sponsor": "தயவுசெய்து ஆதரவு/நன்கொடை அளியுங்கள்", + "spotube_description": "Spotube, ஒரு லேசான, பல தளங்களில் இயங்கும், அனைவருக்கும் இலவசமான spotify கிளையன்ட்", + "version": "பதிப்பு", + "build_number": "கட்டமைப்பு எண்", + "founder": "நிறுவனர்", + "repository": "களஞ்சியம்", + "bug_issues": "பிழை_சிக்கல்கள்", + "made_with": "வங்காளதேசத்திலிருந்து🇧🇩 ❤️ உருவாக்கப்பட்டது", + "kingkor_roy_tirtho": "கிங்கர் ராய் திர்தோ", + "copyright": "© 2021-{current_year} கிங்கர் ராய் திர்தோ", + "license": "உரிமம்", + "add_spotify_credentials": "தொடங்குவதற்கு உங்கள் spotify சான்றுகளைச் சேர்க்கவும்", + "credentials_will_not_be_shared_disclaimer": "கவலைப்பட வேண்டாம், உங்கள் சான்றுகள் எதுவும் சேகரிக்கப்படாது அல்லது யாருடனும் பகிரப்படாது", + "know_how_to_login": "இதை எப்படி செய்வது என்று தெரியவில்லையா?", + "follow_step_by_step_guide": "படிப்படியான வழிகாட்டியைப் பின்பற்றவும்", + "spotify_cookie": "Spotify {name} நட்புநிரல்", + "cookie_name_cookie": "{name} நட்புநிரல்", + "fill_in_all_fields": "அனைத்து களங்களையும் நிரப்பவும்", + "submit": "சமர்ப்பி", + "exit": "வெளியேறு", + "previous": "முந்தைய", + "next": "அடுத்து", + "done": "முடிந்தது", + "step_1": "முதல் படி", + "first_go_to": "முதலில், செல்லவேண்டியது", + "login_if_not_logged_in": "நீங்கள் உள்நுழையவில்லை என்றால் உள்நுழைக/பதிவுசெய்க", + "step_2": "இரண்டாம் படி", + "step_2_steps": "1. நீங்கள் உள்நுழைந்தவுடன், F12 ஐ அழுத்தவும் அல்லது வலது கிளிக் செய்து > ஆய்வு செய்யவும் உலாவி டெவ்டூல்களைத் திறக்கவும்.\n2. பின்னர் \"பயன்பாடு\" தாவலுக்குச் செல்லவும் (Chrome, Edge, Brave போன்றவை) அல்லது \"சேமிப்பகம்\" தாவல் (Firefox, Pale Moon போன்றவை)\n3. \"குக்கிகள்\" பிரிவுக்குச் சென்று பின்னர் \"https://accounts.spotify.com\" பிரிவுக்குச் செல்லவும்", + "step_3": "மூன்றாம் படி", + "step_3_steps": "\"sp_dc\" நட்புநிரலின் மதிப்பை நகலெடுக்கவும்", + "success_emoji": "வெற்றி🥳", + "success_message": "இப்போது நீங்கள் உங்கள் Spotify கணக்கில் வெற்றிகரமாக உள்நுழைந்துள்ளீர்கள். நல்லது, நண்பரே!", + "step_4": "நான்காம் படி", + "step_4_steps": "நகலெடுக்கப்பட்ட \"sp_dc\" மதிப்பை ஒட்டவும்", + "something_went_wrong": "ஏதோ தவறு நடந்துவிட்டது", + "piped_instance": "Piped சேவையகம் நிகழ்வு", + "piped_description": "பாடல் பொருத்தத்திற்குப் பயன்படுத்த வேண்டிய Piped சேவையகம் நிகழ்வு", + "piped_warning": "அவற்றில் சில நன்றாக வேலை செய்யாமல் இருக்கலாம். எனவே உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்", + "invidious_instance": "Invidious சேவையக நிகழ்வு", + "invidious_description": "பாடல் பொருத்தத்திற்குப் பயன்படுத்த வேண்டிய Invidious சேவையக நிகழ்வு", + "invidious_warning": "அவற்றில் சில நன்றாக வேலை செய்யாமல் இருக்கலாம். எனவே உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்", + "generate": "உருவாக்கு", + "track_exists": "பாடல் {track} ஏற்கனவே உள்ளது", + "replace_downloaded_tracks": "பதிவிறக்கம் செய்யப்பட்ட அனைத்து பாடல்களையும் மாற்றவும்", + "skip_download_tracks": "பதிவிறக்கம் செய்யப்பட்ட அனைத்து பாடல்களையும் தவிர்க்கவும்", + "do_you_want_to_replace": "ஏற்கனவே உள்ள பாடலை மாற்ற விரும்புகிறீர்களா?", + "replace": "மாற்று", + "skip": "தவிர்", + "select_up_to_count_type": "{count} {type} வரை தேர்ந்தெடுக்கவும்", + "select_genres": "வகைகளைத் தேர்ந்தெடுக்கவும்", + "add_genres": "வகைகளைச் சேர்க்கவும்", + "country": "நாடு", + "number_of_tracks_generate": "உருவாக்க வேண்டிய பாடல்களின் எண்ணிக்கை", + "not_acoustic": "அகவுஸ்டிக்னெஸ்", + "dance_ability": "நடனத்தன்மை", + "energy": "ஆற்றல்", + "not_instrumental": "கருவித்தன்மை", + "liveness": "உயிர்ப்புத்தன்மை", + "loudness": "ஒலி அளவு", + "talkative": "பேச்சுத்தன்மை", + "valence": "உணர்வு", + "popularity": "பிரபலம்", + "key": "இசை குறிப்பு", + "duration": "கால அளவு (வினாடிகள்)", + "tempo": "வேகம் (BPM)", + "mode": "முறை", + "time_signature": "நேர கையொப்பம்", + "short": "குறுகிய", + "medium": "நடுத்தர", + "long": "நீண்ட", + "min": "குறைந்தபட்சம்", + "max": "அதிகபட்சம்", + "target": "இலக்கு", + "moderate": "மிதமான", + "deselect_all": "அனைத்தையும் தேர்வுநீக்கு", + "select_all": "அனைத்தையும் தேர்ந்தெடு", + "are_you_sure": "உறுதியாக இருக்கிறீர்களா?", + "generating_playlist": "உங்கள் தனிப்பயன்பாட்டிற்கான பாடல் பட்டியலை உருவாக்குகிறது...", + "selected_count_tracks": "{count} பாடல்கள் தேர்ந்தெடுக்கப்பட்டன", + "download_warning": "நீங்கள் அனைத்து பாடல்களையும் மொத்தமாக பதிவிறக்கினால், நீங்கள் தெளிவாக இசையைத் திருடுகிறீர்கள் மற்றும் இசையின் படைப்பாற்றல் சமூகத்திற்கு சேதம் விளைவிக்கிறீர்கள். நீங்கள் இதை அறிந்திருக்கிறீர்கள் என்று நம்புகிறேன். எப்போதும், கலைஞரின் கடின உழைப்பை மதித்து ஆதரிக்க முயற்சி செய்யுங்கள்", + "download_ip_ban_warning": "மேலும், அதிகப்படியான பதிவிறக்க கோரிக்கைகள் காரணமாக உங்கள் IP YouTube இல் தடைசெய்யப்படலாம். IP தடை என்பது குறைந்தது 2-3 மாதங்களுக்கு அந்த IP சாதனத்திலிருந்து YouTube ஐப் பயன்படுத்த முடியாது (நீங்கள் உள்நுழைந்திருந்தாலும் கூட). இது ஒருபோதும் நடந்தால் Spotube பொறுப்பேற்காது", + "by_clicking_accept_terms": "'ஏற்றுக்கொள்' என்பதைக் கிளிக் செய்வதன் மூலம் பின்வரும் விதிமுறைகளுக்கு நீங்கள் ஒப்புக்கொள்கிறீர்கள்:", + "download_agreement_1": "நான் இசையைத் திருடுகிறேன் என்பது எனக்குத் தெரியும். நான் கெட்டவன்", + "download_agreement_2": "நான் கலைஞரை முடிந்தவரை ஆதரிப்பேன், அவர்களின் கலைக்கு பணம் செலுத்த எனக்கு பணம் இல்லாததால் மட்டுமே இதைச் செய்கிறேன்", + "download_agreement_3": "என் IP YouTube இல் தடைசெய்யப்படலாம் என்பதை நான் முழுமையாக அறிவேன், மேலும் என் தற்போதைய செயலால் ஏற்படும் எந்த விபத்துகளுக்கும் Spotube அல்லது அதன் உரிமையாளர்கள்/பங்களிப்பாளர்களை பொறுப்பாக்க மாட்டேன்", + "decline": "மறு", + "accept": "ஏற்றுக்கொள்", + "details": "விவரங்கள்", + "youtube": "YouTube", + "channel": "சேனல்", + "likes": "விருப்பங்கள்", + "dislikes": "விருப்பமில்லாதவை", + "views": "பார்வைகள்", + "streamUrl": "ஸ்ட்ரீம் URL", + "stop": "நிறுத்து", + "sort_newest": "புதிதாக சேர்க்கப்பட்டவற்றை வரிசைப்படுத்து", + "sort_oldest": "பழமையானவற்றை வரிசைப்படுத்து", + "sleep_timer": "உறக்க நேரம்", + "minutes": "{minutes} நிமிடங்கள்", + "hours": "{hours} மணிநேரங்கள்", + "hour": "{hours} மணிநேரம்", + "custom_hours": "தனிப்பயன் மணிநேரங்கள்", + "logs": "பதிவுகள்", + "developers": "உருவாக்குநர்கள்", + "not_logged_in": "நீங்கள் உள்நுழையவில்லை", + "search_mode": "தேடல் முறை", + "audio_source": "ஒலி மூலம்", + "ok": "சரி", + "failed_to_encrypt": "குறியாக்கம் தோல்வியடைந்தது", + "encryption_failed_warning": "Spotube உங்கள் தரவை பாதுகாப்பாக சேமிக்க குறியாக்கத்தைப் பயன்படுத்துகிறது. ஆனால் அவ்வாறு செய்ய முடியவில்லை. எனவே இது பாதுகாப்பற்ற சேமிப்பகத்திற்கு மாறும்\nநீங்கள் லினக்ஸ் பயன்படுத்துகிறீர்கள் என்றால், எந்த ரகசிய சேவையும் (gnome-keyring, kde-wallet, KeePassXC போன்றவை) நிறுவப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும்", + "querying_info": "தகவலைக் கேட்கிறது...", + "piped_api_down": "Piped API செயலிழந்துள்ளது", + "piped_down_error_instructions": "Piped நிகழ்வு {pipedInstance} தற்போது செயலிழந்துள்ளது\n\nநிகழ்வை மாற்றவும் அல்லது 'API வகை'யை அதிகாரப்பூர்வ YouTube API க்கு மாற்றவும்\n\nமாற்றத்திற்குப் பிறகு பயன்பாட்டை மறுதொடக்கம் செய்வதை உறுதிப்படுத்தவும்", + "you_are_offline": "நீங்கள் தற்போது ஆஃப்லைனில் உள்ளீர்கள்", + "connection_restored": "உங்கள் இணைய இணைப்பு மீட்டெடுக்கப்பட்டது", + "use_system_title_bar": "கணினி தலைப்புப் பட்டியைப் பயன்படுத்தவும்", + "crunching_results": "முடிவுகளை செயலாக்குகிறது...", + "search_to_get_results": "முடிவுகளைப் பெற தேடவும்", + "use_amoled_mode": "கருமை நிற இருண்ட தீம்", + "pitch_dark_theme": "AMOLED முறை", + "normalize_audio": "ஒலியை சீரமை", + "change_cover": "அட்டையை மாற்று", + "add_cover": "அட்டையைச் சேர்", + "restore_defaults": "இயல்புநிலைகளை மீட்டமை", + "download_music_codec": "இசை கோடெக்கை பதிவிறக்கு", + "streaming_music_codec": "இசை கோடெக்கை ஸ்ட்ரீம் செய்", + "login_with_lastfm": "Last.fm உடன் உள்நுழைக", + "connect": "இணை", + "disconnect_lastfm": "Last.fm இலிருந்து துண்டி", + "disconnect": "துண்டி", + "username": "பயனர்பெயர்", + "password": "கடவுச்சொல்", + "login": "உள்நுழைக", + "login_with_your_lastfm": "உங்கள் Last.fm கணக்குடன் உள்நுழைக", + "scrobble_to_lastfm": "Last.fm க்கு ஸ்க்ரோபிள் செய்", + "go_to_album": "ஆல்பத்திற்குச் செல்", + "discord_rich_presence": "Discord செழுமையான தோற்றம்", + "browse_all": "அனைத்தையும் உலாவு", + "genres": "வகைகள்", + "explore_genres": "வகைகளை ஆராயுங்கள்", + "friends": "நண்பர்கள்", + "no_lyrics_available": "மன்னிக்கவும், இந்தப் பாடலுக்கான பாடல் வரிகளைக் கண்டுபிடிக்க முடியவில்லை", + "start_a_radio": "வானொலியைத் தொடங்கு", + "how_to_start_radio": "வானொலியை எவ்வாறு தொடங்க விரும்புகிறீர்கள்?", + "replace_queue_question": "தற்போதைய வரிசையை மாற்ற விரும்புகிறீர்களா அல்லது அதனுடன் சேர்க்க விரும்புகிறீர்களா?", + "endless_playback": "முடிவற்ற இயக்கம்", + "delete_playlist": "பாடல் பட்டியலை நீக்கு", + "delete_playlist_confirmation": "இந்த பாடல் பட்டியலை நீக்க விரும்புகிறீர்களா?", + "local_tracks": "உள்ளூர் பாடல்கள்", + "local_tab": "உள்ளூர்", + "song_link": "பாடல் இணைப்பு", + "skip_this_nonsense": "இந்த அர்த்தமற்றதைத் தவிர்", + "freedom_of_music": "\"இசையின் சுதந்திரம்\"", + "freedom_of_music_palm": "\"உங்கள் கைகளில் இசையின் சுதந்திரம்\"", + "get_started": "தொடங்குவோம்", + "youtube_source_description": "பரிந்துரைக்கப்படுகிறது மற்றும் சிறப்பாக செயல்படுகிறது.", + "piped_source_description": "சுதந்திரமாக உணர்கிறீர்களா? YouTube போலவே ஆனால் மிகவும் சுதந்திரமானது.", + "jiosaavn_source_description": "தெற்காசியப் பிராந்தியத்திற்கு சிறந்தது.", + "invidious_source_description": "Piped ஐப் போன்றது ஆனால் அதிக கிடைக்கும் தன்மையுடன்.", + "highest_quality": "உயர்ந்த தரம்: {quality}", + "select_audio_source": "ஒலி மூலத்தைத் தேர்ந்தெடுக்கவும்", + "endless_playback_description": "வரிசையின் இறுதியில் புதிய பாடல்களை\nதானாகவே சேர்க்கவும்", + "choose_your_region": "உங்கள் பிராந்தியத்தைத் தேர்ந்தெடுக்கவும்", + "choose_your_region_description": "இது உங்கள் இருப்பிடத்திற்கான சரியான உள்ளடக்கத்தை\nSpotube காட்ட உதவும்.", + "choose_your_language": "உங்கள் மொழியைத் தேர்ந்தெடுக்கவும்", + "help_project_grow": "இந்த திட்டம் வளர உதவுங்கள்", + "help_project_grow_description": "Spotube ஒரு திறந்த மூல திட்டம். திட்டத்திற்கு பங்களிப்பு செய்வதன் மூலம், பிழைகளைப் புகாரளிப்பதன் மூலம் அல்லது புதிய அம்சங்களைப் பரிந்துரைப்பதன் மூலம் இந்தத் திட்டம் வளர உதவலாம்.", + "contribute_on_github": "GitHub இல் பங்களியுங்கள்", + "donate_on_open_collective": "Open Collective இல் நன்கொடை அளியுங்கள்", + "browse_anonymously": "அநாமதேயமாக உலாவுக", + "enable_connect": "இணைப்பை இயக்கு", + "enable_connect_description": "மற்ற சாதனங்களிலிருந்து Spotube ஐக் கட்டுப்படுத்தவும்", + "devices": "சாதனங்கள்", + "select": "தேர்ந்தெடு", + "connect_client_alert": "நீங்கள் {client} ஆல் கட்டுப்படுத்தப்படுகிறீர்கள்", + "this_device": "இந்த சாதனம்", + "remote": "தொலைநிலை", + "stats": "புள்ளிவிவரங்கள்", + "and_n_more": "மற்றும் {count} கூடுதலாக", + "recently_played": "சமீபத்தில் இயக்கியவை", + "browse_more": "மேலும் உலாவு", + "no_title": "தலைப்பு இல்லை", + "not_playing": "இயக்கப்படவில்லை", + "epic_failure": "மோசமான தோல்வி!", + "added_num_tracks_to_queue": "{tracks_length} பாடல்கள் வரிசையில் சேர்க்கப்பட்டன", + "spotube_has_an_update": "Spotube க்கு ஒரு புதுப்பிப்பு உள்ளது", + "download_now": "இப்போது பதிவிறக்கு", + "nightly_version": "Spotube Nightly {nightlyBuildNum} வெளியிடப்பட்டுள்ளது", + "release_version": "Spotube v{version} வெளியிடப்பட்டுள்ளது", + "read_the_latest": "சமீபத்திய ", + "release_notes": "வெளியீட்டு குறிப்புகளைப் படிக்கவும்", + "pick_color_scheme": "வண்ணத் திட்டத்தைத் தேர்ந்தெடுக்கவும்", + "save": "சேமி", + "choose_the_device": "சாதனத்தைத் தேர்ந்தெடுக்கவும்:", + "multiple_device_connected": "பல சாதனங்கள் இணைக்கப்பட்டுள்ளன.\nஇந்த செயல் நடைபெற வேண்டிய சாதனத்தைத் தேர்ந்தெடுக்கவும்", + "nothing_found": "எதுவும் கிடைக்கவில்லை", + "the_box_is_empty": "பெட்டி காலியாக உள்ளது", + "top_artists": "சிறந்த கலைஞர்கள்", + "top_albums": "சிறந்த ஆல்பங்கள்", + "this_week": "இந்த வாரம்", + "this_month": "இந்த மாதம்", + "last_6_months": "கடந்த 6 மாதங்கள்", + "this_year": "இந்த ஆண்டு", + "last_2_years": "கடந்த 2 ஆண்டுகள்", + "all_time": "எல்லா நேரமும்", + "powered_by_provider": "{providerName} ஆல் இயக்கப்படுகிறது", + "email": "மின்னஞ்சல்", + "profile_followers": "பின்தொடர்பவர்கள்", + "birthday": "பிறந்த நாள்", + "subscription": "சந்தா", + "not_born": "பிறக்கவில்லை", + "hacker": "ஹேக்கர்", + "profile": "சுயவிவரம்", + "no_name": "பெயர் இல்லை", + "edit": "திருத்து", + "user_profile": "பயனர் சுயவிவரம்", + "count_plays": "{count} முறை இசைக்கப்பட்டது", + "streaming_fees_hypothetical": "ஸ்ட்ரீமிங் கட்டணங்கள் (கற்பனை)", + "minutes_listened": "காலம் கேட்டது", + "streamed_songs": "ஸ்ட்ரீமிங் செய்யப்பட்ட பாடல்கள்", + "count_streams": "{count} ஸ்ட்ரீம்கள்", + "owned_by_you": "உங்களால் கொண்டது", + "copied_share_url_to_clipboard": "நகலெடுக்கப்பட்டது {shareUrl} கிளிப்போர்டுக்காக", + "spotify_hypothetical_calculation": "*இது Spotify இன் ஒவ்வொரு ஸ்ட்ரீமிற்கும்\n$0.003 முதல் $0.005 வரை அளவீடு அடிப்படையில் கணக்கிடப்படுகிறது. இது ஒரு கற்பனை\nகணக்கீடு ஆகும், பயனர் எந்த அளவிற்கு கலைஞர்களுக்கு\nஅதோர் பாடலை Spotify மென்பொருளில் கேட்டால் எவ்வளவு பணம் செலுத்தினார்கள் என்பதைக் கண்டுபிடிக்க.", + "count_minutes": "{minutes} நிமிடங்கள்", + "summary_minutes": "நிமிடங்கள்", + "summary_listened_to_music": "இசை கேட்டது", + "summary_songs": "பாடல்கள்", + "summary_streamed_overall": "மொத்தமாக ஸ்ட்ரீமிங்", + "summary_owed_to_artists": "கலைஞர்களுக்கு\nஇந்த மாதம் சொந்தமானது", + "summary_artists": "கலைஞர்கள்", + "summary_music_reached_you": "இசை உங்களுக்கு வந்தது", + "summary_full_albums": "முழு ஆல்பங்கள்", + "summary_got_your_love": "உங்கள் அன்பை பெற்றுக்கொண்டேன்", + "summary_playlists": "பாடல் பட்டியல்கள்", + "summary_were_on_repeat": "மீண்டும் மீண்டும் இருந்தன", + "total_money": "மொத்தம் {money}", + "webview_not_found": "வெப்வியூ கிடைக்கவில்லை", + "webview_not_found_description": "உங்கள் சாதனத்தில் எந்தவொரு வெப்வியூ இயக்கத்தை நிறுவவில்லை.\nஇது நிறுவப்பட்டிருந்தால், சுற்றுச்சூழல் பாதையில் PATH உள்ளது என்பதை உறுதிபடுத்தவும்\n\nநிறுவித்த பிறகு, செயலியை மறுதொடக்கம் செய்யவும்", + "unsupported_platform": "அதிர்ஷ்டகாத உருப்படியை ஆதரிக்கவில்லை", + "cache_music": "இசையை கேஷ் செய்", + "open": "திறக்கவும்", + "cache_folder": "கேஷ் அடைவு", + "export": "ஏற்றுமதி", + "clear_cache": "கேஷ் அழிக்கவும்", + "clear_cache_confirmation": "கேஷைப் அழிக்க விரும்புகிறீர்களா?", + "export_cache_files": "கேஷில் உள்ள கோப்புகளை ஏற்றுமதி செய்யவும்", + "found_n_files": "{count} கோப்புகள் கிடைத்தன", + "export_cache_confirmation": "இந்த கோப்புகளை ஏற்றுமதி செய்ய விரும்புகிறீர்களா?", + "exported_n_out_of_m_files": "{filesExported} கோப்புகள் ஏற்றுமதி செய்யப்பட்டன, {files} கோப்புகளில்", + "undo": "செயல்தவிர்", + "download_all": "அனைத்தையும் பதிவிறக்குக", + "add_all_to_playlist": "அனைத்தையும் பாடல் பட்டியலில் சேர்க்கவும்", + "add_all_to_queue": "அனைத்தையும் வரிசைப்படுத்து", + "play_all_next": "அடுத்த உள்ள அனைத்தையும் இயக்கு", + "pause": "நிறுத்து", + "view_all": "அனைத்தையும் காண்க", + "no_tracks_added_yet": "உங்கள் பாடல்களை இன்னும் சேர்க்கவில்லை என்றால் தெரியாதே", + "no_tracks": "இங்கு பாடல்கள் எதுவும் இல்லை", + "no_tracks_listened_yet": "இன்னும் எதையும் கேள்வியில்லை", + "not_following_artists": "நீங்கள் எந்த கலைஞரையும் பின்தொடரவில்லை", + "no_favorite_albums_yet": "நீங்கள் இன்னும் எந்த ஆல்பங்களையும் பிடித்தவையாகச் சேர்க்கவில்லை", + "no_logs_found": "பதிவுகள் எதுவும் கிடைக்கவில்லை", + "youtube_engine": "YouTube இயந்திரம்", + "youtube_engine_not_installed_title": "{engine} நிறுவியதில்லை", + "youtube_engine_not_installed_message": "{engine} உங்கள் கணினியில் நிறுவியதில்லை.", + "youtube_engine_set_path": "PATH மாறியில் கிடைக்கிறதா என்பதை உறுதிப்படுத்தவும் அல்லது\n{engine} செயல் செய்யக்கூடிய முறையை கீழே அமைக்கவும்", + "youtube_engine_unix_issue_message": "macOS/Linux/unix போல் OS இல், .zshrc/.bashrc/.bash_profile போன்றவை அமைப்பில் பாதையை PATH அமைப்பது இயலாது.\nநீங்கள்.shell configuration file இல் பாதையை அமைக்க வேண்டும்", + "download": "பதிவிறக்கு", + "file_not_found": "கோப்பு கிடைக்கவில்லை", + "custom": "தனிப்பயன்", + "add_custom_url": "தனிப்பயன் URL ஐச் சேர்க்கவும்" } \ No newline at end of file diff --git a/lib/l10n/app_th.arb b/lib/l10n/app_th.arb index 8e9a0318..9f229f49 100644 --- a/lib/l10n/app_th.arb +++ b/lib/l10n/app_th.arb @@ -91,7 +91,7 @@ "mini_player": "มินิเพลเยอร์", "slide_to_seek": "เลื่อนเพื่อไปข้างหน้าหรือถอยหลัง", "shuffle_playlist": "สุ่มเพลย์ลิสต์", - "unshuffle_playlist": "ยกเลิกการสุ่มเพลย์ลิสต์", + "not_shuffle_playlist": "ยกเลิกการสุ่มเพลย์ลิสต์", "previous_track": "แทร็กก่อนหน้า", "next_track": "แทร็กถัดไป", "pause_playback": "หยุดการเล่น", @@ -176,7 +176,7 @@ "first_go_to": "ก่อนอื่น ไปที่", "login_if_not_logged_in": "ยังไม่ได้เข้าสู่ระบบ ให้เข้าสู่ระบบ/ลงทะเบียน", "step_2": "ขั้นที่ 2", - "step_2_steps": "1. หลังจากเข้าสู่ระบบแล้ว กด F12 หรือ คลิกขวาที่เมาส์ > ตรวจสอบเพื่อเปิด Devtools เบราว์เซอร์\n2. จากนั้นไปที่แท็บ \"แอปพลิเคชัน\" (Chrome, Edge, Brave เป็นต้น) หรือแท็บ \"ที่เก็บข้อมูล\" (Firefox, Palemoon เป็นต้น)\n3. ไปที่ส่วน \"คุกกี้\" แล้วไปที่ subsection \"https: //accounts.spotify.com\"", + "step_2_steps": "1. หลังจากเข้าสู่ระบบแล้ว กด F12 หรือ คลิกขวาที่เมาส์ > ตรวจสอบเพื่อเปิด Devtools เบราว์เซอร์\n2. จากนั้นไปที่แท็บ \"แอปพลิเคชัน\" (Chrome, Edge, Brave เป็นต้น) หรือแท็บ \"ที่เก็บข้อมูล\" (Firefox, Pale Moon เป็นต้น)\n3. ไปที่ส่วน \"คุกกี้\" แล้วไปที่ subsection \"https: //accounts.spotify.com\"", "step_3": "ขั้นที่ 3", "step_3_steps": "คัดลอกค่าคุกกี้ \"sp_dc\"", "success_emoji": "สำเร็จ", @@ -199,13 +199,13 @@ "add_genres": "เพิ่มประเภท", "country": "ประเทศ", "number_of_tracks_generate": "จำนวนแทร็กที่จะสร้าง", - "acousticness": "อะคูสติก", - "danceability": "ความสามารถในการเต้น", + "not_acoustic": "อะคูสติก", + "dance_ability": "ความสามารถในการเต้น", "energy": "พลัง", - "instrumentalness": "บรรเลง", + "not_instrumental": "บรรเลง", "liveness": "ความสด", "loudness": "ความดัง", - "speechiness": "การพูด", + "talkative": "การพูด", "valence": "ความสุข", "popularity": "ความนิยม", "key": "คีย์", @@ -244,7 +244,7 @@ "sort_newest": "เรียงตามการเพิ่มใหม่ล่าสุด", "sort_oldest": "เรียงตามการเพิ่มเก่าสุด", "sleep_timer": "ตั้งเวลาปิด", - "mins": "{minutes} นาที", + "minutes": "{minutes} นาที", "hours": "{hours} ชั่วโมง", "hour": "{hours} ชั่วโมง", "custom_hours": "ชั่วโมงที่กำหนดเอง", @@ -255,7 +255,7 @@ "audio_source": "แหล่งที่มาของเสียง", "ok": "ตกลง", "failed_to_encrypt": "เข้ารหัสล้มเหลว", - "encryption_failed_warning": "Spotube ใช้การเข้ารหัสเพื่อเก็บข้อมูลของคุณอย่างปลอดภัย แต่ไม่สามารถทำได้ ดังนั้นจะเปลี่ยนเป็นการจัดเก็บที่ไม่ปลอดภัย\nหากคุณใช้ Linux โปรดตรวจสอบว่าคุณได้ติดตั้งบริการลับ (gnome-keyring, kde-wallet, keepassxc เป็นต้น)", + "encryption_failed_warning": "Spotube ใช้การเข้ารหัสเพื่อเก็บข้อมูลของคุณอย่างปลอดภัย แต่ไม่สามารถทำได้ ดังนั้นจะเปลี่ยนเป็นการจัดเก็บที่ไม่ปลอดภัย\nหากคุณใช้ Linux โปรดตรวจสอบว่าคุณได้ติดตั้งบริการลับ (gnome-keyring, kde-wallet, KeePassXC เป็นต้น)", "querying_info": "กำลังดึงข้อมูล...", "piped_api_down": "Piped API ไม่ทำงาน", "piped_down_error_instructions": "Piped instance {pipedInstance} ไม่ทำงานขณะนี้\n\nเปลี่ยนอินสแตนซ์หรือเปลี่ยน 'ประเภท API' เป็น YouTube API อย่างเป็นทางการ\n\nอย่าลืมรีสตาร์ทแอปหลังจากเปลี่ยน", @@ -367,7 +367,7 @@ "user_profile": "โปรไฟล์ผู้ใช้", "count_plays": "{count} การเล่น", "streaming_fees_hypothetical": "*คำนวณจากการจ่ายเงินต่อการสตรีมของ Spotify\nระหว่าง $0.003 ถึง $0.005 นี่เป็นการคำนวณสมมุติ\nเพื่อให้ข้อมูลแก่ผู้ใช้เกี่ยวกับจำนวนเงินที่พวกเขา\nอาจจะจ่ายให้กับศิลปินหากพวกเขาฟังเพลงของพวกเขาใน Spotify", - "count_mins": "{minutes} นาที", + "count_minutes": "{minutes} นาที", "summary_minutes": "นาที", "summary_listened_to_music": "ฟังเพลง", "summary_songs": "เพลง", @@ -384,8 +384,8 @@ "streamed_songs": "เพลงที่สตรีม", "count_streams": "{count} สตรีม", "owned_by_you": "เป็นเจ้าของโดยคุณ", - "copied_shareurl_to_clipboard": "{shareUrl} คัดลอกไปที่คลิปบอร์ดแล้ว", - "spotify_hipotetical_calculation": "*คำนวณตามการจ่ายต่อสตรีมของ Spotify\nซึ่งอยู่ในช่วง $0.003 ถึง $0.005 นี่เป็นการคำนวณสมมุติ\nเพื่อให้ผู้ใช้ทราบว่าพวกเขาจะจ่ายเงินให้ศิลปินเท่าไหร่\nหากพวกเขาฟังเพลงของพวกเขาใน Spotify.", + "copied_share_url_to_clipboard": "{shareUrl} คัดลอกไปที่คลิปบอร์ดแล้ว", + "spotify_hypothetical_calculation": "*คำนวณตามการจ่ายต่อสตรีมของ Spotify\nซึ่งอยู่ในช่วง $0.003 ถึง $0.005 นี่เป็นการคำนวณสมมุติ\nเพื่อให้ผู้ใช้ทราบว่าพวกเขาจะจ่ายเงินให้ศิลปินเท่าไหร่\nหากพวกเขาฟังเพลงของพวกเขาใน Spotify.", "webview_not_found": "ไม่พบ Webview", "webview_not_found_description": "ไม่พบ runtime ของ Webview บนอุปกรณ์ของคุณ\nหากติดตั้งแล้วตรวจสอบให้แน่ใจว่าอยู่ใน environment PATH\n\nหลังจากติดตั้งแล้ว ให้รีสตาร์ทแอป", "unsupported_platform": "แพลตฟอร์มไม่รองรับ", diff --git a/lib/l10n/app_tl.arb b/lib/l10n/app_tl.arb index c395cdc7..8a5285e9 100644 --- a/lib/l10n/app_tl.arb +++ b/lib/l10n/app_tl.arb @@ -1,428 +1,428 @@ { - "guest": "Bisita", - "browse": "Mag-browse", - "search": "Maghanap", - "library": "Silid-aklatan", - "lyrics": "Mga Liriko", - "settings": "Mga Setting", - "genre_categories_filter": "I-filter ang mga kategorya o genre...", - "genre": "Genre", - "personalized": "Naka-personalize", - "featured": "Tampok", - "new_releases": "Mga Bagong Paglabas", - "songs": "Mga Kanta", - "playing_track": "Tumutugtog ang {track}", - "queue_clear_alert": "Ito ay magbubura ng kasalukuyang pila. {track_length} na mga track ang tatanggalin\nGusto mo bang magpatuloy?", - "load_more": "Mag-load pa", - "playlists": "Mga Playlist", - "artists": "Mga Artista", - "albums": "Mga Album", - "tracks": "Mga Track", - "downloads": "Mga Download", - "filter_playlists": "I-filter ang iyong mga playlist...", - "liked_tracks": "Mga Nagustuhang Track", - "liked_tracks_description": "Lahat ng mga track na iyong nagustuhan", - "playlist": "Playlist", - "create_a_playlist": "Gumawa ng playlist", - "update_playlist": "I-update ang playlist", - "create": "Lumikha", - "cancel": "Ikansela", - "update": "I-update", - "playlist_name": "Pangalan ng Playlist", - "name_of_playlist": "Pangalan ng playlist", - "description": "Paglalarawan", - "public": "Pampubliko", - "collaborative": "Pakikipagtulungan", - "search_local_tracks": "Maghanap ng mga lokal na track...", - "play": "I-play", - "delete": "Burahin", - "none": "Wala", - "sort_a_z": "Ayusin ayon sa A-Z", - "sort_z_a": "Ayusin ayon sa Z-A", - "sort_artist": "Ayusin ayon sa Artista", - "sort_album": "Ayusin ayon sa Album", - "sort_duration": "Ayusin ayon sa Tagal", - "sort_tracks": "Ayusin ang mga Track", - "currently_downloading": "Kasalukuyang Nagda-download ({tracks_length})", - "cancel_all": "Kanselahin Lahat", - "filter_artist": "I-filter ang mga artista...", - "followers": "{followers} na mga Tagasunod", - "add_artist_to_blacklist": "Idagdag ang artista sa blacklist", - "top_tracks": "Mga Nangungunang Track", - "fans_also_like": "Gusto rin ng mga tagahanga", - "loading": "Naglo-load...", - "artist": "Artista", - "blacklisted": "Naka-blacklist", - "following": "Sinusundan", - "follow": "Sundan", - "artist_url_copied": "Na-copy sa clipboard ang URL ng artista", - "added_to_queue": "Idinagdag ang {tracks} na mga track sa pila", - "filter_albums": "I-filter ang mga album...", - "synced": "Naka-sync", - "plain": "Simpleng", - "shuffle": "I-shuffle", - "search_tracks": "Maghanap ng mga track...", - "released": "Inilabas", - "error": "Error {error}", - "title": "Pamagat", - "time": "Oras", - "more_actions": "Higit pang mga aksyon", - "download_count": "I-download ({count})", - "add_count_to_playlist": "Idagdag ({count}) sa Playlist", - "add_count_to_queue": "Idagdag ({count}) sa Pila", - "play_count_next": "I-play ({count}) kasunod", - "album": "Album", - "copied_to_clipboard": "Na-copy ang {data} sa clipboard", - "add_to_following_playlists": "Idagdag ang {track} sa mga sumusunod na Playlist", - "add": "Idagdag", - "added_track_to_queue": "Idinagdag ang {track} sa pila", - "add_to_queue": "Idagdag sa pila", - "track_will_play_next": "Ang {track} ay tutugtog susunod", - "play_next": "I-play susunod", - "removed_track_from_queue": "Tinanggal ang {track} mula sa pila", - "remove_from_queue": "Alisin mula sa pila", - "remove_from_favorites": "Alisin mula sa mga paborito", - "save_as_favorite": "I-save bilang paborito", - "add_to_playlist": "Idagdag sa playlist", - "remove_from_playlist": "Alisin mula sa playlist", - "add_to_blacklist": "Idagdag sa blacklist", - "remove_from_blacklist": "Alisin mula sa blacklist", - "share": "Ibahagi", - "mini_player": "Mini Player", - "slide_to_seek": "I-slide para mag-seek pasulong o pabalik", - "shuffle_playlist": "I-shuffle ang playlist", - "unshuffle_playlist": "I-unshuffle ang playlist", - "previous_track": "Nakaraang track", - "next_track": "Susunod na track", - "pause_playback": "I-pause ang Playback", - "resume_playback": "Ipagpatuloy ang Playback", - "loop_track": "I-loop ang track", - "no_loop": "Walang loop", - "repeat_playlist": "Ulitin ang playlist", - "queue": "Pila", - "alternative_track_sources": "Alternatibong mga pinagmulan ng track", - "download_track": "I-download ang track", - "tracks_in_queue": "{tracks} na mga track sa pila", - "clear_all": "Burahin lahat", - "show_hide_ui_on_hover": "Ipakita/Itago ang UI sa hover", - "always_on_top": "Palaging nasa ibabaw", - "exit_mini_player": "Lumabas sa Mini player", - "download_location": "Lokasyon ng pag-download", - "local_library": "Lokal na silid-aklatan", - "add_library_location": "Idagdag sa silid-aklatan", - "remove_library_location": "Alisin mula sa silid-aklatan", - "account": "Account", - "login_with_spotify": "Mag-login gamit ang iyong Spotify account", - "connect_with_spotify": "Kumonekta sa Spotify", - "logout": "Mag-logout", - "logout_of_this_account": "Mag-logout sa account na ito", - "language_region": "Wika at Rehiyon", - "language": "Wika", - "system_default": "Default ng Sistema", - "market_place_region": "Rehiyon ng Marketplace", - "recommendation_country": "Bansang Inirerekomenda", - "appearance": "Hitsura", - "layout_mode": "Mode ng Layout", - "override_layout_settings": "I-override ang mga setting ng responsive layout mode", - "adaptive": "Umaangkop", - "compact": "Kompakto", - "extended": "Pinalawig", - "theme": "Tema", - "dark": "Madilim", - "light": "Maliwanag", - "system": "Sistema", - "accent_color": "Kulay ng Accent", - "sync_album_color": "I-sync ang kulay ng album", - "sync_album_color_description": "Ginagamit ang pangunahing kulay ng album art bilang kulay ng accent", - "playback": "Playback", - "audio_quality": "Kalidad ng Audio", - "high": "Mataas", - "low": "Mababa", - "pre_download_play": "Mag-pre-download at i-play", - "pre_download_play_description": "Sa halip na mag-stream ng audio, mag-download ng bytes at i-play sa halip (Inirerekomenda para sa mga gumagamit ng mataas na bandwidth)", - "skip_non_music": "Laktawan ang mga segment na hindi musika (SponsorBlock)", - "blacklist_description": "Mga track at artista na nasa blacklist", - "wait_for_download_to_finish": "Mangyaring maghintay para matapos ang kasalukuyang pag-download", - "desktop": "Desktop", - "close_behavior": "Pag-uugali ng Pagsara", - "close": "Isara", - "minimize_to_tray": "I-minimize sa tray", - "show_tray_icon": "Ipakita ang icon ng System tray", - "about": "Tungkol sa", - "u_love_spotube": "Alam naming gusto mo ang Spotube", - "check_for_updates": "Maghanap ng mga update", - "about_spotube": "Tungkol sa Spotube", - "blacklist": "Blacklist", - "please_sponsor": "Mangyaring Mag-sponsor/Mag-donate", - "spotube_description": "Spotube, isang magaan, cross-platform, libreng-para-sa-lahat na spotify client", - "version": "Bersyon", - "build_number": "Build Number", - "founder": "Nagtatag", - "repository": "Repository", - "bug_issues": "Bug+Mga Isyu", - "made_with": "Ginawa nang may ❤️ sa Bangladesh🇧🇩", - "kingkor_roy_tirtho": "Kingkor Roy Tirtho", - "copyright": "© 2021-{current_year} Kingkor Roy Tirtho", - "license": "Lisensya", - "add_spotify_credentials": "Idagdag ang iyong mga kredensyal sa spotify para makapagsimula", - "credentials_will_not_be_shared_disclaimer": "Huwag mag-alala, ang alinman sa iyong mga kredensyal ay hindi kokolektahin o ibabahagi sa sinuman", - "know_how_to_login": "Hindi mo alam kung paano gawin ito?", - "follow_step_by_step_guide": "Sundin ang Hakbang-hakbang na gabay", - "spotify_cookie": "Spotify {name} Cookie", - "cookie_name_cookie": "{name} Cookie", - "fill_in_all_fields": "Mangyaring punan ang lahat ng field", - "submit": "Isumite", - "exit": "Lumabas", - "previous": "Nakaraan", - "next": "Susunod", - "done": "Tapos na", - "step_1": "Hakbang 1", - "first_go_to": "Una, Pumunta sa", - "login_if_not_logged_in": "at Mag-login/Mag-signup kung hindi ka naka-log in", - "step_2": "Hakbang 2", - "step_2_steps": "1. Kapag naka-log in ka na, pindutin ang F12 o i-right click ang Mouse > Inspect para Buksan ang Browser devtools.\n2. Pagkatapos ay pumunta sa \"Application\" Tab (Chrome, Edge, Brave atbp..) o \"Storage\" Tab (Firefox, Palemoon atbp..)\n3. Pumunta sa \"Cookies\" na seksyon at pagkatapos sa \"https://accounts.spotify.com\" na subseksyon", - "step_3": "Hakbang 3", - "step_3_steps": "Kopyahin ang halaga ng \"sp_dc\" Cookie", - "success_emoji": "Tagumpay🥳", - "success_message": "Ngayon ay matagumpay kang Naka-log in gamit ang iyong Spotify account. Magaling, kaibigan!", - "step_4": "Hakbang 4", - "step_4_steps": "I-paste ang na-kopyang halaga ng \"sp_dc\"", - "something_went_wrong": "May nangyaring mali", - "piped_instance": "Instance ng Piped Server", - "piped_description": "Ang instance ng Piped server na gagamitin para sa pagtutugma ng track", - "piped_warning": "Maaaring hindi gumagana nang mabuti ang ilan sa mga ito. Kaya gamitin sa sarili mong peligro", - "invidious_instance": "Instance ng Invidious Server", - "invidious_description": "Ang instance ng Invidious server na gagamitin para sa pagtutugma ng track", - "invidious_warning": "Maaaring hindi gumagana nang mabuti ang ilan sa mga ito. Kaya gamitin sa sarili mong peligro", - "generate": "Gumawa", - "track_exists": "Ang Track na {track} ay umiiral na", - "replace_downloaded_tracks": "Palitan ang lahat ng na-download na mga track", - "skip_download_tracks": "Laktawan ang pag-download ng lahat ng na-download na mga track", - "do_you_want_to_replace": "Gusto mo bang palitan ang umiiral na track??", - "replace": "Palitan", - "skip": "Laktawan", - "select_up_to_count_type": "Pumili ng hanggang {count} {type}", - "select_genres": "Pumili ng mga Genre", - "add_genres": "Magdagdag ng mga Genre", - "country": "Bansa", - "number_of_tracks_generate": "Bilang ng mga track na gagawin", - "acousticness": "Acoustic-ness", - "danceability": "Kakayahang Sayawin", - "energy": "Enerhiya", - "instrumentalness": "Instrumental-ness", - "liveness": "Liveness", - "loudness": "Lakas", - "speechiness": "Pagsasalita", - "valence": "Valence", - "popularity": "Popularidad", - "key": "Key", - "duration": "Tagal (s)", - "tempo": "Tempo (BPM)", - "mode": "Mode", - "time_signature": "Time Signature", - "short": "Maikli", - "medium": "Katamtaman", - "long": "Mahaba", - "min": "Min", - "max": "Max", - "target": "Target", - "moderate": "Katamtaman", - "deselect_all": "Alisin ang Pagkakapili sa Lahat", - "select_all": "Piliin Lahat", - "are_you_sure": "Sigurado ka ba?", - "generating_playlist": "Gumagawa ng iyong custom na playlist...", - "selected_count_tracks": "Napili ang {count} na mga track", - "download_warning": "Kung nag-download ka ng lahat ng Track sa maramihan, malinaw na nagpa-pirate ka ng Musika at nagsasanhi ng pinsala sa creative society ng Musika. Sana ay alam mo ito. Palaging, subukang igalang at suportahan ang masipag na paggawa ng Artist", - "download_ip_ban_warning": "Sa nga pala, ang iyong IP ay maaaring ma-block sa YouTube dahil sa sobrang mga kahilingan sa pag-download kaysa sa karaniwan. Ang IP block ay nangangahulugang hindi mo magagamit ang YouTube (kahit na naka-log in ka) sa loob ng hindi bababa sa 2-3 buwan mula sa device na may IP na iyon. At hindi pinanghahawakan ng Spotube ang anumang responsibilidad kung mangyayari ito", - "by_clicking_accept_terms": "Sa pamamagitan ng pag-click sa 'tanggapin', sumasang-ayon ka sa mga sumusunod na tuntunin:", - "download_agreement_1": "Alam kong nagpa-pirate ako ng Musika. Masama ako", - "download_agreement_2": "Susuportahan ko ang Artist saan man ako maaari at ginagawa ko lang ito dahil wala akong pera para bumili ng kanilang sining", - "download_agreement_3": "Lubos kong nauunawaan na ang aking IP ay maaaring ma-block sa YouTube at hindi ko pinanghahawakan ang Spotube o ang kanyang mga may-ari/nag-ambag na responsable para sa anumang aksidente na sanhi ng aking kasalukuyang aksyon", - "decline": "Tanggihan", - "accept": "Tanggapin", - "details": "Mga Detalye", - "youtube": "YouTube", - "channel": "Channel", - "likes": "Mga Like", - "dislikes": "Mga Dislike", - "views": "Mga View", - "streamUrl": "Stream URL", - "stop": "Ihinto", - "sort_newest": "Ayusin ayon sa pinakabagong idinagdag", - "sort_oldest": "Ayusin ayon sa pinakalumang idinagdag", - "sleep_timer": "Sleep Timer", - "mins": "{minutes} Minuto", - "hours": "{hours} Oras", - "hour": "{hours} Oras", - "custom_hours": "Custom na Oras", - "logs": "Mga Log", - "developers": "Mga Developer", - "not_logged_in": "Hindi ka naka-log in", - "search_mode": "Mode ng Paghahanap", - "audio_source": "Pinagmulan ng Audio", - "ok": "Ok", - "failed_to_encrypt": "Nabigong i-encrypt", - "encryption_failed_warning": "Gumagamit ng encryption ang Spotube para ligtas na i-store ang iyong data. Ngunit nabigo. Kaya babalik ito sa hindi secure na storage\nKung gumagamit ka ng linux, mangyaring tiyakin na mayroon kang anumang secret-service na naka-install (gnome-keyring, kde-wallet, keepassxc atbp)", - "querying_info": "Kinukuha ang impormasyon...", - "piped_api_down": "Ang Piped API ay hindi gumagana", - "piped_down_error_instructions": "Ang instance ng Piped na {pipedInstance} ay kasalukuyang hindi gumagana\n\nMaaari mong baguhin ang instance o baguhin ang 'Uri ng API' sa opisyal na YouTube API\n\nSiguraduhing i-restart ang app pagkatapos ng pagbabago", - "you_are_offline": "Kasalukuyan kang offline", - "connection_restored": "Naibalik na ang iyong koneksyon sa internet", - "use_system_title_bar": "Gamitin ang title bar ng system", - "crunching_results": "Pinaproseso ang mga resulta...", - "search_to_get_results": "Maghanap para makakuha ng mga resulta", - "use_amoled_mode": "Matingkad na itim na madilim na tema", - "pitch_dark_theme": "AMOLED Mode", - "normalize_audio": "I-normalize ang audio", - "change_cover": "Baguhin ang cover", - "add_cover": "Magdagdag ng cover", - "restore_defaults": "Ibalik ang mga default", - "download_music_codec": "Codec para sa pag-download ng musika", - "streaming_music_codec": "Codec para sa pag-stream ng musika", - "login_with_lastfm": "Mag-login gamit ang Last.fm", - "connect": "Kumonekta", - "disconnect_lastfm": "Idiskonekta ang Last.fm", - "disconnect": "Idiskonekta", - "username": "Username", - "password": "Password", - "login": "Mag-login", - "login_with_your_lastfm": "Mag-login gamit ang iyong Last.fm account", - "scrobble_to_lastfm": "I-scrobble sa Last.fm", - "go_to_album": "Pumunta sa Album", - "discord_rich_presence": "Discord Rich Presence", - "browse_all": "I-browse Lahat", - "genres": "Mga Genre", - "explore_genres": "Tuklasin ang mga Genre", - "friends": "Mga Kaibigan", - "no_lyrics_available": "Paumanhin, hindi mahanap ang lyrics para sa track na ito", - "start_a_radio": "Magsimula ng Radio", - "how_to_start_radio": "Paano mo gustong simulan ang radio?", - "replace_queue_question": "Gusto mo bang palitan ang kasalukuyang pila o idagdag dito?", - "endless_playback": "Walang Hanggang Playback", - "delete_playlist": "Burahin ang Playlist", - "delete_playlist_confirmation": "Sigurado ka bang gusto mong burahin ang playlist na ito?", - "local_tracks": "Mga Lokal na Track", - "local_tab": "Lokal", - "song_link": "Link ng Kanta", - "skip_this_nonsense": "Laktawan ang kalokohan na ito", - "freedom_of_music": "\"Kalayaan ng Musika\"", - "freedom_of_music_palm": "\"Kalayaan ng Musika sa iyong palad\"", - "get_started": "Magsimula na tayo", - "youtube_source_description": "Inirerekomenda at pinakamahusay na gumagana.", - "piped_source_description": "Gusto ng kalayaan? Kapareho ng YouTube ngunit mas malaya.", - "jiosaavn_source_description": "Pinakamahusay para sa rehiyon ng South Asia.", - "invidious_source_description": "Katulad ng Piped ngunit may mas mataas na availability.", - "highest_quality": "Pinakamataas na Kalidad: {quality}", - "select_audio_source": "Pumili ng Pinagmulan ng Audio", - "endless_playback_description": "Awtomatikong magdagdag ng mga bagong kanta\nsa dulo ng pila", - "choose_your_region": "Piliin ang iyong rehiyon", - "choose_your_region_description": "Ito ay tutulong sa Spotube na ipakita sa iyo ang tamang content\npara sa iyong lokasyon.", - "choose_your_language": "Piliin ang iyong wika", - "help_project_grow": "Tulungan ang proyektong ito na lumago", - "help_project_grow_description": "Ang Spotube ay isang open-source na proyekto. Maaari mong tulungan ang proyektong ito na lumago sa pamamagitan ng pag-contribute sa proyekto, pag-ulat ng mga bug, o pagmungkahi ng mga bagong feature.", - "contribute_on_github": "Mag-contribute sa GitHub", - "donate_on_open_collective": "Mag-donate sa Open Collective", - "browse_anonymously": "Mag-browse nang Anonymous", - "enable_connect": "I-enable ang Connect", - "enable_connect_description": "Kontrolin ang Spotube mula sa ibang mga device", - "devices": "Mga Device", - "select": "Pumili", - "connect_client_alert": "Ikaw ay kontrolado ng {client}", - "this_device": "Ang Device na ito", - "remote": "Remote", - "stats": "Mga Stat", - "and_n_more": "at {count} pa", - "recently_played": "Kamakailan Lang na Ni-play", - "browse_more": "Mag-browse pa", - "no_title": "Walang Pamagat", - "not_playing": "Hindi tumutugtog", - "epic_failure": "Epic na pagkabigo!", - "added_num_tracks_to_queue": "Nagdagdag ng {tracks_length} na mga track sa pila", - "spotube_has_an_update": "Ang Spotube ay may update", - "download_now": "I-download Ngayon", - "nightly_version": "Ang Spotube Nightly {nightlyBuildNum} ay inilabas na", - "release_version": "Ang Spotube v{version} ay inilabas na", - "read_the_latest": "Basahin ang pinakabagong ", - "release_notes": "release notes", - "pick_color_scheme": "Pumili ng color scheme", - "save": "I-save", - "choose_the_device": "Piliin ang device:", - "multiple_device_connected": "Mayroong maraming device na nakakonekta.\nPiliin ang device kung saan mo gustong maganap ang aksyon na ito", - "nothing_found": "Walang nahanap", - "the_box_is_empty": "Ang kahon ay walang laman", - "top_artists": "Nangungunang mga Artista", - "top_albums": "Nangungunang mga Album", - "this_week": "Ngayong linggo", - "this_month": "Ngayong buwan", - "last_6_months": "Nakaraang 6 na buwan", - "this_year": "Ngayong taon", - "last_2_years": "Nakaraang 2 taon", - "all_time": "Lahat ng panahon", - "powered_by_provider": "Pinapagana ng {providerName}", - "email": "Email", - "profile_followers": "Mga Tagasunod", - "birthday": "Kaarawan", - "subscription": "Subscription", - "not_born": "Hindi pa ipinanganak", - "hacker": "Hacker", - "profile": "Profile", - "no_name": "Walang Pangalan", - "edit": "I-edit", - "user_profile": "Profile ng User", - "count_plays": "{count} na mga play", - "streaming_fees_hypothetical": "Mga bayarin sa streaming (hypothetical)", - "minutes_listened": "Mga minutong pinapakinggan", - "streamed_songs": "Mga na-stream na kanta", - "count_streams": "{count} na mga stream", - "owned_by_you": "Pag-aari mo", - "copied_shareurl_to_clipboard": "Na-kopya ang {shareUrl} sa clipboard", - "spotify_hipotetical_calculation": "*Ito ay kinalkula batay sa bawat stream\nna bayad ng Spotify na $0.003 hanggang $0.005. Ito ay isang hypothetical\nna pagkalkula para bigyan ang user ng ideya kung magkano\nang kanilang ibabayad sa mga artista kung sila ay nakikinig\nng kanilang kanta sa Spotify.", - "count_mins": "{minutes} minuto", - "summary_minutes": "minuto", - "summary_listened_to_music": "Nakinig sa musika", - "summary_songs": "mga kanta", - "summary_streamed_overall": "Na-stream sa kabuuan", - "summary_owed_to_artists": "Utang sa mga artista\nngayong buwan", - "summary_artists": "artista", - "summary_music_reached_you": "Umabot sa iyo ang musika", - "summary_full_albums": "buong album", - "summary_got_your_love": "Nakuha ang iyong pagmamahal", - "summary_playlists": "mga playlist", - "summary_were_on_repeat": "Pinu-playlst muli", - "total_money": "Kabuuang {money}", - "webview_not_found": "Hindi nahanap ang Webview", - "webview_not_found_description": "Walang webview runtime na naka-install sa iyong device.\nKung naka-install ito, siguraduhing nasa Environment PATH\n\nPagkatapos mag-install, i-restart ang app", - "unsupported_platform": "Hindi suportadong platform", - "cache_music": "I-cache ang musika", - "open": "Buksan", - "cache_folder": "Folder ng cache", - "export": "I-export", - "clear_cache": "Burahin ang cache", - "clear_cache_confirmation": "Gusto mo bang burahin ang cache?", - "export_cache_files": "I-export ang mga Naka-cache na File", - "found_n_files": "Nahanap ang {count} na mga file", - "export_cache_confirmation": "Gusto mo bang i-export ang mga file na ito sa", - "exported_n_out_of_m_files": "Na-export ang {filesExported} mula sa {files} na mga file", - "undo": "I-undo", - "download_all": "I-download lahat", - "add_all_to_playlist": "Idagdag lahat sa playlist", - "add_all_to_queue": "Idagdag lahat sa pila", - "play_all_next": "I-play lahat susunod", - "pause": "Pause", - "view_all": "Tingnan lahat", - "no_tracks_added_yet": "Mukhang wala ka pang idinaragdag na mga track", - "no_tracks": "Mukhang walang mga track dito", - "no_tracks_listened_yet": "Mukhang wala ka pang pinakikinggan", - "not_following_artists": "Hindi ka sumusunod sa anumang mga artista", - "no_favorite_albums_yet": "Mukhang wala ka pang idinagdag na anumang mga album sa iyong mga paborito", - "no_logs_found": "Walang nahanap na mga log", - "youtube_engine": "YouTube Engine", - "youtube_engine_not_installed_title": "Hindi naka-install ang {engine}", - "youtube_engine_not_installed_message": "Hindi naka-install ang {engine} sa iyong sistema.", - "youtube_engine_set_path": "Siguraduhing available ito sa PATH variable o\ni-set ang absolute path sa {engine} executable sa ibaba", - "youtube_engine_unix_issue_message": "Sa macOS/Linux/unix tulad ng OS, ang pag-set ng path sa .zshrc/.bashrc/.bash_profile atbp. ay hindi gagana.\nKailangan mong i-set ang path sa configuration file ng shell", - "download": "I-download", - "file_not_found": "Hindi nahanap ang file", - "custom": "Custom", - "add_custom_url": "Magdagdag ng custom URL" + "guest": "Bisita", + "browse": "Mag-browse", + "search": "Maghanap", + "library": "Silid-aklatan", + "lyrics": "Mga Liriko", + "settings": "Mga Setting", + "genre_categories_filter": "I-filter ang mga kategorya o genre...", + "genre": "Genre", + "personalized": "Naka-personalize", + "featured": "Tampok", + "new_releases": "Mga Bagong Paglabas", + "songs": "Mga Kanta", + "playing_track": "Tumutugtog ang {track}", + "queue_clear_alert": "Ito ay magbubura ng kasalukuyang pila. {track_length} na mga track ang tatanggalin\nGusto mo bang magpatuloy?", + "load_more": "Mag-load pa", + "playlists": "Mga Playlist", + "artists": "Mga Artista", + "albums": "Mga Album", + "tracks": "Mga Track", + "downloads": "Mga Download", + "filter_playlists": "I-filter ang iyong mga playlist...", + "liked_tracks": "Mga Nagustuhang Track", + "liked_tracks_description": "Lahat ng mga track na iyong nagustuhan", + "playlist": "Playlist", + "create_a_playlist": "Gumawa ng playlist", + "update_playlist": "I-update ang playlist", + "create": "Lumikha", + "cancel": "Ikansela", + "update": "I-update", + "playlist_name": "Pangalan ng Playlist", + "name_of_playlist": "Pangalan ng playlist", + "description": "Paglalarawan", + "public": "Pampubliko", + "collaborative": "Pakikipagtulungan", + "search_local_tracks": "Maghanap ng mga lokal na track...", + "play": "I-play", + "delete": "Burahin", + "none": "Wala", + "sort_a_z": "Ayusin ayon sa A-Z", + "sort_z_a": "Ayusin ayon sa Z-A", + "sort_artist": "Ayusin ayon sa Artista", + "sort_album": "Ayusin ayon sa Album", + "sort_duration": "Ayusin ayon sa Tagal", + "sort_tracks": "Ayusin ang mga Track", + "currently_downloading": "Kasalukuyang Nagda-download ({tracks_length})", + "cancel_all": "Kanselahin Lahat", + "filter_artist": "I-filter ang mga artista...", + "followers": "{followers} na mga Tagasunod", + "add_artist_to_blacklist": "Idagdag ang artista sa blacklist", + "top_tracks": "Mga Nangungunang Track", + "fans_also_like": "Gusto rin ng mga tagahanga", + "loading": "Naglo-load...", + "artist": "Artista", + "blacklisted": "Naka-blacklist", + "following": "Sinusundan", + "follow": "Sundan", + "artist_url_copied": "Na-copy sa clipboard ang URL ng artista", + "added_to_queue": "Idinagdag ang {tracks} na mga track sa pila", + "filter_albums": "I-filter ang mga album...", + "synced": "Naka-sync", + "plain": "Simpleng", + "shuffle": "I-shuffle", + "search_tracks": "Maghanap ng mga track...", + "released": "Inilabas", + "error": "Error {error}", + "title": "Pamagat", + "time": "Oras", + "more_actions": "Higit pang mga aksyon", + "download_count": "I-download ({count})", + "add_count_to_playlist": "Idagdag ({count}) sa Playlist", + "add_count_to_queue": "Idagdag ({count}) sa Pila", + "play_count_next": "I-play ({count}) kasunod", + "album": "Album", + "copied_to_clipboard": "Na-copy ang {data} sa clipboard", + "add_to_following_playlists": "Idagdag ang {track} sa mga sumusunod na Playlist", + "add": "Idagdag", + "added_track_to_queue": "Idinagdag ang {track} sa pila", + "add_to_queue": "Idagdag sa pila", + "track_will_play_next": "Ang {track} ay tutugtog susunod", + "play_next": "I-play susunod", + "removed_track_from_queue": "Tinanggal ang {track} mula sa pila", + "remove_from_queue": "Alisin mula sa pila", + "remove_from_favorites": "Alisin mula sa mga paborito", + "save_as_favorite": "I-save bilang paborito", + "add_to_playlist": "Idagdag sa playlist", + "remove_from_playlist": "Alisin mula sa playlist", + "add_to_blacklist": "Idagdag sa blacklist", + "remove_from_blacklist": "Alisin mula sa blacklist", + "share": "Ibahagi", + "mini_player": "Mini Player", + "slide_to_seek": "I-slide para mag-seek pasulong o pabalik", + "shuffle_playlist": "I-shuffle ang playlist", + "not_shuffle_playlist": "I-unshuffle ang playlist", + "previous_track": "Nakaraang track", + "next_track": "Susunod na track", + "pause_playback": "I-pause ang Playback", + "resume_playback": "Ipagpatuloy ang Playback", + "loop_track": "I-loop ang track", + "no_loop": "Walang loop", + "repeat_playlist": "Ulitin ang playlist", + "queue": "Pila", + "alternative_track_sources": "Alternatibong mga pinagmulan ng track", + "download_track": "I-download ang track", + "tracks_in_queue": "{tracks} na mga track sa pila", + "clear_all": "Burahin lahat", + "show_hide_ui_on_hover": "Ipakita/Itago ang UI sa hover", + "always_on_top": "Palaging nasa ibabaw", + "exit_mini_player": "Lumabas sa Mini player", + "download_location": "Lokasyon ng pag-download", + "local_library": "Lokal na silid-aklatan", + "add_library_location": "Idagdag sa silid-aklatan", + "remove_library_location": "Alisin mula sa silid-aklatan", + "account": "Account", + "login_with_spotify": "Mag-login gamit ang iyong Spotify account", + "connect_with_spotify": "Kumonekta sa Spotify", + "logout": "Mag-logout", + "logout_of_this_account": "Mag-logout sa account na ito", + "language_region": "Wika at Rehiyon", + "language": "Wika", + "system_default": "Default ng Sistema", + "market_place_region": "Rehiyon ng Marketplace", + "recommendation_country": "Bansang Inirerekomenda", + "appearance": "Hitsura", + "layout_mode": "Mode ng Layout", + "override_layout_settings": "I-override ang mga setting ng responsive layout mode", + "adaptive": "Umaangkop", + "compact": "Kompakto", + "extended": "Pinalawig", + "theme": "Tema", + "dark": "Madilim", + "light": "Maliwanag", + "system": "Sistema", + "accent_color": "Kulay ng Accent", + "sync_album_color": "I-sync ang kulay ng album", + "sync_album_color_description": "Ginagamit ang pangunahing kulay ng album art bilang kulay ng accent", + "playback": "Playback", + "audio_quality": "Kalidad ng Audio", + "high": "Mataas", + "low": "Mababa", + "pre_download_play": "Mag-pre-download at i-play", + "pre_download_play_description": "Sa halip na mag-stream ng audio, mag-download ng bytes at i-play sa halip (Inirerekomenda para sa mga gumagamit ng mataas na bandwidth)", + "skip_non_music": "Laktawan ang mga segment na hindi musika (SponsorBlock)", + "blacklist_description": "Mga track at artista na nasa blacklist", + "wait_for_download_to_finish": "Mangyaring maghintay para matapos ang kasalukuyang pag-download", + "desktop": "Desktop", + "close_behavior": "Pag-uugali ng Pagsara", + "close": "Isara", + "minimize_to_tray": "I-minimize sa tray", + "show_tray_icon": "Ipakita ang icon ng System tray", + "about": "Tungkol sa", + "u_love_spotube": "Alam naming gusto mo ang Spotube", + "check_for_updates": "Maghanap ng mga update", + "about_spotube": "Tungkol sa Spotube", + "blacklist": "Blacklist", + "please_sponsor": "Mangyaring Mag-sponsor/Mag-donate", + "spotube_description": "Spotube, isang magaan, cross-platform, libreng-para-sa-lahat na spotify client", + "version": "Bersyon", + "build_number": "Build Number", + "founder": "Nagtatag", + "repository": "Repository", + "bug_issues": "Bug+Mga Isyu", + "made_with": "Ginawa nang may ❤️ sa Bangladesh🇧🇩", + "kingkor_roy_tirtho": "Kingkor Roy Tirtho", + "copyright": "© 2021-{current_year} Kingkor Roy Tirtho", + "license": "Lisensya", + "add_spotify_credentials": "Idagdag ang iyong mga kredensyal sa spotify para makapagsimula", + "credentials_will_not_be_shared_disclaimer": "Huwag mag-alala, ang alinman sa iyong mga kredensyal ay hindi kokolektahin o ibabahagi sa sinuman", + "know_how_to_login": "Hindi mo alam kung paano gawin ito?", + "follow_step_by_step_guide": "Sundin ang Hakbang-hakbang na gabay", + "spotify_cookie": "Spotify {name} Cookie", + "cookie_name_cookie": "{name} Cookie", + "fill_in_all_fields": "Mangyaring punan ang lahat ng field", + "submit": "Isumite", + "exit": "Lumabas", + "previous": "Nakaraan", + "next": "Susunod", + "done": "Tapos na", + "step_1": "Hakbang 1", + "first_go_to": "Una, Pumunta sa", + "login_if_not_logged_in": "at Mag-login/Mag-signup kung hindi ka naka-log in", + "step_2": "Hakbang 2", + "step_2_steps": "1. Kapag naka-log in ka na, pindutin ang F12 o i-right click ang Mouse > Inspect para Buksan ang Browser devtools.\n2. Pagkatapos ay pumunta sa \"Application\" Tab (Chrome, Edge, Brave atbp..) o \"Storage\" Tab (Firefox, Pale Moon atbp..)\n3. Pumunta sa \"Cookies\" na seksyon at pagkatapos sa \"https://accounts.spotify.com\" na subseksyon", + "step_3": "Hakbang 3", + "step_3_steps": "Kopyahin ang halaga ng \"sp_dc\" Cookie", + "success_emoji": "Tagumpay🥳", + "success_message": "Ngayon ay matagumpay kang Naka-log in gamit ang iyong Spotify account. Magaling, kaibigan!", + "step_4": "Hakbang 4", + "step_4_steps": "I-paste ang na-kopyang halaga ng \"sp_dc\"", + "something_went_wrong": "May nangyaring mali", + "piped_instance": "Instance ng Piped Server", + "piped_description": "Ang instance ng Piped server na gagamitin para sa pagtutugma ng track", + "piped_warning": "Maaaring hindi gumagana nang mabuti ang ilan sa mga ito. Kaya gamitin sa sarili mong peligro", + "invidious_instance": "Instance ng Invidious Server", + "invidious_description": "Ang instance ng Invidious server na gagamitin para sa pagtutugma ng track", + "invidious_warning": "Maaaring hindi gumagana nang mabuti ang ilan sa mga ito. Kaya gamitin sa sarili mong peligro", + "generate": "Gumawa", + "track_exists": "Ang Track na {track} ay umiiral na", + "replace_downloaded_tracks": "Palitan ang lahat ng na-download na mga track", + "skip_download_tracks": "Laktawan ang pag-download ng lahat ng na-download na mga track", + "do_you_want_to_replace": "Gusto mo bang palitan ang umiiral na track??", + "replace": "Palitan", + "skip": "Laktawan", + "select_up_to_count_type": "Pumili ng hanggang {count} {type}", + "select_genres": "Pumili ng mga Genre", + "add_genres": "Magdagdag ng mga Genre", + "country": "Bansa", + "number_of_tracks_generate": "Bilang ng mga track na gagawin", + "not_acoustic": "Acoustic-ness", + "dance_ability": "Kakayahang Sayawin", + "energy": "Enerhiya", + "not_instrumental": "Instrumental-ness", + "liveness": "Liveness", + "loudness": "Lakas", + "talkative": "Pagsasalita", + "valence": "Valence", + "popularity": "Popularidad", + "key": "Key", + "duration": "Tagal (s)", + "tempo": "Tempo (BPM)", + "mode": "Mode", + "time_signature": "Time Signature", + "short": "Maikli", + "medium": "Katamtaman", + "long": "Mahaba", + "min": "Min", + "max": "Max", + "target": "Target", + "moderate": "Katamtaman", + "deselect_all": "Alisin ang Pagkakapili sa Lahat", + "select_all": "Piliin Lahat", + "are_you_sure": "Sigurado ka ba?", + "generating_playlist": "Gumagawa ng iyong custom na playlist...", + "selected_count_tracks": "Napili ang {count} na mga track", + "download_warning": "Kung nag-download ka ng lahat ng Track sa maramihan, malinaw na nagpa-pirate ka ng Musika at nagsasanhi ng pinsala sa creative society ng Musika. Sana ay alam mo ito. Palaging, subukang igalang at suportahan ang masipag na paggawa ng Artist", + "download_ip_ban_warning": "Sa nga pala, ang iyong IP ay maaaring ma-block sa YouTube dahil sa sobrang mga kahilingan sa pag-download kaysa sa karaniwan. Ang IP block ay nangangahulugang hindi mo magagamit ang YouTube (kahit na naka-log in ka) sa loob ng hindi bababa sa 2-3 buwan mula sa device na may IP na iyon. At hindi pinanghahawakan ng Spotube ang anumang responsibilidad kung mangyayari ito", + "by_clicking_accept_terms": "Sa pamamagitan ng pag-click sa 'tanggapin', sumasang-ayon ka sa mga sumusunod na tuntunin:", + "download_agreement_1": "Alam kong nagpa-pirate ako ng Musika. Masama ako", + "download_agreement_2": "Susuportahan ko ang Artist saan man ako maaari at ginagawa ko lang ito dahil wala akong pera para bumili ng kanilang sining", + "download_agreement_3": "Lubos kong nauunawaan na ang aking IP ay maaaring ma-block sa YouTube at hindi ko pinanghahawakan ang Spotube o ang kanyang mga may-ari/nag-ambag na responsable para sa anumang aksidente na sanhi ng aking kasalukuyang aksyon", + "decline": "Tanggihan", + "accept": "Tanggapin", + "details": "Mga Detalye", + "youtube": "YouTube", + "channel": "Channel", + "likes": "Mga Like", + "dislikes": "Mga Dislike", + "views": "Mga View", + "streamUrl": "Stream URL", + "stop": "Ihinto", + "sort_newest": "Ayusin ayon sa pinakabagong idinagdag", + "sort_oldest": "Ayusin ayon sa pinakalumang idinagdag", + "sleep_timer": "Sleep Timer", + "minutes": "{minutes} Minuto", + "hours": "{hours} Oras", + "hour": "{hours} Oras", + "custom_hours": "Custom na Oras", + "logs": "Mga Log", + "developers": "Mga Developer", + "not_logged_in": "Hindi ka naka-log in", + "search_mode": "Mode ng Paghahanap", + "audio_source": "Pinagmulan ng Audio", + "ok": "Ok", + "failed_to_encrypt": "Nabigong i-encrypt", + "encryption_failed_warning": "Gumagamit ng encryption ang Spotube para ligtas na i-store ang iyong data. Ngunit nabigo. Kaya babalik ito sa hindi secure na storage\nKung gumagamit ka ng linux, mangyaring tiyakin na mayroon kang anumang secret-service na naka-install (gnome-keyring, kde-wallet, KeePassXC atbp)", + "querying_info": "Kinukuha ang impormasyon...", + "piped_api_down": "Ang Piped API ay hindi gumagana", + "piped_down_error_instructions": "Ang instance ng Piped na {pipedInstance} ay kasalukuyang hindi gumagana\n\nMaaari mong baguhin ang instance o baguhin ang 'Uri ng API' sa opisyal na YouTube API\n\nSiguraduhing i-restart ang app pagkatapos ng pagbabago", + "you_are_offline": "Kasalukuyan kang offline", + "connection_restored": "Naibalik na ang iyong koneksyon sa internet", + "use_system_title_bar": "Gamitin ang title bar ng system", + "crunching_results": "Pinaproseso ang mga resulta...", + "search_to_get_results": "Maghanap para makakuha ng mga resulta", + "use_amoled_mode": "Matingkad na itim na madilim na tema", + "pitch_dark_theme": "AMOLED Mode", + "normalize_audio": "I-normalize ang audio", + "change_cover": "Baguhin ang cover", + "add_cover": "Magdagdag ng cover", + "restore_defaults": "Ibalik ang mga default", + "download_music_codec": "Codec para sa pag-download ng musika", + "streaming_music_codec": "Codec para sa pag-stream ng musika", + "login_with_lastfm": "Mag-login gamit ang Last.fm", + "connect": "Kumonekta", + "disconnect_lastfm": "Idiskonekta ang Last.fm", + "disconnect": "Idiskonekta", + "username": "Username", + "password": "Password", + "login": "Mag-login", + "login_with_your_lastfm": "Mag-login gamit ang iyong Last.fm account", + "scrobble_to_lastfm": "I-scrobble sa Last.fm", + "go_to_album": "Pumunta sa Album", + "discord_rich_presence": "Discord Rich Presence", + "browse_all": "I-browse Lahat", + "genres": "Mga Genre", + "explore_genres": "Tuklasin ang mga Genre", + "friends": "Mga Kaibigan", + "no_lyrics_available": "Paumanhin, hindi mahanap ang lyrics para sa track na ito", + "start_a_radio": "Magsimula ng Radio", + "how_to_start_radio": "Paano mo gustong simulan ang radio?", + "replace_queue_question": "Gusto mo bang palitan ang kasalukuyang pila o idagdag dito?", + "endless_playback": "Walang Hanggang Playback", + "delete_playlist": "Burahin ang Playlist", + "delete_playlist_confirmation": "Sigurado ka bang gusto mong burahin ang playlist na ito?", + "local_tracks": "Mga Lokal na Track", + "local_tab": "Lokal", + "song_link": "Link ng Kanta", + "skip_this_nonsense": "Laktawan ang kalokohan na ito", + "freedom_of_music": "\"Kalayaan ng Musika\"", + "freedom_of_music_palm": "\"Kalayaan ng Musika sa iyong palad\"", + "get_started": "Magsimula na tayo", + "youtube_source_description": "Inirerekomenda at pinakamahusay na gumagana.", + "piped_source_description": "Gusto ng kalayaan? Kapareho ng YouTube ngunit mas malaya.", + "jiosaavn_source_description": "Pinakamahusay para sa rehiyon ng South Asia.", + "invidious_source_description": "Katulad ng Piped ngunit may mas mataas na availability.", + "highest_quality": "Pinakamataas na Kalidad: {quality}", + "select_audio_source": "Pumili ng Pinagmulan ng Audio", + "endless_playback_description": "Awtomatikong magdagdag ng mga bagong kanta\nsa dulo ng pila", + "choose_your_region": "Piliin ang iyong rehiyon", + "choose_your_region_description": "Ito ay tutulong sa Spotube na ipakita sa iyo ang tamang content\npara sa iyong lokasyon.", + "choose_your_language": "Piliin ang iyong wika", + "help_project_grow": "Tulungan ang proyektong ito na lumago", + "help_project_grow_description": "Ang Spotube ay isang open-source na proyekto. Maaari mong tulungan ang proyektong ito na lumago sa pamamagitan ng pag-contribute sa proyekto, pag-ulat ng mga bug, o pagmungkahi ng mga bagong feature.", + "contribute_on_github": "Mag-contribute sa GitHub", + "donate_on_open_collective": "Mag-donate sa Open Collective", + "browse_anonymously": "Mag-browse nang Anonymous", + "enable_connect": "I-enable ang Connect", + "enable_connect_description": "Kontrolin ang Spotube mula sa ibang mga device", + "devices": "Mga Device", + "select": "Pumili", + "connect_client_alert": "Ikaw ay kontrolado ng {client}", + "this_device": "Ang Device na ito", + "remote": "Remote", + "stats": "Mga Stat", + "and_n_more": "at {count} pa", + "recently_played": "Kamakailan Lang na Ni-play", + "browse_more": "Mag-browse pa", + "no_title": "Walang Pamagat", + "not_playing": "Hindi tumutugtog", + "epic_failure": "Epic na pagkabigo!", + "added_num_tracks_to_queue": "Nagdagdag ng {tracks_length} na mga track sa pila", + "spotube_has_an_update": "Ang Spotube ay may update", + "download_now": "I-download Ngayon", + "nightly_version": "Ang Spotube Nightly {nightlyBuildNum} ay inilabas na", + "release_version": "Ang Spotube v{version} ay inilabas na", + "read_the_latest": "Basahin ang pinakabagong ", + "release_notes": "release notes", + "pick_color_scheme": "Pumili ng color scheme", + "save": "I-save", + "choose_the_device": "Piliin ang device:", + "multiple_device_connected": "Mayroong maraming device na nakakonekta.\nPiliin ang device kung saan mo gustong maganap ang aksyon na ito", + "nothing_found": "Walang nahanap", + "the_box_is_empty": "Ang kahon ay walang laman", + "top_artists": "Nangungunang mga Artista", + "top_albums": "Nangungunang mga Album", + "this_week": "Ngayong linggo", + "this_month": "Ngayong buwan", + "last_6_months": "Nakaraang 6 na buwan", + "this_year": "Ngayong taon", + "last_2_years": "Nakaraang 2 taon", + "all_time": "Lahat ng panahon", + "powered_by_provider": "Pinapagana ng {providerName}", + "email": "Email", + "profile_followers": "Mga Tagasunod", + "birthday": "Kaarawan", + "subscription": "Subscription", + "not_born": "Hindi pa ipinanganak", + "hacker": "Hacker", + "profile": "Profile", + "no_name": "Walang Pangalan", + "edit": "I-edit", + "user_profile": "Profile ng User", + "count_plays": "{count} na mga play", + "streaming_fees_hypothetical": "Mga bayarin sa streaming (hypothetical)", + "minutes_listened": "Mga minutong pinapakinggan", + "streamed_songs": "Mga na-stream na kanta", + "count_streams": "{count} na mga stream", + "owned_by_you": "Pag-aari mo", + "copied_share_url_to_clipboard": "Na-kopya ang {shareUrl} sa clipboard", + "spotify_hypothetical_calculation": "*Ito ay kinalkula batay sa bawat stream\nna bayad ng Spotify na $0.003 hanggang $0.005. Ito ay isang hypothetical\nna pagkalkula para bigyan ang user ng ideya kung magkano\nang kanilang ibabayad sa mga artista kung sila ay nakikinig\nng kanilang kanta sa Spotify.", + "count_minutes": "{minutes} minuto", + "summary_minutes": "minuto", + "summary_listened_to_music": "Nakinig sa musika", + "summary_songs": "mga kanta", + "summary_streamed_overall": "Na-stream sa kabuuan", + "summary_owed_to_artists": "Utang sa mga artista\nngayong buwan", + "summary_artists": "artista", + "summary_music_reached_you": "Umabot sa iyo ang musika", + "summary_full_albums": "buong album", + "summary_got_your_love": "Nakuha ang iyong pagmamahal", + "summary_playlists": "mga playlist", + "summary_were_on_repeat": "Pinu-playlst muli", + "total_money": "Kabuuang {money}", + "webview_not_found": "Hindi nahanap ang Webview", + "webview_not_found_description": "Walang webview runtime na naka-install sa iyong device.\nKung naka-install ito, siguraduhing nasa Environment PATH\n\nPagkatapos mag-install, i-restart ang app", + "unsupported_platform": "Hindi suportadong platform", + "cache_music": "I-cache ang musika", + "open": "Buksan", + "cache_folder": "Folder ng cache", + "export": "I-export", + "clear_cache": "Burahin ang cache", + "clear_cache_confirmation": "Gusto mo bang burahin ang cache?", + "export_cache_files": "I-export ang mga Naka-cache na File", + "found_n_files": "Nahanap ang {count} na mga file", + "export_cache_confirmation": "Gusto mo bang i-export ang mga file na ito sa", + "exported_n_out_of_m_files": "Na-export ang {filesExported} mula sa {files} na mga file", + "undo": "I-undo", + "download_all": "I-download lahat", + "add_all_to_playlist": "Idagdag lahat sa playlist", + "add_all_to_queue": "Idagdag lahat sa pila", + "play_all_next": "I-play lahat susunod", + "pause": "Pause", + "view_all": "Tingnan lahat", + "no_tracks_added_yet": "Mukhang wala ka pang idinaragdag na mga track", + "no_tracks": "Mukhang walang mga track dito", + "no_tracks_listened_yet": "Mukhang wala ka pang pinakikinggan", + "not_following_artists": "Hindi ka sumusunod sa anumang mga artista", + "no_favorite_albums_yet": "Mukhang wala ka pang idinagdag na anumang mga album sa iyong mga paborito", + "no_logs_found": "Walang nahanap na mga log", + "youtube_engine": "YouTube Engine", + "youtube_engine_not_installed_title": "Hindi naka-install ang {engine}", + "youtube_engine_not_installed_message": "Hindi naka-install ang {engine} sa iyong sistema.", + "youtube_engine_set_path": "Siguraduhing available ito sa PATH variable o\ni-set ang absolute path sa {engine} executable sa ibaba", + "youtube_engine_unix_issue_message": "Sa macOS/Linux/unix tulad ng OS, ang pag-set ng path sa .zshrc/.bashrc/.bash_profile atbp. ay hindi gagana.\nKailangan mong i-set ang path sa configuration file ng shell", + "download": "I-download", + "file_not_found": "Hindi nahanap ang file", + "custom": "Custom", + "add_custom_url": "Magdagdag ng custom URL" } \ No newline at end of file diff --git a/lib/l10n/app_tr.arb b/lib/l10n/app_tr.arb index 1e659cc5..64455558 100644 --- a/lib/l10n/app_tr.arb +++ b/lib/l10n/app_tr.arb @@ -91,7 +91,7 @@ "mini_player": "Mini oynatıcı", "slide_to_seek": "İleri veya geri arama yapmak için kaydırın", "shuffle_playlist": "Oynatma listesini karıştır", - "unshuffle_playlist": "Oynatma listesinin karışıklığını kaldır", + "not_shuffle_playlist": "Oynatma listesinin karışıklığını kaldır", "previous_track": "Önceki parça", "next_track": "Sonraki parça", "pause_playback": "Oynatmayı duraklat", @@ -176,7 +176,7 @@ "first_go_to": "İlk olarak şuraya gidin:", "login_if_not_logged_in": "ve oturum açmadıysanız Oturum açın/Kaydolun", "step_2": "2. Adım", - "step_2_steps": "1. Oturum açtıktan sonra, tarayıcı geliştirme araçlarını açmak için F12'ye veya fareye sağ tıklayın > İncele'ye basın.\n2. Daha sonra \"Uygulama\" sekmesine (Chrome, Edge, Brave vb..) veya \"Depolama\" sekmesine (Firefox, Palemoon vb..) gidin\n3. \"Çerezler\" bölümüne, ardından \"https://accounts.spotify.com\" alt bölümüne gidin", + "step_2_steps": "1. Oturum açtıktan sonra, tarayıcı geliştirme araçlarını açmak için F12'ye veya fareye sağ tıklayın > İncele'ye basın.\n2. Daha sonra \"Uygulama\" sekmesine (Chrome, Edge, Brave vb..) veya \"Depolama\" sekmesine (Firefox, Pale Moon vb..) gidin\n3. \"Çerezler\" bölümüne, ardından \"https://accounts.spotify.com\" alt bölümüne gidin", "step_3": "3. Adım", "step_3_steps": "\"sp_dc\" Çerezinin değerini kopyalayın", "success_emoji": "Başarılı🥳", @@ -199,13 +199,13 @@ "add_genres": "Tür ekle", "country": "Ülke", "number_of_tracks_generate": "Oluşturulacak parça sayısı", - "acousticness": "Akustiklik", - "danceability": "Dans Edilebilirlik", + "not_acoustic": "Akustiklik", + "dance_ability": "Dans Edilebilirlik", "energy": "Enerji", - "instrumentalness": "Araçsallık", + "not_instrumental": "Araçsallık", "liveness": "Canlılık", "loudness": "Ses yüksekliği", - "speechiness": "Konuşkanlık", + "talkative": "Konuşkanlık", "valence": "Değerlik", "popularity": "Popülerlik", "key": "Anahtar", @@ -244,7 +244,7 @@ "sort_newest": "En yeni eklenene göre sırala.", "sort_oldest": "En eski eklenene göre sırala", "sleep_timer": "Uyku Zamanlayıcısı", - "mins": "{minutes} Dakika", + "minutes": "{minutes} Dakika", "hours": "{hours} Saatler", "hour": "{hours} Saat", "custom_hours": "Özel Saatler", @@ -255,7 +255,7 @@ "audio_source": "Ses kaynağı", "ok": "Tamam", "failed_to_encrypt": "Şifreleme başarısız oldu", - "encryption_failed_warning": "Spotube, verilerinizi güvenli bir şekilde depolamak için şifreleme kullanır. Ancak bunu başaramadı. Bu nedenle, güvensiz depolamaya geri dönecektir\nLinux kullanıyorsanız, lütfen gnome-keyring, kde-wallet, keepassxc vb. herhangi bir gizli servisin yüklü olduğundan emin olun.", + "encryption_failed_warning": "Spotube, verilerinizi güvenli bir şekilde depolamak için şifreleme kullanır. Ancak bunu başaramadı. Bu nedenle, güvensiz depolamaya geri dönecektir\nLinux kullanıyorsanız, lütfen gnome-keyring, kde-wallet, KeePassXC vb. herhangi bir gizli servisin yüklü olduğundan emin olun.", "querying_info": "Bilgi sorgulanıyor...", "piped_api_down": "Piped API kapalı", "piped_down_error_instructions": "Piped örneği {pipedInstance} şu anda kapalı\n\nÖrneği değiştirin veya 'API türünü' resmi YouTube API'si olarak değiştirin\n\nDeğişiklikten sonra uygulamayı yeniden başlattığınızdan emin olun", @@ -366,7 +366,7 @@ "user_profile": "Kullanıcı Profili", "count_plays": "{count} çalma", "streaming_fees_hypothetical": "*Spotify'ın akış başına ödeme miktarına\n$0.003 ile $0.005 arasında hesaplanmıştır. Bu, kullanıcıya\nSpotify'da şarkılarını dinlerse sanatçılara ne kadar ödeme\nyapmış olabileceğini göstermek için hipotetik bir hesaplamadır.", - "count_mins": "{minutes} dk", + "count_minutes": "{minutes} dk", "summary_minutes": "dakika", "summary_listened_to_music": "Dinlenen müzik", "summary_songs": "şarkılar", @@ -383,8 +383,8 @@ "streamed_songs": "Yayınlanan Şarkılar", "count_streams": "{count} yayın", "owned_by_you": "Sahip olduğunuz", - "copied_shareurl_to_clipboard": "{shareUrl} panoya kopyalandı", - "spotify_hipotetical_calculation": "*Bu, Spotify'ın her yayın başına ödemenin\n$0.003 ile $0.005 arasında olduğu varsayımıyla hesaplanmıştır. Bu\nhipotetik bir hesaplamadır, kullanıcıya şarkılarını Spotify'da dinlediklerinde\nsanatçılara ne kadar ödeme yapacaklarını gösterir.", + "copied_share_url_to_clipboard": "{shareUrl} panoya kopyalandı", + "spotify_hypothetical_calculation": "*Bu, Spotify'ın her yayın başına ödemenin\n$0.003 ile $0.005 arasında olduğu varsayımıyla hesaplanmıştır. Bu\nhipotetik bir hesaplamadır, kullanıcıya şarkılarını Spotify'da dinlediklerinde\nsanatçılara ne kadar ödeme yapacaklarını gösterir.", "webview_not_found": "Webview bulunamadı", "webview_not_found_description": "Cihazınızda herhangi bir Webview çalışma zamanı yüklü değil.\nEğer kuruluysa, ortam YOLUNDA olduğundan emin olun\n\nKurulumdan sonra uygulamayı yeniden başlatın", "unsupported_platform": "Desteklenmeyen platform", diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index bc731240..a1af16b1 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -90,7 +90,7 @@ "mini_player": "Міні-плеєр", "slide_to_seek": "Проведіть пальцем, щоб перемотати вперед або назад", "shuffle_playlist": "Випадковий порядок відтворення плейлиста", - "unshuffle_playlist": "Відключити випадковий порядок відтворення плейлиста", + "not_shuffle_playlist": "Відключити випадковий порядок відтворення плейлиста", "previous_track": "Попередній трек", "next_track": "Наступний трек", "pause_playback": "Призупинити відтворення", @@ -175,7 +175,7 @@ "first_go_to": "Спочатку перейдіть на", "login_if_not_logged_in": "та Увійдіть/Зареєструйтесь, якщо ви не ввійшли", "step_2": "Крок 2", - "step_2_steps": "1. Після входу натисніть F12 або клацніть правою кнопкою миші > Інспектувати, щоб відкрити інструменти розробки браузера.\n2. Потім перейдіть на вкладку 'Програма' (Chrome, Edge, Brave тощо) або вкладку 'Сховище' (Firefox, Palemoon тощо).\n3. Перейдіть до розділу 'Кукі-файли', а потім до підрозділу 'https://accounts.spotify.com'", + "step_2_steps": "1. Після входу натисніть F12 або клацніть правою кнопкою миші > Інспектувати, щоб відкрити інструменти розробки браузера.\n2. Потім перейдіть на вкладку 'Програма' (Chrome, Edge, Brave тощо) або вкладку 'Сховище' (Firefox, Pale Moon тощо).\n3. Перейдіть до розділу 'Кукі-файли', а потім до підрозділу 'https://accounts.spotify.com'", "step_3": "Крок 3", "success_emoji": "Успіх🥳", "success_message": "Тепер ви успішно ввійшли у свій обліковий запис Spotify. Гарна робота, друже!", @@ -196,13 +196,13 @@ "add_genres": "Додати жанри", "country": "Країна", "number_of_tracks_generate": "Кількість треків для створення", - "acousticness": "Акустичність", - "danceability": "Танцювальність", + "not_acoustic": "Акустичність", + "dance_ability": "Танцювальність", "energy": "Енергія", - "instrumentalness": "Інструментальність", + "not_instrumental": "Інструментальність", "liveness": "Живість", "loudness": "Гучність", - "speechiness": "Розмовність", + "talkative": "Розмовність", "valence": "Валентність", "popularity": "Популярність", "key": "Тональність", @@ -241,7 +241,7 @@ "sort_newest": "Сортувати за датою додавання (новіші першими)", "sort_oldest": "Сортувати за датою додавання (старіші першими)", "sleep_timer": "Таймер сну", - "mins": "{minutes} хвилин", + "minutes": "{minutes} хвилин", "hours": "{hours} годин", "hour": "{hours} година", "custom_hours": "Кількість годин на замовлення", @@ -252,7 +252,7 @@ "audio_source": "Джерело аудіо", "ok": "Гаразд", "failed_to_encrypt": "Не вдалося зашифрувати", - "encryption_failed_warning": "Spotube використовує шифрування для безпечного зберігання ваших даних. Але не вдалося цього зробити. Тому він перейде до небезпечного зберігання\nЯкщо ви використовуєте Linux, переконайтеся, що у вас встановлено будь-який секретний сервіс (gnome-keyring, kde-wallet, keepassxc тощо)", + "encryption_failed_warning": "Spotube використовує шифрування для безпечного зберігання ваших даних. Але не вдалося цього зробити. Тому він перейде до небезпечного зберігання\nЯкщо ви використовуєте Linux, переконайтеся, що у вас встановлено будь-який секретний сервіс (gnome-keyring, kde-wallet, KeePassXC тощо)", "querying_info": "Запит інформації...", "piped_api_down": "API Piped не працює", "piped_down_error_instructions": "Поточний екземпляр Piped {pipedInstance} не працює\n\nЗмініть екземпляр або змініть 'Тип API' на офіційний YouTube API\n\nОбов'язково перезапустіть програму після зміни", @@ -366,7 +366,7 @@ "user_profile": "Профіль користувача", "count_plays": "{count} відтворень", "streaming_fees_hypothetical": "*Розраховано на основі виплат Spotify за стримінг\nвід $0.003 до $0.005. Це гіпотетичний\nрозрахунок, щоб дати уявлення користувачу про те, скільки б він\nзаплатив артистам, якби слухав їхні пісні на Spotify.", - "count_mins": "{minutes} хв", + "count_minutes": "{minutes} хв", "summary_minutes": "хвилини", "summary_listened_to_music": "Прослухана музика", "summary_songs": "пісні", @@ -383,8 +383,8 @@ "streamed_songs": "Стримлені пісні", "count_streams": "{count} стримів", "owned_by_you": "Ваша власність", - "copied_shareurl_to_clipboard": "{shareUrl} скопійовано в буфер обміну", - "spotify_hipotetical_calculation": "*Це розраховано на основі виплат Spotify за стрім\nвід $0.003 до $0.005. Це гіпотетичний розрахунок,\nщоб дати користувачеві уявлення про те, скільки б він заплатив\nартистам, якби слухав їхні пісні на Spotify.", + "copied_share_url_to_clipboard": "{shareUrl} скопійовано в буфер обміну", + "spotify_hypothetical_calculation": "*Це розраховано на основі виплат Spotify за стрім\nвід $0.003 до $0.005. Це гіпотетичний розрахунок,\nщоб дати користувачеві уявлення про те, скільки б він заплатив\nартистам, якби слухав їхні пісні на Spotify.", "webview_not_found": "Webview не знайдено", "webview_not_found_description": "На вашому пристрої не встановлено виконуване середовище Webview.\nЯкщо воно встановлено, переконайтеся, що воно знаходиться в environment PATH\n\nПісля встановлення перезапустіть програму", "unsupported_platform": "Непідтримувана платформа", diff --git a/lib/l10n/app_vi.arb b/lib/l10n/app_vi.arb index 75f8e3f7..bd008b62 100644 --- a/lib/l10n/app_vi.arb +++ b/lib/l10n/app_vi.arb @@ -90,7 +90,7 @@ "mini_player": "Trình phát thu nhỏ", "slide_to_seek": "Trượt để tìm kiếm tiến hoặc lùi", "shuffle_playlist": "Xáo trộn bài hát", - "unshuffle_playlist": "Hủy xáo trộn bài hát", + "not_shuffle_playlist": "Hủy xáo trộn bài hát", "previous_track": "Bài hát trước", "next_track": "Bài hát tiếp theo", "pause_playback": "Tạm dừng phát", @@ -175,7 +175,7 @@ "first_go_to": "Đầu tiên, truy cập", "login_if_not_logged_in": "và Đăng nhập/Đăng ký nếu chưa có tài khoản", "step_2": "Bước 2", - "step_2_steps": "1. Sau khi đăng nhập, nhấn F12 hoặc Chuột phải > Mở devtools của trình duyệt.\n2. Sau đó, chuyển đến Tab \"Ứng dụng/Application\" (Chrome, Edge, Brave, v.v.) hoặc Tab \"Lưu trữ/Storage\" (Firefox, Palemoon, v.v.)\n3. Chuyển đến phần \"Cookie\" sau đó phần con \"https://accounts.spotify.com\"", + "step_2_steps": "1. Sau khi đăng nhập, nhấn F12 hoặc Chuột phải > Mở devtools của trình duyệt.\n2. Sau đó, chuyển đến Tab \"Ứng dụng/Application\" (Chrome, Edge, Brave, v.v.) hoặc Tab \"Lưu trữ/Storage\" (Firefox, Pale Moon, v.v.)\n3. Chuyển đến phần \"Cookie\" sau đó phần con \"https://accounts.spotify.com\"", "step_3": "Bước 3", "step_3_steps": "Sao chép giá trị của Cookie \"sp_dc\" và \"sp_key\" (hoặc sp_gaid)", "success_emoji": "Thành công🥳", @@ -198,13 +198,13 @@ "add_genres": "Thêm Thể loại", "country": "Quốc gia", "number_of_tracks_generate": "Số lượng bài hát để tạo", - "acousticness": "Độ âm thanh", - "danceability": "Khả năng nhảy", + "not_acoustic": "Độ âm thanh", + "dance_ability": "Khả năng nhảy", "energy": "Năng lượng", - "instrumentalness": "Độ nhạc cụ", + "not_instrumental": "Độ nhạc cụ", "liveness": "Sống động", "loudness": "Độ ồn", - "speechiness": "Độ nói", + "talkative": "Độ nói", "valence": "Tính tích cực", "popularity": "Độ phổ biến", "key": "Tông", @@ -243,7 +243,7 @@ "sort_newest": "Sắp xếp theo mới nhất", "sort_oldest": "Sắp xếp theo cũ nhất", "sleep_timer": "Hẹn giờ tắt", - "mins": "{minutes} Phút", + "minutes": "{minutes} Phút", "hours": "{hours} Giờ", "hour": "{hours} Giờ", "custom_hours": "Giờ Tùy chỉnh", @@ -254,7 +254,7 @@ "audio_source": "Nguồn âm thanh", "ok": "Ok", "failed_to_encrypt": "Mã hóa không thành công", - "encryption_failed_warning": "Spotube không thành công trong việc mã hóa nhằm lưu trữ dữ liêu an toàn. vậy nên sẽ chuyển về lưu trữ không an toàn\nNếu bạn đang sử dụng Linux, đảm bảo rằng bạn có sử dụng dịch vụ bảo mật (gnome-keyring, kde-wallet, keepassxc, v.v.)", + "encryption_failed_warning": "Spotube không thành công trong việc mã hóa nhằm lưu trữ dữ liêu an toàn. vậy nên sẽ chuyển về lưu trữ không an toàn\nNếu bạn đang sử dụng Linux, đảm bảo rằng bạn có sử dụng dịch vụ bảo mật (gnome-keyring, kde-wallet, KeePassXC, v.v.)", "querying_info": "Đang truy vấn thông tin...", "piped_api_down": "API Piped đang gặp sự cố", "piped_down_error_instructions": "Phiên bản Piped {pipedInstance} hiện đang gặp sự cố\n\nThay đổi phiên bản hoặc thay đổi 'Loại API' thành API YouTube official\n\nKhởi động lai ứng dụng sau khi thay đổi.", @@ -366,7 +366,7 @@ "user_profile": "Hồ sơ người dùng", "count_plays": "{count} lần phát", "streaming_fees_hypothetical": "*Tính toán dựa trên thanh toán của Spotify cho mỗi lần phát\ntừ $0.003 đến $0.005. Đây là một tính toán giả định để\ngive người dùng cái nhìn về số tiền họ sẽ chi trả cho các nghệ sĩ nếu họ nghe\nbài hát của họ trên Spotify.", - "count_mins": "{minutes} phút", + "count_minutes": "{minutes} phút", "summary_minutes": "phút", "summary_listened_to_music": "Đã nghe nhạc", "summary_songs": "bài hát", @@ -383,8 +383,8 @@ "streamed_songs": "Bài hát đã phát", "count_streams": "{count} lượt phát", "owned_by_you": "Thuộc sở hữu của bạn", - "copied_shareurl_to_clipboard": "{shareUrl} đã sao chép vào bảng tạm", - "spotify_hipotetical_calculation": "*Được tính toán dựa trên khoản thanh toán của Spotify cho mỗi lượt phát\ntừ $0.003 đến $0.005. Đây là một tính toán giả định để\ncung cấp cho người dùng cái nhìn về số tiền họ sẽ phải trả\ncho các nghệ sĩ nếu họ nghe bài hát của họ trên Spotify.", + "copied_share_url_to_clipboard": "{shareUrl} đã sao chép vào bảng tạm", + "spotify_hypothetical_calculation": "*Được tính toán dựa trên khoản thanh toán của Spotify cho mỗi lượt phát\ntừ $0.003 đến $0.005. Đây là một tính toán giả định để\ncung cấp cho người dùng cái nhìn về số tiền họ sẽ phải trả\ncho các nghệ sĩ nếu họ nghe bài hát của họ trên Spotify.", "webview_not_found": "Không tìm thấy Webview", "webview_not_found_description": "Không có runtime Webview nào được cài đặt trên thiết bị của bạn.\nNếu đã cài đặt, hãy đảm bảo rằng nó nằm trong environment PATH\n\nSau khi cài đặt, hãy khởi động lại ứng dụng", "unsupported_platform": "Nền tảng không được hỗ trợ", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 03ebae12..1b816db7 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -88,7 +88,7 @@ "mini_player": "小窗模式", "slide_to_seek": "滑动以前进或后退", "shuffle_playlist": "随机播放歌单", - "unshuffle_playlist": "取消随机播放歌单", + "not_shuffle_playlist": "取消随机播放歌单", "previous_track": "上一首歌曲", "next_track": "下一首歌曲", "pause_playback": "暂停播放", @@ -173,7 +173,7 @@ "first_go_to": "首先,前往", "login_if_not_logged_in": "如果尚未登录,请登录或者注册一个账户", "step_2": "步骤 2", - "step_2_steps": "1. 一旦你已经完成登录, 按 F12 键或者鼠标右击网页空白区域 > 选择“检查”以打开浏览器开发者工具(DevTools)\n2. 然后选择 \"应用(Application)\" 标签页(Chrome, Edge, Brave 等基于 Chromium 的浏览器) 或 \"存储(Storage)\" 标签页 (Firefox, Palemoon 等基于 Firefox 的浏览器))\n3. 选择 \"Cookies\" 栏目然后选择 \"https://accounts.spotify.com\" 子栏目", + "step_2_steps": "1. 一旦你已经完成登录, 按 F12 键或者鼠标右击网页空白区域 > 选择“检查”以打开浏览器开发者工具(DevTools)\n2. 然后选择 \"应用(Application)\" 标签页(Chrome, Edge, Brave 等基于 Chromium 的浏览器) 或 \"存储(Storage)\" 标签页 (Firefox, Pale Moon 等基于 Firefox 的浏览器))\n3. 选择 \"Cookies\" 栏目然后选择 \"https://accounts.spotify.com\" 子栏目", "step_3": "步骤 3", "success_emoji": "成功🥳", "success_message": "你已经成功使用 Spotify 登录。干得漂亮!", @@ -194,13 +194,13 @@ "add_genres": "添加曲风", "country": "国家和地区", "number_of_tracks_generate": "生成歌曲的数目", - "acousticness": "原声程度", - "danceability": "律动感", + "not_acoustic": "原声程度", + "dance_ability": "律动感", "energy": "冲击感", - "instrumentalness": "歌唱部分占比", + "not_instrumental": "歌唱部分占比", "liveness": "现场感", "loudness": "响度", - "speechiness": "朗诵比例", + "talkative": "朗诵比例", "valence": "心理感受", "popularity": "流行度", "key": "曲调", @@ -239,7 +239,7 @@ "sort_newest": "按添加日期正序", "sort_oldest": "按添加日期倒序", "sleep_timer": "睡眠定时器", - "mins": "{minutes} 分", + "minutes": "{minutes} 分", "hours": "{hours} 时", "hour": "{hours} 时", "custom_hours": "自定义时间", @@ -250,7 +250,7 @@ "audio_source": "音频源", "ok": "确定", "failed_to_encrypt": "加密失败", - "encryption_failed_warning": "Spotube使用加密来安全地存储您的数据。但是失败了。因此,它将回退到不安全的存储\n如果您使用Linux,请确保已安装gnome-keyring、kde-wallet和keepassxc等秘密服务", + "encryption_failed_warning": "Spotube使用加密来安全地存储您的数据。但是失败了。因此,它将回退到不安全的存储\n如果您使用Linux,请确保已安装gnome-keyring、kde-wallet和KeePassXC等秘密服务", "querying_info": "正在查询信息...", "piped_api_down": "Piped API不可用", "piped_down_error_instructions": "当前Piped实例{pipedInstance}不可用\n\n请更改实例或将'API类型'更改为官方YouTube API\n\n更改后请确保重新启动应用程序", @@ -366,7 +366,7 @@ "user_profile": "用户资料", "count_plays": "{count} 次播放", "streaming_fees_hypothetical": "*基于 Spotify 每次播放的支付金额\n从 $0.003 到 $0.005 计算。这是一个假设性的\n计算,旨在让用户了解如果他们在 Spotify 上收听\n这些歌曲,可能会付给艺术家的金额。", - "count_mins": "{minutes} 分钟", + "count_minutes": "{minutes} 分钟", "summary_minutes": "分钟", "summary_listened_to_music": "听音乐", "summary_songs": "歌曲", @@ -383,8 +383,8 @@ "streamed_songs": "已流媒体歌曲", "count_streams": "{count} 次流媒体", "owned_by_you": "由您拥有", - "copied_shareurl_to_clipboard": "{shareUrl} 已复制到剪贴板", - "spotify_hipotetical_calculation": "*根据 Spotify 每次流媒体的支付金额\n$0.003 到 $0.005 进行计算。这是一个假设性的\n计算,用于给用户了解他们如果在 Spotify 上\n收听歌曲会支付给艺术家的金额。", + "copied_share_url_to_clipboard": "{shareUrl} 已复制到剪贴板", + "spotify_hypothetical_calculation": "*根据 Spotify 每次流媒体的支付金额\n$0.003 到 $0.005 进行计算。这是一个假设性的\n计算,用于给用户了解他们如果在 Spotify 上\n收听歌曲会支付给艺术家的金额。", "webview_not_found": "未找到 Webview", "webview_not_found_description": "您的设备中未安装 Webview 运行时。\n如果已安装,请确保它在 environment PATH 中\n\n安装后,重新启动应用程序", "unsupported_platform": "不支持的平台", diff --git a/lib/l10n/generated/app_localizations.dart b/lib/l10n/generated/app_localizations.dart index 457e29b6..c77ce6e7 100644 --- a/lib/l10n/generated/app_localizations.dart +++ b/lib/l10n/generated/app_localizations.dart @@ -701,11 +701,11 @@ abstract class AppLocalizations { /// **'Shuffle playlist'** String get shuffle_playlist; - /// No description provided for @unshuffle_playlist. + /// No description provided for @not_shuffle_playlist. /// /// In en, this message translates to: /// **'Unshuffle playlist'** - String get unshuffle_playlist; + String get not_shuffle_playlist; /// No description provided for @previous_track. /// @@ -1238,7 +1238,7 @@ abstract class AppLocalizations { /// No description provided for @step_2_steps. /// /// In en, this message translates to: - /// **'1. Once you\'re logged in, press F12 or Mouse Right Click > Inspect to Open the Browser devtools.\n2. Then go the \"Application\" Tab (Chrome, Edge, Brave etc..) or \"Storage\" Tab (Firefox, Palemoon etc..)\n3. Go to the \"Cookies\" section then the \"https://accounts.spotify.com\" subsection'** + /// **'1. Once you\'re logged in, press F12 or Mouse Right Click > Inspect to Open the Browser devtools.\n2. Then go the \"Application\" Tab (Chrome, Edge, Brave etc..) or \"Storage\" Tab (Firefox, Pale Moon etc..)\n3. Go to the \"Cookies\" section then the \"https://accounts.spotify.com\" subsection'** String get step_2_steps; /// No description provided for @step_3. @@ -1391,17 +1391,17 @@ abstract class AppLocalizations { /// **'Number of tracks to generate'** String get number_of_tracks_generate; - /// No description provided for @acousticness. + /// No description provided for @not_acoustic. /// /// In en, this message translates to: - /// **'Acousticness'** - String get acousticness; + /// **'not_acoustic'** + String get not_acoustic; - /// No description provided for @danceability. + /// No description provided for @dance_ability. /// /// In en, this message translates to: - /// **'Danceability'** - String get danceability; + /// **'dance_ability'** + String get dance_ability; /// No description provided for @energy. /// @@ -1409,11 +1409,11 @@ abstract class AppLocalizations { /// **'Energy'** String get energy; - /// No description provided for @instrumentalness. + /// No description provided for @not_instrumental. /// /// In en, this message translates to: - /// **'Instrumentalness'** - String get instrumentalness; + /// **'not_instrumental'** + String get not_instrumental; /// No description provided for @liveness. /// @@ -1427,11 +1427,11 @@ abstract class AppLocalizations { /// **'Loudness'** String get loudness; - /// No description provided for @speechiness. + /// No description provided for @talkative. /// /// In en, this message translates to: - /// **'Speechiness'** - String get speechiness; + /// **'talkative'** + String get talkative; /// No description provided for @valence. /// @@ -1661,11 +1661,11 @@ abstract class AppLocalizations { /// **'Sleep Timer'** String get sleep_timer; - /// No description provided for @mins. + /// No description provided for @minutes. /// /// In en, this message translates to: /// **'{minutes} Minutes'** - String mins(Object minutes); + String minutes(Object minutes); /// No description provided for @hours. /// @@ -1730,7 +1730,7 @@ abstract class AppLocalizations { /// No description provided for @encryption_failed_warning. /// /// In en, this message translates to: - /// **'Spotube uses encryption to securely store your data. But failed to do so. So it\'ll fallback to insecure storage\nIf you\'re using linux, please make sure you\'ve any secret-service (gnome-keyring, kde-wallet, keepassxc etc) installed'** + /// **'Spotube uses encryption to securely store your data. But failed to do so. So it\'ll fallback to insecure storage\nIf you\'re using linux, please make sure you\'ve any secret-service (gnome-keyring, kde-wallet, KeePassXC etc) installed'** String get encryption_failed_warning; /// No description provided for @querying_info. @@ -2405,23 +2405,23 @@ abstract class AppLocalizations { /// **'Owned by you'** String get owned_by_you; - /// No description provided for @copied_shareurl_to_clipboard. + /// No description provided for @copied_share_url_to_clipboard. /// /// In en, this message translates to: /// **'Copied {shareUrl} to clipboard'** - String copied_shareurl_to_clipboard(Object shareUrl); + String copied_share_url_to_clipboard(Object shareUrl); - /// No description provided for @spotify_hipotetical_calculation. + /// No description provided for @spotify_hypothetical_calculation. /// /// In en, this message translates to: /// **'*This is calculated based on Spotify\'s per stream\npayout of \$0.003 to \$0.005. This is a hypothetical\ncalculation to give user insight about how much they\nwould have paid to the artists if they were to listen\ntheir song in Spotify.'** - String get spotify_hipotetical_calculation; + String get spotify_hypothetical_calculation; - /// No description provided for @count_mins. + /// No description provided for @count_minutes. /// /// In en, this message translates to: - /// **'{minutes} mins'** - String count_mins(Object minutes); + /// **'{minutes} minutes'** + String count_minutes(Object minutes); /// No description provided for @summary_minutes. /// diff --git a/lib/l10n/generated/app_localizations_ar.dart b/lib/l10n/generated/app_localizations_ar.dart index 19f23d09..85763335 100644 --- a/lib/l10n/generated/app_localizations_ar.dart +++ b/lib/l10n/generated/app_localizations_ar.dart @@ -315,7 +315,7 @@ class AppLocalizationsAr extends AppLocalizations { String get shuffle_playlist => 'قائمة تشغيل عشوائية'; @override - String get unshuffle_playlist => 'إلغاء ترتيب قائمة التشغيل'; + String get not_shuffle_playlist => 'إلغاء ترتيب قائمة التشغيل'; @override String get previous_track => 'المقطوعة السابقة'; @@ -590,7 +590,7 @@ class AppLocalizationsAr extends AppLocalizations { String get step_2 => 'الخطوة 2'; @override - String get step_2_steps => '1. بمجرد تسجيل الدخول، اضغط على F12 أو انقر بزر الماوس الأيمن > فحص لفتح أدوات تطوير المتصفح.\n2. ثم انتقل إلى علامة التبويب \"التطبيقات\" (Chrome وEdge وBrave وما إلى ذلك.) أو علامة التبويب \"التخزين\" (Firefox وPalemoon وما إلى ذلك..)\n3. انتقل إلى قسم \"ملفات تعريف الارتباط\" ثم القسم الفرعي \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. بمجرد تسجيل الدخول، اضغط على F12 أو انقر بزر الماوس الأيمن > فحص لفتح أدوات تطوير المتصفح.\n2. ثم انتقل إلى علامة التبويب \"التطبيقات\" (Chrome وEdge وBrave وما إلى ذلك.) أو علامة التبويب \"التخزين\" (Firefox وPale Moon وما إلى ذلك..)\n3. انتقل إلى قسم \"ملفات تعريف الارتباط\" ثم القسم الفرعي \"https://accounts.spotify.com\"'; @override String get step_3 => 'الخطوة 3'; @@ -672,16 +672,16 @@ class AppLocalizationsAr extends AppLocalizations { String get number_of_tracks_generate => 'عدد المسارات المقطوعات المراد توليدها'; @override - String get acousticness => 'صوتية'; + String get not_acoustic => 'صوتية'; @override - String get danceability => 'قدرة على الرقص'; + String get dance_ability => 'قدرة على الرقص'; @override String get energy => 'طاقة'; @override - String get instrumentalness => 'نفعية'; + String get not_instrumental => 'نفعية'; @override String get liveness => 'حيوية'; @@ -690,7 +690,7 @@ class AppLocalizationsAr extends AppLocalizations { String get loudness => 'بريق'; @override - String get speechiness => 'كلام'; + String get talkative => 'كلام'; @override String get valence => 'تكافؤ'; @@ -809,7 +809,7 @@ class AppLocalizationsAr extends AppLocalizations { String get sleep_timer => 'مؤقت النوم'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes دقائق'; } @@ -848,7 +848,7 @@ class AppLocalizationsAr extends AppLocalizations { String get failed_to_encrypt => 'فشل في التشفير'; @override - String get encryption_failed_warning => 'يستخدم Spotube التشفير لتخزين بياناتك بشكل آمن. لكنها فشلت في القيام بذلك. لذلك سيعود الأمر إلى التخزين غير الآمن\nإذا كنت تستخدم Linux، فيرجى التأكد من تثبيت أي خدمة سرية (gnome-keyring، kde-wallet، keepassxc، إلخ)'; + String get encryption_failed_warning => 'يستخدم Spotube التشفير لتخزين بياناتك بشكل آمن. لكنها فشلت في القيام بذلك. لذلك سيعود الأمر إلى التخزين غير الآمن\nإذا كنت تستخدم Linux، فيرجى التأكد من تثبيت أي خدمة سرية (gnome-keyring، kde-wallet، KeePassXC، إلخ)'; @override String get querying_info => 'جارٍ الاستعلام عن معلومات...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsAr extends AppLocalizations { String get owned_by_you => 'مملوك لك'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return 'تم نسخ $shareUrl إلى الحافظة'; } @override - String get spotify_hipotetical_calculation => '*هذا محسوب بناءً على الدفع لكل بث من سبوتيفاي\nبقيمة 0.003 إلى 0.005 دولار. هذا حساب افتراضي\nلإعطاء المستخدم فكرة عن المبلغ الذي\nكان سيدفعه للفنانين إذا كانوا قد استمعوا\nإلى أغنيتهم على سبوتيفاي.'; + String get spotify_hypothetical_calculation => '*هذا محسوب بناءً على الدفع لكل بث من سبوتيفاي\nبقيمة 0.003 إلى 0.005 دولار. هذا حساب افتراضي\nلإعطاء المستخدم فكرة عن المبلغ الذي\nكان سيدفعه للفنانين إذا كانوا قد استمعوا\nإلى أغنيتهم على سبوتيفاي.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes دقيقة'; } diff --git a/lib/l10n/generated/app_localizations_bn.dart b/lib/l10n/generated/app_localizations_bn.dart index 4009f3dd..8faf199c 100644 --- a/lib/l10n/generated/app_localizations_bn.dart +++ b/lib/l10n/generated/app_localizations_bn.dart @@ -315,7 +315,7 @@ class AppLocalizationsBn extends AppLocalizations { String get shuffle_playlist => 'প্লেলিস্ট এলোমেলো করুন'; @override - String get unshuffle_playlist => 'প্লেলিস্ট আগের মতো করুন'; + String get not_shuffle_playlist => 'প্লেলিস্ট আগের মতো করুন'; @override String get previous_track => 'আগের গানের ট্র্যাক'; @@ -590,7 +590,7 @@ class AppLocalizationsBn extends AppLocalizations { String get step_2 => 'ধাপ 2'; @override - String get step_2_steps => '১. একবার আপনি লগ ইন করলে, ব্রাউজার ডেভটুল খুলতে F12 বা মাউসের রাইট ক্লিক > \"Inspect to open Browser DevTools\" টিপুন।\n২. তারপর \"Application\" ট্যাবে যান (Chrome, Edge, Brave etc..) অথবা \"Storage\" Tab (Firefox, Palemoon etc..)\n৩. \"Cookies \" বিভাগে যান তারপর \"https://accounts.spotify.com\" উপবিভাগে যান'; + String get step_2_steps => '১. একবার আপনি লগ ইন করলে, ব্রাউজার ডেভটুল খুলতে F12 বা মাউসের রাইট ক্লিক > \"Inspect to open Browser DevTools\" টিপুন।\n২. তারপর \"Application\" ট্যাবে যান (Chrome, Edge, Brave etc..) অথবা \"Storage\" Tab (Firefox, Pale Moon etc..)\n৩. \"Cookies \" বিভাগে যান তারপর \"https://accounts.spotify.com\" উপবিভাগে যান'; @override String get step_3 => 'ধাপ 3'; @@ -672,16 +672,16 @@ class AppLocalizationsBn extends AppLocalizations { String get number_of_tracks_generate => 'উত্পাদিত ট্র্যাকের সংখ্যা'; @override - String get acousticness => 'অধ্যাত্মিকতা'; + String get not_acoustic => 'অধ্যাত্মিকতা'; @override - String get danceability => 'নৃত্যমূলকতা'; + String get dance_ability => 'নৃত্যমূলকতা'; @override String get energy => 'শক্তি'; @override - String get instrumentalness => 'সাধারণতা'; + String get not_instrumental => 'সাধারণতা'; @override String get liveness => 'জীবনমুক্ততা'; @@ -690,7 +690,7 @@ class AppLocalizationsBn extends AppLocalizations { String get loudness => 'স্বরের উচ্চতা'; @override - String get speechiness => 'বক্তব্যমূলকতা'; + String get talkative => 'বক্তব্যমূলকতা'; @override String get valence => 'সন্তোষমূলকতা'; @@ -809,7 +809,7 @@ class AppLocalizationsBn extends AppLocalizations { String get sleep_timer => 'স্লীপ টাইমার'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes মিনিট'; } @@ -848,7 +848,7 @@ class AppLocalizationsBn extends AppLocalizations { String get failed_to_encrypt => 'এনক্রিপ্ট করা ব্যর্থ হয়েছে'; @override - String get encryption_failed_warning => 'Spotube আপনার তথ্যগুলি নিরাপদভাবে স্টোর করতে এনক্রিপশন ব্যবহার করে। কিন্তু এটি ব্যর্থ হয়েছে। তাই এটি অনিরাপদ স্টোরে ফলফল হবে\nযদি আপনি Linux ব্যবহার করেন, তবে দয়া করে নিশ্চিত হউন যে আপনার কোনও সিক্রেট-সার্ভিস gnome-keyring, kde-wallet, keepassxc ইত্যাদি ইনস্টল করা আছে'; + String get encryption_failed_warning => 'Spotube আপনার তথ্যগুলি নিরাপদভাবে স্টোর করতে এনক্রিপশন ব্যবহার করে। কিন্তু এটি ব্যর্থ হয়েছে। তাই এটি অনিরাপদ স্টোরে ফলফল হবে\nযদি আপনি Linux ব্যবহার করেন, তবে দয়া করে নিশ্চিত হউন যে আপনার কোনও সিক্রেট-সার্ভিস gnome-keyring, kde-wallet, KeePassXC ইত্যাদি ইনস্টল করা আছে'; @override String get querying_info => 'তথ্য অনুসন্ধান করা হচ্ছে'; @@ -1207,15 +1207,15 @@ class AppLocalizationsBn extends AppLocalizations { String get owned_by_you => 'আপনার মালিকানাধীন'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl ক্লিপবোর্ডে কপি করা হয়েছে'; } @override - String get spotify_hipotetical_calculation => '*এটি স্পোটিফাইয়ের প্রতি স্ট্রিম\n\$0.003 থেকে \$0.005 পেআউটের ভিত্তিতে গণনা করা হয়েছে। এটি একটি ধারণাগত\nগণনা ব্যবহারকারীদেরকে জানাতে দেয় যে কত টাকা\nতারা শিল্পীদের দিতো যদি তারা স্পোটিফাইতে\nতাদের গান শুনতেন।'; + String get spotify_hypothetical_calculation => '*এটি স্পোটিফাইয়ের প্রতি স্ট্রিম\n\$0.003 থেকে \$0.005 পেআউটের ভিত্তিতে গণনা করা হয়েছে। এটি একটি ধারণাগত\nগণনা ব্যবহারকারীদেরকে জানাতে দেয় যে কত টাকা\nতারা শিল্পীদের দিতো যদি তারা স্পোটিফাইতে\nতাদের গান শুনতেন।'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes মিনিট'; } diff --git a/lib/l10n/generated/app_localizations_ca.dart b/lib/l10n/generated/app_localizations_ca.dart index c9f80a5a..a1b3b1fb 100644 --- a/lib/l10n/generated/app_localizations_ca.dart +++ b/lib/l10n/generated/app_localizations_ca.dart @@ -315,7 +315,7 @@ class AppLocalizationsCa extends AppLocalizations { String get shuffle_playlist => 'Mesclar la llista de reproducció'; @override - String get unshuffle_playlist => 'No mesclar la llista de reproducció'; + String get not_shuffle_playlist => 'No mesclar la llista de reproducció'; @override String get previous_track => 'Cançó anterior'; @@ -590,7 +590,7 @@ class AppLocalizationsCa extends AppLocalizations { String get step_2 => 'Pas 2'; @override - String get step_2_steps => '1. Una vegada que hagi iniciat sessió, premi F12 o faci clic dret amb el ratolí > Inspeccionar per obrir les eines de desenvolulpador del navegador.\n2. Després vagi a la pestanya \"Application\" (Chrome, Edge, Brave, etc.) o \"Storage\" (Firefox, Palemoon, etc.)\n3. Vagi a la secció \"Cookies\" i després a la subsecció \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Una vegada que hagi iniciat sessió, premi F12 o faci clic dret amb el ratolí > Inspeccionar per obrir les eines de desenvolulpador del navegador.\n2. Després vagi a la pestanya \"Application\" (Chrome, Edge, Brave, etc.) o \"Storage\" (Firefox, Pale Moon, etc.)\n3. Vagi a la secció \"Cookies\" i després a la subsecció \"https://accounts.spotify.com\"'; @override String get step_3 => 'Pas 3'; @@ -672,16 +672,16 @@ class AppLocalizationsCa extends AppLocalizations { String get number_of_tracks_generate => 'Número de cançons a generar'; @override - String get acousticness => 'Acústica'; + String get not_acoustic => 'Acústica'; @override - String get danceability => 'Ballabilitat'; + String get dance_ability => 'Ballabilitat'; @override String get energy => 'Energia'; @override - String get instrumentalness => 'Instrumental'; + String get not_instrumental => 'Instrumental'; @override String get liveness => 'En viu'; @@ -690,7 +690,7 @@ class AppLocalizationsCa extends AppLocalizations { String get loudness => 'Sonoritat'; @override - String get speechiness => 'Parla'; + String get talkative => 'Parla'; @override String get valence => 'Valencia'; @@ -809,7 +809,7 @@ class AppLocalizationsCa extends AppLocalizations { String get sleep_timer => 'Temporitzador d\'apagat'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes minuts'; } @@ -848,7 +848,7 @@ class AppLocalizationsCa extends AppLocalizations { String get failed_to_encrypt => 'Error al xifrar'; @override - String get encryption_failed_warning => 'Spotube utilitza el xifrado per emmagatzemar les seves dades de forma segura. Però ha fallat. Per tant, tornarà a un emmagatzament no segur\nSi estè utilizant Linux, asseguri\'s de tenir instal·lats els serveis secrets com gnome-keyring, kde-wallet i keepassxc'; + String get encryption_failed_warning => 'Spotube utilitza el xifrado per emmagatzemar les seves dades de forma segura. Però ha fallat. Per tant, tornarà a un emmagatzament no segur\nSi estè utilizant Linux, asseguri\'s de tenir instal·lats els serveis secrets com gnome-keyring, kde-wallet i KeePassXC'; @override String get querying_info => 'Consultant informació...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsCa extends AppLocalizations { String get owned_by_you => 'De la teva propietat'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return 'S\'ha copiat $shareUrl al porta-retalls'; } @override - String get spotify_hipotetical_calculation => '*Això es calcula basant-se en els\npagaments per reproducció de Spotify de \$0.003 a \$0.005.\nAquest és un càlcul hipotètic per\ndonar als usuaris una idea de quant\nhaurien pagat als artistes si haguessin escoltat\nla seva cançó a Spotify.'; + String get spotify_hypothetical_calculation => '*Això es calcula basant-se en els\npagaments per reproducció de Spotify de \$0.003 a \$0.005.\nAquest és un càlcul hipotètic per\ndonar als usuaris una idea de quant\nhaurien pagat als artistes si haguessin escoltat\nla seva cançó a Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes minuts'; } diff --git a/lib/l10n/generated/app_localizations_cs.dart b/lib/l10n/generated/app_localizations_cs.dart index 4bacb229..b5415678 100644 --- a/lib/l10n/generated/app_localizations_cs.dart +++ b/lib/l10n/generated/app_localizations_cs.dart @@ -315,7 +315,7 @@ class AppLocalizationsCs extends AppLocalizations { String get shuffle_playlist => 'Zamíchat playlist'; @override - String get unshuffle_playlist => 'Zrušit zamíchání playlistu'; + String get not_shuffle_playlist => 'Zrušit zamíchání playlistu'; @override String get previous_track => 'Předchozí skladba'; @@ -590,7 +590,7 @@ class AppLocalizationsCs extends AppLocalizations { String get step_2 => 'Krok 2'; @override - String get step_2_steps => '1. Jakmile jste přihlášeni, stiskněte F12 nebo pravé tlačítko myši > Prozkoumat, abyste otevřeli nástroje pro vývojáře prohlížeče.\n2. Poté přejděte na kartu \"Aplikace\" (Chrome, Edge, Brave atd.) nebo kartu \"Úložiště\" (Firefox, Palemoon atd.)\n3. Přejděte do sekce \"Cookies\" a pak do podsekce \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Jakmile jste přihlášeni, stiskněte F12 nebo pravé tlačítko myši > Prozkoumat, abyste otevřeli nástroje pro vývojáře prohlížeče.\n2. Poté přejděte na kartu \"Aplikace\" (Chrome, Edge, Brave atd.) nebo kartu \"Úložiště\" (Firefox, Pale Moon atd.)\n3. Přejděte do sekce \"Cookies\" a pak do podsekce \"https://accounts.spotify.com\"'; @override String get step_3 => 'Krok 3'; @@ -672,16 +672,16 @@ class AppLocalizationsCs extends AppLocalizations { String get number_of_tracks_generate => 'Počet skladeb k vygenerování'; @override - String get acousticness => 'Akustičnost'; + String get not_acoustic => 'Akustičnost'; @override - String get danceability => 'Tanečnost'; + String get dance_ability => 'Tanečnost'; @override String get energy => 'Energie'; @override - String get instrumentalness => 'Instrumentálnost'; + String get not_instrumental => 'Instrumentálnost'; @override String get liveness => 'Živost'; @@ -690,7 +690,7 @@ class AppLocalizationsCs extends AppLocalizations { String get loudness => 'Hlasitost'; @override - String get speechiness => 'Mluvnost'; + String get talkative => 'Mluvnost'; @override String get valence => 'Valence'; @@ -809,7 +809,7 @@ class AppLocalizationsCs extends AppLocalizations { String get sleep_timer => 'Časovač spánku'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Minut'; } @@ -848,7 +848,7 @@ class AppLocalizationsCs extends AppLocalizations { String get failed_to_encrypt => 'Šifrování selhalo'; @override - String get encryption_failed_warning => 'Spotube používá šifrování k bezpečnému ukládání vašich dat. Ale selhalo. Takže se vrátí k nezabezpečenému úložišti\nPokud používáte linux, ujistěte se, že máte nainstalovanou jakoukoli službu k ukládání bezpečnostních pověření (gnome-keyring, kde-wallet, keepassxc atd.)'; + String get encryption_failed_warning => 'Spotube používá šifrování k bezpečnému ukládání vašich dat. Ale selhalo. Takže se vrátí k nezabezpečenému úložišti\nPokud používáte linux, ujistěte se, že máte nainstalovanou jakoukoli službu k ukládání bezpečnostních pověření (gnome-keyring, kde-wallet, KeePassXC atd.)'; @override String get querying_info => 'Získávání informací...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsCs extends AppLocalizations { String get owned_by_you => 'Vlastněno vámi'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return 'Zkopírováno $shareUrl do schránky'; } @override - String get spotify_hipotetical_calculation => '*Toto je vypočítáno na základě výplaty\nza stream Spotify od \$0.003 do \$0.005.\nToto je hypotetický výpočet,\nabyste měli představu o tom, kolik\nbyste zaplatili umělcům,\npokud byste poslouchali jejich píseň na Spotify.'; + String get spotify_hypothetical_calculation => '*Toto je vypočítáno na základě výplaty\nza stream Spotify od \$0.003 do \$0.005.\nToto je hypotetický výpočet,\nabyste měli představu o tom, kolik\nbyste zaplatili umělcům,\npokud byste poslouchali jejich píseň na Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes minut'; } diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index a3b51c8a..1a6980c9 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -315,7 +315,7 @@ class AppLocalizationsDe extends AppLocalizations { String get shuffle_playlist => 'Playlist mischen'; @override - String get unshuffle_playlist => 'Playlist nicht mehr mischen'; + String get not_shuffle_playlist => 'Playlist nicht mehr mischen'; @override String get previous_track => 'Vorheriger Track'; @@ -590,7 +590,7 @@ class AppLocalizationsDe extends AppLocalizations { String get step_2 => 'Schritt 2'; @override - String get step_2_steps => '1. Wenn du angemeldet bist, drücke F12 oder klicke mit der rechten Maustaste > Inspektion, um die Browser-Entwicklertools zu öffnen.\n2. Gehe dann zum \"Anwendungs\"-Tab (Chrome, Edge, Brave usw.) oder zum \"Storage\"-Tab (Firefox, Palemoon usw.)\n3. Gehe zum Abschnitt \"Cookies\" und dann zum Unterabschnitt \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Wenn du angemeldet bist, drücke F12 oder klicke mit der rechten Maustaste > Inspektion, um die Browser-Entwicklertools zu öffnen.\n2. Gehe dann zum \"Anwendungs\"-Tab (Chrome, Edge, Brave usw.) oder zum \"Storage\"-Tab (Firefox, Pale Moon usw.)\n3. Gehe zum Abschnitt \"Cookies\" und dann zum Unterabschnitt \"https://accounts.spotify.com\"'; @override String get step_3 => 'Schritt 3'; @@ -672,16 +672,16 @@ class AppLocalizationsDe extends AppLocalizations { String get number_of_tracks_generate => 'Anzahl der zu generierenden Titel'; @override - String get acousticness => 'Akustik'; + String get not_acoustic => 'Akustik'; @override - String get danceability => 'Tanzbarkeit'; + String get dance_ability => 'Tanzbarkeit'; @override String get energy => 'Energie'; @override - String get instrumentalness => 'Instrumentalität'; + String get not_instrumental => 'Instrumentalität'; @override String get liveness => 'Lebendigkeit'; @@ -690,7 +690,7 @@ class AppLocalizationsDe extends AppLocalizations { String get loudness => 'Lautstärke'; @override - String get speechiness => 'Sprechanteil'; + String get talkative => 'Sprechanteil'; @override String get valence => 'Stimmung'; @@ -809,7 +809,7 @@ class AppLocalizationsDe extends AppLocalizations { String get sleep_timer => 'Schlaftimer'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Minuten'; } @@ -848,7 +848,7 @@ class AppLocalizationsDe extends AppLocalizations { String get failed_to_encrypt => 'Verschlüsselung fehlgeschlagen'; @override - String get encryption_failed_warning => 'Spotube verwendet Verschlüsselung, um Ihre Daten sicher zu speichern. Dies ist jedoch fehlgeschlagen. Daher wird es auf unsichere Speicherung zurückgreifen\nWenn Sie Linux verwenden, stellen Sie bitte sicher, dass Sie Secret-Services wie gnome-keyring, kde-wallet und keepassxc installiert haben'; + String get encryption_failed_warning => 'Spotube verwendet Verschlüsselung, um Ihre Daten sicher zu speichern. Dies ist jedoch fehlgeschlagen. Daher wird es auf unsichere Speicherung zurückgreifen\nWenn Sie Linux verwenden, stellen Sie bitte sicher, dass Sie Secret-Services wie gnome-keyring, kde-wallet und KeePassXC installiert haben'; @override String get querying_info => 'Abfrageinformationen...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsDe extends AppLocalizations { String get owned_by_you => 'In Ihrem Besitz'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl in die Zwischenablage kopiert'; } @override - String get spotify_hipotetical_calculation => '*Dies ist basierend auf Spotifys\npro Stream Auszahlung von \$0,003 bis \$0,005\nberechnet. Dies ist eine hypothetische Berechnung,\num dem Benutzer Einblick zu geben,\nwieviel sie den Künstlern gezahlt hätten,\nwenn sie ihren Song auf Spotify gehört hätten.'; + String get spotify_hypothetical_calculation => '*Dies ist basierend auf Spotifys\npro Stream Auszahlung von \$0,003 bis \$0,005\nberechnet. Dies ist eine hypothetische Berechnung,\num dem Benutzer Einblick zu geben,\nwieviel sie den Künstlern gezahlt hätten,\nwenn sie ihren Song auf Spotify gehört hätten.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes Minuten'; } diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 8ad7ca57..b06fc558 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -315,7 +315,7 @@ class AppLocalizationsEn extends AppLocalizations { String get shuffle_playlist => 'Shuffle playlist'; @override - String get unshuffle_playlist => 'Unshuffle playlist'; + String get not_shuffle_playlist => 'Unshuffle playlist'; @override String get previous_track => 'Previous track'; @@ -590,7 +590,7 @@ class AppLocalizationsEn extends AppLocalizations { String get step_2 => 'Step 2'; @override - String get step_2_steps => '1. Once you\'re logged in, press F12 or Mouse Right Click > Inspect to Open the Browser devtools.\n2. Then go the \"Application\" Tab (Chrome, Edge, Brave etc..) or \"Storage\" Tab (Firefox, Palemoon etc..)\n3. Go to the \"Cookies\" section then the \"https://accounts.spotify.com\" subsection'; + String get step_2_steps => '1. Once you\'re logged in, press F12 or Mouse Right Click > Inspect to Open the Browser devtools.\n2. Then go the \"Application\" Tab (Chrome, Edge, Brave etc..) or \"Storage\" Tab (Firefox, Pale Moon etc..)\n3. Go to the \"Cookies\" section then the \"https://accounts.spotify.com\" subsection'; @override String get step_3 => 'Step 3'; @@ -672,16 +672,16 @@ class AppLocalizationsEn extends AppLocalizations { String get number_of_tracks_generate => 'Number of tracks to generate'; @override - String get acousticness => 'Acousticness'; + String get not_acoustic => 'not_acoustic'; @override - String get danceability => 'Danceability'; + String get dance_ability => 'dance_ability'; @override String get energy => 'Energy'; @override - String get instrumentalness => 'Instrumentalness'; + String get not_instrumental => 'not_instrumental'; @override String get liveness => 'Liveness'; @@ -690,7 +690,7 @@ class AppLocalizationsEn extends AppLocalizations { String get loudness => 'Loudness'; @override - String get speechiness => 'Speechiness'; + String get talkative => 'talkative'; @override String get valence => 'Valence'; @@ -809,7 +809,7 @@ class AppLocalizationsEn extends AppLocalizations { String get sleep_timer => 'Sleep Timer'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Minutes'; } @@ -848,7 +848,7 @@ class AppLocalizationsEn extends AppLocalizations { String get failed_to_encrypt => 'Failed to encrypt'; @override - String get encryption_failed_warning => 'Spotube uses encryption to securely store your data. But failed to do so. So it\'ll fallback to insecure storage\nIf you\'re using linux, please make sure you\'ve any secret-service (gnome-keyring, kde-wallet, keepassxc etc) installed'; + String get encryption_failed_warning => 'Spotube uses encryption to securely store your data. But failed to do so. So it\'ll fallback to insecure storage\nIf you\'re using linux, please make sure you\'ve any secret-service (gnome-keyring, kde-wallet, KeePassXC etc) installed'; @override String get querying_info => 'Querying info...'; @@ -1207,16 +1207,16 @@ class AppLocalizationsEn extends AppLocalizations { String get owned_by_you => 'Owned by you'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return 'Copied $shareUrl to clipboard'; } @override - String get spotify_hipotetical_calculation => '*This is calculated based on Spotify\'s per stream\npayout of \$0.003 to \$0.005. This is a hypothetical\ncalculation to give user insight about how much they\nwould have paid to the artists if they were to listen\ntheir song in Spotify.'; + String get spotify_hypothetical_calculation => '*This is calculated based on Spotify\'s per stream\npayout of \$0.003 to \$0.005. This is a hypothetical\ncalculation to give user insight about how much they\nwould have paid to the artists if they were to listen\ntheir song in Spotify.'; @override - String count_mins(Object minutes) { - return '$minutes mins'; + String count_minutes(Object minutes) { + return '$minutes minutes'; } @override diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index 7db6473a..3f1aaad1 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -315,7 +315,7 @@ class AppLocalizationsEs extends AppLocalizations { String get shuffle_playlist => 'Reproducir lista en orden aleatorio'; @override - String get unshuffle_playlist => 'Desactivar reproducción aleatoria'; + String get not_shuffle_playlist => 'Desactivar reproducción aleatoria'; @override String get previous_track => 'Pista anterior'; @@ -590,7 +590,7 @@ class AppLocalizationsEs extends AppLocalizations { String get step_2 => 'Paso 2'; @override - String get step_2_steps => '1. Una vez que hayas iniciado sesión, presiona F12 o haz clic derecho con el ratón > Inspeccionar para abrir las herramientas de desarrollo del navegador.\n2. Luego ve a la pestaña \"Application\" (Chrome, Edge, Brave, etc.) o \"Storage\" (Firefox, Palemoon, etc.)\n3. Ve a la sección \"Cookies\" y luego la subsección \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Una vez que hayas iniciado sesión, presiona F12 o haz clic derecho con el ratón > Inspeccionar para abrir las herramientas de desarrollo del navegador.\n2. Luego ve a la pestaña \"Application\" (Chrome, Edge, Brave, etc.) o \"Storage\" (Firefox, Pale Moon, etc.)\n3. Ve a la sección \"Cookies\" y luego la subsección \"https://accounts.spotify.com\"'; @override String get step_3 => 'Paso 3'; @@ -672,16 +672,16 @@ class AppLocalizationsEs extends AppLocalizations { String get number_of_tracks_generate => 'Número de canciones a generar'; @override - String get acousticness => 'Acousticness'; + String get not_acoustic => 'not_acoustic'; @override - String get danceability => 'Danceability'; + String get dance_ability => 'dance_ability'; @override String get energy => 'Energía'; @override - String get instrumentalness => 'Instrumentalidad'; + String get not_instrumental => 'Instrumentalidad'; @override String get liveness => 'En vivo'; @@ -690,7 +690,7 @@ class AppLocalizationsEs extends AppLocalizations { String get loudness => 'Volumen'; @override - String get speechiness => 'Habla'; + String get talkative => 'Habla'; @override String get valence => 'Valencia'; @@ -809,7 +809,7 @@ class AppLocalizationsEs extends AppLocalizations { String get sleep_timer => 'Temporizador de apagado'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes minutos'; } @@ -848,7 +848,7 @@ class AppLocalizationsEs extends AppLocalizations { String get failed_to_encrypt => 'Error al cifrar'; @override - String get encryption_failed_warning => 'Spotube utiliza el cifrado para almacenar sus datos de forma segura. Pero ha fallado. Por lo tanto, volverá a un almacenamiento no seguro\nSi está utilizando Linux, asegúrese de tener instalados servicios secretos como gnome-keyring, kde-wallet y keepassxc'; + String get encryption_failed_warning => 'Spotube utiliza el cifrado para almacenar sus datos de forma segura. Pero ha fallado. Por lo tanto, volverá a un almacenamiento no seguro\nSi está utilizando Linux, asegúrese de tener instalados servicios secretos como gnome-keyring, kde-wallet y KeePassXC'; @override String get querying_info => 'Consultando información...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsEs extends AppLocalizations { String get owned_by_you => 'En tu posesión'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return 'Copiado $shareUrl al portapapeles'; } @override - String get spotify_hipotetical_calculation => '*Esto se calcula en base al\npago por stream de Spotify de \$0.003 a \$0.005.\nEs un cálculo hipotético para dar\nuna idea de cuánto habría\npagado a los artistas si hubieras escuchado\nsu canción en Spotify.'; + String get spotify_hypothetical_calculation => '*Esto se calcula en base al\npago por stream de Spotify de \$0.003 a \$0.005.\nEs un cálculo hipotético para dar\nuna idea de cuánto habría\npagado a los artistas si hubieras escuchado\nsu canción en Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes minutos'; } diff --git a/lib/l10n/generated/app_localizations_eu.dart b/lib/l10n/generated/app_localizations_eu.dart index 96615c5b..6dcfb549 100644 --- a/lib/l10n/generated/app_localizations_eu.dart +++ b/lib/l10n/generated/app_localizations_eu.dart @@ -315,7 +315,7 @@ class AppLocalizationsEu extends AppLocalizations { String get shuffle_playlist => 'Erreproduzitu zerrenda ausazko ordenean'; @override - String get unshuffle_playlist => 'Desgaitu ausazko erreprodukzioa'; + String get not_shuffle_playlist => 'Desgaitu ausazko erreprodukzioa'; @override String get previous_track => 'Aurreko pista'; @@ -590,7 +590,7 @@ class AppLocalizationsEu extends AppLocalizations { String get step_2 => '2. pausua'; @override - String get step_2_steps => '1. Saioa hasita duzularik, sakatu F12 edo saguaren eskuineko botoia klikatu > Ikuskatu nabigatzaileko garapen tresnak irekitzeko.\n2. Joan \"Aplikazio\" (Chrome, Edge, Brave, etab.) edo \"Biltegiratzea\" (Firefox, Palemoon, etab.)\n3. Joan \"Cookieak\" atalera eta gero \"https://accounts.spotify.com\" azpiatalera'; + String get step_2_steps => '1. Saioa hasita duzularik, sakatu F12 edo saguaren eskuineko botoia klikatu > Ikuskatu nabigatzaileko garapen tresnak irekitzeko.\n2. Joan \"Aplikazio\" (Chrome, Edge, Brave, etab.) edo \"Biltegiratzea\" (Firefox, Pale Moon, etab.)\n3. Joan \"Cookieak\" atalera eta gero \"https://accounts.spotify.com\" azpiatalera'; @override String get step_3 => '3. pausua'; @@ -672,16 +672,16 @@ class AppLocalizationsEu extends AppLocalizations { String get number_of_tracks_generate => 'Sortzeko kanta kopurua'; @override - String get acousticness => 'Akustikotasuna'; + String get not_acoustic => 'Akustikotasuna'; @override - String get danceability => 'Dantzagarritasuna'; + String get dance_ability => 'Dantzagarritasuna'; @override String get energy => 'Energia'; @override - String get instrumentalness => 'Instrumentaltasuna'; + String get not_instrumental => 'Instrumentaltasuna'; @override String get liveness => 'Zuzenean'; @@ -690,7 +690,7 @@ class AppLocalizationsEu extends AppLocalizations { String get loudness => 'Ozentasuna'; @override - String get speechiness => 'Hitzaldia'; + String get talkative => 'Hitzaldia'; @override String get valence => 'Balentzia'; @@ -809,7 +809,7 @@ class AppLocalizationsEu extends AppLocalizations { String get sleep_timer => 'Itzaltzeko tenporizadorea'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes minutu'; } @@ -848,7 +848,7 @@ class AppLocalizationsEu extends AppLocalizations { String get failed_to_encrypt => 'Errorea zifratzean'; @override - String get encryption_failed_warning => 'Spotube-ek zifratzea darabil datuak modu seguruan biltegiratzeko. Baina huts egin du. Hori dela eta, biltegiratzea ez da segurua izango\nLinux erabiltzen ari bazara, ziurtatu edozein sekretu-zerbitzu (gnome-keyring, kde-wallet, keepassxc etab.) instalatuta duzula'; + String get encryption_failed_warning => 'Spotube-ek zifratzea darabil datuak modu seguruan biltegiratzeko. Baina huts egin du. Hori dela eta, biltegiratzea ez da segurua izango\nLinux erabiltzen ari bazara, ziurtatu edozein sekretu-zerbitzu (gnome-keyring, kde-wallet, KeePassXC etab.) instalatuta duzula'; @override String get querying_info => 'Informazioa egiaztatzen...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsEu extends AppLocalizations { String get owned_by_you => 'Zure jabetzakoa'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl arbelera kopiatua'; } @override - String get spotify_hipotetical_calculation => '*Sportify-k stream bakoitzeko duen \$0.003 eta \$0.005\nordainsarian oinarritua da. Kalkulu hipotetiko bat,\nkanta hauek Spotify-n entzun bazenitu,\nberaiek artistari zenbat ordaiduko lioketen jakin dezazun.'; + String get spotify_hypothetical_calculation => '*Sportify-k stream bakoitzeko duen \$0.003 eta \$0.005\nordainsarian oinarritua da. Kalkulu hipotetiko bat,\nkanta hauek Spotify-n entzun bazenitu,\nberaiek artistari zenbat ordaiduko lioketen jakin dezazun.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes minutu'; } diff --git a/lib/l10n/generated/app_localizations_fa.dart b/lib/l10n/generated/app_localizations_fa.dart index 657d01e1..9ea5caf4 100644 --- a/lib/l10n/generated/app_localizations_fa.dart +++ b/lib/l10n/generated/app_localizations_fa.dart @@ -315,7 +315,7 @@ class AppLocalizationsFa extends AppLocalizations { String get shuffle_playlist => 'پخش تصادفی'; @override - String get unshuffle_playlist => 'خاموش کردن پخش تصادفی'; + String get not_shuffle_playlist => 'خاموش کردن پخش تصادفی'; @override String get previous_track => 'آهنگ قبلی'; @@ -590,7 +590,7 @@ class AppLocalizationsFa extends AppLocalizations { String get step_2 => 'گام 2'; @override - String get step_2_steps => '1. پس از ورود به سیستم، F12 یا کلیک راست ماوس > Inspect را فشار دهید تا ابزارهای توسعه مرورگر باز شود..\n2. سپس به تب \"Application\" (Chrome, Edge, Brave etc..) یا \"Storage\" Tab (Firefox, Palemoon etc..)\n3. به قسمت \"Cookies\" و به پخش \"https://accounts.spotify.com\" بروید'; + String get step_2_steps => '1. پس از ورود به سیستم، F12 یا کلیک راست ماوس > Inspect را فشار دهید تا ابزارهای توسعه مرورگر باز شود..\n2. سپس به تب \"Application\" (Chrome, Edge, Brave etc..) یا \"Storage\" Tab (Firefox, Pale Moon etc..)\n3. به قسمت \"Cookies\" و به پخش \"https://accounts.spotify.com\" بروید'; @override String get step_3 => 'گام 3'; @@ -672,16 +672,16 @@ class AppLocalizationsFa extends AppLocalizations { String get number_of_tracks_generate => 'تعداد آهنگ های ساخته شده'; @override - String get acousticness => 'آکوستیک'; + String get not_acoustic => 'آکوستیک'; @override - String get danceability => 'رقصیدن'; + String get dance_ability => 'رقصیدن'; @override String get energy => 'انرژی'; @override - String get instrumentalness => 'بی کلام'; + String get not_instrumental => 'بی کلام'; @override String get liveness => 'حس زندگی'; @@ -690,7 +690,7 @@ class AppLocalizationsFa extends AppLocalizations { String get loudness => 'صدای بلند'; @override - String get speechiness => 'دکلمه'; + String get talkative => 'دکلمه'; @override String get valence => 'ظرفیت'; @@ -809,7 +809,7 @@ class AppLocalizationsFa extends AppLocalizations { String get sleep_timer => 'زمان خواب'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes دقیقه'; } @@ -848,7 +848,7 @@ class AppLocalizationsFa extends AppLocalizations { String get failed_to_encrypt => 'رمز گذاری نشده'; @override - String get encryption_failed_warning => 'Spotube از رمزگذاری برای ذخیره ایمن داده های شما استفاده می کند. اما موفق به انجام این کار نشد. بنابراین به فضای ذخیره‌سازی ناامن تبدیل می‌شود\nاگر از لینوکس استفاده می‌کنید، لطفاً مطمئن شوید که سرویس مخفی (gnome-keyring، kde-wallet، keepassxc و غیره) را نصب کرده‌اید.'; + String get encryption_failed_warning => 'Spotube از رمزگذاری برای ذخیره ایمن داده های شما استفاده می کند. اما موفق به انجام این کار نشد. بنابراین به فضای ذخیره‌سازی ناامن تبدیل می‌شود\nاگر از لینوکس استفاده می‌کنید، لطفاً مطمئن شوید که سرویس مخفی (gnome-keyring، kde-wallet، KeePassXC و غیره) را نصب کرده‌اید.'; @override String get querying_info => 'جستجو درباره '; @@ -1207,15 +1207,15 @@ class AppLocalizationsFa extends AppLocalizations { String get owned_by_you => 'توسط شما مالکیت شده'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl به کلیپ‌بورد کپی شد'; } @override - String get spotify_hipotetical_calculation => '*این بر اساس پرداخت هر پخش اسپاتیفای\nبه مبلغ 0.003 تا 0.005 دلار محاسبه شده است.\nاین یک محاسبه فرضی است که به کاربران نشان دهد چقدر ممکن است\nبه هنرمندان پرداخت می‌کردند اگر ترانه آنها را در اسپاتیفای گوش می‌دادند.'; + String get spotify_hypothetical_calculation => '*این بر اساس پرداخت هر پخش اسپاتیفای\nبه مبلغ 0.003 تا 0.005 دلار محاسبه شده است.\nاین یک محاسبه فرضی است که به کاربران نشان دهد چقدر ممکن است\nبه هنرمندان پرداخت می‌کردند اگر ترانه آنها را در اسپاتیفای گوش می‌دادند.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes دقیقه'; } diff --git a/lib/l10n/generated/app_localizations_fi.dart b/lib/l10n/generated/app_localizations_fi.dart index a1c7579f..4ddec92c 100644 --- a/lib/l10n/generated/app_localizations_fi.dart +++ b/lib/l10n/generated/app_localizations_fi.dart @@ -315,7 +315,7 @@ class AppLocalizationsFi extends AppLocalizations { String get shuffle_playlist => 'Sekoita soittolista'; @override - String get unshuffle_playlist => 'Poista sekoitus soittolistasta'; + String get not_shuffle_playlist => 'Poista sekoitus soittolistasta'; @override String get previous_track => 'Äskeinen kappale'; @@ -590,7 +590,7 @@ class AppLocalizationsFi extends AppLocalizations { String get step_2 => 'Vaihe 2'; @override - String get step_2_steps => '1. Kun olet kirjautunut, paina F12 tai oikeaa hiiren näppäintä > Tarkista ja avaa selaimen kehittäjä työkalut.\n2. Mene sitten \"Application\"-välilehteen (Chrome, Edge, Brave jne..) tai \"Storage\"-välilehteen (Firefox, Palemoon jne..)\n3. Mene \"Cookies\"-osastoon, sitten \"https://accounts.spotify.com\" alakohtaan.'; + String get step_2_steps => '1. Kun olet kirjautunut, paina F12 tai oikeaa hiiren näppäintä > Tarkista ja avaa selaimen kehittäjä työkalut.\n2. Mene sitten \"Application\"-välilehteen (Chrome, Edge, Brave jne..) tai \"Storage\"-välilehteen (Firefox, Pale Moon jne..)\n3. Mene \"Cookies\"-osastoon, sitten \"https://accounts.spotify.com\" alakohtaan.'; @override String get step_3 => 'Vaihe 3'; @@ -672,16 +672,16 @@ class AppLocalizationsFi extends AppLocalizations { String get number_of_tracks_generate => 'Numero tuotettavia kappaleita'; @override - String get acousticness => 'Akustisuus'; + String get not_acoustic => 'Akustisuus'; @override - String get danceability => 'Tanssittavuus'; + String get dance_ability => 'Tanssittavuus'; @override String get energy => 'Energia'; @override - String get instrumentalness => 'Instrumentaalisuus'; + String get not_instrumental => 'Instrumentaalisuus'; @override String get liveness => 'Elävyyttä'; @@ -690,7 +690,7 @@ class AppLocalizationsFi extends AppLocalizations { String get loudness => 'Äänekkyys'; @override - String get speechiness => 'Puheisuus'; + String get talkative => 'Puheisuus'; @override String get valence => 'Valenssi'; @@ -809,7 +809,7 @@ class AppLocalizationsFi extends AppLocalizations { String get sleep_timer => 'Uniajastin'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Minuuttia'; } @@ -848,7 +848,7 @@ class AppLocalizationsFi extends AppLocalizations { String get failed_to_encrypt => 'Salaaminen epäonnistui'; @override - String get encryption_failed_warning => 'Spotube käyttää salausta tallentaakseen tietosi, mutta epäonnistui, joten se palaa epäturvalliseen tallennukseen\nJos käytät Linuxia, varmista että sinulla on turvallisuuspalvelu (gnome-keyring, kde-wallet, keepassxc jne) asennettu'; + String get encryption_failed_warning => 'Spotube käyttää salausta tallentaakseen tietosi, mutta epäonnistui, joten se palaa epäturvalliseen tallennukseen\nJos käytät Linuxia, varmista että sinulla on turvallisuuspalvelu (gnome-keyring, kde-wallet, KeePassXC jne) asennettu'; @override String get querying_info => 'Hankitaan tietoa...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsFi extends AppLocalizations { String get owned_by_you => 'Sinun omistama'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl kopioitu leikepöydälle'; } @override - String get spotify_hipotetical_calculation => '*Tämä on laskettu Spotifyn suoratoiston\nmaksun perusteella, joka on 0,003–0,005 dollaria.\nTämä on hypoteettinen laskelma, joka antaa käyttäjälle käsityksen\nsiitä, kuinka paljon he olisivat maksaneet artisteille,\njollei heidän kappaleensa olisi kuunneltu Spotifyssa.'; + String get spotify_hypothetical_calculation => '*Tämä on laskettu Spotifyn suoratoiston\nmaksun perusteella, joka on 0,003–0,005 dollaria.\nTämä on hypoteettinen laskelma, joka antaa käyttäjälle käsityksen\nsiitä, kuinka paljon he olisivat maksaneet artisteille,\njollei heidän kappaleensa olisi kuunneltu Spotifyssa.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes min'; } diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 4e56d666..5fa0fd20 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -315,7 +315,7 @@ class AppLocalizationsFr extends AppLocalizations { String get shuffle_playlist => 'Lecture aléatoire de la liste de lecture'; @override - String get unshuffle_playlist => 'Annuler la lecture aléatoire de la liste de lecture'; + String get not_shuffle_playlist => 'Annuler la lecture aléatoire de la liste de lecture'; @override String get previous_track => 'Piste précédente'; @@ -590,7 +590,7 @@ class AppLocalizationsFr extends AppLocalizations { String get step_2 => 'Étape 2'; @override - String get step_2_steps => '1. Une fois connecté, appuyez sur F12 ou clic droit de la souris > Inspecter pour ouvrir les outils de développement du navigateur.\n2. Ensuite, allez dans l\'onglet \"Application\" (Chrome, Edge, Brave, etc.) ou l\'onglet \"Stockage\" (Firefox, Palemoon, etc.)\n3. Allez dans la section \"Cookies\", puis dans la sous-section \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Une fois connecté, appuyez sur F12 ou clic droit de la souris > Inspecter pour ouvrir les outils de développement du navigateur.\n2. Ensuite, allez dans l\'onglet \"Application\" (Chrome, Edge, Brave, etc.) ou l\'onglet \"Stockage\" (Firefox, Pale Moon, etc.)\n3. Allez dans la section \"Cookies\", puis dans la sous-section \"https://accounts.spotify.com\"'; @override String get step_3 => 'Étape 3'; @@ -672,16 +672,16 @@ class AppLocalizationsFr extends AppLocalizations { String get number_of_tracks_generate => 'Nombre de pistes à générer'; @override - String get acousticness => 'Acoustique'; + String get not_acoustic => 'Acoustique'; @override - String get danceability => 'Dansabilité'; + String get dance_ability => 'Dansabilité'; @override String get energy => 'Énergie'; @override - String get instrumentalness => 'Instrumentalité'; + String get not_instrumental => 'Instrumentalité'; @override String get liveness => 'Interprétation en direct'; @@ -690,7 +690,7 @@ class AppLocalizationsFr extends AppLocalizations { String get loudness => 'Sonorité'; @override - String get speechiness => 'Parlé'; + String get talkative => 'Parlé'; @override String get valence => 'Valeur émotionnelle'; @@ -809,7 +809,7 @@ class AppLocalizationsFr extends AppLocalizations { String get sleep_timer => 'Minuteur de veille'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes minutes'; } @@ -848,7 +848,7 @@ class AppLocalizationsFr extends AppLocalizations { String get failed_to_encrypt => 'Échec de la cryptage'; @override - String get encryption_failed_warning => 'Spotube utilise le cryptage pour stocker vos données en toute sécurité. Mais cela a échoué. Il basculera donc vers un stockage non sécurisé\nSi vous utilisez Linux, assurez-vous d\'avoir installé des services secrets tels que gnome-keyring, kde-wallet et keepassxc'; + String get encryption_failed_warning => 'Spotube utilise le cryptage pour stocker vos données en toute sécurité. Mais cela a échoué. Il basculera donc vers un stockage non sécurisé\nSi vous utilisez Linux, assurez-vous d\'avoir installé des services secrets tels que gnome-keyring, kde-wallet et KeePassXC'; @override String get querying_info => 'Interrogation des info...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsFr extends AppLocalizations { String get owned_by_you => 'Possédé par vous'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl copié dans le presse-papier'; } @override - String get spotify_hipotetical_calculation => '*Cela est calculé en fonction du\npaiement par stream de Spotify de 0,003 \$ à 0,005 \$.\nIl s\'agit d\'un calcul hypothétique pour donner\nune idée de combien vous auriez\npayé aux artistes si vous aviez\nécouté leur chanson sur Spotify.'; + String get spotify_hypothetical_calculation => '*Cela est calculé en fonction du\npaiement par stream de Spotify de 0,003 \$ à 0,005 \$.\nIl s\'agit d\'un calcul hypothétique pour donner\nune idée de combien vous auriez\npayé aux artistes si vous aviez\nécouté leur chanson sur Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes minutes'; } diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index fc9ceda4..24708050 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -315,7 +315,7 @@ class AppLocalizationsHi extends AppLocalizations { String get shuffle_playlist => 'प्लेलिस्ट शफल करें'; @override - String get unshuffle_playlist => 'अनशफल प्लेलिस्ट'; + String get not_shuffle_playlist => 'अनशफल प्लेलिस्ट'; @override String get previous_track => 'पिछला ट्रैक'; @@ -590,7 +590,7 @@ class AppLocalizationsHi extends AppLocalizations { String get step_2 => '2 चरण'; @override - String get step_2_steps => '1. जब आप लॉगिन हो जाएँ, तो F12 दबाएं या माउस राइट क्लिक> निरीक्षण करें ताकि ब्राउज़र डेवटूल्स खुलें।\n2. फिर ब्राउज़र के \"एप्लिकेशन\" टैब (Chrome, Edge, Brave आदि) या \"स्टोरेज\" टैब (Firefox, Palemoon आदि) में जाएं\n3. \"कुकीज़\" अनुभाग में जाएं फिर \"https: //accounts.spotify.com\" उप-अनुभाग में जाएं'; + String get step_2_steps => '1. जब आप लॉगिन हो जाएँ, तो F12 दबाएं या माउस राइट क्लिक> निरीक्षण करें ताकि ब्राउज़र डेवटूल्स खुलें।\n2. फिर ब्राउज़र के \"एप्लिकेशन\" टैब (Chrome, Edge, Brave आदि) या \"स्टोरेज\" टैब (Firefox, Pale Moon आदि) में जाएं\n3. \"कुकीज़\" अनुभाग में जाएं फिर \"https: //accounts.spotify.com\" उप-अनुभाग में जाएं'; @override String get step_3 => 'स्टेप 3'; @@ -672,16 +672,16 @@ class AppLocalizationsHi extends AppLocalizations { String get number_of_tracks_generate => 'उत्पन्न करने के लिए ट्रैक की संख्या'; @override - String get acousticness => 'ध्वनिकता'; + String get not_acoustic => 'ध्वनिकता'; @override - String get danceability => 'नृत्यता'; + String get dance_ability => 'नृत्यता'; @override String get energy => 'ऊर्जा'; @override - String get instrumentalness => 'आलापिकता'; + String get not_instrumental => 'आलापिकता'; @override String get liveness => 'जीवंतता'; @@ -690,7 +690,7 @@ class AppLocalizationsHi extends AppLocalizations { String get loudness => 'शोर'; @override - String get speechiness => 'बोलचालता'; + String get talkative => 'बोलचालता'; @override String get valence => 'मनोदयता'; @@ -809,7 +809,7 @@ class AppLocalizationsHi extends AppLocalizations { String get sleep_timer => 'स्लीप टाइमर'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes मिनट'; } @@ -848,7 +848,7 @@ class AppLocalizationsHi extends AppLocalizations { String get failed_to_encrypt => 'एन्क्रिप्ट करने में विफल रहा'; @override - String get encryption_failed_warning => 'Spotube आपके डेटा को सुरक्षित रूप से स्टोर करने के लिए एन्क्रिप्शन का उपयोग करता है। लेकिन इसमें विफल रहा। इसलिए, यह असुरक्षित स्टोरेज पर फॉलबैक करेगा\nयदि आप Linux का उपयोग कर रहे हैं, तो कृपया सुनिश्चित करें कि आपके पास gnome-keyring, kde-wallet, keepassxc आदि जैसी कोई सीक्रेट-सर्विस इंस्टॉल की गई है'; + String get encryption_failed_warning => 'Spotube आपके डेटा को सुरक्षित रूप से स्टोर करने के लिए एन्क्रिप्शन का उपयोग करता है। लेकिन इसमें विफल रहा। इसलिए, यह असुरक्षित स्टोरेज पर फॉलबैक करेगा\nयदि आप Linux का उपयोग कर रहे हैं, तो कृपया सुनिश्चित करें कि आपके पास gnome-keyring, kde-wallet, KeePassXC आदि जैसी कोई सीक्रेट-सर्विस इंस्टॉल की गई है'; @override String get querying_info => 'जानकारी प्राप्त करना'; @@ -1207,15 +1207,15 @@ class AppLocalizationsHi extends AppLocalizations { String get owned_by_you => 'तपाईंले स्वामित्व गरेको'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl क्लिपबोर्डमा कपी गरियो'; } @override - String get spotify_hipotetical_calculation => '*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n\$0.003 देखि \$0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।'; + String get spotify_hypothetical_calculation => '*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n\$0.003 देखि \$0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes मिनट'; } diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 3e07ed0c..05c8506b 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -315,7 +315,7 @@ class AppLocalizationsId extends AppLocalizations { String get shuffle_playlist => 'Acak daftar putar'; @override - String get unshuffle_playlist => 'Batalkan pengacakan daftar putar'; + String get not_shuffle_playlist => 'Batalkan pengacakan daftar putar'; @override String get previous_track => 'Lagu sebelumnya'; @@ -590,7 +590,7 @@ class AppLocalizationsId extends AppLocalizations { String get step_2 => 'Langkah 2'; @override - String get step_2_steps => '1. Setelah Anda masuk, tekan F12 atau Klik Kanan Mouse > Buka Browser Devtools.\n2. Lalu buka Tab \"Aplikasi\" (Chrome, Edge, Brave, dll.) atau Tab \"Penyimpanan\" (Firefox, Palemoon, dll.)\n3. Buka bagian \"Cookie\" lalu subbagian \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Setelah Anda masuk, tekan F12 atau Klik Kanan Mouse > Buka Browser Devtools.\n2. Lalu buka Tab \"Aplikasi\" (Chrome, Edge, Brave, dll.) atau Tab \"Penyimpanan\" (Firefox, Pale Moon, dll.)\n3. Buka bagian \"Cookie\" lalu subbagian \"https://accounts.spotify.com\"'; @override String get step_3 => 'Langkah 3'; @@ -672,16 +672,16 @@ class AppLocalizationsId extends AppLocalizations { String get number_of_tracks_generate => 'Jumlah trek yang akan dihasilkan'; @override - String get acousticness => 'Akustik'; + String get not_acoustic => 'Akustik'; @override - String get danceability => 'Menari'; + String get dance_ability => 'Menari'; @override String get energy => 'Energi'; @override - String get instrumentalness => 'Instrumentalitas'; + String get not_instrumental => 'Instrumentalitas'; @override String get liveness => 'Kehidupan'; @@ -690,7 +690,7 @@ class AppLocalizationsId extends AppLocalizations { String get loudness => 'Kekerasan'; @override - String get speechiness => 'Berbicara'; + String get talkative => 'Berbicara'; @override String get valence => 'Valensi'; @@ -809,7 +809,7 @@ class AppLocalizationsId extends AppLocalizations { String get sleep_timer => 'Pengatur Waktu Tidur'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Menit'; } @@ -848,7 +848,7 @@ class AppLocalizationsId extends AppLocalizations { String get failed_to_encrypt => 'Gagal mengenkripsi'; @override - String get encryption_failed_warning => 'Spotube menggunakan enkripsi untuk menyimpan data Anda dengan aman. Namun gagal melakukannya. Jadi itu akan kembali ke penyimpanan yang tidak aman\nJika Anda menggunakan linux, pastikan Anda telah menginstal layanan rahasia (gnome-keyring, kde-wallet, keepassxc, dll)'; + String get encryption_failed_warning => 'Spotube menggunakan enkripsi untuk menyimpan data Anda dengan aman. Namun gagal melakukannya. Jadi itu akan kembali ke penyimpanan yang tidak aman\nJika Anda menggunakan linux, pastikan Anda telah menginstal layanan rahasia (gnome-keyring, kde-wallet, KeePassXC, dll)'; @override String get querying_info => 'Mencari informasi...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsId extends AppLocalizations { String get owned_by_you => 'Dimiliki oleh Anda'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl disalin ke clipboard'; } @override - String get spotify_hipotetical_calculation => '*Ini dihitung berdasarkan pembayaran\nper stream Spotify dari \$0,003 hingga \$0,005.\nIni adalah perhitungan hipotetis untuk memberi\npengguna gambaran tentang berapa banyak\nmereka akan membayar kepada artis jika\nmereka mendengarkan lagu mereka di Spotify.'; + String get spotify_hypothetical_calculation => '*Ini dihitung berdasarkan pembayaran\nper stream Spotify dari \$0,003 hingga \$0,005.\nIni adalah perhitungan hipotetis untuk memberi\npengguna gambaran tentang berapa banyak\nmereka akan membayar kepada artis jika\nmereka mendengarkan lagu mereka di Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes menit'; } diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index abfc0fb4..d55c8f53 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -70,7 +70,7 @@ class AppLocalizationsIt extends AppLocalizations { String get tracks => 'Tracce'; @override - String get downloads => 'Downloads'; + String get downloads => 'Scaricati'; @override String get filter_playlists => 'Filtra le tue playlist...'; @@ -315,7 +315,7 @@ class AppLocalizationsIt extends AppLocalizations { String get shuffle_playlist => 'Playlist casuale'; @override - String get unshuffle_playlist => 'Ordina playlist'; + String get not_shuffle_playlist => 'Ordina playlist'; @override String get previous_track => 'Traccia precedente'; @@ -330,7 +330,7 @@ class AppLocalizationsIt extends AppLocalizations { String get resume_playback => 'Riprendi Playback'; @override - String get loop_track => 'Cicla traccia'; + String get loop_track => 'Itera traccia'; @override String get no_loop => 'Nessun ciclo'; @@ -437,10 +437,10 @@ class AppLocalizationsIt extends AppLocalizations { String get system => 'Sistema'; @override - String get accent_color => 'Colore accento'; + String get accent_color => 'Colore principale'; @override - String get sync_album_color => 'Syncronizza colore album'; + String get sync_album_color => 'Sincronizza colore album'; @override String get sync_album_color_description => 'Usa il colore dominante della copertina dell\'album come colore accento'; @@ -506,7 +506,7 @@ class AppLocalizationsIt extends AppLocalizations { String get please_sponsor => 'Per favore sponsorizza/dona'; @override - String get spotube_description => 'Spotube, un client spotify gratis per tutti, multipiattaforma e leggero'; + String get spotube_description => 'Spotube, un client spotify gratis per tutti, multi-piattaforma e leggero'; @override String get version => 'Versione'; @@ -590,7 +590,7 @@ class AppLocalizationsIt extends AppLocalizations { String get step_2 => 'Passo 2'; @override - String get step_2_steps => '1. Quando sei acceduto premi F12 o premi il tasto destro del Mouse > Ispeziona per aprire gli strumenti di sviluppo del browser.\n2. Vai quindi nel tab \"Applicazione\" (Chrome, Edge, Brave etc..) o tab \"Archiviazione\" (Firefox, Palemoon etc..)\n3. Vai nella sezione \"Cookies\" quindi nella sezione \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Quando sei acceduto premi F12 o premi il tasto destro del Mouse > Ispeziona per aprire gli strumenti di sviluppo del browser.\n2. Vai quindi nel tab \"Applicazione\" (Chrome, Edge, Brave etc..) o tab \"Archiviazione\" (Firefox, Pale Moon etc..)\n3. Vai nella sezione \"Cookies\" quindi nella sezione \"https://accounts.spotify.com\"'; @override String get step_3 => 'Passo 3'; @@ -617,10 +617,10 @@ class AppLocalizationsIt extends AppLocalizations { String get piped_instance => 'Istanza Server Piped'; @override - String get piped_description => 'L\'istanza server Piped da usare per il match della tracccia'; + String get piped_description => 'L\'istanza server Piped da usare per il match della traccia'; @override - String get piped_warning => 'Alcune di queste non funzioneranno benen. Usa quindi a tuo rischio'; + String get piped_warning => 'Alcune di queste non funzioneranno bene. Usa quindi a tuo rischio'; @override String get invidious_instance => 'Istanza del server Invidious'; @@ -669,19 +669,19 @@ class AppLocalizationsIt extends AppLocalizations { String get country => 'Paese'; @override - String get number_of_tracks_generate => 'Nnumero di tracce da generare'; + String get number_of_tracks_generate => 'Numero di tracce da generare'; @override - String get acousticness => 'Acustica'; + String get not_acoustic => 'Acustica'; @override - String get danceability => 'Ballabilità'; + String get dance_ability => 'Ballabile'; @override String get energy => 'Energia'; @override - String get instrumentalness => 'Strumentalità'; + String get not_instrumental => 'Strumentalità'; @override String get liveness => 'Vitalità'; @@ -690,7 +690,7 @@ class AppLocalizationsIt extends AppLocalizations { String get loudness => 'Sonorità'; @override - String get speechiness => 'Loquacità'; + String get talkative => 'Loquacità'; @override String get valence => 'Valenza'; @@ -752,19 +752,19 @@ class AppLocalizationsIt extends AppLocalizations { } @override - String get download_warning => 'Se scarichi tutte le Tracce in massa stai chiaramente piratando Musica e causando un danno alla società creativa della Musica. Spero che tu sia cosciente di questo. Cerca di rispettare e supportare sempre il duro lavoro degli Artisti'; + String get download_warning => 'Se scarichi tutte le Tracce in massa stai chiaramente scaricando illegalmente Musica e causando un danno alla società creativa della Musica. Spero che tu sia cosciente di questo. Cerca di rispettare e supportare sempre il duro lavoro degli Artisti'; @override - String get download_ip_ban_warning => 'A proposito, il tuo IP può essere bloccato da YouTube per il numero di richieste di download eccessive rispetto la norma. Il blocco IP significa che non puoi usare YoutTube (anche hai effettuato l\'accesso) per almeno 2-3 mesi dal dispositivo con questo IP. Spotube non ha responsabilità se questo dovesse accadere'; + String get download_ip_ban_warning => 'A proposito, il tuo IP può essere bloccato da YouTube per il numero di richieste di download eccessive rispetto la norma. Il blocco IP significa che non puoi usare YouTube (anche hai effettuato l\'accesso) per almeno 2-3 mesi dal dispositivo con questo IP. Spotube non ha responsabilità se questo dovesse accadere'; @override String get by_clicking_accept_terms => 'Cliccando su \'accetta\' concordi con i seguenti termini:'; @override - String get download_agreement_1 => 'So che sto piratando Musica. Sono cattivo'; + String get download_agreement_1 => 'So che sto scaricando illegalmente Musica. Sono cattivo'; @override - String get download_agreement_2 => 'Supporterò l\'Artista come potrò e sto facendo questo solo perchè non ho denaro per acquistare il suo prodotto dell\'ingegno'; + String get download_agreement_2 => 'Supporterò l\'Artista come potrò e sto facendo questo solo perché non ho denaro per acquistare il suo prodotto dell\'ingegno'; @override String get download_agreement_3 => 'Sono completamente cosciente che il mio IP può essere bloccato da YouTube & non riterrò responsabili Spotube o i suoi autori/contributori per ogni inconveniente causato dalla mia azione corrente'; @@ -809,7 +809,7 @@ class AppLocalizationsIt extends AppLocalizations { String get sleep_timer => 'Timer Dormire'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Minuti'; } @@ -848,7 +848,7 @@ class AppLocalizationsIt extends AppLocalizations { String get failed_to_encrypt => 'Criptazione fallita'; @override - String get encryption_failed_warning => 'Spotube usa la criptazione per memorizzare in modo sicuro i dati. Ma ha fallito a farlo. Passerà quindi in ripiego alla memorizzazione non siscura\nSe stai usando Linux assicurati di avere un servizio di segretezza installato (gnome-keyring, kde-wallet, keepassxc etc)'; + String get encryption_failed_warning => 'Spotube usa la criptazione per memorizzare in modo sicuro i dati. Ma ha fallito a farlo. Passerà quindi in ripiego alla memorizzazione non sicura\n Se stai usando Linux assicurati di avere un servizio di segretezza installato (gnome-keyring, kde-wallet, KeePassXC etc)'; @override String get querying_info => 'Richiesta informazioni...'; @@ -907,10 +907,10 @@ class AppLocalizationsIt extends AppLocalizations { String get connect => 'Connetti'; @override - String get disconnect_lastfm => 'Disconnetti Last.fm'; + String get disconnect_lastfm => 'Scollega Last.fm'; @override - String get disconnect => 'Disconnetti'; + String get disconnect => 'Scollega'; @override String get username => 'Nome utente'; @@ -1207,15 +1207,15 @@ class AppLocalizationsIt extends AppLocalizations { String get owned_by_you => 'Di tua proprietà'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return 'Copiato $shareUrl negli appunti'; } @override - String get spotify_hipotetical_calculation => '*Questo è calcolato in base al pagamento per streaming di Spotify\nche va da \$0.003 a \$0.005. Questo è un calcolo ipotetico\nper dare all\'utente un\'idea di quanto avrebbe pagato agli artisti se avesse ascoltato\ne loro canzoni su Spotify.'; + String get spotify_hypothetical_calculation => '*Questo è calcolato in base al pagamento per streaming di Spotify\nche va da \$0.003 a \$0.005. Questo è un calcolo ipotetico\nper dare all\'utente un\'idea di quanto avrebbe pagato agli artisti se avesse ascoltato\ne loro canzoni su Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes min'; } diff --git a/lib/l10n/generated/app_localizations_ja.dart b/lib/l10n/generated/app_localizations_ja.dart index a8233a1d..be1e2d26 100644 --- a/lib/l10n/generated/app_localizations_ja.dart +++ b/lib/l10n/generated/app_localizations_ja.dart @@ -315,7 +315,7 @@ class AppLocalizationsJa extends AppLocalizations { String get shuffle_playlist => '再生リストをシャッフル'; @override - String get unshuffle_playlist => '再生リストのシャッフル解除'; + String get not_shuffle_playlist => '再生リストのシャッフル解除'; @override String get previous_track => '前の曲'; @@ -590,7 +590,7 @@ class AppLocalizationsJa extends AppLocalizations { String get step_2 => 'ステップ 2'; @override - String get step_2_steps => '1. ログインしたら、F12を押すか、マウス右クリック > 調査(検証)でブラウザの開発者ツール (devtools) を開きます。\n2. アプリケーション (Application) タブ (Chrome, Edge, Brave など) またはストレージタブ (Firefox, Palemoon など)\n3. Cookies 欄を選択し、https://accounts.spotify.com の枝を選びます'; + String get step_2_steps => '1. ログインしたら、F12を押すか、マウス右クリック > 調査(検証)でブラウザの開発者ツール (devtools) を開きます。\n2. アプリケーション (Application) タブ (Chrome, Edge, Brave など) またはストレージタブ (Firefox, Pale Moon など)\n3. Cookies 欄を選択し、https://accounts.spotify.com の枝を選びます'; @override String get step_3 => 'ステップ 3'; @@ -672,16 +672,16 @@ class AppLocalizationsJa extends AppLocalizations { String get number_of_tracks_generate => '生成する曲数'; @override - String get acousticness => 'アコースティック感'; + String get not_acoustic => 'アコースティック感'; @override - String get danceability => 'ダンス感'; + String get dance_ability => 'ダンス感'; @override String get energy => 'エネルギー'; @override - String get instrumentalness => 'インストゥルメンタル'; + String get not_instrumental => 'インストゥルメンタル'; @override String get liveness => 'ライブ感'; @@ -690,7 +690,7 @@ class AppLocalizationsJa extends AppLocalizations { String get loudness => 'ラウドネス'; @override - String get speechiness => '会話感'; + String get talkative => '会話感'; @override String get valence => '多幸性'; @@ -809,7 +809,7 @@ class AppLocalizationsJa extends AppLocalizations { String get sleep_timer => 'スリープタイマー'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes 分'; } @@ -848,7 +848,7 @@ class AppLocalizationsJa extends AppLocalizations { String get failed_to_encrypt => '暗号化に失敗しました'; @override - String get encryption_failed_warning => 'Spotubeはデータを安全に保存するために暗号化を使用しています。しかし、失敗しました。したがって、安全でないストレージにフォールバックします\nLinuxを使用している場合は、gnome-keyring、kde-wallet、keepassxcなどのシークレットサービスがインストールされていることを確認してください'; + String get encryption_failed_warning => 'Spotubeはデータを安全に保存するために暗号化を使用しています。しかし、失敗しました。したがって、安全でないストレージにフォールバックします\nLinuxを使用している場合は、gnome-keyring、kde-wallet、KeePassXCなどのシークレットサービスがインストールされていることを確認してください'; @override String get querying_info => '情報を取得中...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsJa extends AppLocalizations { String get owned_by_you => 'あなたが所有'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl をクリップボードにコピーしました'; } @override - String get spotify_hipotetical_calculation => '*これは、Spotifyのストリームごとの支払い\nが \$0.003 から \$0.005 の範囲で計算されています。これは仮想的な\n計算で、Spotify で曲を聴いた場合に、アーティストに\nどれくらい支払ったかをユーザーに示すためのものです。'; + String get spotify_hypothetical_calculation => '*これは、Spotifyのストリームごとの支払い\nが \$0.003 から \$0.005 の範囲で計算されています。これは仮想的な\n計算で、Spotify で曲を聴いた場合に、アーティストに\nどれくらい支払ったかをユーザーに示すためのものです。'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes 分'; } diff --git a/lib/l10n/generated/app_localizations_ka.dart b/lib/l10n/generated/app_localizations_ka.dart index cefdc73e..68a2d7c5 100644 --- a/lib/l10n/generated/app_localizations_ka.dart +++ b/lib/l10n/generated/app_localizations_ka.dart @@ -315,7 +315,7 @@ class AppLocalizationsKa extends AppLocalizations { String get shuffle_playlist => 'ფლეილისტის არევა'; @override - String get unshuffle_playlist => 'ფლეილისტის დალაგება'; + String get not_shuffle_playlist => 'ფლეილისტის დალაგება'; @override String get previous_track => 'წინა ტრეკი'; @@ -590,7 +590,7 @@ class AppLocalizationsKa extends AppLocalizations { String get step_2 => 'ნაბიჯი 2'; @override - String get step_2_steps => '1. როცა შეხვალთ, დააჭირეთ F12-ს ან მაუსის მარჯვენა ღილაკს > Inspect to Open the Browser devtools.\n2. შემდეგ გახსენით \"Application\" განყოფილება (Chrome, Edge, Brave etc..) ან \"Storage\" განყოფილება (Firefox, Palemoon etc..)\n3. შედით \"Cookies\" სექციაში და შემდეგ \"https://accounts.spotify.com\" სუბსექციაში'; + String get step_2_steps => '1. როცა შეხვალთ, დააჭირეთ F12-ს ან მაუსის მარჯვენა ღილაკს > Inspect to Open the Browser devtools.\n2. შემდეგ გახსენით \"Application\" განყოფილება (Chrome, Edge, Brave etc..) ან \"Storage\" განყოფილება (Firefox, Pale Moon etc..)\n3. შედით \"Cookies\" სექციაში და შემდეგ \"https://accounts.spotify.com\" სუბსექციაში'; @override String get step_3 => 'ნაბიჯი 3'; @@ -672,16 +672,16 @@ class AppLocalizationsKa extends AppLocalizations { String get number_of_tracks_generate => 'დასაგენერირებელი ტრეკების რაოდენობა'; @override - String get acousticness => 'Acousticness'; + String get not_acoustic => 'not_acoustic'; @override - String get danceability => 'Danceability'; + String get dance_ability => 'dance_ability'; @override String get energy => 'Energy'; @override - String get instrumentalness => 'Instrumentalness'; + String get not_instrumental => 'not_instrumental'; @override String get liveness => 'Liveness'; @@ -690,7 +690,7 @@ class AppLocalizationsKa extends AppLocalizations { String get loudness => 'Loudness'; @override - String get speechiness => 'Speechiness'; + String get talkative => 'talkative'; @override String get valence => 'Valence'; @@ -809,7 +809,7 @@ class AppLocalizationsKa extends AppLocalizations { String get sleep_timer => 'ძილის ტაიმერი'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes წუთი'; } @@ -848,7 +848,7 @@ class AppLocalizationsKa extends AppLocalizations { String get failed_to_encrypt => 'დაშიფვრა ვერ მოხერხდა'; @override - String get encryption_failed_warning => 'Spotube uses encryption to securely store your data. But failed to do so. So it\'ll fallback to insecure storage\nIf you\'re using linux, please make sure you\'ve any secret-service (gnome-keyring, kde-wallet, keepassxc etc) installed'; + String get encryption_failed_warning => 'Spotube uses encryption to securely store your data. But failed to do so. So it\'ll fallback to insecure storage\nIf you\'re using linux, please make sure you\'ve any secret-service (gnome-keyring, kde-wallet, KeePassXC etc) installed'; @override String get querying_info => 'Querying info...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsKa extends AppLocalizations { String get owned_by_you => 'შენ მიერ საკუთრებული'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl აიღო კლიპბორდზე'; } @override - String get spotify_hipotetical_calculation => '*ეს გამოითვლება Spotify-ის თითოეულ სტრიმზე\nგადახდის შესაბამისად, რომელიც \$0.003 დან \$0.005-მდეა. ეს არის ჰიპოთეტური\nგამოთვლა, რომელიც აჩვენებს მომხმარებელს რამდენი გადაიხდიდა\nარტისტებს, თუკი ისინი უსმენდნენ მათ სიმღერებს Spotify-ზე.'; + String get spotify_hypothetical_calculation => '*ეს გამოითვლება Spotify-ის თითოეულ სტრიმზე\nგადახდის შესაბამისად, რომელიც \$0.003 დან \$0.005-მდეა. ეს არის ჰიპოთეტური\nგამოთვლა, რომელიც აჩვენებს მომხმარებელს რამდენი გადაიხდიდა\nარტისტებს, თუკი ისინი უსმენდნენ მათ სიმღერებს Spotify-ზე.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes წუთი'; } diff --git a/lib/l10n/generated/app_localizations_ko.dart b/lib/l10n/generated/app_localizations_ko.dart index 14628194..f959fcd4 100644 --- a/lib/l10n/generated/app_localizations_ko.dart +++ b/lib/l10n/generated/app_localizations_ko.dart @@ -315,7 +315,7 @@ class AppLocalizationsKo extends AppLocalizations { String get shuffle_playlist => '플레이리스트를 섞기'; @override - String get unshuffle_playlist => '플레이리스트를 섞지 않기'; + String get not_shuffle_playlist => '플레이리스트를 섞지 않기'; @override String get previous_track => '이전 곡'; @@ -590,7 +590,7 @@ class AppLocalizationsKo extends AppLocalizations { String get step_2 => '2단계'; @override - String get step_2_steps => '1. 로그인에 성공하면、F12나 마우스 우클릭 > 검사(Inspect)을 눌러 브라우저의 개발자 도구(devtools)를 열어주세요.\n2. 애플리케이션 (Application) 탭 (Chrome, Edge, Brave 등) 또는 스토리지 탭 (Firefox, Palemoon 등)을 열어주세요.\n3. 쿠키 (Cookies) 섹션으로 들어가서, https://accounts.spotify.com 서브섹션으로 들어가주세요.'; + String get step_2_steps => '1. 로그인에 성공하면、F12나 마우스 우클릭 > 검사(Inspect)을 눌러 브라우저의 개발자 도구(devtools)를 열어주세요.\n2. 애플리케이션 (Application) 탭 (Chrome, Edge, Brave 등) 또는 스토리지 탭 (Firefox, Pale Moon 등)을 열어주세요.\n3. 쿠키 (Cookies) 섹션으로 들어가서, https://accounts.spotify.com 서브섹션으로 들어가주세요.'; @override String get step_3 => '3단계'; @@ -672,16 +672,16 @@ class AppLocalizationsKo extends AppLocalizations { String get number_of_tracks_generate => '생성할 곡 수'; @override - String get acousticness => '반주 구간 (Acousticness)'; + String get not_acoustic => '반주 구간 (not_acoustic)'; @override - String get danceability => '흥겨운 정도 (Danceability)'; + String get dance_ability => '흥겨운 정도 (dance_ability)'; @override String get energy => '에너지 (Energy)'; @override - String get instrumentalness => '기악성 (Instrumentalness)'; + String get not_instrumental => '기악성 (not_instrumental)'; @override String get liveness => '생동감 (Liveness)'; @@ -690,7 +690,7 @@ class AppLocalizationsKo extends AppLocalizations { String get loudness => '라우드니스 (Loudness)'; @override - String get speechiness => '회화성 (Speechniss)'; + String get talkative => '회화성 (Speechniss)'; @override String get valence => '감정가 (Valence)'; @@ -809,7 +809,7 @@ class AppLocalizationsKo extends AppLocalizations { String get sleep_timer => '취침 타이머'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes 분'; } @@ -848,7 +848,7 @@ class AppLocalizationsKo extends AppLocalizations { String get failed_to_encrypt => '암호화에 실패했습니다'; @override - String get encryption_failed_warning => 'Spotube는 암호화를 사용하여 데이터를 안전하게 저장합니다. 하지만 그렇게 하지 못했습니다. 따라서 안전하지 않은 저장소로 대체됩니다.\n리눅스를 사용하는 경우, 비밀 서비스(gnome-keyring, kde-wallet, keepassxc 등)가 설치되어 있는지 확인하세요.'; + String get encryption_failed_warning => 'Spotube는 암호화를 사용하여 데이터를 안전하게 저장합니다. 하지만 그렇게 하지 못했습니다. 따라서 안전하지 않은 저장소로 대체됩니다.\n리눅스를 사용하는 경우, 비밀 서비스(gnome-keyring, kde-wallet, KeePassXC 등)가 설치되어 있는지 확인하세요.'; @override String get querying_info => '정보를 얻는 중...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsKo extends AppLocalizations { String get owned_by_you => '당신이 소유'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl를 클립보드에 복사했습니다'; } @override - String get spotify_hipotetical_calculation => '*Spotify의 스트림당 지불금 \$0.003에서 \$0.005까지의\n기준으로 계산되었습니다. 이는 사용자가 Spotify에서\n곡을 들을 때 아티스트에게 얼마를 지불했을지를\n알려주기 위한 가상의 계산입니다.'; + String get spotify_hypothetical_calculation => '*Spotify의 스트림당 지불금 \$0.003에서 \$0.005까지의\n기준으로 계산되었습니다. 이는 사용자가 Spotify에서\n곡을 들을 때 아티스트에게 얼마를 지불했을지를\n알려주기 위한 가상의 계산입니다.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes 분'; } diff --git a/lib/l10n/generated/app_localizations_ne.dart b/lib/l10n/generated/app_localizations_ne.dart index 06fc54f9..6c750377 100644 --- a/lib/l10n/generated/app_localizations_ne.dart +++ b/lib/l10n/generated/app_localizations_ne.dart @@ -315,7 +315,7 @@ class AppLocalizationsNe extends AppLocalizations { String get shuffle_playlist => 'प्लेलिस्ट शफल गर्नुहोस्'; @override - String get unshuffle_playlist => 'प्लेलिस्ट शफल नगर्नुहोस्'; + String get not_shuffle_playlist => 'प्लेलिस्ट शफल नगर्नुहोस्'; @override String get previous_track => 'पूर्व ट्र्याक'; @@ -590,7 +590,7 @@ class AppLocalizationsNe extends AppLocalizations { String get step_2 => 'कदम 2'; @override - String get step_2_steps => '1. एकबार तपाईं लगइन गरे पछि, F12 थिच्नुहोस् वा माउस राइट क्लिक गर्नुहोस् > इन्स्पेक्ट गर्नुहोस् भने ब्राउजर डेभटुलहरू खुलाउनका लागि।\n2. तपाईंको \"एप्लिकेसन\" ट्याबमा जानुहोस् (Chrome, Edge, Brave इत्यादि) वा \"स्टोरेज\" ट्याबमा जानुहोस् (Firefox, Palemoon इत्यादि)\n3. तपाईंको इन्सेक्ट गरेको ब्राउजर डेभटुलहरूमा \"कुकीहरू\" खण्डमा जानुहोस् अनि \"https://accounts.spotify.com\" उपकोणमा जानुहोस्'; + String get step_2_steps => '1. एकबार तपाईं लगइन गरे पछि, F12 थिच्नुहोस् वा माउस राइट क्लिक गर्नुहोस् > इन्स्पेक्ट गर्नुहोस् भने ब्राउजर डेभटुलहरू खुलाउनका लागि।\n2. तपाईंको \"एप्लिकेसन\" ट्याबमा जानुहोस् (Chrome, Edge, Brave इत्यादि) वा \"स्टोरेज\" ट्याबमा जानुहोस् (Firefox, Pale Moon इत्यादि)\n3. तपाईंको इन्सेक्ट गरेको ब्राउजर डेभटुलहरूमा \"कुकीहरू\" खण्डमा जानुहोस् अनि \"https://accounts.spotify.com\" उपकोणमा जानुहोस्'; @override String get step_3 => 'कदम 3'; @@ -672,16 +672,16 @@ class AppLocalizationsNe extends AppLocalizations { String get number_of_tracks_generate => 'बनाउनका लागि ट्र्याकहरूको संख्या'; @override - String get acousticness => 'एकोस्टिकनेस'; + String get not_acoustic => 'एकोस्टिकनेस'; @override - String get danceability => 'नृत्यक्षमता'; + String get dance_ability => 'नृत्यक्षमता'; @override String get energy => 'ऊर्जा'; @override - String get instrumentalness => 'साजा रहेकोता'; + String get not_instrumental => 'साजा रहेकोता'; @override String get liveness => 'प्राणिकता'; @@ -690,7 +690,7 @@ class AppLocalizationsNe extends AppLocalizations { String get loudness => 'शोर'; @override - String get speechiness => 'भाषण'; + String get talkative => 'भाषण'; @override String get valence => 'मानसिक स्वभाव'; @@ -809,7 +809,7 @@ class AppLocalizationsNe extends AppLocalizations { String get sleep_timer => 'सुत्ने टाइमर'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes मिनेटहरू'; } @@ -1207,15 +1207,15 @@ class AppLocalizationsNe extends AppLocalizations { String get owned_by_you => 'तपाईंले स्वामित्व गरेको'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl क्लिपबोर्डमा कपी गरियो'; } @override - String get spotify_hipotetical_calculation => '*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n\$0.003 देखि \$0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।'; + String get spotify_hypothetical_calculation => '*यो Spotify को प्रति स्ट्रीम भुगतानको आधारमा\n\$0.003 देखि \$0.005 को बीचमा गणना गरिएको हो। यो एक काल्पनिक\nगणना हो जसले प्रयोगकर्तालाई देखाउँछ कि उनीहरूले कति\nअर्टिस्टहरूलाई तिनीहरूका गीतहरू Spotify मा सुनेमा\nभुक्तान गर्नुपर्ने थियो।'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes मिनेट'; } diff --git a/lib/l10n/generated/app_localizations_nl.dart b/lib/l10n/generated/app_localizations_nl.dart index 3c17818f..94c61649 100644 --- a/lib/l10n/generated/app_localizations_nl.dart +++ b/lib/l10n/generated/app_localizations_nl.dart @@ -315,7 +315,7 @@ class AppLocalizationsNl extends AppLocalizations { String get shuffle_playlist => 'Afspeellijst schuifelen'; @override - String get unshuffle_playlist => 'Afspeellijst onschuifelen'; + String get not_shuffle_playlist => 'Afspeellijst onschuifelen'; @override String get previous_track => 'Vorige nummer'; @@ -590,7 +590,7 @@ class AppLocalizationsNl extends AppLocalizations { String get step_2 => 'Stap 2'; @override - String get step_2_steps => '1. Zodra je bent aangemeld, druk je op F12 of klik je met de rechtermuisknop > Inspect om de Browser devtools te openen.\n2. Ga vervolgens naar het tabblad \"Toepassing\" (Chrome, Edge, Brave enz..) of naar het tabblad \"Opslag\" (Firefox, Palemoon enz..).\n3. Ga naar de sectie \"Cookies\" en vervolgens naar de subsectie \"https://accounts.spotify.com\".'; + String get step_2_steps => '1. Zodra je bent aangemeld, druk je op F12 of klik je met de rechtermuisknop > Inspect om de Browser devtools te openen.\n2. Ga vervolgens naar het tabblad \"Toepassing\" (Chrome, Edge, Brave enz..) of naar het tabblad \"Opslag\" (Firefox, Pale Moon enz..).\n3. Ga naar de sectie \"Cookies\" en vervolgens naar de subsectie \"https://accounts.spotify.com\".'; @override String get step_3 => 'Stap 3'; @@ -672,16 +672,16 @@ class AppLocalizationsNl extends AppLocalizations { String get number_of_tracks_generate => 'Aantal nummers om te genereren'; @override - String get acousticness => 'Akoestiek'; + String get not_acoustic => 'Akoestiek'; @override - String get danceability => 'Dansbaarheid'; + String get dance_ability => 'Dansbaarheid'; @override String get energy => 'Energie'; @override - String get instrumentalness => 'Instrumentaliteit'; + String get not_instrumental => 'Instrumentaliteit'; @override String get liveness => 'Levendigheid'; @@ -690,7 +690,7 @@ class AppLocalizationsNl extends AppLocalizations { String get loudness => 'Luidheid'; @override - String get speechiness => 'Spraak'; + String get talkative => 'Spraak'; @override String get valence => 'Valentie'; @@ -755,7 +755,7 @@ class AppLocalizationsNl extends AppLocalizations { String get download_warning => 'Als je alle nummers in bulk downloadt, ben je duidelijk bezig met muziekpiraterij en breng je schade toe aan de creatieve muziekmaatschappij. Ik hoop dat je je hiervan bewust bent. Probeer altijd het harde werk van artiesten te respecteren en te steunen.'; @override - String get download_ip_ban_warning => 'BTW, je IP-adres kan worden geblokkeerd op YouTube als gevolg van buitensporige downloadverzoeken. IP-blokkering betekent dat je YouTube niet kunt gebruiken (zelfs als je ingelogd bent) voor tenminste 2-3 maanden vanaf dat IP-apparaat. Spotube is niet verantwoordelijk als dit ooit gebeurt.'; + String get download_ip_ban_warning => 'BTW, je IP-adres kan worden geblokkeerd op YouTube als gevolg van buitensporige downloadverzoeken. IP-blokkering betekent dat je YouTube niet kunt gebruiken (zelfs als je ingelogd bent) voor tenminuteste 2-3 maanden vanaf dat IP-apparaat. Spotube is niet verantwoordelijk als dit ooit gebeurt.'; @override String get by_clicking_accept_terms => 'Door op \'accepteren\' te klikken ga je akkoord met de volgende voorwaarden:'; @@ -809,7 +809,7 @@ class AppLocalizationsNl extends AppLocalizations { String get sleep_timer => 'Slaaptimer'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes minuten'; } @@ -848,7 +848,7 @@ class AppLocalizationsNl extends AppLocalizations { String get failed_to_encrypt => 'Versleuteling mislukt'; @override - String get encryption_failed_warning => 'Spotube gebruikt versleuteling om je gegevens veilig op te slaan. Maar dat is niet gelukt. Dus zal het terugvallen op onveilige opslag.\nAls je linux gebruikt, zorg er dan voor dat je een geheim-dienst (gnome-keyring, kde-wallet, keepassxc etc) hebt geïnstalleerd.'; + String get encryption_failed_warning => 'Spotube gebruikt versleuteling om je gegevens veilig op te slaan. Maar dat is niet gelukt. Dus zal het terugvallen op onveilige opslag.\nAls je linux gebruikt, zorg er dan voor dat je een geheim-dienst (gnome-keyring, kde-wallet, KeePassXC etc) hebt geïnstalleerd.'; @override String get querying_info => 'Info opvragen…'; @@ -1207,15 +1207,15 @@ class AppLocalizationsNl extends AppLocalizations { String get owned_by_you => 'Bezit door jou'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl gekopieerd naar klembord'; } @override - String get spotify_hipotetical_calculation => '*Dit is berekend op basis van Spotify\'s betaling per stream\nvan \$0.003 tot \$0.005. Dit is een hypothetische\nberekening om de gebruiker inzicht te geven in hoeveel ze\naan de artiesten zouden hebben betaald als ze hun liedjes op Spotify\nzouden luisteren.'; + String get spotify_hypothetical_calculation => '*Dit is berekend op basis van Spotify\'s betaling per stream\nvan \$0.003 tot \$0.005. Dit is een hypothetische\nberekening om de gebruiker inzicht te geven in hoeveel ze\naan de artiesten zouden hebben betaald als ze hun liedjes op Spotify\nzouden luisteren.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes min'; } diff --git a/lib/l10n/generated/app_localizations_pl.dart b/lib/l10n/generated/app_localizations_pl.dart index d4001f8f..5ae4aaed 100644 --- a/lib/l10n/generated/app_localizations_pl.dart +++ b/lib/l10n/generated/app_localizations_pl.dart @@ -315,7 +315,7 @@ class AppLocalizationsPl extends AppLocalizations { String get shuffle_playlist => 'Odtwarzaj losowo z playlisty'; @override - String get unshuffle_playlist => 'Nie odtwarzaj losowo z playlisty'; + String get not_shuffle_playlist => 'Nie odtwarzaj losowo z playlisty'; @override String get previous_track => 'Poprzedni utwór'; @@ -590,7 +590,7 @@ class AppLocalizationsPl extends AppLocalizations { String get step_2 => 'Krok 2'; @override - String get step_2_steps => '1. Jeśli jesteś zalogowany, naciśnij klawisz F12 lub Kliknij prawym przyciskiem myszy > Zbadaj, aby odtworzyć narzędzia developerskie.\n2. Następnie przejdź do zakładki \"Application\" (Chrome, Edge, Brave etc..) lub zakładki \"Storage\" (Firefox, Palemoon etc..)\n3. Przejdź do sekcji \"Cookies\" a następnie do pod-sekcji \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Jeśli jesteś zalogowany, naciśnij klawisz F12 lub Kliknij prawym przyciskiem myszy > Zbadaj, aby odtworzyć narzędzia developerskie.\n2. Następnie przejdź do zakładki \"Application\" (Chrome, Edge, Brave etc..) lub zakładki \"Storage\" (Firefox, Pale Moon etc..)\n3. Przejdź do sekcji \"Cookies\" a następnie do pod-sekcji \"https://accounts.spotify.com\"'; @override String get step_3 => 'Krok 3'; @@ -672,16 +672,16 @@ class AppLocalizationsPl extends AppLocalizations { String get number_of_tracks_generate => 'Liczba utworów do wygenerowania'; @override - String get acousticness => 'Akustyczna'; + String get not_acoustic => 'Akustyczna'; @override - String get danceability => 'Taneczna'; + String get dance_ability => 'Taneczna'; @override String get energy => 'Energiczna'; @override - String get instrumentalness => 'Instrumentalna'; + String get not_instrumental => 'Instrumentalna'; @override String get liveness => 'Żywa'; @@ -690,7 +690,7 @@ class AppLocalizationsPl extends AppLocalizations { String get loudness => 'Głośna'; @override - String get speechiness => 'Wymowna'; + String get talkative => 'Wymowna'; @override String get valence => 'Wartościowa'; @@ -809,7 +809,7 @@ class AppLocalizationsPl extends AppLocalizations { String get sleep_timer => 'Minutnik'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Minuty'; } @@ -848,7 +848,7 @@ class AppLocalizationsPl extends AppLocalizations { String get failed_to_encrypt => 'Nie można zaszyfrować :('; @override - String get encryption_failed_warning => 'Spotube używa szyfrowania do bezpiecznego przechowywania danych. Ale nie udało się tego zrobić. Więc powróci do niezabezpieczonego przechowywania\nJeśli używasz Linuksa, upewnij się, że masz zainstalowane jakieś usługi do szyfrowania (gnome-keyring, kde-wallet, keepassxc itp.)'; + String get encryption_failed_warning => 'Spotube używa szyfrowania do bezpiecznego przechowywania danych. Ale nie udało się tego zrobić. Więc powróci do niezabezpieczonego przechowywania\nJeśli używasz Linuksa, upewnij się, że masz zainstalowane jakieś usługi do szyfrowania (gnome-keyring, kde-wallet, KeePassXC itp.)'; @override String get querying_info => 'Szukam informacji...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsPl extends AppLocalizations { String get owned_by_you => 'Własność Twoja'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl skopiowano do schowka'; } @override - String get spotify_hipotetical_calculation => '*Obliczone na podstawie płatności Spotify za strumień\nw zakresie od \$0.003 do \$0.005. Jest to hipotetyczne\nobliczenie mające na celu pokazanie użytkownikowi, ile\nzapłaciliby artystom, gdyby słuchali ich utworów na Spotify.'; + String get spotify_hypothetical_calculation => '*Obliczone na podstawie płatności Spotify za strumień\nw zakresie od \$0.003 do \$0.005. Jest to hipotetyczne\nobliczenie mające na celu pokazanie użytkownikowi, ile\nzapłaciliby artystom, gdyby słuchali ich utworów na Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes min'; } diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 87ac9bfa..35c675d8 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -315,7 +315,7 @@ class AppLocalizationsPt extends AppLocalizations { String get shuffle_playlist => 'Embaralhar playlist'; @override - String get unshuffle_playlist => 'Desembaralhar playlist'; + String get not_shuffle_playlist => 'Desembaralhar playlist'; @override String get previous_track => 'Faixa anterior'; @@ -590,7 +590,7 @@ class AppLocalizationsPt extends AppLocalizations { String get step_2 => 'Passo 2'; @override - String get step_2_steps => '1. Uma vez logado, pressione F12 ou clique com o botão direito do mouse > Inspecionar para abrir as ferramentas de desenvolvimento do navegador.\n2. Em seguida, vá para a guia \"Aplicativo\" (Chrome, Edge, Brave, etc.) ou \"Armazenamento\" (Firefox, Palemoon, etc.)\n3. Acesse a seção \"Cookies\" e depois a subseção \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Uma vez logado, pressione F12 ou clique com o botão direito do mouse > Inspecionar para abrir as ferramentas de desenvolvimento do navegador.\n2. Em seguida, vá para a guia \"Aplicativo\" (Chrome, Edge, Brave, etc.) ou \"Armazenamento\" (Firefox, Pale Moon, etc.)\n3. Acesse a seção \"Cookies\" e depois a subseção \"https://accounts.spotify.com\"'; @override String get step_3 => 'Passo 3'; @@ -672,16 +672,16 @@ class AppLocalizationsPt extends AppLocalizations { String get number_of_tracks_generate => 'Número de faixas a gerar'; @override - String get acousticness => 'Acústica'; + String get not_acoustic => 'Acústica'; @override - String get danceability => 'Dançabilidade'; + String get dance_ability => 'Dançabilidade'; @override String get energy => 'Energia'; @override - String get instrumentalness => 'Instrumentalidade'; + String get not_instrumental => 'Instrumentalidade'; @override String get liveness => 'Vivacidade'; @@ -690,7 +690,7 @@ class AppLocalizationsPt extends AppLocalizations { String get loudness => 'Volume'; @override - String get speechiness => 'Discurso'; + String get talkative => 'Discurso'; @override String get valence => 'Valência'; @@ -809,7 +809,7 @@ class AppLocalizationsPt extends AppLocalizations { String get sleep_timer => 'Temporizador de Sono'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Minutos'; } @@ -848,7 +848,7 @@ class AppLocalizationsPt extends AppLocalizations { String get failed_to_encrypt => 'Falha ao criptografar'; @override - String get encryption_failed_warning => 'O Spotube usa criptografia para armazenar seus dados com segurança, mas falhou em fazê-lo. Portanto, ele voltará para o armazenamento não seguro.\nSe você estiver usando o Linux, certifique-se de ter algum serviço secreto (gnome-keyring, kde-wallet, keepassxc, etc.) instalado'; + String get encryption_failed_warning => 'O Spotube usa criptografia para armazenar seus dados com segurança, mas falhou em fazê-lo. Portanto, ele voltará para o armazenamento não seguro.\nSe você estiver usando o Linux, certifique-se de ter algum serviço secreto (gnome-keyring, kde-wallet, KeePassXC, etc.) instalado'; @override String get querying_info => 'Consultando informações...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsPt extends AppLocalizations { String get owned_by_you => 'De sua propriedade'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl copiado para a área de transferência'; } @override - String get spotify_hipotetical_calculation => '*Isso é calculado com base no pagamento por stream do Spotify\nque varia de \$0.003 a \$0.005. Esta é uma cálculo hipotético\npara dar ao usuário uma visão de quanto teriam pago aos artistas\nse eles ouvissem suas músicas no Spotify.'; + String get spotify_hypothetical_calculation => '*Isso é calculado com base no pagamento por stream do Spotify\nque varia de \$0.003 a \$0.005. Esta é uma cálculo hipotético\npara dar ao usuário uma visão de quanto teriam pago aos artistas\nse eles ouvissem suas músicas no Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes min'; } diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 7f38bb57..71c28202 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -315,7 +315,7 @@ class AppLocalizationsRu extends AppLocalizations { String get shuffle_playlist => 'Перемешать плейлист'; @override - String get unshuffle_playlist => 'Снять перемешивание плейлиста'; + String get not_shuffle_playlist => 'Снять перемешивание плейлиста'; @override String get previous_track => 'Предыдущий трек'; @@ -590,7 +590,7 @@ class AppLocalizationsRu extends AppLocalizations { String get step_2 => 'Шаг 2'; @override - String get step_2_steps => '1. После входа в систему нажмите F12 или щелкните правой кнопкой мыши > «Проверить», чтобы открыть инструменты разработчика браузера.\n2. Затем перейдите на вкладку \"Application\" (Chrome, Edge, Brave и т.д..) or \"Storage\" (Firefox, Palemoon и т.д..)\n3. Перейдите в раздел \"Cookies\", а затем в подраздел \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. После входа в систему нажмите F12 или щелкните правой кнопкой мыши > «Проверить», чтобы открыть инструменты разработчика браузера.\n2. Затем перейдите на вкладку \"Application\" (Chrome, Edge, Brave и т.д..) or \"Storage\" (Firefox, Pale Moon и т.д..)\n3. Перейдите в раздел \"Cookies\", а затем в подраздел \"https://accounts.spotify.com\"'; @override String get step_3 => 'Шаг 3'; @@ -672,16 +672,16 @@ class AppLocalizationsRu extends AppLocalizations { String get number_of_tracks_generate => 'Количество треков для создания'; @override - String get acousticness => 'Акустичность'; + String get not_acoustic => 'Акустичность'; @override - String get danceability => 'Ритмичность'; + String get dance_ability => 'Ритмичность'; @override String get energy => 'Энергичность'; @override - String get instrumentalness => 'Инструментальность'; + String get not_instrumental => 'Инструментальность'; @override String get liveness => 'Живость'; @@ -690,7 +690,7 @@ class AppLocalizationsRu extends AppLocalizations { String get loudness => 'Громкость'; @override - String get speechiness => 'Речевой характер'; + String get talkative => 'Речевой характер'; @override String get valence => 'Значимость'; @@ -809,7 +809,7 @@ class AppLocalizationsRu extends AppLocalizations { String get sleep_timer => 'Таймер сна'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Минут'; } @@ -848,7 +848,7 @@ class AppLocalizationsRu extends AppLocalizations { String get failed_to_encrypt => 'Не удалось зашифровать'; @override - String get encryption_failed_warning => 'Spotube использует шифрование для безопасного хранения ваших данных. Однако в этом случае произошла ошибка. Поэтому будет использовано небезопасное хранилище.\nЕсли вы используете Linux, убедитесь, что у вас установлен какой-либо инструмент для работы с секретами (gnome-keyring, kde-wallet, keepassxc и т.д.)'; + String get encryption_failed_warning => 'Spotube использует шифрование для безопасного хранения ваших данных. Однако в этом случае произошла ошибка. Поэтому будет использовано небезопасное хранилище.\nЕсли вы используете Linux, убедитесь, что у вас установлен какой-либо инструмент для работы с секретами (gnome-keyring, kde-wallet, KeePassXC и т.д.)'; @override String get querying_info => 'Запрос информации...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsRu extends AppLocalizations { String get owned_by_you => 'Ваша собственность'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl скопировано в буфер обмена'; } @override - String get spotify_hipotetical_calculation => '*Это рассчитано на основе выплат Spotify за стрим\nот \$0.003 до \$0.005. Это гипотетический расчет,\nчтобы дать пользователю представление о том, сколько бы он\nзаплатил артистам, если бы слушал их песни на Spotify.'; + String get spotify_hypothetical_calculation => '*Это рассчитано на основе выплат Spotify за стрим\nот \$0.003 до \$0.005. Это гипотетический расчет,\nчтобы дать пользователю представление о том, сколько бы он\nзаплатил артистам, если бы слушал их песни на Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes мин'; } diff --git a/lib/l10n/generated/app_localizations_ta.dart b/lib/l10n/generated/app_localizations_ta.dart index be0826b6..fb65efc7 100644 --- a/lib/l10n/generated/app_localizations_ta.dart +++ b/lib/l10n/generated/app_localizations_ta.dart @@ -315,7 +315,7 @@ class AppLocalizationsTa extends AppLocalizations { String get shuffle_playlist => 'பாடல் பட்டியலை கலக்கு'; @override - String get unshuffle_playlist => 'பாடல் பட்டியலை கலக்காதே'; + String get not_shuffle_playlist => 'பாடல் பட்டியலை கலக்காதே'; @override String get previous_track => 'முந்தைய பாடல்'; @@ -590,7 +590,7 @@ class AppLocalizationsTa extends AppLocalizations { String get step_2 => 'இரண்டாம் படி'; @override - String get step_2_steps => '1. நீங்கள் உள்நுழைந்தவுடன், F12 ஐ அழுத்தவும் அல்லது வலது கிளிக் செய்து > ஆய்வு செய்யவும் உலாவி டெவ்டூல்களைத் திறக்கவும்.\n2. பின்னர் \"பயன்பாடு\" தாவலுக்குச் செல்லவும் (Chrome, Edge, Brave போன்றவை) அல்லது \"சேமிப்பகம்\" தாவல் (Firefox, Palemoon போன்றவை)\n3. \"குக்கிகள்\" பிரிவுக்குச் சென்று பின்னர் \"https://accounts.spotify.com\" பிரிவுக்குச் செல்லவும்'; + String get step_2_steps => '1. நீங்கள் உள்நுழைந்தவுடன், F12 ஐ அழுத்தவும் அல்லது வலது கிளிக் செய்து > ஆய்வு செய்யவும் உலாவி டெவ்டூல்களைத் திறக்கவும்.\n2. பின்னர் \"பயன்பாடு\" தாவலுக்குச் செல்லவும் (Chrome, Edge, Brave போன்றவை) அல்லது \"சேமிப்பகம்\" தாவல் (Firefox, Pale Moon போன்றவை)\n3. \"குக்கிகள்\" பிரிவுக்குச் சென்று பின்னர் \"https://accounts.spotify.com\" பிரிவுக்குச் செல்லவும்'; @override String get step_3 => 'மூன்றாம் படி'; @@ -672,16 +672,16 @@ class AppLocalizationsTa extends AppLocalizations { String get number_of_tracks_generate => 'உருவாக்க வேண்டிய பாடல்களின் எண்ணிக்கை'; @override - String get acousticness => 'அகவுஸ்டிக்னெஸ்'; + String get not_acoustic => 'அகவுஸ்டிக்னெஸ்'; @override - String get danceability => 'நடனத்தன்மை'; + String get dance_ability => 'நடனத்தன்மை'; @override String get energy => 'ஆற்றல்'; @override - String get instrumentalness => 'கருவித்தன்மை'; + String get not_instrumental => 'கருவித்தன்மை'; @override String get liveness => 'உயிர்ப்புத்தன்மை'; @@ -690,7 +690,7 @@ class AppLocalizationsTa extends AppLocalizations { String get loudness => 'ஒலி அளவு'; @override - String get speechiness => 'பேச்சுத்தன்மை'; + String get talkative => 'பேச்சுத்தன்மை'; @override String get valence => 'உணர்வு'; @@ -809,7 +809,7 @@ class AppLocalizationsTa extends AppLocalizations { String get sleep_timer => 'உறக்க நேரம்'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes நிமிடங்கள்'; } @@ -848,7 +848,7 @@ class AppLocalizationsTa extends AppLocalizations { String get failed_to_encrypt => 'குறியாக்கம் தோல்வியடைந்தது'; @override - String get encryption_failed_warning => 'Spotube உங்கள் தரவை பாதுகாப்பாக சேமிக்க குறியாக்கத்தைப் பயன்படுத்துகிறது. ஆனால் அவ்வாறு செய்ய முடியவில்லை. எனவே இது பாதுகாப்பற்ற சேமிப்பகத்திற்கு மாறும்\nநீங்கள் லினக்ஸ் பயன்படுத்துகிறீர்கள் என்றால், எந்த ரகசிய சேவையும் (gnome-keyring, kde-wallet, keepassxc போன்றவை) நிறுவப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும்'; + String get encryption_failed_warning => 'Spotube உங்கள் தரவை பாதுகாப்பாக சேமிக்க குறியாக்கத்தைப் பயன்படுத்துகிறது. ஆனால் அவ்வாறு செய்ய முடியவில்லை. எனவே இது பாதுகாப்பற்ற சேமிப்பகத்திற்கு மாறும்\nநீங்கள் லினக்ஸ் பயன்படுத்துகிறீர்கள் என்றால், எந்த ரகசிய சேவையும் (gnome-keyring, kde-wallet, KeePassXC போன்றவை) நிறுவப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும்'; @override String get querying_info => 'தகவலைக் கேட்கிறது...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsTa extends AppLocalizations { String get owned_by_you => 'உங்களால் கொண்டது'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return 'நகலெடுக்கப்பட்டது $shareUrl கிளிப்போர்டுக்காக'; } @override - String get spotify_hipotetical_calculation => '*இது Spotify இன் ஒவ்வொரு ஸ்ட்ரீமிற்கும்\n\$0.003 முதல் \$0.005 வரை அளவீடு அடிப்படையில் கணக்கிடப்படுகிறது. இது ஒரு கற்பனை\nகணக்கீடு ஆகும், பயனர் எந்த அளவிற்கு கலைஞர்களுக்கு\nஅதோர் பாடலை Spotify மென்பொருளில் கேட்டால் எவ்வளவு பணம் செலுத்தினார்கள் என்பதைக் கண்டுபிடிக்க.'; + String get spotify_hypothetical_calculation => '*இது Spotify இன் ஒவ்வொரு ஸ்ட்ரீமிற்கும்\n\$0.003 முதல் \$0.005 வரை அளவீடு அடிப்படையில் கணக்கிடப்படுகிறது. இது ஒரு கற்பனை\nகணக்கீடு ஆகும், பயனர் எந்த அளவிற்கு கலைஞர்களுக்கு\nஅதோர் பாடலை Spotify மென்பொருளில் கேட்டால் எவ்வளவு பணம் செலுத்தினார்கள் என்பதைக் கண்டுபிடிக்க.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes நிமிடங்கள்'; } diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index 679a12da..86a8b940 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -315,7 +315,7 @@ class AppLocalizationsTh extends AppLocalizations { String get shuffle_playlist => 'สุ่มเพลย์ลิสต์'; @override - String get unshuffle_playlist => 'ยกเลิกการสุ่มเพลย์ลิสต์'; + String get not_shuffle_playlist => 'ยกเลิกการสุ่มเพลย์ลิสต์'; @override String get previous_track => 'แทร็กก่อนหน้า'; @@ -590,7 +590,7 @@ class AppLocalizationsTh extends AppLocalizations { String get step_2 => 'ขั้นที่ 2'; @override - String get step_2_steps => '1. หลังจากเข้าสู่ระบบแล้ว กด F12 หรือ คลิกขวาที่เมาส์ > ตรวจสอบเพื่อเปิด Devtools เบราว์เซอร์\n2. จากนั้นไปที่แท็บ \"แอปพลิเคชัน\" (Chrome, Edge, Brave เป็นต้น) หรือแท็บ \"ที่เก็บข้อมูล\" (Firefox, Palemoon เป็นต้น)\n3. ไปที่ส่วน \"คุกกี้\" แล้วไปที่ subsection \"https: //accounts.spotify.com\"'; + String get step_2_steps => '1. หลังจากเข้าสู่ระบบแล้ว กด F12 หรือ คลิกขวาที่เมาส์ > ตรวจสอบเพื่อเปิด Devtools เบราว์เซอร์\n2. จากนั้นไปที่แท็บ \"แอปพลิเคชัน\" (Chrome, Edge, Brave เป็นต้น) หรือแท็บ \"ที่เก็บข้อมูล\" (Firefox, Pale Moon เป็นต้น)\n3. ไปที่ส่วน \"คุกกี้\" แล้วไปที่ subsection \"https: //accounts.spotify.com\"'; @override String get step_3 => 'ขั้นที่ 3'; @@ -672,16 +672,16 @@ class AppLocalizationsTh extends AppLocalizations { String get number_of_tracks_generate => 'จำนวนแทร็กที่จะสร้าง'; @override - String get acousticness => 'อะคูสติก'; + String get not_acoustic => 'อะคูสติก'; @override - String get danceability => 'ความสามารถในการเต้น'; + String get dance_ability => 'ความสามารถในการเต้น'; @override String get energy => 'พลัง'; @override - String get instrumentalness => 'บรรเลง'; + String get not_instrumental => 'บรรเลง'; @override String get liveness => 'ความสด'; @@ -690,7 +690,7 @@ class AppLocalizationsTh extends AppLocalizations { String get loudness => 'ความดัง'; @override - String get speechiness => 'การพูด'; + String get talkative => 'การพูด'; @override String get valence => 'ความสุข'; @@ -809,7 +809,7 @@ class AppLocalizationsTh extends AppLocalizations { String get sleep_timer => 'ตั้งเวลาปิด'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes นาที'; } @@ -848,7 +848,7 @@ class AppLocalizationsTh extends AppLocalizations { String get failed_to_encrypt => 'เข้ารหัสล้มเหลว'; @override - String get encryption_failed_warning => 'Spotube ใช้การเข้ารหัสเพื่อเก็บข้อมูลของคุณอย่างปลอดภัย แต่ไม่สามารถทำได้ ดังนั้นจะเปลี่ยนเป็นการจัดเก็บที่ไม่ปลอดภัย\nหากคุณใช้ Linux โปรดตรวจสอบว่าคุณได้ติดตั้งบริการลับ (gnome-keyring, kde-wallet, keepassxc เป็นต้น)'; + String get encryption_failed_warning => 'Spotube ใช้การเข้ารหัสเพื่อเก็บข้อมูลของคุณอย่างปลอดภัย แต่ไม่สามารถทำได้ ดังนั้นจะเปลี่ยนเป็นการจัดเก็บที่ไม่ปลอดภัย\nหากคุณใช้ Linux โปรดตรวจสอบว่าคุณได้ติดตั้งบริการลับ (gnome-keyring, kde-wallet, KeePassXC เป็นต้น)'; @override String get querying_info => 'กำลังดึงข้อมูล...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsTh extends AppLocalizations { String get owned_by_you => 'เป็นเจ้าของโดยคุณ'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl คัดลอกไปที่คลิปบอร์ดแล้ว'; } @override - String get spotify_hipotetical_calculation => '*คำนวณตามการจ่ายต่อสตรีมของ Spotify\nซึ่งอยู่ในช่วง \$0.003 ถึง \$0.005 นี่เป็นการคำนวณสมมุติ\nเพื่อให้ผู้ใช้ทราบว่าพวกเขาจะจ่ายเงินให้ศิลปินเท่าไหร่\nหากพวกเขาฟังเพลงของพวกเขาใน Spotify.'; + String get spotify_hypothetical_calculation => '*คำนวณตามการจ่ายต่อสตรีมของ Spotify\nซึ่งอยู่ในช่วง \$0.003 ถึง \$0.005 นี่เป็นการคำนวณสมมุติ\nเพื่อให้ผู้ใช้ทราบว่าพวกเขาจะจ่ายเงินให้ศิลปินเท่าไหร่\nหากพวกเขาฟังเพลงของพวกเขาใน Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes นาที'; } diff --git a/lib/l10n/generated/app_localizations_tl.dart b/lib/l10n/generated/app_localizations_tl.dart index 49452c3b..76757e90 100644 --- a/lib/l10n/generated/app_localizations_tl.dart +++ b/lib/l10n/generated/app_localizations_tl.dart @@ -315,7 +315,7 @@ class AppLocalizationsTl extends AppLocalizations { String get shuffle_playlist => 'I-shuffle ang playlist'; @override - String get unshuffle_playlist => 'I-unshuffle ang playlist'; + String get not_shuffle_playlist => 'I-unshuffle ang playlist'; @override String get previous_track => 'Nakaraang track'; @@ -590,7 +590,7 @@ class AppLocalizationsTl extends AppLocalizations { String get step_2 => 'Hakbang 2'; @override - String get step_2_steps => '1. Kapag naka-log in ka na, pindutin ang F12 o i-right click ang Mouse > Inspect para Buksan ang Browser devtools.\n2. Pagkatapos ay pumunta sa \"Application\" Tab (Chrome, Edge, Brave atbp..) o \"Storage\" Tab (Firefox, Palemoon atbp..)\n3. Pumunta sa \"Cookies\" na seksyon at pagkatapos sa \"https://accounts.spotify.com\" na subseksyon'; + String get step_2_steps => '1. Kapag naka-log in ka na, pindutin ang F12 o i-right click ang Mouse > Inspect para Buksan ang Browser devtools.\n2. Pagkatapos ay pumunta sa \"Application\" Tab (Chrome, Edge, Brave atbp..) o \"Storage\" Tab (Firefox, Pale Moon atbp..)\n3. Pumunta sa \"Cookies\" na seksyon at pagkatapos sa \"https://accounts.spotify.com\" na subseksyon'; @override String get step_3 => 'Hakbang 3'; @@ -672,16 +672,16 @@ class AppLocalizationsTl extends AppLocalizations { String get number_of_tracks_generate => 'Bilang ng mga track na gagawin'; @override - String get acousticness => 'Acoustic-ness'; + String get not_acoustic => 'Acoustic-ness'; @override - String get danceability => 'Kakayahang Sayawin'; + String get dance_ability => 'Kakayahang Sayawin'; @override String get energy => 'Enerhiya'; @override - String get instrumentalness => 'Instrumental-ness'; + String get not_instrumental => 'Instrumental-ness'; @override String get liveness => 'Liveness'; @@ -690,7 +690,7 @@ class AppLocalizationsTl extends AppLocalizations { String get loudness => 'Lakas'; @override - String get speechiness => 'Pagsasalita'; + String get talkative => 'Pagsasalita'; @override String get valence => 'Valence'; @@ -809,7 +809,7 @@ class AppLocalizationsTl extends AppLocalizations { String get sleep_timer => 'Sleep Timer'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Minuto'; } @@ -848,7 +848,7 @@ class AppLocalizationsTl extends AppLocalizations { String get failed_to_encrypt => 'Nabigong i-encrypt'; @override - String get encryption_failed_warning => 'Gumagamit ng encryption ang Spotube para ligtas na i-store ang iyong data. Ngunit nabigo. Kaya babalik ito sa hindi secure na storage\nKung gumagamit ka ng linux, mangyaring tiyakin na mayroon kang anumang secret-service na naka-install (gnome-keyring, kde-wallet, keepassxc atbp)'; + String get encryption_failed_warning => 'Gumagamit ng encryption ang Spotube para ligtas na i-store ang iyong data. Ngunit nabigo. Kaya babalik ito sa hindi secure na storage\nKung gumagamit ka ng linux, mangyaring tiyakin na mayroon kang anumang secret-service na naka-install (gnome-keyring, kde-wallet, KeePassXC atbp)'; @override String get querying_info => 'Kinukuha ang impormasyon...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsTl extends AppLocalizations { String get owned_by_you => 'Pag-aari mo'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return 'Na-kopya ang $shareUrl sa clipboard'; } @override - String get spotify_hipotetical_calculation => '*Ito ay kinalkula batay sa bawat stream\nna bayad ng Spotify na \$0.003 hanggang \$0.005. Ito ay isang hypothetical\nna pagkalkula para bigyan ang user ng ideya kung magkano\nang kanilang ibabayad sa mga artista kung sila ay nakikinig\nng kanilang kanta sa Spotify.'; + String get spotify_hypothetical_calculation => '*Ito ay kinalkula batay sa bawat stream\nna bayad ng Spotify na \$0.003 hanggang \$0.005. Ito ay isang hypothetical\nna pagkalkula para bigyan ang user ng ideya kung magkano\nang kanilang ibabayad sa mga artista kung sila ay nakikinig\nng kanilang kanta sa Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes minuto'; } diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 11a78620..5e1f6d7d 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -315,7 +315,7 @@ class AppLocalizationsTr extends AppLocalizations { String get shuffle_playlist => 'Oynatma listesini karıştır'; @override - String get unshuffle_playlist => 'Oynatma listesinin karışıklığını kaldır'; + String get not_shuffle_playlist => 'Oynatma listesinin karışıklığını kaldır'; @override String get previous_track => 'Önceki parça'; @@ -590,7 +590,7 @@ class AppLocalizationsTr extends AppLocalizations { String get step_2 => '2. Adım'; @override - String get step_2_steps => '1. Oturum açtıktan sonra, tarayıcı geliştirme araçlarını açmak için F12\'ye veya fareye sağ tıklayın > İncele\'ye basın.\n2. Daha sonra \"Uygulama\" sekmesine (Chrome, Edge, Brave vb..) veya \"Depolama\" sekmesine (Firefox, Palemoon vb..) gidin\n3. \"Çerezler\" bölümüne, ardından \"https://accounts.spotify.com\" alt bölümüne gidin'; + String get step_2_steps => '1. Oturum açtıktan sonra, tarayıcı geliştirme araçlarını açmak için F12\'ye veya fareye sağ tıklayın > İncele\'ye basın.\n2. Daha sonra \"Uygulama\" sekmesine (Chrome, Edge, Brave vb..) veya \"Depolama\" sekmesine (Firefox, Pale Moon vb..) gidin\n3. \"Çerezler\" bölümüne, ardından \"https://accounts.spotify.com\" alt bölümüne gidin'; @override String get step_3 => '3. Adım'; @@ -672,16 +672,16 @@ class AppLocalizationsTr extends AppLocalizations { String get number_of_tracks_generate => 'Oluşturulacak parça sayısı'; @override - String get acousticness => 'Akustiklik'; + String get not_acoustic => 'Akustiklik'; @override - String get danceability => 'Dans Edilebilirlik'; + String get dance_ability => 'Dans Edilebilirlik'; @override String get energy => 'Enerji'; @override - String get instrumentalness => 'Araçsallık'; + String get not_instrumental => 'Araçsallık'; @override String get liveness => 'Canlılık'; @@ -690,7 +690,7 @@ class AppLocalizationsTr extends AppLocalizations { String get loudness => 'Ses yüksekliği'; @override - String get speechiness => 'Konuşkanlık'; + String get talkative => 'Konuşkanlık'; @override String get valence => 'Değerlik'; @@ -809,7 +809,7 @@ class AppLocalizationsTr extends AppLocalizations { String get sleep_timer => 'Uyku Zamanlayıcısı'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Dakika'; } @@ -848,7 +848,7 @@ class AppLocalizationsTr extends AppLocalizations { String get failed_to_encrypt => 'Şifreleme başarısız oldu'; @override - String get encryption_failed_warning => 'Spotube, verilerinizi güvenli bir şekilde depolamak için şifreleme kullanır. Ancak bunu başaramadı. Bu nedenle, güvensiz depolamaya geri dönecektir\nLinux kullanıyorsanız, lütfen gnome-keyring, kde-wallet, keepassxc vb. herhangi bir gizli servisin yüklü olduğundan emin olun.'; + String get encryption_failed_warning => 'Spotube, verilerinizi güvenli bir şekilde depolamak için şifreleme kullanır. Ancak bunu başaramadı. Bu nedenle, güvensiz depolamaya geri dönecektir\nLinux kullanıyorsanız, lütfen gnome-keyring, kde-wallet, KeePassXC vb. herhangi bir gizli servisin yüklü olduğundan emin olun.'; @override String get querying_info => 'Bilgi sorgulanıyor...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsTr extends AppLocalizations { String get owned_by_you => 'Sahip olduğunuz'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl panoya kopyalandı'; } @override - String get spotify_hipotetical_calculation => '*Bu, Spotify\'ın her yayın başına ödemenin\n\$0.003 ile \$0.005 arasında olduğu varsayımıyla hesaplanmıştır. Bu\nhipotetik bir hesaplamadır, kullanıcıya şarkılarını Spotify\'da dinlediklerinde\nsanatçılara ne kadar ödeme yapacaklarını gösterir.'; + String get spotify_hypothetical_calculation => '*Bu, Spotify\'ın her yayın başına ödemenin\n\$0.003 ile \$0.005 arasında olduğu varsayımıyla hesaplanmıştır. Bu\nhipotetik bir hesaplamadır, kullanıcıya şarkılarını Spotify\'da dinlediklerinde\nsanatçılara ne kadar ödeme yapacaklarını gösterir.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes dk'; } diff --git a/lib/l10n/generated/app_localizations_uk.dart b/lib/l10n/generated/app_localizations_uk.dart index 2511b2c2..2bec6823 100644 --- a/lib/l10n/generated/app_localizations_uk.dart +++ b/lib/l10n/generated/app_localizations_uk.dart @@ -315,7 +315,7 @@ class AppLocalizationsUk extends AppLocalizations { String get shuffle_playlist => 'Випадковий порядок відтворення плейлиста'; @override - String get unshuffle_playlist => 'Відключити випадковий порядок відтворення плейлиста'; + String get not_shuffle_playlist => 'Відключити випадковий порядок відтворення плейлиста'; @override String get previous_track => 'Попередній трек'; @@ -590,7 +590,7 @@ class AppLocalizationsUk extends AppLocalizations { String get step_2 => 'Крок 2'; @override - String get step_2_steps => '1. Після входу натисніть F12 або клацніть правою кнопкою миші > Інспектувати, щоб відкрити інструменти розробки браузера.\n2. Потім перейдіть на вкладку \'Програма\' (Chrome, Edge, Brave тощо) або вкладку \'Сховище\' (Firefox, Palemoon тощо).\n3. Перейдіть до розділу \'Кукі-файли\', а потім до підрозділу \'https://accounts.spotify.com\''; + String get step_2_steps => '1. Після входу натисніть F12 або клацніть правою кнопкою миші > Інспектувати, щоб відкрити інструменти розробки браузера.\n2. Потім перейдіть на вкладку \'Програма\' (Chrome, Edge, Brave тощо) або вкладку \'Сховище\' (Firefox, Pale Moon тощо).\n3. Перейдіть до розділу \'Кукі-файли\', а потім до підрозділу \'https://accounts.spotify.com\''; @override String get step_3 => 'Крок 3'; @@ -672,16 +672,16 @@ class AppLocalizationsUk extends AppLocalizations { String get number_of_tracks_generate => 'Кількість треків для створення'; @override - String get acousticness => 'Акустичність'; + String get not_acoustic => 'Акустичність'; @override - String get danceability => 'Танцювальність'; + String get dance_ability => 'Танцювальність'; @override String get energy => 'Енергія'; @override - String get instrumentalness => 'Інструментальність'; + String get not_instrumental => 'Інструментальність'; @override String get liveness => 'Живість'; @@ -690,7 +690,7 @@ class AppLocalizationsUk extends AppLocalizations { String get loudness => 'Гучність'; @override - String get speechiness => 'Розмовність'; + String get talkative => 'Розмовність'; @override String get valence => 'Валентність'; @@ -809,7 +809,7 @@ class AppLocalizationsUk extends AppLocalizations { String get sleep_timer => 'Таймер сну'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes хвилин'; } @@ -848,7 +848,7 @@ class AppLocalizationsUk extends AppLocalizations { String get failed_to_encrypt => 'Не вдалося зашифрувати'; @override - String get encryption_failed_warning => 'Spotube використовує шифрування для безпечного зберігання ваших даних. Але не вдалося цього зробити. Тому він перейде до небезпечного зберігання\nЯкщо ви використовуєте Linux, переконайтеся, що у вас встановлено будь-який секретний сервіс (gnome-keyring, kde-wallet, keepassxc тощо)'; + String get encryption_failed_warning => 'Spotube використовує шифрування для безпечного зберігання ваших даних. Але не вдалося цього зробити. Тому він перейде до небезпечного зберігання\nЯкщо ви використовуєте Linux, переконайтеся, що у вас встановлено будь-який секретний сервіс (gnome-keyring, kde-wallet, KeePassXC тощо)'; @override String get querying_info => 'Запит інформації...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsUk extends AppLocalizations { String get owned_by_you => 'Ваша власність'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl скопійовано в буфер обміну'; } @override - String get spotify_hipotetical_calculation => '*Це розраховано на основі виплат Spotify за стрім\nвід \$0.003 до \$0.005. Це гіпотетичний розрахунок,\nщоб дати користувачеві уявлення про те, скільки б він заплатив\nартистам, якби слухав їхні пісні на Spotify.'; + String get spotify_hypothetical_calculation => '*Це розраховано на основі виплат Spotify за стрім\nвід \$0.003 до \$0.005. Це гіпотетичний розрахунок,\nщоб дати користувачеві уявлення про те, скільки б він заплатив\nартистам, якби слухав їхні пісні на Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes хв'; } diff --git a/lib/l10n/generated/app_localizations_vi.dart b/lib/l10n/generated/app_localizations_vi.dart index 0f773578..e31e03d6 100644 --- a/lib/l10n/generated/app_localizations_vi.dart +++ b/lib/l10n/generated/app_localizations_vi.dart @@ -315,7 +315,7 @@ class AppLocalizationsVi extends AppLocalizations { String get shuffle_playlist => 'Xáo trộn bài hát'; @override - String get unshuffle_playlist => 'Hủy xáo trộn bài hát'; + String get not_shuffle_playlist => 'Hủy xáo trộn bài hát'; @override String get previous_track => 'Bài hát trước'; @@ -590,7 +590,7 @@ class AppLocalizationsVi extends AppLocalizations { String get step_2 => 'Bước 2'; @override - String get step_2_steps => '1. Sau khi đăng nhập, nhấn F12 hoặc Chuột phải > Mở devtools của trình duyệt.\n2. Sau đó, chuyển đến Tab \"Ứng dụng/Application\" (Chrome, Edge, Brave, v.v.) hoặc Tab \"Lưu trữ/Storage\" (Firefox, Palemoon, v.v.)\n3. Chuyển đến phần \"Cookie\" sau đó phần con \"https://accounts.spotify.com\"'; + String get step_2_steps => '1. Sau khi đăng nhập, nhấn F12 hoặc Chuột phải > Mở devtools của trình duyệt.\n2. Sau đó, chuyển đến Tab \"Ứng dụng/Application\" (Chrome, Edge, Brave, v.v.) hoặc Tab \"Lưu trữ/Storage\" (Firefox, Pale Moon, v.v.)\n3. Chuyển đến phần \"Cookie\" sau đó phần con \"https://accounts.spotify.com\"'; @override String get step_3 => 'Bước 3'; @@ -672,16 +672,16 @@ class AppLocalizationsVi extends AppLocalizations { String get number_of_tracks_generate => 'Số lượng bài hát để tạo'; @override - String get acousticness => 'Độ âm thanh'; + String get not_acoustic => 'Độ âm thanh'; @override - String get danceability => 'Khả năng nhảy'; + String get dance_ability => 'Khả năng nhảy'; @override String get energy => 'Năng lượng'; @override - String get instrumentalness => 'Độ nhạc cụ'; + String get not_instrumental => 'Độ nhạc cụ'; @override String get liveness => 'Sống động'; @@ -690,7 +690,7 @@ class AppLocalizationsVi extends AppLocalizations { String get loudness => 'Độ ồn'; @override - String get speechiness => 'Độ nói'; + String get talkative => 'Độ nói'; @override String get valence => 'Tính tích cực'; @@ -809,7 +809,7 @@ class AppLocalizationsVi extends AppLocalizations { String get sleep_timer => 'Hẹn giờ tắt'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes Phút'; } @@ -848,7 +848,7 @@ class AppLocalizationsVi extends AppLocalizations { String get failed_to_encrypt => 'Mã hóa không thành công'; @override - String get encryption_failed_warning => 'Spotube không thành công trong việc mã hóa nhằm lưu trữ dữ liêu an toàn. vậy nên sẽ chuyển về lưu trữ không an toàn\nNếu bạn đang sử dụng Linux, đảm bảo rằng bạn có sử dụng dịch vụ bảo mật (gnome-keyring, kde-wallet, keepassxc, v.v.)'; + String get encryption_failed_warning => 'Spotube không thành công trong việc mã hóa nhằm lưu trữ dữ liêu an toàn. vậy nên sẽ chuyển về lưu trữ không an toàn\nNếu bạn đang sử dụng Linux, đảm bảo rằng bạn có sử dụng dịch vụ bảo mật (gnome-keyring, kde-wallet, KeePassXC, v.v.)'; @override String get querying_info => 'Đang truy vấn thông tin...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsVi extends AppLocalizations { String get owned_by_you => 'Thuộc sở hữu của bạn'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl đã sao chép vào bảng tạm'; } @override - String get spotify_hipotetical_calculation => '*Được tính toán dựa trên khoản thanh toán của Spotify cho mỗi lượt phát\ntừ \$0.003 đến \$0.005. Đây là một tính toán giả định để\ncung cấp cho người dùng cái nhìn về số tiền họ sẽ phải trả\ncho các nghệ sĩ nếu họ nghe bài hát của họ trên Spotify.'; + String get spotify_hypothetical_calculation => '*Được tính toán dựa trên khoản thanh toán của Spotify cho mỗi lượt phát\ntừ \$0.003 đến \$0.005. Đây là một tính toán giả định để\ncung cấp cho người dùng cái nhìn về số tiền họ sẽ phải trả\ncho các nghệ sĩ nếu họ nghe bài hát của họ trên Spotify.'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes phút'; } diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 58f7a37e..7917f6a5 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -315,7 +315,7 @@ class AppLocalizationsZh extends AppLocalizations { String get shuffle_playlist => '随机播放歌单'; @override - String get unshuffle_playlist => '取消随机播放歌单'; + String get not_shuffle_playlist => '取消随机播放歌单'; @override String get previous_track => '上一首歌曲'; @@ -590,7 +590,7 @@ class AppLocalizationsZh extends AppLocalizations { String get step_2 => '步骤 2'; @override - String get step_2_steps => '1. 一旦你已经完成登录, 按 F12 键或者鼠标右击网页空白区域 > 选择“检查”以打开浏览器开发者工具(DevTools)\n2. 然后选择 \"应用(Application)\" 标签页(Chrome, Edge, Brave 等基于 Chromium 的浏览器) 或 \"存储(Storage)\" 标签页 (Firefox, Palemoon 等基于 Firefox 的浏览器))\n3. 选择 \"Cookies\" 栏目然后选择 \"https://accounts.spotify.com\" 子栏目'; + String get step_2_steps => '1. 一旦你已经完成登录, 按 F12 键或者鼠标右击网页空白区域 > 选择“检查”以打开浏览器开发者工具(DevTools)\n2. 然后选择 \"应用(Application)\" 标签页(Chrome, Edge, Brave 等基于 Chromium 的浏览器) 或 \"存储(Storage)\" 标签页 (Firefox, Pale Moon 等基于 Firefox 的浏览器))\n3. 选择 \"Cookies\" 栏目然后选择 \"https://accounts.spotify.com\" 子栏目'; @override String get step_3 => '步骤 3'; @@ -672,16 +672,16 @@ class AppLocalizationsZh extends AppLocalizations { String get number_of_tracks_generate => '生成歌曲的数目'; @override - String get acousticness => '原声程度'; + String get not_acoustic => '原声程度'; @override - String get danceability => '律动感'; + String get dance_ability => '律动感'; @override String get energy => '冲击感'; @override - String get instrumentalness => '歌唱部分占比'; + String get not_instrumental => '歌唱部分占比'; @override String get liveness => '现场感'; @@ -690,7 +690,7 @@ class AppLocalizationsZh extends AppLocalizations { String get loudness => '响度'; @override - String get speechiness => '朗诵比例'; + String get talkative => '朗诵比例'; @override String get valence => '心理感受'; @@ -809,7 +809,7 @@ class AppLocalizationsZh extends AppLocalizations { String get sleep_timer => '睡眠定时器'; @override - String mins(Object minutes) { + String minutes(Object minutes) { return '$minutes 分'; } @@ -848,7 +848,7 @@ class AppLocalizationsZh extends AppLocalizations { String get failed_to_encrypt => '加密失败'; @override - String get encryption_failed_warning => 'Spotube使用加密来安全地存储您的数据。但是失败了。因此,它将回退到不安全的存储\n如果您使用Linux,请确保已安装gnome-keyring、kde-wallet和keepassxc等秘密服务'; + String get encryption_failed_warning => 'Spotube使用加密来安全地存储您的数据。但是失败了。因此,它将回退到不安全的存储\n如果您使用Linux,请确保已安装gnome-keyring、kde-wallet和KeePassXC等秘密服务'; @override String get querying_info => '正在查询信息...'; @@ -1207,15 +1207,15 @@ class AppLocalizationsZh extends AppLocalizations { String get owned_by_you => '由您拥有'; @override - String copied_shareurl_to_clipboard(Object shareUrl) { + String copied_share_url_to_clipboard(Object shareUrl) { return '$shareUrl 已复制到剪贴板'; } @override - String get spotify_hipotetical_calculation => '*根据 Spotify 每次流媒体的支付金额\n\$0.003 到 \$0.005 进行计算。这是一个假设性的\n计算,用于给用户了解他们如果在 Spotify 上\n收听歌曲会支付给艺术家的金额。'; + String get spotify_hypothetical_calculation => '*根据 Spotify 每次流媒体的支付金额\n\$0.003 到 \$0.005 进行计算。这是一个假设性的\n计算,用于给用户了解他们如果在 Spotify 上\n收听歌曲会支付给艺术家的金额。'; @override - String count_mins(Object minutes) { + String count_minutes(Object minutes) { return '$minutes 分钟'; } diff --git a/lib/l10n/l10n.dart b/lib/l10n/l10n.dart index 0b974641..9983cf82 100644 --- a/lib/l10n/l10n.dart +++ b/lib/l10n/l10n.dart @@ -18,6 +18,7 @@ library l10n; import 'package:shadcn_flutter/shadcn_flutter.dart'; + export 'package:spotube/l10n/generated/app_localizations.dart'; class L10n { diff --git a/lib/main.dart b/lib/main.dart index f178b663..9c5341a2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,14 +6,17 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' as material; import 'package:flutter/services.dart'; import 'package:flutter_discord_rpc/flutter_discord_rpc.dart'; +import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; - +import 'package:flutter_native_splash/flutter_native_splash.dart'; +// import 'package:flutter_new_pipe_extractor/flutter_new_pipe_extractor.dart'; import 'package:home_widget/home_widget.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:local_notifier/local_notifier.dart'; import 'package:media_kit/media_kit.dart'; import 'package:metadata_god/metadata_god.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:smtc_windows/smtc_windows.dart'; import 'package:spotube/collections/env.dart'; import 'package:spotube/collections/initializers.dart'; @@ -25,16 +28,16 @@ import 'package:spotube/hooks/configurators/use_disable_battery_optimizations.da import 'package:spotube/hooks/configurators/use_fix_window_stretching.dart'; import 'package:spotube/hooks/configurators/use_get_storage_perms.dart'; import 'package:spotube/hooks/configurators/use_has_touch.dart'; +import 'package:spotube/l10n/l10n.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart'; import 'package:spotube/provider/audio_player/audio_player_streams.dart'; +import 'package:spotube/provider/connect/clients.dart'; import 'package:spotube/provider/database/database.dart'; import 'package:spotube/provider/glance/glance.dart'; import 'package:spotube/provider/server/bonsoir.dart'; import 'package:spotube/provider/server/server.dart'; import 'package:spotube/provider/tray_manager/tray_manager.dart'; -import 'package:spotube/l10n/l10n.dart'; -import 'package:spotube/provider/connect/clients.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/cli/cli.dart'; @@ -44,13 +47,9 @@ import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/wm_tools/wm_tools.dart'; import 'package:spotube/utils/migrations/sandbox.dart'; import 'package:spotube/utils/platform.dart'; -import 'package:flutter_native_splash/flutter_native_splash.dart'; -import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:timezone/data/latest.dart' as tz; import 'package:window_manager/window_manager.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:yt_dlp_dart/yt_dlp_dart.dart'; -import 'package:flutter_new_pipe_extractor/flutter_new_pipe_extractor.dart'; Future main(List rawArgs) async { if (rawArgs.contains("web_view_title_bar")) { @@ -75,10 +74,9 @@ Future main(List rawArgs) async { await migrateMacOsFromSandboxToNoSandbox(); - // force High Refresh Rate on some Android devices (like One Plus) if (kIsAndroid) { await FlutterDisplayMode.setHighRefreshRate(); - await NewPipeExtractor.init(); + // await NewPipeExtractor.init(); } if (!kIsWeb) { @@ -107,7 +105,7 @@ Future main(List rawArgs) async { final database = AppDatabase(); if (kIsDesktop) { - await localNotifier.setup(appName: "Spotube"); + await localNotifier.setup(appName: "SpoTube"); await WindowManagerTools.initialize(); } @@ -123,14 +121,14 @@ Future main(List rawArgs) async { observers: const [ AppLoggerProviderObserver(), ], - child: const Spotube(), + child: const SpoTube(), ), ); }); } -class Spotube extends HookConsumerWidget { - const Spotube({super.key}); +class SpoTube extends HookConsumerWidget { + const SpoTube({super.key}); @override Widget build(BuildContext context, ref) { @@ -162,8 +160,10 @@ class Spotube extends HookConsumerWidget { } return () { - /// For enabling hot reload for audio player - if (!kDebugMode) return; + if (!kDebugMode) { + return; + } + audioPlayer.dispose(); }; }, []); @@ -179,7 +179,7 @@ class Spotube extends HookConsumerWidget { ], routerConfig: router.config(), debugShowCheckedModeBanner: false, - title: 'Spotube', + title: 'SpoTube', builder: (context, child) { child = ScrollConfiguration( behavior: ScrollConfiguration.of(context).copyWith( diff --git a/lib/models/connect/connect.dart b/lib/models/connect/connect.dart index a70520ad..a26ac7b0 100644 --- a/lib/models/connect/connect.dart +++ b/lib/models/connect/connect.dart @@ -10,6 +10,5 @@ import 'package:spotube/provider/audio_player/state.dart'; part 'connect.freezed.dart'; part 'connect.g.dart'; - -part 'ws_event.dart'; part 'load.dart'; +part 'ws_event.dart'; diff --git a/lib/models/database/database.dart b/lib/models/database/database.dart index 199e7147..a7b60205 100644 --- a/lib/models/database/database.dart +++ b/lib/models/database/database.dart @@ -4,7 +4,9 @@ import 'dart:convert'; import 'dart:io'; import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; import 'package:encrypt/encrypt.dart'; +import 'package:flutter/widgets.dart' hide Table, Key, View; import 'package:media_kit/media_kit.dart' hide Track; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; @@ -12,35 +14,31 @@ import 'package:shadcn_flutter/shadcn_flutter.dart' show ThemeMode, Colors; import 'package:spotify/spotify.dart' hide Playlist; import 'package:spotube/models/database/database.steps.dart'; import 'package:spotube/models/lyrics.dart'; +import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart'; import 'package:spotube/services/kv_store/encrypted_kv_store.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; import 'package:spotube/services/sourced_track/enums.dart'; -import 'package:flutter/widgets.dart' hide Table, Key, View; -import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart'; -import 'package:drift/native.dart'; -import 'package:spotube/services/youtube_engine/newpipe_engine.dart'; +// import 'package:spotube/services/youtube_engine/newpipe_engine.dart'; import 'package:spotube/services/youtube_engine/youtube_explode_engine.dart'; import 'package:spotube/services/youtube_engine/yt_dlp_engine.dart'; import 'package:sqlite3/sqlite3.dart'; import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart'; part 'database.g.dart'; - +part 'tables/audio_player_state.dart'; part 'tables/authentication.dart'; part 'tables/blacklist.dart'; +part 'tables/history.dart'; +part 'tables/lyrics.dart'; part 'tables/preferences.dart'; part 'tables/scrobbler.dart'; part 'tables/skip_segment.dart'; part 'tables/source_match.dart'; -part 'tables/audio_player_state.dart'; -part 'tables/history.dart'; -part 'tables/lyrics.dart'; - part 'typeconverters/color.dart'; -part 'typeconverters/locale.dart'; -part 'typeconverters/string_list.dart'; part 'typeconverters/encrypted_text.dart'; +part 'typeconverters/locale.dart'; part 'typeconverters/map.dart'; +part 'typeconverters/string_list.dart'; part 'typeconverters/subtitle.dart'; @DriftDatabase( diff --git a/lib/models/database/database.steps.dart b/lib/models/database/database.steps.dart index 8e0f8e3f..dbceeef5 100644 --- a/lib/models/database/database.steps.dart +++ b/lib/models/database/database.steps.dart @@ -1,7 +1,7 @@ // dart format width=80 -import 'package:drift/internal/versioned_schema.dart' as i0; import 'package:drift/drift.dart' as i1; import 'package:drift/drift.dart'; +import 'package:drift/internal/versioned_schema.dart' as i0; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/models/database/database.dart'; @@ -224,12 +224,16 @@ final class Schema2 extends i0.VersionedSchema { class Shape0 extends i0.VersionedTable { Shape0({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get cookie => columnsByName['cookie']! as i1.GeneratedColumn; + i1.GeneratedColumn get accessToken => columnsByName['access_token']! as i1.GeneratedColumn; + i1.GeneratedColumn get expiration => columnsByName['expiration']! as i1.GeneratedColumn; } @@ -240,24 +244,31 @@ i1.GeneratedColumn _column_0(String aliasedName) => type: i1.DriftSqlType.int, defaultConstraints: i1.GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + i1.GeneratedColumn _column_1(String aliasedName) => i1.GeneratedColumn('cookie', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_2(String aliasedName) => i1.GeneratedColumn('access_token', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_3(String aliasedName) => i1.GeneratedColumn('expiration', aliasedName, false, type: i1.DriftSqlType.dateTime); class Shape1 extends i0.VersionedTable { Shape1({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get name => columnsByName['name']! as i1.GeneratedColumn; + i1.GeneratedColumn get elementType => columnsByName['element_type']! as i1.GeneratedColumn; + i1.GeneratedColumn get elementId => columnsByName['element_id']! as i1.GeneratedColumn; } @@ -265,65 +276,93 @@ class Shape1 extends i0.VersionedTable { i1.GeneratedColumn _column_4(String aliasedName) => i1.GeneratedColumn('name', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_5(String aliasedName) => i1.GeneratedColumn('element_type', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_6(String aliasedName) => i1.GeneratedColumn('element_id', aliasedName, false, type: i1.DriftSqlType.string); class Shape2 extends i0.VersionedTable { Shape2({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioQuality => columnsByName['audio_quality']! as i1.GeneratedColumn; + i1.GeneratedColumn get albumColorSync => columnsByName['album_color_sync']! as i1.GeneratedColumn; + i1.GeneratedColumn get amoledDarkTheme => columnsByName['amoled_dark_theme']! as i1.GeneratedColumn; + i1.GeneratedColumn get checkUpdate => columnsByName['check_update']! as i1.GeneratedColumn; + i1.GeneratedColumn get normalizeAudio => columnsByName['normalize_audio']! as i1.GeneratedColumn; + i1.GeneratedColumn get showSystemTrayIcon => columnsByName['show_system_tray_icon']! as i1.GeneratedColumn; + i1.GeneratedColumn get systemTitleBar => columnsByName['system_title_bar']! as i1.GeneratedColumn; + i1.GeneratedColumn get skipNonMusic => columnsByName['skip_non_music']! as i1.GeneratedColumn; + i1.GeneratedColumn get closeBehavior => columnsByName['close_behavior']! as i1.GeneratedColumn; + i1.GeneratedColumn get accentColorScheme => columnsByName['accent_color_scheme']! as i1.GeneratedColumn; + i1.GeneratedColumn get layoutMode => columnsByName['layout_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get locale => columnsByName['locale']! as i1.GeneratedColumn; + i1.GeneratedColumn get market => columnsByName['market']! as i1.GeneratedColumn; + i1.GeneratedColumn get searchMode => columnsByName['search_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadLocation => columnsByName['download_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get localLibraryLocation => columnsByName['local_library_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get pipedInstance => columnsByName['piped_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get invidiousInstance => columnsByName['invidious_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get themeMode => columnsByName['theme_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioSource => columnsByName['audio_source']! as i1.GeneratedColumn; + i1.GeneratedColumn get streamMusicCodec => columnsByName['stream_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadMusicCodec => columnsByName['download_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get discordPresence => columnsByName['discord_presence']! as i1.GeneratedColumn; + i1.GeneratedColumn get endlessPlayback => columnsByName['endless_playback']! as i1.GeneratedColumn; + i1.GeneratedColumn get enableConnect => columnsByName['enable_connect']! as i1.GeneratedColumn; } @@ -332,114 +371,138 @@ i1.GeneratedColumn _column_7(String aliasedName) => i1.GeneratedColumn('audio_quality', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(SourceQualities.high.name)); + i1.GeneratedColumn _column_8(String aliasedName) => i1.GeneratedColumn('album_color_sync', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("album_color_sync" IN (0, 1))'), defaultValue: const Constant(true)); + i1.GeneratedColumn _column_9(String aliasedName) => i1.GeneratedColumn('amoled_dark_theme', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("amoled_dark_theme" IN (0, 1))'), defaultValue: const Constant(false)); + i1.GeneratedColumn _column_10(String aliasedName) => i1.GeneratedColumn('check_update', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("check_update" IN (0, 1))'), defaultValue: const Constant(true)); + i1.GeneratedColumn _column_11(String aliasedName) => i1.GeneratedColumn('normalize_audio', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("normalize_audio" IN (0, 1))'), defaultValue: const Constant(false)); + i1.GeneratedColumn _column_12(String aliasedName) => i1.GeneratedColumn('show_system_tray_icon', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("show_system_tray_icon" IN (0, 1))'), defaultValue: const Constant(false)); + i1.GeneratedColumn _column_13(String aliasedName) => i1.GeneratedColumn('system_title_bar', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("system_title_bar" IN (0, 1))'), defaultValue: const Constant(false)); + i1.GeneratedColumn _column_14(String aliasedName) => i1.GeneratedColumn('skip_non_music', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("skip_non_music" IN (0, 1))'), defaultValue: const Constant(false)); + i1.GeneratedColumn _column_15(String aliasedName) => i1.GeneratedColumn('close_behavior', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(CloseBehavior.close.name)); + i1.GeneratedColumn _column_16(String aliasedName) => i1.GeneratedColumn('accent_color_scheme', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: const Constant("Blue:0xFF2196F3")); + i1.GeneratedColumn _column_17(String aliasedName) => i1.GeneratedColumn('layout_mode', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(LayoutMode.adaptive.name)); + i1.GeneratedColumn _column_18(String aliasedName) => i1.GeneratedColumn('locale', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: const Constant('{"languageCode":"system","countryCode":"system"}')); + i1.GeneratedColumn _column_19(String aliasedName) => i1.GeneratedColumn('market', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(Market.US.name)); + i1.GeneratedColumn _column_20(String aliasedName) => i1.GeneratedColumn('search_mode', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(SearchMode.youtube.name)); + i1.GeneratedColumn _column_21(String aliasedName) => i1.GeneratedColumn('download_location', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: const Constant("")); + i1.GeneratedColumn _column_22(String aliasedName) => i1.GeneratedColumn('local_library_location', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: const Constant("")); + i1.GeneratedColumn _column_23(String aliasedName) => i1.GeneratedColumn('piped_instance', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: const Constant("https://pipedapi.kavin.rocks")); + i1.GeneratedColumn _column_24(String aliasedName) => i1.GeneratedColumn('invidious_instance', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: const Constant("https://inv.nadeko.net")); + i1.GeneratedColumn _column_25(String aliasedName) => i1.GeneratedColumn('theme_mode', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(ThemeMode.system.name)); + i1.GeneratedColumn _column_26(String aliasedName) => i1.GeneratedColumn('audio_source', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(AudioSource.youtube.name)); + i1.GeneratedColumn _column_27(String aliasedName) => i1.GeneratedColumn('stream_music_codec', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(SourceCodecs.weba.name)); + i1.GeneratedColumn _column_28(String aliasedName) => i1.GeneratedColumn('download_music_codec', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(SourceCodecs.m4a.name)); + i1.GeneratedColumn _column_29(String aliasedName) => i1.GeneratedColumn('discord_presence', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("discord_presence" IN (0, 1))'), defaultValue: const Constant(true)); + i1.GeneratedColumn _column_30(String aliasedName) => i1.GeneratedColumn('endless_playback', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("endless_playback" IN (0, 1))'), defaultValue: const Constant(true)); + i1.GeneratedColumn _column_31(String aliasedName) => i1.GeneratedColumn('enable_connect', aliasedName, false, type: i1.DriftSqlType.bool, @@ -449,12 +512,16 @@ i1.GeneratedColumn _column_31(String aliasedName) => class Shape3 extends i0.VersionedTable { Shape3({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => columnsByName['created_at']! as i1.GeneratedColumn; + i1.GeneratedColumn get username => columnsByName['username']! as i1.GeneratedColumn; + i1.GeneratedColumn get passwordHash => columnsByName['password_hash']! as i1.GeneratedColumn; } @@ -462,23 +529,30 @@ class Shape3 extends i0.VersionedTable { i1.GeneratedColumn _column_32(String aliasedName) => i1.GeneratedColumn('created_at', aliasedName, false, type: i1.DriftSqlType.dateTime, defaultValue: currentDateAndTime); + i1.GeneratedColumn _column_33(String aliasedName) => i1.GeneratedColumn('username', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_34(String aliasedName) => i1.GeneratedColumn('password_hash', aliasedName, false, type: i1.DriftSqlType.string); class Shape4 extends i0.VersionedTable { Shape4({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get start => columnsByName['start']! as i1.GeneratedColumn; + i1.GeneratedColumn get end => columnsByName['end']! as i1.GeneratedColumn; + i1.GeneratedColumn get trackId => columnsByName['track_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => columnsByName['created_at']! as i1.GeneratedColumn; } @@ -486,23 +560,30 @@ class Shape4 extends i0.VersionedTable { i1.GeneratedColumn _column_35(String aliasedName) => i1.GeneratedColumn('start', aliasedName, false, type: i1.DriftSqlType.int); + i1.GeneratedColumn _column_36(String aliasedName) => i1.GeneratedColumn('end', aliasedName, false, type: i1.DriftSqlType.int); + i1.GeneratedColumn _column_37(String aliasedName) => i1.GeneratedColumn('track_id', aliasedName, false, type: i1.DriftSqlType.string); class Shape5 extends i0.VersionedTable { Shape5({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get trackId => columnsByName['track_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get sourceId => columnsByName['source_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get sourceType => columnsByName['source_type']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => columnsByName['created_at']! as i1.GeneratedColumn; } @@ -510,6 +591,7 @@ class Shape5 extends i0.VersionedTable { i1.GeneratedColumn _column_38(String aliasedName) => i1.GeneratedColumn('source_id', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_39(String aliasedName) => i1.GeneratedColumn('source_type', aliasedName, false, type: i1.DriftSqlType.string, @@ -517,14 +599,19 @@ i1.GeneratedColumn _column_39(String aliasedName) => class Shape6 extends i0.VersionedTable { Shape6({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get playing => columnsByName['playing']! as i1.GeneratedColumn; + i1.GeneratedColumn get loopMode => columnsByName['loop_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get shuffled => columnsByName['shuffled']! as i1.GeneratedColumn; + i1.GeneratedColumn get collections => columnsByName['collections']! as i1.GeneratedColumn; } @@ -534,24 +621,30 @@ i1.GeneratedColumn _column_40(String aliasedName) => type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("playing" IN (0, 1))')); + i1.GeneratedColumn _column_41(String aliasedName) => i1.GeneratedColumn('loop_mode', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_42(String aliasedName) => i1.GeneratedColumn('shuffled', aliasedName, false, type: i1.DriftSqlType.bool, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'CHECK ("shuffled" IN (0, 1))')); + i1.GeneratedColumn _column_43(String aliasedName) => i1.GeneratedColumn('collections', aliasedName, false, type: i1.DriftSqlType.string); class Shape7 extends i0.VersionedTable { Shape7({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioPlayerStateId => columnsByName['audio_player_state_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get index => columnsByName['index']! as i1.GeneratedColumn; } @@ -561,20 +654,26 @@ i1.GeneratedColumn _column_44(String aliasedName) => type: i1.DriftSqlType.int, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'REFERENCES audio_player_state_table (id)')); + i1.GeneratedColumn _column_45(String aliasedName) => i1.GeneratedColumn('index', aliasedName, false, type: i1.DriftSqlType.int); class Shape8 extends i0.VersionedTable { Shape8({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get playlistId => columnsByName['playlist_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get uri => columnsByName['uri']! as i1.GeneratedColumn; + i1.GeneratedColumn get extras => columnsByName['extras']! as i1.GeneratedColumn; + i1.GeneratedColumn get httpHeaders => columnsByName['http_headers']! as i1.GeneratedColumn; } @@ -584,26 +683,34 @@ i1.GeneratedColumn _column_46(String aliasedName) => type: i1.DriftSqlType.int, defaultConstraints: i1.GeneratedColumn.constraintIsAlways( 'REFERENCES playlist_table (id)')); + i1.GeneratedColumn _column_47(String aliasedName) => i1.GeneratedColumn('uri', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_48(String aliasedName) => i1.GeneratedColumn('extras', aliasedName, true, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_49(String aliasedName) => i1.GeneratedColumn('http_headers', aliasedName, true, type: i1.DriftSqlType.string); class Shape9 extends i0.VersionedTable { Shape9({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get createdAt => columnsByName['created_at']! as i1.GeneratedColumn; + i1.GeneratedColumn get type => columnsByName['type']! as i1.GeneratedColumn; + i1.GeneratedColumn get itemId => columnsByName['item_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get data => columnsByName['data']! as i1.GeneratedColumn; } @@ -611,19 +718,24 @@ class Shape9 extends i0.VersionedTable { i1.GeneratedColumn _column_50(String aliasedName) => i1.GeneratedColumn('type', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_51(String aliasedName) => i1.GeneratedColumn('item_id', aliasedName, false, type: i1.DriftSqlType.string); + i1.GeneratedColumn _column_52(String aliasedName) => i1.GeneratedColumn('data', aliasedName, false, type: i1.DriftSqlType.string); class Shape10 extends i0.VersionedTable { Shape10({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get trackId => columnsByName['track_id']! as i1.GeneratedColumn; + i1.GeneratedColumn get data => columnsByName['data']! as i1.GeneratedColumn; } @@ -845,58 +957,85 @@ final class Schema3 extends i0.VersionedSchema { class Shape11 extends i0.VersionedTable { Shape11({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioQuality => columnsByName['audio_quality']! as i1.GeneratedColumn; + i1.GeneratedColumn get albumColorSync => columnsByName['album_color_sync']! as i1.GeneratedColumn; + i1.GeneratedColumn get amoledDarkTheme => columnsByName['amoled_dark_theme']! as i1.GeneratedColumn; + i1.GeneratedColumn get checkUpdate => columnsByName['check_update']! as i1.GeneratedColumn; + i1.GeneratedColumn get normalizeAudio => columnsByName['normalize_audio']! as i1.GeneratedColumn; + i1.GeneratedColumn get showSystemTrayIcon => columnsByName['show_system_tray_icon']! as i1.GeneratedColumn; + i1.GeneratedColumn get systemTitleBar => columnsByName['system_title_bar']! as i1.GeneratedColumn; + i1.GeneratedColumn get skipNonMusic => columnsByName['skip_non_music']! as i1.GeneratedColumn; + i1.GeneratedColumn get closeBehavior => columnsByName['close_behavior']! as i1.GeneratedColumn; + i1.GeneratedColumn get accentColorScheme => columnsByName['accent_color_scheme']! as i1.GeneratedColumn; + i1.GeneratedColumn get layoutMode => columnsByName['layout_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get locale => columnsByName['locale']! as i1.GeneratedColumn; + i1.GeneratedColumn get market => columnsByName['market']! as i1.GeneratedColumn; + i1.GeneratedColumn get searchMode => columnsByName['search_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadLocation => columnsByName['download_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get localLibraryLocation => columnsByName['local_library_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get pipedInstance => columnsByName['piped_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get invidiousInstance => columnsByName['invidious_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get themeMode => columnsByName['theme_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioSource => columnsByName['audio_source']! as i1.GeneratedColumn; + i1.GeneratedColumn get streamMusicCodec => columnsByName['stream_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadMusicCodec => columnsByName['download_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get discordPresence => columnsByName['discord_presence']! as i1.GeneratedColumn; + i1.GeneratedColumn get endlessPlayback => columnsByName['endless_playback']! as i1.GeneratedColumn; + i1.GeneratedColumn get enableConnect => columnsByName['enable_connect']! as i1.GeneratedColumn; + i1.GeneratedColumn get cacheMusic => columnsByName['cache_music']! as i1.GeneratedColumn; } @@ -1126,60 +1265,88 @@ final class Schema4 extends i0.VersionedSchema { class Shape12 extends i0.VersionedTable { Shape12({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get id => columnsByName['id']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioQuality => columnsByName['audio_quality']! as i1.GeneratedColumn; + i1.GeneratedColumn get albumColorSync => columnsByName['album_color_sync']! as i1.GeneratedColumn; + i1.GeneratedColumn get amoledDarkTheme => columnsByName['amoled_dark_theme']! as i1.GeneratedColumn; + i1.GeneratedColumn get checkUpdate => columnsByName['check_update']! as i1.GeneratedColumn; + i1.GeneratedColumn get normalizeAudio => columnsByName['normalize_audio']! as i1.GeneratedColumn; + i1.GeneratedColumn get showSystemTrayIcon => columnsByName['show_system_tray_icon']! as i1.GeneratedColumn; + i1.GeneratedColumn get systemTitleBar => columnsByName['system_title_bar']! as i1.GeneratedColumn; + i1.GeneratedColumn get skipNonMusic => columnsByName['skip_non_music']! as i1.GeneratedColumn; + i1.GeneratedColumn get closeBehavior => columnsByName['close_behavior']! as i1.GeneratedColumn; + i1.GeneratedColumn get accentColorScheme => columnsByName['accent_color_scheme']! as i1.GeneratedColumn; + i1.GeneratedColumn get layoutMode => columnsByName['layout_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get locale => columnsByName['locale']! as i1.GeneratedColumn; + i1.GeneratedColumn get market => columnsByName['market']! as i1.GeneratedColumn; + i1.GeneratedColumn get searchMode => columnsByName['search_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadLocation => columnsByName['download_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get localLibraryLocation => columnsByName['local_library_location']! as i1.GeneratedColumn; + i1.GeneratedColumn get pipedInstance => columnsByName['piped_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get invidiousInstance => columnsByName['invidious_instance']! as i1.GeneratedColumn; + i1.GeneratedColumn get themeMode => columnsByName['theme_mode']! as i1.GeneratedColumn; + i1.GeneratedColumn get audioSource => columnsByName['audio_source']! as i1.GeneratedColumn; + i1.GeneratedColumn get youtubeClientEngine => columnsByName['youtube_client_engine']! as i1.GeneratedColumn; + i1.GeneratedColumn get streamMusicCodec => columnsByName['stream_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get downloadMusicCodec => columnsByName['download_music_codec']! as i1.GeneratedColumn; + i1.GeneratedColumn get discordPresence => columnsByName['discord_presence']! as i1.GeneratedColumn; + i1.GeneratedColumn get endlessPlayback => columnsByName['endless_playback']! as i1.GeneratedColumn; + i1.GeneratedColumn get enableConnect => columnsByName['enable_connect']! as i1.GeneratedColumn; + i1.GeneratedColumn get cacheMusic => columnsByName['cache_music']! as i1.GeneratedColumn; } @@ -1188,6 +1355,7 @@ i1.GeneratedColumn _column_54(String aliasedName) => i1.GeneratedColumn('youtube_client_engine', aliasedName, false, type: i1.DriftSqlType.string, defaultValue: Constant(YoutubeClientEngine.youtubeExplode.name)); + i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, diff --git a/lib/models/database/tables/audio_player_state.dart b/lib/models/database/tables/audio_player_state.dart index 3e49cf6f..c353da12 100644 --- a/lib/models/database/tables/audio_player_state.dart +++ b/lib/models/database/tables/audio_player_state.dart @@ -2,26 +2,35 @@ part of '../database.dart'; class AudioPlayerStateTable extends Table { IntColumn get id => integer().autoIncrement()(); + BoolColumn get playing => boolean()(); + TextColumn get loopMode => textEnum()(); + BoolColumn get shuffled => boolean()(); + TextColumn get collections => text().map(const StringListConverter())(); } class PlaylistTable extends Table { IntColumn get id => integer().autoIncrement()(); + IntColumn get audioPlayerStateId => integer().references(AudioPlayerStateTable, #id)(); + IntColumn get index => integer()(); } class PlaylistMediaTable extends Table { IntColumn get id => integer().autoIncrement()(); + IntColumn get playlistId => integer().references(PlaylistTable, #id)(); TextColumn get uri => text()(); + TextColumn get extras => text().nullable().map(const MapTypeConverter())(); + TextColumn get httpHeaders => text().nullable().map(const MapTypeConverter())(); } diff --git a/lib/models/database/tables/authentication.dart b/lib/models/database/tables/authentication.dart index 96041952..85650854 100644 --- a/lib/models/database/tables/authentication.dart +++ b/lib/models/database/tables/authentication.dart @@ -2,7 +2,10 @@ part of '../database.dart'; class AuthenticationTable extends Table { IntColumn get id => integer().autoIncrement()(); + TextColumn get cookie => text().map(EncryptedTextConverter())(); + TextColumn get accessToken => text().map(EncryptedTextConverter())(); + DateTimeColumn get expiration => dateTime()(); } diff --git a/lib/models/database/tables/blacklist.dart b/lib/models/database/tables/blacklist.dart index 8a8d9dee..494dcd9e 100644 --- a/lib/models/database/tables/blacklist.dart +++ b/lib/models/database/tables/blacklist.dart @@ -12,7 +12,10 @@ enum BlacklistedType { ) class BlacklistTable extends Table { IntColumn get id => integer().autoIncrement()(); + TextColumn get name => text()(); + TextColumn get elementType => textEnum()(); + TextColumn get elementId => text()(); } diff --git a/lib/models/database/tables/history.dart b/lib/models/database/tables/history.dart index 23c16f17..f592bbe9 100644 --- a/lib/models/database/tables/history.dart +++ b/lib/models/database/tables/history.dart @@ -8,9 +8,13 @@ enum HistoryEntryType { class HistoryTable extends Table { IntColumn get id => integer().autoIncrement()(); + DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); + TextColumn get type => textEnum()(); + TextColumn get itemId => text()(); + TextColumn get data => text().map(const MapTypeConverter())(); } @@ -18,8 +22,10 @@ class HistoryTable extends Table { extension HistoryItemParseExtension on HistoryTableData { PlaylistSimple? get playlist => type == HistoryEntryType.playlist ? PlaylistSimple.fromJson(data) : null; + AlbumSimple? get album => type == HistoryEntryType.album ? AlbumSimple.fromJson(data) : null; + Track? get track => type == HistoryEntryType.track ? Track.fromJson(data) : null; } diff --git a/lib/models/database/tables/lyrics.dart b/lib/models/database/tables/lyrics.dart index 7c4c7f8f..219cfa7b 100644 --- a/lib/models/database/tables/lyrics.dart +++ b/lib/models/database/tables/lyrics.dart @@ -4,5 +4,6 @@ class LyricsTable extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get trackId => text()(); + TextColumn get data => text().map(SubtitleTypeConverter())(); } diff --git a/lib/models/database/tables/preferences.dart b/lib/models/database/tables/preferences.dart index 492ac1f9..804a860c 100644 --- a/lib/models/database/tables/preferences.dart +++ b/lib/models/database/tables/preferences.dart @@ -2,7 +2,7 @@ part of '../database.dart'; enum LayoutMode { compact, - extended, + // extended, adaptive, } @@ -22,8 +22,8 @@ enum AudioSource { enum YoutubeClientEngine { ytDlp("yt-dlp"), - youtubeExplode("YouTubeExplode"), - newPipe("NewPipe"); + youtubeExplode("YouTubeExplode"); + // newPipe("NewPipe"); final String label; @@ -34,7 +34,9 @@ enum YoutubeClientEngine { YoutubeClientEngine.youtubeExplode => YouTubeExplodeEngine.isAvailableForPlatform, YoutubeClientEngine.ytDlp => YtDlpEngine.isAvailableForPlatform, - YoutubeClientEngine.newPipe => NewPipeEngine.isAvailableForPlatform, + // YoutubeClientEngine.newPipe => NewPipeEngine.isAvailableForPlatform, + // TODO: Handle this case. + // YoutubeClientEngine.newPipe => throw UnimplementedError(), }; } } @@ -44,6 +46,7 @@ enum MusicCodec { weba._("WebA (Best for streamed music)\nDoesn't support audio metadata"); final String label; + const MusicCodec._(this.label); } @@ -62,59 +65,86 @@ enum SearchMode { class PreferencesTable extends Table { IntColumn get id => integer().autoIncrement()(); + TextColumn get audioQuality => textEnum() .withDefault(Constant(SourceQualities.high.name))(); + BoolColumn get albumColorSync => boolean().withDefault(const Constant(true))(); + BoolColumn get amoledDarkTheme => boolean().withDefault(const Constant(false))(); + BoolColumn get checkUpdate => boolean().withDefault(const Constant(true))(); + BoolColumn get normalizeAudio => boolean().withDefault(const Constant(false))(); + BoolColumn get showSystemTrayIcon => boolean().withDefault(const Constant(false))(); + BoolColumn get systemTitleBar => boolean().withDefault(const Constant(false))(); + BoolColumn get skipNonMusic => boolean().withDefault(const Constant(false))(); + TextColumn get closeBehavior => textEnum() .withDefault(Constant(CloseBehavior.close.name))(); + TextColumn get accentColorScheme => text() .withDefault(const Constant("Blue:0xFF2196F3")) .map(const SpotubeColorConverter())(); + TextColumn get layoutMode => textEnum().withDefault(Constant(LayoutMode.adaptive.name))(); + TextColumn get locale => text() .withDefault( const Constant('{"languageCode":"system","countryCode":"system"}'), ) .map(const LocaleConverter())(); + TextColumn get market => textEnum().withDefault(Constant(Market.US.name))(); + TextColumn get searchMode => textEnum().withDefault(Constant(SearchMode.youtube.name))(); + TextColumn get downloadLocation => text().withDefault(const Constant(""))(); + TextColumn get localLibraryLocation => text().withDefault(const Constant("")).map(const StringListConverter())(); + TextColumn get pipedInstance => text().withDefault(const Constant("https://pipedapi.kavin.rocks"))(); + TextColumn get invidiousInstance => text().withDefault(const Constant("https://inv.nadeko.net"))(); + TextColumn get themeMode => textEnum().withDefault(Constant(ThemeMode.system.name))(); + TextColumn get audioSource => textEnum().withDefault(Constant(AudioSource.youtube.name))(); + TextColumn get youtubeClientEngine => textEnum() .withDefault(Constant(YoutubeClientEngine.youtubeExplode.name))(); + TextColumn get streamMusicCodec => textEnum().withDefault(Constant(SourceCodecs.weba.name))(); + TextColumn get downloadMusicCodec => textEnum().withDefault(Constant(SourceCodecs.m4a.name))(); + BoolColumn get discordPresence => boolean().withDefault(const Constant(true))(); + BoolColumn get endlessPlayback => boolean().withDefault(const Constant(true))(); + BoolColumn get enableConnect => boolean().withDefault(const Constant(false))(); + BoolColumn get cacheMusic => boolean().withDefault(const Constant(true))(); // Default values as PreferencesTableData @@ -125,10 +155,10 @@ class PreferencesTable extends Table { albumColorSync: true, amoledDarkTheme: false, checkUpdate: true, - normalizeAudio: false, + normalizeAudio: true, showSystemTrayIcon: false, systemTitleBar: false, - skipNonMusic: false, + skipNonMusic: true, closeBehavior: CloseBehavior.close, accentColorScheme: SpotubeColor(Colors.blue.value, name: "Blue"), layoutMode: LayoutMode.adaptive, diff --git a/lib/models/database/tables/scrobbler.dart b/lib/models/database/tables/scrobbler.dart index 481c441e..684c26bf 100644 --- a/lib/models/database/tables/scrobbler.dart +++ b/lib/models/database/tables/scrobbler.dart @@ -2,7 +2,10 @@ part of '../database.dart'; class ScrobblerTable extends Table { IntColumn get id => integer().autoIncrement()(); + DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); + TextColumn get username => text()(); + TextColumn get passwordHash => text().map(EncryptedTextConverter())(); } diff --git a/lib/models/database/tables/skip_segment.dart b/lib/models/database/tables/skip_segment.dart index 719f2617..1e94f1c5 100644 --- a/lib/models/database/tables/skip_segment.dart +++ b/lib/models/database/tables/skip_segment.dart @@ -2,8 +2,12 @@ part of '../database.dart'; class SkipSegmentTable extends Table { IntColumn get id => integer().autoIncrement()(); + IntColumn get start => integer()(); + IntColumn get end => integer()(); + TextColumn get trackId => text()(); + DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); } diff --git a/lib/models/database/tables/source_match.dart b/lib/models/database/tables/source_match.dart index 78d0eb05..2711d457 100644 --- a/lib/models/database/tables/source_match.dart +++ b/lib/models/database/tables/source_match.dart @@ -17,9 +17,13 @@ enum SourceType { ) class SourceMatchTable extends Table { IntColumn get id => integer().autoIncrement()(); + TextColumn get trackId => text()(); + TextColumn get sourceId => text()(); + TextColumn get sourceType => textEnum().withDefault(Constant(SourceType.youtube.name))(); + DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)(); } diff --git a/lib/models/database/typeconverters/encrypted_text.dart b/lib/models/database/typeconverters/encrypted_text.dart index 6afa8210..279cc4ab 100644 --- a/lib/models/database/typeconverters/encrypted_text.dart +++ b/lib/models/database/typeconverters/encrypted_text.dart @@ -2,6 +2,7 @@ part of '../database.dart'; class DecryptedText { final String value; + const DecryptedText(this.value); static Encrypter? _encrypter; diff --git a/lib/models/spotify/recommendation_seeds.dart b/lib/models/spotify/recommendation_seeds.dart index 0d874ad6..3322aedf 100644 --- a/lib/models/spotify/recommendation_seeds.dart +++ b/lib/models/spotify/recommendation_seeds.dart @@ -19,17 +19,17 @@ class GeneratePlaylistProviderInput with _$GeneratePlaylistProviderInput { @freezed class RecommendationSeeds with _$RecommendationSeeds { factory RecommendationSeeds({ - num? acousticness, - num? danceability, + num? not_acoustic, + num? dance_ability, @JsonKey(name: "duration_ms") num? durationMs, num? energy, - num? instrumentalness, + num? not_instrumental, num? key, num? liveness, num? loudness, num? mode, num? popularity, - num? speechiness, + num? talkative, num? tempo, @JsonKey(name: "time_signature") num? timeSignature, num? valence, diff --git a/lib/models/spotify/recommendation_seeds.freezed.dart b/lib/models/spotify/recommendation_seeds.freezed.dart index c55a4134..b9ecf675 100644 --- a/lib/models/spotify/recommendation_seeds.freezed.dart +++ b/lib/models/spotify/recommendation_seeds.freezed.dart @@ -347,18 +347,18 @@ RecommendationSeeds _$RecommendationSeedsFromJson(Map json) { /// @nodoc mixin _$RecommendationSeeds { - num? get acousticness => throw _privateConstructorUsedError; - num? get danceability => throw _privateConstructorUsedError; + num? get not_acoustic => throw _privateConstructorUsedError; + num? get dance_ability => throw _privateConstructorUsedError; @JsonKey(name: "duration_ms") num? get durationMs => throw _privateConstructorUsedError; num? get energy => throw _privateConstructorUsedError; - num? get instrumentalness => throw _privateConstructorUsedError; + num? get not_instrumental => throw _privateConstructorUsedError; num? get key => throw _privateConstructorUsedError; num? get liveness => throw _privateConstructorUsedError; num? get loudness => throw _privateConstructorUsedError; num? get mode => throw _privateConstructorUsedError; num? get popularity => throw _privateConstructorUsedError; - num? get speechiness => throw _privateConstructorUsedError; + num? get talkative => throw _privateConstructorUsedError; num? get tempo => throw _privateConstructorUsedError; @JsonKey(name: "time_signature") num? get timeSignature => throw _privateConstructorUsedError; @@ -381,17 +381,17 @@ abstract class $RecommendationSeedsCopyWith<$Res> { _$RecommendationSeedsCopyWithImpl<$Res, RecommendationSeeds>; @useResult $Res call( - {num? acousticness, - num? danceability, + {num? not_acoustic, + num? dance_ability, @JsonKey(name: "duration_ms") num? durationMs, num? energy, - num? instrumentalness, + num? not_instrumental, num? key, num? liveness, num? loudness, num? mode, num? popularity, - num? speechiness, + num? talkative, num? tempo, @JsonKey(name: "time_signature") num? timeSignature, num? valence}); @@ -412,29 +412,29 @@ class _$RecommendationSeedsCopyWithImpl<$Res, $Val extends RecommendationSeeds> @pragma('vm:prefer-inline') @override $Res call({ - Object? acousticness = freezed, - Object? danceability = freezed, + Object? not_acoustic = freezed, + Object? dance_ability = freezed, Object? durationMs = freezed, Object? energy = freezed, - Object? instrumentalness = freezed, + Object? not_instrumental = freezed, Object? key = freezed, Object? liveness = freezed, Object? loudness = freezed, Object? mode = freezed, Object? popularity = freezed, - Object? speechiness = freezed, + Object? talkative = freezed, Object? tempo = freezed, Object? timeSignature = freezed, Object? valence = freezed, }) { return _then(_value.copyWith( - acousticness: freezed == acousticness - ? _value.acousticness - : acousticness // ignore: cast_nullable_to_non_nullable + not_acoustic: freezed == not_acoustic + ? _value.not_acoustic + : not_acoustic // ignore: cast_nullable_to_non_nullable as num?, - danceability: freezed == danceability - ? _value.danceability - : danceability // ignore: cast_nullable_to_non_nullable + dance_ability: freezed == dance_ability + ? _value.dance_ability + : dance_ability // ignore: cast_nullable_to_non_nullable as num?, durationMs: freezed == durationMs ? _value.durationMs @@ -444,9 +444,9 @@ class _$RecommendationSeedsCopyWithImpl<$Res, $Val extends RecommendationSeeds> ? _value.energy : energy // ignore: cast_nullable_to_non_nullable as num?, - instrumentalness: freezed == instrumentalness - ? _value.instrumentalness - : instrumentalness // ignore: cast_nullable_to_non_nullable + not_instrumental: freezed == not_instrumental + ? _value.not_instrumental + : not_instrumental // ignore: cast_nullable_to_non_nullable as num?, key: freezed == key ? _value.key @@ -468,9 +468,9 @@ class _$RecommendationSeedsCopyWithImpl<$Res, $Val extends RecommendationSeeds> ? _value.popularity : popularity // ignore: cast_nullable_to_non_nullable as num?, - speechiness: freezed == speechiness - ? _value.speechiness - : speechiness // ignore: cast_nullable_to_non_nullable + talkative: freezed == talkative + ? _value.talkative + : talkative // ignore: cast_nullable_to_non_nullable as num?, tempo: freezed == tempo ? _value.tempo @@ -497,17 +497,17 @@ abstract class _$$RecommendationSeedsImplCopyWith<$Res> @override @useResult $Res call( - {num? acousticness, - num? danceability, + {num? not_acoustic, + num? dance_ability, @JsonKey(name: "duration_ms") num? durationMs, num? energy, - num? instrumentalness, + num? not_instrumental, num? key, num? liveness, num? loudness, num? mode, num? popularity, - num? speechiness, + num? talkative, num? tempo, @JsonKey(name: "time_signature") num? timeSignature, num? valence}); @@ -526,29 +526,29 @@ class __$$RecommendationSeedsImplCopyWithImpl<$Res> @pragma('vm:prefer-inline') @override $Res call({ - Object? acousticness = freezed, - Object? danceability = freezed, + Object? not_acoustic = freezed, + Object? dance_ability = freezed, Object? durationMs = freezed, Object? energy = freezed, - Object? instrumentalness = freezed, + Object? not_instrumental = freezed, Object? key = freezed, Object? liveness = freezed, Object? loudness = freezed, Object? mode = freezed, Object? popularity = freezed, - Object? speechiness = freezed, + Object? talkative = freezed, Object? tempo = freezed, Object? timeSignature = freezed, Object? valence = freezed, }) { return _then(_$RecommendationSeedsImpl( - acousticness: freezed == acousticness - ? _value.acousticness - : acousticness // ignore: cast_nullable_to_non_nullable + not_acoustic: freezed == not_acoustic + ? _value.not_acoustic + : not_acoustic // ignore: cast_nullable_to_non_nullable as num?, - danceability: freezed == danceability - ? _value.danceability - : danceability // ignore: cast_nullable_to_non_nullable + dance_ability: freezed == dance_ability + ? _value.dance_ability + : dance_ability // ignore: cast_nullable_to_non_nullable as num?, durationMs: freezed == durationMs ? _value.durationMs @@ -558,9 +558,9 @@ class __$$RecommendationSeedsImplCopyWithImpl<$Res> ? _value.energy : energy // ignore: cast_nullable_to_non_nullable as num?, - instrumentalness: freezed == instrumentalness - ? _value.instrumentalness - : instrumentalness // ignore: cast_nullable_to_non_nullable + not_instrumental: freezed == not_instrumental + ? _value.not_instrumental + : not_instrumental // ignore: cast_nullable_to_non_nullable as num?, key: freezed == key ? _value.key @@ -582,9 +582,9 @@ class __$$RecommendationSeedsImplCopyWithImpl<$Res> ? _value.popularity : popularity // ignore: cast_nullable_to_non_nullable as num?, - speechiness: freezed == speechiness - ? _value.speechiness - : speechiness // ignore: cast_nullable_to_non_nullable + talkative: freezed == talkative + ? _value.talkative + : talkative // ignore: cast_nullable_to_non_nullable as num?, tempo: freezed == tempo ? _value.tempo @@ -606,17 +606,17 @@ class __$$RecommendationSeedsImplCopyWithImpl<$Res> @JsonSerializable() class _$RecommendationSeedsImpl implements _RecommendationSeeds { _$RecommendationSeedsImpl( - {this.acousticness, - this.danceability, + {this.not_acoustic, + this.dance_ability, @JsonKey(name: "duration_ms") this.durationMs, this.energy, - this.instrumentalness, + this.not_instrumental, this.key, this.liveness, this.loudness, this.mode, this.popularity, - this.speechiness, + this.talkative, this.tempo, @JsonKey(name: "time_signature") this.timeSignature, this.valence}); @@ -625,16 +625,16 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { _$$RecommendationSeedsImplFromJson(json); @override - final num? acousticness; + final num? not_acoustic; @override - final num? danceability; + final num? dance_ability; @override @JsonKey(name: "duration_ms") final num? durationMs; @override final num? energy; @override - final num? instrumentalness; + final num? not_instrumental; @override final num? key; @override @@ -646,7 +646,7 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { @override final num? popularity; @override - final num? speechiness; + final num? talkative; @override final num? tempo; @override @@ -657,7 +657,7 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { @override String toString() { - return 'RecommendationSeeds(acousticness: $acousticness, danceability: $danceability, durationMs: $durationMs, energy: $energy, instrumentalness: $instrumentalness, key: $key, liveness: $liveness, loudness: $loudness, mode: $mode, popularity: $popularity, speechiness: $speechiness, tempo: $tempo, timeSignature: $timeSignature, valence: $valence)'; + return 'RecommendationSeeds(not_acoustic: $not_acoustic, dance_ability: $dance_ability, durationMs: $durationMs, energy: $energy, not_instrumental: $not_instrumental, key: $key, liveness: $liveness, loudness: $loudness, mode: $mode, popularity: $popularity, talkative: $talkative, tempo: $tempo, timeSignature: $timeSignature, valence: $valence)'; } @override @@ -665,15 +665,15 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { return identical(this, other) || (other.runtimeType == runtimeType && other is _$RecommendationSeedsImpl && - (identical(other.acousticness, acousticness) || - other.acousticness == acousticness) && - (identical(other.danceability, danceability) || - other.danceability == danceability) && + (identical(other.not_acoustic, not_acoustic) || + other.not_acoustic == not_acoustic) && + (identical(other.dance_ability, dance_ability) || + other.dance_ability == dance_ability) && (identical(other.durationMs, durationMs) || other.durationMs == durationMs) && (identical(other.energy, energy) || other.energy == energy) && - (identical(other.instrumentalness, instrumentalness) || - other.instrumentalness == instrumentalness) && + (identical(other.not_instrumental, not_instrumental) || + other.not_instrumental == not_instrumental) && (identical(other.key, key) || other.key == key) && (identical(other.liveness, liveness) || other.liveness == liveness) && @@ -682,8 +682,8 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { (identical(other.mode, mode) || other.mode == mode) && (identical(other.popularity, popularity) || other.popularity == popularity) && - (identical(other.speechiness, speechiness) || - other.speechiness == speechiness) && + (identical(other.talkative, talkative) || + other.talkative == talkative) && (identical(other.tempo, tempo) || other.tempo == tempo) && (identical(other.timeSignature, timeSignature) || other.timeSignature == timeSignature) && @@ -694,17 +694,17 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { @override int get hashCode => Object.hash( runtimeType, - acousticness, - danceability, + not_acoustic, + dance_ability, durationMs, energy, - instrumentalness, + not_instrumental, key, liveness, loudness, mode, popularity, - speechiness, + talkative, tempo, timeSignature, valence); @@ -728,17 +728,17 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds { abstract class _RecommendationSeeds implements RecommendationSeeds { factory _RecommendationSeeds( - {final num? acousticness, - final num? danceability, + {final num? not_acoustic, + final num? dance_ability, @JsonKey(name: "duration_ms") final num? durationMs, final num? energy, - final num? instrumentalness, + final num? not_instrumental, final num? key, final num? liveness, final num? loudness, final num? mode, final num? popularity, - final num? speechiness, + final num? talkative, final num? tempo, @JsonKey(name: "time_signature") final num? timeSignature, final num? valence}) = _$RecommendationSeedsImpl; @@ -747,16 +747,16 @@ abstract class _RecommendationSeeds implements RecommendationSeeds { _$RecommendationSeedsImpl.fromJson; @override - num? get acousticness; + num? get not_acoustic; @override - num? get danceability; + num? get dance_ability; @override @JsonKey(name: "duration_ms") num? get durationMs; @override num? get energy; @override - num? get instrumentalness; + num? get not_instrumental; @override num? get key; @override @@ -768,7 +768,7 @@ abstract class _RecommendationSeeds implements RecommendationSeeds { @override num? get popularity; @override - num? get speechiness; + num? get talkative; @override num? get tempo; @override diff --git a/lib/models/spotify/recommendation_seeds.g.dart b/lib/models/spotify/recommendation_seeds.g.dart index accb2ed1..cf8729e2 100644 --- a/lib/models/spotify/recommendation_seeds.g.dart +++ b/lib/models/spotify/recommendation_seeds.g.dart @@ -8,17 +8,17 @@ part of 'recommendation_seeds.dart'; _$RecommendationSeedsImpl _$$RecommendationSeedsImplFromJson(Map json) => _$RecommendationSeedsImpl( - acousticness: json['acousticness'] as num?, - danceability: json['danceability'] as num?, + not_acoustic: json['not_acoustic'] as num?, + dance_ability: json['dance_ability'] as num?, durationMs: json['duration_ms'] as num?, energy: json['energy'] as num?, - instrumentalness: json['instrumentalness'] as num?, + not_instrumental: json['not_instrumental'] as num?, key: json['key'] as num?, liveness: json['liveness'] as num?, loudness: json['loudness'] as num?, mode: json['mode'] as num?, popularity: json['popularity'] as num?, - speechiness: json['speechiness'] as num?, + talkative: json['talkative'] as num?, tempo: json['tempo'] as num?, timeSignature: json['time_signature'] as num?, valence: json['valence'] as num?, @@ -27,17 +27,17 @@ _$RecommendationSeedsImpl _$$RecommendationSeedsImplFromJson(Map json) => Map _$$RecommendationSeedsImplToJson( _$RecommendationSeedsImpl instance) => { - 'acousticness': instance.acousticness, - 'danceability': instance.danceability, + 'not_acoustic': instance.not_acoustic, + 'dance_ability': instance.dance_ability, 'duration_ms': instance.durationMs, 'energy': instance.energy, - 'instrumentalness': instance.instrumentalness, + 'not_instrumental': instance.not_instrumental, 'key': instance.key, 'liveness': instance.liveness, 'loudness': instance.loudness, 'mode': instance.mode, 'popularity': instance.popularity, - 'speechiness': instance.speechiness, + 'talkative': instance.talkative, 'tempo': instance.tempo, 'time_signature': instance.timeSignature, 'valence': instance.valence, diff --git a/lib/models/spotify_friends.dart b/lib/models/spotify_friends.dart index b386fb81..776d8571 100644 --- a/lib/models/spotify_friends.dart +++ b/lib/models/spotify_friends.dart @@ -62,6 +62,7 @@ class SpotifyActivityContext { _$SpotifyActivityContextFromJson(json); String get id => uri.split(":").last; + String get path => uri.split(":").skip(1).join("/"); } diff --git a/lib/modules/album/album_card.dart b/lib/modules/album/album_card.dart index 84106594..4615e977 100644 --- a/lib/modules/album/album_card.dart +++ b/lib/modules/album/album_card.dart @@ -12,10 +12,10 @@ import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/extensions/track.dart'; import 'package:spotube/models/connect/connect.dart'; +import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/querying_track_info.dart'; import 'package:spotube/provider/connect/connect.dart'; import 'package:spotube/provider/history/history.dart'; -import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; @@ -26,6 +26,7 @@ extension FormattedAlbumType on AlbumType { class AlbumCard extends HookConsumerWidget { final AlbumSimple album; final bool _isTile; + const AlbumCard( this.album, { super.key, diff --git a/lib/modules/artist/artist_card.dart b/lib/modules/artist/artist_card.dart index e53070ef..1b78b7c7 100644 --- a/lib/modules/artist/artist_card.dart +++ b/lib/modules/artist/artist_card.dart @@ -1,19 +1,17 @@ import 'package:auto_route/auto_route.dart'; import 'package:auto_size_text/auto_size_text.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotify/spotify.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; - import 'package:spotube/provider/blacklist_provider.dart'; class ArtistCard extends HookConsumerWidget { final Artist artist; + const ArtistCard(this.artist, {super.key}); @override @@ -45,7 +43,7 @@ class ArtistCard extends HookConsumerWidget { provider: backgroundImage, size: 130, ), - const Gap(10), + const Gap(16), AutoSizeText( artist.name!, maxLines: 2, @@ -61,7 +59,7 @@ class ArtistCard extends HookConsumerWidget { DestructiveBadge( child: Text(context.l10n.blacklisted.toUpperCase()), ), - const Gap(5), + const Gap(8), ], SecondaryBadge( child: Text(context.l10n.artist.toUpperCase()), diff --git a/lib/modules/connect/connect_device.dart b/lib/modules/connect/connect_device.dart index 2c8d612b..89d74769 100644 --- a/lib/modules/connect/connect_device.dart +++ b/lib/modules/connect/connect_device.dart @@ -9,7 +9,9 @@ import 'package:spotube/provider/connect/clients.dart'; class ConnectDeviceButton extends HookConsumerWidget { final bool _sidebar; + const ConnectDeviceButton({super.key}) : _sidebar = false; + const ConnectDeviceButton.sidebar({super.key}) : _sidebar = true; @override @@ -37,10 +39,14 @@ class ConnectDeviceButton extends HookConsumerWidget { onPressed: () { context.navigateTo(const ConnectRoute()); }, - trailing: const Icon(SpotubeIcons.speaker), + trailing: const Icon( + SpotubeIcons.speaker, + color: Colors.white, + ), child: Text( "${context.l10n.devices}" "${hasServices ? " (${connectClients.asData?.value.services.length})" : ""}", + style: const TextStyle(color: Colors.white), ), ), ); diff --git a/lib/modules/connect/local_devices.dart b/lib/modules/connect/local_devices.dart index dc192e44..dbecb1b9 100644 --- a/lib/modules/connect/local_devices.dart +++ b/lib/modules/connect/local_devices.dart @@ -26,7 +26,7 @@ class ConnectPageLocalDevices extends HookWidget { return SliverMainAxisGroup( slivers: [ - const SliverGap(10), + const SliverGap(16), SliverPadding( padding: const EdgeInsets.symmetric(horizontal: 8.0), sliver: SliverToBoxAdapter( @@ -36,10 +36,10 @@ class ConnectPageLocalDevices extends HookWidget { ), ), ), - const SliverGap(10), + const SliverGap(16), SliverList.separated( itemCount: devices.length, - separatorBuilder: (context, index) => const Gap(10), + separatorBuilder: (context, index) => const Gap(16), itemBuilder: (context, index) { final device = devices[index]; @@ -52,7 +52,7 @@ class ConnectPageLocalDevices extends HookWidget { ); }, ), - const SliverGap(200) + const SliverGap(256) ], ); } diff --git a/lib/modules/getting_started/blur_card.dart b/lib/modules/getting_started/blur_card.dart index 6434c0a3..dddf4f7a 100644 --- a/lib/modules/getting_started/blur_card.dart +++ b/lib/modules/getting_started/blur_card.dart @@ -3,6 +3,7 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; class BlurCard extends HookConsumerWidget { final Widget child; + const BlurCard({super.key, required this.child}); @override diff --git a/lib/modules/home/sections/feed.dart b/lib/modules/home/sections/feed.dart index d3e363cc..9fdb50e2 100644 --- a/lib/modules/home/sections/feed.dart +++ b/lib/modules/home/sections/feed.dart @@ -12,7 +12,7 @@ class HomePageFeedSection extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { final homeFeed = ref.watch(homeViewProvider); - final nonShortSections = homeFeed.asData?.value?.sections + final nonShortSections = homeFeed.asData?.value.sections .where((s) => s.typename == "HomeGenericSectionData") .toList() ?? []; @@ -37,7 +37,7 @@ class HomePageFeedSection extends HookConsumerWidget { hasNextPage: false, isLoadingNextPage: false, onFetchMore: () {}, - titleTrailing: Button.text( + titleTrailing: Button.ghost( child: Text(context.l10n.browse_all), onPressed: () { context.navigateTo(HomeFeedSectionRoute(sectionUri: section.uri)); diff --git a/lib/modules/home/sections/friends.dart b/lib/modules/home/sections/friends.dart index 5c9c2178..710966d0 100644 --- a/lib/modules/home/sections/friends.dart +++ b/lib/modules/home/sections/friends.dart @@ -5,8 +5,8 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/fake.dart'; -import 'package:spotube/modules/home/sections/friends/friend_item.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/home/sections/friends/friend_item.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/spotify/spotify.dart'; diff --git a/lib/modules/home/sections/friends/friend_item.dart b/lib/modules/home/sections/friends/friend_item.dart index bf04558f..af9d566e 100644 --- a/lib/modules/home/sections/friends/friend_item.dart +++ b/lib/modules/home/sections/friends/friend_item.dart @@ -1,6 +1,5 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/gestures.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; @@ -12,6 +11,7 @@ import 'package:spotube/provider/spotify/spotify.dart'; class FriendItem extends HookConsumerWidget { final SpotifyFriendActivity friend; + const FriendItem({ super.key, required this.friend, diff --git a/lib/modules/home/sections/genres/genre_card.dart b/lib/modules/home/sections/genres/genre_card.dart index 8133f0db..d878c49c 100644 --- a/lib/modules/home/sections/genres/genre_card.dart +++ b/lib/modules/home/sections/genres/genre_card.dart @@ -21,6 +21,7 @@ final gradientState = StateProvider.family( class GenreSectionCard extends HookConsumerWidget { final Category category; + const GenreSectionCard({ super.key, required this.category, @@ -98,7 +99,7 @@ class GenreSectionCard extends HookConsumerWidget { child: ListView.separated( scrollDirection: Axis.horizontal, itemCount: playlistsData.length, - separatorBuilder: (context, index) => const Gap(12), + separatorBuilder: (context, index) => const Gap(24), itemBuilder: (context, index) { final playlist = playlistsData.elementAt(index); diff --git a/lib/modules/home/sections/genres/genre_card_playlist_card.dart b/lib/modules/home/sections/genres/genre_card_playlist_card.dart index 1e1b3b76..61902644 100644 --- a/lib/modules/home/sections/genres/genre_card_playlist_card.dart +++ b/lib/modules/home/sections/genres/genre_card_playlist_card.dart @@ -12,6 +12,7 @@ import 'package:stroke_text/stroke_text.dart'; class GenreSectionCardPlaylistCard extends HookConsumerWidget { final PlaylistSimple playlist; + const GenreSectionCardPlaylistCard({ super.key, required this.playlist, diff --git a/lib/modules/home/sections/genres/genres.dart b/lib/modules/home/sections/genres/genres.dart index c9f3f9b2..3a4cdab2 100644 --- a/lib/modules/home/sections/genres/genres.dart +++ b/lib/modules/home/sections/genres/genres.dart @@ -1,6 +1,5 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; diff --git a/lib/modules/library/local_folder/cache_export_dialog.dart b/lib/modules/library/local_folder/cache_export_dialog.dart index 0f10defc..beb018f6 100644 --- a/lib/modules/library/local_folder/cache_export_dialog.dart +++ b/lib/modules/library/local_folder/cache_export_dialog.dart @@ -1,9 +1,9 @@ import 'dart:io'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:path/path.dart' as path; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/sourced_track/enums.dart'; @@ -13,6 +13,7 @@ final codecs = SourceCodecs.values.map((s) => s.name); class LocalFolderCacheExportDialog extends HookConsumerWidget { final Directory exportDir; final Directory cacheDir; + const LocalFolderCacheExportDialog({ super.key, required this.exportDir, @@ -66,7 +67,7 @@ class LocalFolderCacheExportDialog extends HookConsumerWidget { Text( context.l10n.found_n_files(files.value.length.toString()), ), - const Gap(10), + const Gap(16), Text.rich( TextSpan( children: [ @@ -93,7 +94,7 @@ class LocalFolderCacheExportDialog extends HookConsumerWidget { filesExported.value.toString(), ), ), - const Gap(10), + const Gap(16), LinearProgressIndicator( value: filesExported.value / files.value.length, ), diff --git a/lib/modules/library/local_folder/local_folder_item.dart b/lib/modules/library/local_folder/local_folder_item.dart index 78f1aa14..33924709 100644 --- a/lib/modules/library/local_folder/local_folder_item.dart +++ b/lib/modules/library/local_folder/local_folder_item.dart @@ -2,7 +2,6 @@ import 'dart:math'; import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:path/path.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; @@ -18,6 +17,7 @@ import 'package:spotube/provider/user_preferences/user_preferences_provider.dart class LocalFolderItem extends HookConsumerWidget { final String folder; + const LocalFolderItem({super.key, required this.folder}); @override diff --git a/lib/modules/library/playlist_generate/recommendation_attribute_dials.dart b/lib/modules/library/playlist_generate/recommendation_attribute_dials.dart index 564bfb55..e62b7b99 100644 --- a/lib/modules/library/playlist_generate/recommendation_attribute_dials.dart +++ b/lib/modules/library/playlist_generate/recommendation_attribute_dials.dart @@ -8,8 +8,10 @@ typedef RecommendationAttribute = ({double min, double target, double max}); RecommendationAttribute lowValues(double base) => (min: 1 * base, target: 0.3 * base, max: 0.3 * base); + RecommendationAttribute moderateValues(double base) => (min: 0.5 * base, target: 1 * base, max: 0.5 * base); + RecommendationAttribute highValues(double base) => (min: 0.3 * base, target: 0.3 * base, max: 1 * base); diff --git a/lib/modules/library/playlist_generate/recommendation_attribute_fields.dart b/lib/modules/library/playlist_generate/recommendation_attribute_fields.dart index b616b080..8a14c50f 100644 --- a/lib/modules/library/playlist_generate/recommendation_attribute_fields.dart +++ b/lib/modules/library/playlist_generate/recommendation_attribute_fields.dart @@ -1,9 +1,9 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; -import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart'; -import 'package:spotube/modules/library/playlist_generate/recommendation_attribute_dials.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart'; +import 'package:spotube/modules/library/playlist_generate/recommendation_attribute_dials.dart'; import 'package:spotube/pages/library/playlist_generate/playlist_generate.dart'; class RecommendationAttributeFields extends HookWidget { diff --git a/lib/modules/library/playlist_generate/simple_track_tile.dart b/lib/modules/library/playlist_generate/simple_track_tile.dart index afa723f3..aea5dd0d 100644 --- a/lib/modules/library/playlist_generate/simple_track_tile.dart +++ b/lib/modules/library/playlist_generate/simple_track_tile.dart @@ -2,7 +2,6 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/spotube_icons.dart'; - import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/ui/button_tile.dart'; import 'package:spotube/extensions/image.dart'; @@ -10,6 +9,7 @@ import 'package:spotube/extensions/image.dart'; class SimpleTrackTile extends HookWidget { final Track track; final VoidCallback? onDelete; + const SimpleTrackTile({ super.key, required this.track, diff --git a/lib/modules/library/user_downloads/download_item.dart b/lib/modules/library/user_downloads/download_item.dart index 2c0a96a5..b209dc46 100644 --- a/lib/modules/library/user_downloads/download_item.dart +++ b/lib/modules/library/user_downloads/download_item.dart @@ -16,6 +16,7 @@ import 'package:spotube/services/sourced_track/sourced_track.dart'; class DownloadItem extends HookConsumerWidget { final Track track; + const DownloadItem({ super.key, required this.track, @@ -135,7 +136,7 @@ class DownloadItem extends HookConsumerWidget { ), DownloadStatus.completed => Icon(SpotubeIcons.done, color: Colors.green[400]), - DownloadStatus.queued => IconButton.ghost( + DownloadStatus.queued => IconButton.text( icon: const Icon(SpotubeIcons.close), onPressed: () { downloadManager.removeFromQueue(track as SourcedTrack); diff --git a/lib/modules/lyrics/zoom_controls.dart b/lib/modules/lyrics/zoom_controls.dart index b4eeb9d6..26148240 100644 --- a/lib/modules/lyrics/zoom_controls.dart +++ b/lib/modules/lyrics/zoom_controls.dart @@ -1,7 +1,6 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; - import 'package:spotube/collections/spotube_icons.dart'; class ZoomControls extends HookWidget { diff --git a/lib/modules/player/player.dart b/lib/modules/player/player.dart index aa5171d5..d2677a68 100644 --- a/lib/modules/player/player.dart +++ b/lib/modules/player/player.dart @@ -4,36 +4,35 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:sliding_up_panel/sliding_up_panel.dart'; - import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/components/framework/app_pop_scope.dart'; -import 'package:spotube/modules/player/player_actions.dart'; -import 'package:spotube/modules/player/player_controls.dart'; -import 'package:spotube/modules/player/volume_slider.dart'; import 'package:spotube/components/dialogs/track_details_dialog.dart'; +import 'package:spotube/components/framework/app_pop_scope.dart'; +import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/links/artist_link.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/extensions/artist_simple.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/models/local_track.dart'; +import 'package:spotube/modules/player/player_actions.dart'; +import 'package:spotube/modules/player/player_controls.dart'; +import 'package:spotube/modules/player/volume_slider.dart'; import 'package:spotube/modules/root/spotube_navigation_bar.dart'; -import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/server/active_sourced_track.dart'; import 'package:spotube/provider/volume_provider.dart'; import 'package:spotube/services/sourced_track/sources/youtube.dart'; import 'package:spotube/utils/platform.dart'; - import 'package:url_launcher/url_launcher_string.dart'; class PlayerView extends HookConsumerWidget { final PanelController panelController; final ScrollController scrollController; + const PlayerView({ super.key, required this.panelController, diff --git a/lib/modules/player/player_actions.dart b/lib/modules/player/player_actions.dart index 0ed56ed2..f39b534d 100644 --- a/lib/modules/player/player_actions.dart +++ b/lib/modules/player/player_actions.dart @@ -5,20 +5,19 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/routes.gr.dart'; - import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/extensions/constrains.dart'; -import 'package:spotube/modules/player/player_queue.dart'; -import 'package:spotube/modules/player/sibling_tracks_sheet.dart'; import 'package:spotube/components/adaptive/adaptive_pop_sheet_list.dart'; import 'package:spotube/components/heart_button/heart_button.dart'; import 'package:spotube/extensions/artist_simple.dart'; +import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/duration.dart'; import 'package:spotube/models/local_track.dart'; -import 'package:spotube/provider/download_manager_provider.dart'; -import 'package:spotube/provider/authentication/authentication.dart'; +import 'package:spotube/modules/player/player_queue.dart'; +import 'package:spotube/modules/player/sibling_tracks_sheet.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +import 'package:spotube/provider/authentication/authentication.dart'; +import 'package:spotube/provider/download_manager_provider.dart'; import 'package:spotube/provider/sleep_timer_provider.dart'; class PlayerActions extends HookConsumerWidget { @@ -67,8 +66,8 @@ class PlayerActions extends HookConsumerWidget { final sleepTimerEntries = useMemoized( () => { - context.l10n.mins(15): const Duration(minutes: 15), - context.l10n.mins(30): const Duration(minutes: 30), + context.l10n.minutes(15): const Duration(minutes: 15), + context.l10n.minutes(30): const Duration(minutes: 30), context.l10n.hour(1): const Duration(hours: 1), context.l10n.hour(2): const Duration(hours: 2), }, diff --git a/lib/modules/player/player_controls.dart b/lib/modules/player/player_controls.dart index 4d5d6deb..f2299c27 100644 --- a/lib/modules/player/player_controls.dart +++ b/lib/modules/player/player_controls.dart @@ -4,9 +4,8 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:media_kit/media_kit.dart'; import 'package:palette_generator/palette_generator.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - -import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/intents.dart'; +import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/duration.dart'; @@ -144,7 +143,7 @@ class PlayerControls extends HookConsumerWidget { tooltip: TooltipContainer( child: Text( shuffled - ? context.l10n.unshuffle_playlist + ? context.l10n.not_shuffle_playlist : context.l10n.shuffle_playlist, ), ), @@ -173,7 +172,10 @@ class PlayerControls extends HookConsumerWidget { child: Text(context.l10n.previous_track)), child: IconButton.ghost( enabled: !isFetchingActiveTrack, - icon: const Icon(SpotubeIcons.skipBack), + icon: const Icon( + SpotubeIcons.skipBack, + color: Colors.white, + ), onPressed: audioPlayer.skipToPrevious, ), ), @@ -195,6 +197,7 @@ class PlayerControls extends HookConsumerWidget { ) : Icon( playing ? SpotubeIcons.pause : SpotubeIcons.play, + color: Colors.white, ), onPressed: isFetchingActiveTrack ? null diff --git a/lib/modules/player/player_overlay.dart b/lib/modules/player/player_overlay.dart index 3c3ff373..c0aaebda 100644 --- a/lib/modules/player/player_overlay.dart +++ b/lib/modules/player/player_overlay.dart @@ -1,10 +1,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:sliding_up_panel/sliding_up_panel.dart'; -import 'package:spotube/modules/player/player_overlay_collapsed.dart'; - -import 'package:spotube/modules/root/spotube_navigation_bar.dart'; import 'package:spotube/modules/player/player.dart'; +import 'package:spotube/modules/player/player_overlay_collapsed.dart'; +import 'package:spotube/modules/root/spotube_navigation_bar.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; final playerOverlayControllerProvider = StateProvider((ref) { diff --git a/lib/modules/player/player_overlay_collapsed.dart b/lib/modules/player/player_overlay_collapsed.dart index d0961ade..997c66ea 100644 --- a/lib/modules/player/player_overlay_collapsed.dart +++ b/lib/modules/player/player_overlay_collapsed.dart @@ -12,6 +12,7 @@ import 'package:spotube/services/audio_player/audio_player.dart'; class PlayerOverlayCollapsedSection extends HookConsumerWidget { final PanelController panelController; + const PlayerOverlayCollapsedSection({ super.key, required this.panelController, @@ -101,7 +102,7 @@ class PlayerOverlayCollapsedSection extends HookConsumerWidget { ? null : audioPlayer.skipToNext, ), - const Gap(5), + const Gap(8), ], ), ], diff --git a/lib/modules/player/player_queue.dart b/lib/modules/player/player_queue.dart index 0ef86111..ceda9cdf 100644 --- a/lib/modules/player/player_queue.dart +++ b/lib/modules/player/player_queue.dart @@ -4,7 +4,6 @@ import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; - import 'package:scroll_to_index/scroll_to_index.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; @@ -170,7 +169,7 @@ class PlayerQueue extends HookConsumerWidget { }, ), ), - const Gap(5), + const Gap(8), if (mediaQuery.smAndDown) const BackButton(icon: SpotubeIcons.angleDown), ], @@ -183,7 +182,7 @@ class PlayerQueue extends HookConsumerWidget { child: CustomScrollView( controller: controller, slivers: [ - const SliverGap(10), + const SliverGap(16), SliverReorderableList( onReorder: onReorder, itemCount: filteredTracks.length, diff --git a/lib/modules/player/player_track_details.dart b/lib/modules/player/player_track_details.dart index 2e38bf37..26dadc3a 100644 --- a/lib/modules/player/player_track_details.dart +++ b/lib/modules/player/player_track_details.dart @@ -1,9 +1,7 @@ import 'package:auto_route/auto_route.dart'; - -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; - import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/components/image/universal_image.dart'; @@ -17,6 +15,7 @@ import 'package:spotube/provider/audio_player/audio_player.dart'; class PlayerTrackDetails extends HookConsumerWidget { final Color? color; final Track? track; + const PlayerTrackDetails({super.key, this.color, this.track}); @override diff --git a/lib/modules/player/sibling_tracks_sheet.dart b/lib/modules/player/sibling_tracks_sheet.dart index d026cea9..e41230c9 100644 --- a/lib/modules/player/sibling_tracks_sheet.dart +++ b/lib/modules/player/sibling_tracks_sheet.dart @@ -1,5 +1,4 @@ import 'package:collection/collection.dart'; - import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; @@ -60,6 +59,7 @@ final sourceInfoToIconMap = { class SiblingTracksSheet extends HookConsumerWidget { final bool floating; + const SiblingTracksSheet({ super.key, this.floating = true, diff --git a/lib/modules/player/volume_slider.dart b/lib/modules/player/volume_slider.dart index ee4ac9c5..505d2a7b 100644 --- a/lib/modules/player/volume_slider.dart +++ b/lib/modules/player/volume_slider.dart @@ -1,5 +1,4 @@ import 'package:flutter/gestures.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/spotube_icons.dart'; diff --git a/lib/modules/playlist/playlist_card.dart b/lib/modules/playlist/playlist_card.dart index 1e2ba1bf..edcf23c1 100644 --- a/lib/modules/playlist/playlist_card.dart +++ b/lib/modules/playlist/playlist_card.dart @@ -11,10 +11,10 @@ import 'package:spotube/components/playbutton_view/playbutton_tile.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/models/connect/connect.dart'; +import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/querying_track_info.dart'; import 'package:spotube/provider/connect/connect.dart'; import 'package:spotube/provider/history/history.dart'; -import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:stroke_text/stroke_text.dart'; diff --git a/lib/modules/playlist/playlist_create_dialog.dart b/lib/modules/playlist/playlist_create_dialog.dart index 3ee39583..e85fd0ab 100644 --- a/lib/modules/playlist/playlist_create_dialog.dart +++ b/lib/modules/playlist/playlist_create_dialog.dart @@ -4,14 +4,13 @@ import 'dart:io'; import 'package:auto_route/auto_route.dart'; import 'package:collection/collection.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; -import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:image_picker/image_picker.dart'; import 'package:path/path.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; - import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/form/checkbox_form_field.dart'; import 'package:spotube/components/form/text_form_field.dart'; @@ -24,6 +23,7 @@ class PlaylistCreateDialog extends HookConsumerWidget { /// Track ids to add to the playlist final List trackIds; final String? playlistId; + const PlaylistCreateDialog({ super.key, this.trackIds = const [], @@ -222,14 +222,14 @@ class PlaylistCreateDialog extends HookConsumerWidget { ); }, ), - const Gap(20), + const Gap(32), TextFormBuilderField( name: 'playlistName', label: Text(context.l10n.playlist_name), placeholder: Text(context.l10n.name_of_playlist), validator: FormBuilderValidators.required(), ), - const Gap(20), + const Gap(32), TextFormBuilderField( name: 'description', label: Text(context.l10n.description), @@ -238,12 +238,12 @@ class PlaylistCreateDialog extends HookConsumerWidget { keyboardType: TextInputType.multiline, maxLines: 5, ), - const Gap(20), + const Gap(32), CheckboxFormBuilderField( name: 'public', trailing: Text(context.l10n.public), ), - const Gap(10), + const Gap(16), CheckboxFormBuilderField( name: 'collaborative', trailing: Text(context.l10n.collaborative), diff --git a/lib/modules/root/bottom_player.dart b/lib/modules/root/bottom_player.dart index 18b4c221..ab6b726d 100644 --- a/lib/modules/root/bottom_player.dart +++ b/lib/modules/root/bottom_player.dart @@ -3,22 +3,20 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; - import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/models/database/database.dart'; -import 'package:spotube/modules/player/player_actions.dart'; -import 'package:spotube/modules/player/player_overlay.dart'; -import 'package:spotube/modules/player/player_track_details.dart'; -import 'package:spotube/modules/player/player_controls.dart'; -import 'package:spotube/modules/player/volume_slider.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; +import 'package:spotube/models/database/database.dart'; +import 'package:spotube/modules/player/player_actions.dart'; +import 'package:spotube/modules/player/player_controls.dart'; +import 'package:spotube/modules/player/player_overlay.dart'; +import 'package:spotube/modules/player/player_track_details.dart'; +import 'package:spotube/modules/player/volume_slider.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; - import 'package:spotube/provider/volume_provider.dart'; import 'package:spotube/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/modules/root/sidebar/sidebar.dart b/lib/modules/root/sidebar/sidebar.dart index 743b339b..5882de49 100644 --- a/lib/modules/root/sidebar/sidebar.dart +++ b/lib/modules/root/sidebar/sidebar.dart @@ -2,14 +2,12 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/side_bar_tiles.dart'; -import 'package:spotube/models/database/database.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/models/database/database.dart'; import 'package:spotube/modules/root/sidebar/sidebar_footer.dart'; - import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; class Sidebar extends HookConsumerWidget { @@ -26,7 +24,7 @@ class Sidebar extends HookConsumerWidget { color: Colors.black, borderRadius: BorderRadius.circular(50), ), - child: Assets.spotubeLogoPng.image(height: 50), + child: Assets.spotubeLogoStableNotWallpaper.image(height: 50), ); } @@ -62,7 +60,7 @@ class Sidebar extends HookConsumerWidget { final navigationButtons = [ NavigationLabel( - child: mediaQuery.lgAndUp ? const Text("Spotube") : const Text(""), + child: mediaQuery.lgAndUp ? const Text("SpoTube") : const Text(""), ), for (final tile in sidebarTileList) NavigationButton( @@ -117,7 +115,7 @@ class Sidebar extends HookConsumerWidget { ), ), const SidebarFooter(), - if (mediaQuery.lgAndUp) const Gap(130) else const Gap(65), + if (mediaQuery.lgAndUp) const Gap(128) else const Gap(64), ], ), const VerticalDivider(), diff --git a/lib/modules/root/sidebar/sidebar_footer.dart b/lib/modules/root/sidebar/sidebar_footer.dart index fb3edddd..a2f1d5ae 100644 --- a/lib/modules/root/sidebar/sidebar_footer.dart +++ b/lib/modules/root/sidebar/sidebar_footer.dart @@ -2,13 +2,12 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart' show Badge; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/image/universal_image.dart'; -import 'package:spotube/extensions/image.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/extensions/image.dart'; import 'package:spotube/modules/connect/connect_device.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/download_manager_provider.dart'; @@ -62,7 +61,7 @@ class SidebarFooter extends HookConsumerWidget implements NavigationBarItem { } return Container( - padding: const EdgeInsets.only(left: 12), + padding: const EdgeInsets.only(left: 12, bottom: 48), width: 180, child: Column( mainAxisSize: MainAxisSize.min, diff --git a/lib/modules/root/spotube_navigation_bar.dart b/lib/modules/root/spotube_navigation_bar.dart index 15417fa6..d9a3a1f9 100644 --- a/lib/modules/root/spotube_navigation_bar.dart +++ b/lib/modules/root/spotube_navigation_bar.dart @@ -6,11 +6,8 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; - import 'package:spotube/collections/side_bar_tiles.dart'; -import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; -import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/download_manager_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; @@ -44,11 +41,11 @@ class SpotubeNavigationBar extends HookConsumerWidget { ), ); - if (layoutMode == LayoutMode.extended || - (mediaQuery.mdAndUp && layoutMode == LayoutMode.adaptive) || - panelHeight < 10) { - return const SizedBox(); - } + // if (layoutMode == LayoutMode.extended || + // (mediaQuery.mdAndUp && layoutMode == LayoutMode.adaptive) || + // panelHeight < 10) { + // return const SizedBox(); + // } return AnimatedContainer( duration: const Duration(milliseconds: 100), diff --git a/lib/modules/root/update_dialog.dart b/lib/modules/root/update_dialog.dart index 4aa2fd13..81681443 100644 --- a/lib/modules/root/update_dialog.dart +++ b/lib/modules/root/update_dialog.dart @@ -1,7 +1,7 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/components/links/anchor_button.dart'; -import 'package:url_launcher/url_launcher_string.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:url_launcher/url_launcher_string.dart'; import 'package:version/version.dart'; class RootAppUpdateDialog extends StatelessWidget { @@ -9,6 +9,7 @@ class RootAppUpdateDialog extends StatelessWidget { final int? nightlyBuildNum; const RootAppUpdateDialog({super.key, this.version}) : nightlyBuildNum = null; + const RootAppUpdateDialog.nightly({super.key, required this.nightlyBuildNum}) : version = null; diff --git a/lib/modules/settings/color_scheme_picker_dialog.dart b/lib/modules/settings/color_scheme_picker_dialog.dart index 8092f825..5d636de7 100644 --- a/lib/modules/settings/color_scheme_picker_dialog.dart +++ b/lib/modules/settings/color_scheme_picker_dialog.dart @@ -4,7 +4,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/extensions/context.dart'; - import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; class SpotubeColor extends Color { @@ -127,6 +126,7 @@ class ColorChip extends StatelessWidget { final Color color; final bool isActive; final VoidCallback onPressed; + const ColorChip({ super.key, required this.name, diff --git a/lib/modules/settings/section_card_with_heading.dart b/lib/modules/settings/section_card_with_heading.dart index c7bc1f26..930890a8 100644 --- a/lib/modules/settings/section_card_with_heading.dart +++ b/lib/modules/settings/section_card_with_heading.dart @@ -5,6 +5,7 @@ import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; class SectionCardWithHeading extends StatelessWidget { final String heading; final List children; + const SectionCardWithHeading({ super.key, required this.heading, diff --git a/lib/modules/settings/youtube_engine_not_installed_dialog.dart b/lib/modules/settings/youtube_engine_not_installed_dialog.dart index b993dd1b..488f965b 100644 --- a/lib/modules/settings/youtube_engine_not_installed_dialog.dart +++ b/lib/modules/settings/youtube_engine_not_installed_dialog.dart @@ -22,6 +22,7 @@ const engineDownloadUrls = { class YouTubeEngineNotInstalledDialog extends HookConsumerWidget { final YoutubeClientEngine engine; + const YouTubeEngineNotInstalledDialog({ super.key, required this.engine, @@ -88,7 +89,7 @@ class YouTubeEngineNotInstalledDialog extends HookConsumerWidget { ), ), actions: [ - Button.text( + Button.ghost( onPressed: () { if (!context.mounted) return; Navigator.of(context).pop(false); diff --git a/lib/modules/stats/common/album_item.dart b/lib/modules/stats/common/album_item.dart index cd0a6caf..939bc49a 100644 --- a/lib/modules/stats/common/album_item.dart +++ b/lib/modules/stats/common/album_item.dart @@ -2,15 +2,16 @@ import 'package:auto_route/auto_route.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/routes.gr.dart'; -import 'package:spotube/components/ui/button_tile.dart'; -import 'package:spotube/modules/album/album_card.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/links/artist_link.dart'; +import 'package:spotube/components/ui/button_tile.dart'; import 'package:spotube/extensions/image.dart'; +import 'package:spotube/modules/album/album_card.dart'; class StatsAlbumItem extends StatelessWidget { final AlbumSimple album; final Widget info; + const StatsAlbumItem({super.key, required this.album, required this.info}); @override diff --git a/lib/modules/stats/common/artist_item.dart b/lib/modules/stats/common/artist_item.dart index 5eff9a9d..15f091e3 100644 --- a/lib/modules/stats/common/artist_item.dart +++ b/lib/modules/stats/common/artist_item.dart @@ -9,6 +9,7 @@ import 'package:spotube/extensions/image.dart'; class StatsArtistItem extends StatelessWidget { final Artist artist; final Widget info; + const StatsArtistItem({ super.key, required this.artist, diff --git a/lib/modules/stats/common/playlist_item.dart b/lib/modules/stats/common/playlist_item.dart index 58610af1..1d12cf15 100644 --- a/lib/modules/stats/common/playlist_item.dart +++ b/lib/modules/stats/common/playlist_item.dart @@ -10,6 +10,7 @@ import 'package:spotube/extensions/string.dart'; class StatsPlaylistItem extends StatelessWidget { final PlaylistSimple playlist; final Widget info; + const StatsPlaylistItem( {super.key, required this.playlist, required this.info}); diff --git a/lib/modules/stats/common/track_item.dart b/lib/modules/stats/common/track_item.dart index ae2e22c6..8a19d193 100644 --- a/lib/modules/stats/common/track_item.dart +++ b/lib/modules/stats/common/track_item.dart @@ -10,6 +10,7 @@ import 'package:spotube/extensions/image.dart'; class StatsTrackItem extends StatelessWidget { final Track track; final Widget info; + const StatsTrackItem({ super.key, required this.track, diff --git a/lib/modules/stats/summary/summary.dart b/lib/modules/stats/summary/summary.dart index 30e68b1f..9e7ceae9 100644 --- a/lib/modules/stats/summary/summary.dart +++ b/lib/modules/stats/summary/summary.dart @@ -3,10 +3,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/fake.dart'; -import 'package:spotube/collections/formatters.dart'; import 'package:spotube/collections/routes.gr.dart'; -import 'package:spotube/modules/stats/summary/summary_card.dart'; -import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/history/summary.dart'; @@ -22,76 +19,49 @@ class StatsPageSummarySection extends HookConsumerWidget { enabled: summary.isLoading, child: SliverPadding( padding: const EdgeInsets.all(10), - sliver: SliverLayoutBuilder(builder: (context, constrains) { + sliver: SliverLayoutBuilder(builder: (context, constraints) { return SliverGrid( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: constrains.isXs - ? 2 - : constrains.smAndDown - ? 3 - : constrains.mdAndDown - ? 4 - : constrains.lgAndDown - ? 5 - : 6, - mainAxisSpacing: 10, - crossAxisSpacing: 10, - childAspectRatio: constrains.isXs ? 1.3 : 1.5, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 5, + crossAxisSpacing: 25, + mainAxisSpacing: 25, + childAspectRatio: 1.5, ), delegate: SliverChildListDelegate([ - SummaryCard( - title: summaryData.duration.inMinutes.toDouble(), + _buildTile( + context, + title: summaryData.duration.inMinutes.toString(), unit: context.l10n.summary_minutes, - description: context.l10n.summary_listened_to_music, - color: Colors.indigo, - onTap: () { - context.navigateTo(const StatsMinutesRoute()); - }, + icon: Icons.access_time, + route: const StatsMinutesRoute(), ), - SummaryCard( - title: summaryData.tracks.toDouble(), - unit: context.l10n.summary_songs, - description: context.l10n.summary_streamed_overall, - color: Colors.blue, - onTap: () { - context.navigateTo(const StatsStreamsRoute()); - }, - ), - SummaryCard.unformatted( - title: usdFormatter.format(summaryData.fees.toDouble()), - unit: "", - description: context.l10n.summary_owed_to_artists, - color: Colors.green, - onTap: () { - context.navigateTo(const StatsStreamFeesRoute()); - }, - ), - SummaryCard( - title: summaryData.artists.toDouble(), - unit: context.l10n.summary_artists, - description: context.l10n.summary_music_reached_you, - color: Colors.yellow, - onTap: () { - context.navigateTo(const StatsArtistsRoute()); - }, - ), - SummaryCard( - title: summaryData.albums.toDouble(), + _buildTile( + context, + title: summaryData.albums.toString(), unit: context.l10n.summary_full_albums, - description: context.l10n.summary_got_your_love, - color: Colors.pink, - onTap: () { - context.navigateTo(const StatsAlbumsRoute()); - }, + icon: Icons.album, + route: const StatsAlbumsRoute(), ), - SummaryCard( - title: summaryData.playlists.toDouble(), + _buildTile( + context, + title: summaryData.playlists.toString(), unit: context.l10n.summary_playlists, - description: context.l10n.summary_were_on_repeat, - color: Colors.teal, - onTap: () { - context.navigateTo(const StatsPlaylistsRoute()); - }, + icon: Icons.playlist_play, + route: const StatsPlaylistsRoute(), + ), + _buildTile( + context, + title: summaryData.artists.toString(), + unit: context.l10n.artists, + icon: Icons.person, + route: const StatsArtistsRoute(), + ), + _buildTile( + context, + title: "\$ ${summaryData.fees.toString()}", + unit: context.l10n.streaming_fees_hypothetical, + icon: Icons.monetization_on, + route: const StatsStreamFeesRoute(), ), ]), ); @@ -99,4 +69,64 @@ class StatsPageSummarySection extends HookConsumerWidget { ), ); } + + Widget _buildTile( + BuildContext context, { + required String title, + required String unit, + required IconData icon, + required PageRouteInfo route, + VoidCallback? onTap, + }) { + return GestureDetector( + onTap: onTap ?? + () { + context.navigateTo(route); + }, + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 20), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondary, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + spreadRadius: 2, + blurRadius: 5, + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + icon, + color: Colors.white, + size: 35, + ), + const SizedBox(height: 12), + Text( + title, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 6), + Text( + unit, + style: TextStyle( + fontSize: 14, + color: Colors.white.withOpacity(0.7), + ), + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ); + } } diff --git a/lib/modules/stats/summary/summary_card.dart b/lib/modules/stats/summary/summary_card.dart index e78dd080..aff5eb60 100644 --- a/lib/modules/stats/summary/summary_card.dart +++ b/lib/modules/stats/summary/summary_card.dart @@ -70,7 +70,7 @@ class SummaryCard extends StatelessWidget { ), maxLines: 1, ), - const Gap(5), + const Gap(8), AutoSizeText( description, maxLines: description.contains("\n") diff --git a/lib/modules/stats/top/albums.dart b/lib/modules/stats/top/albums.dart index 09bf755c..f3dd69d6 100644 --- a/lib/modules/stats/top/albums.dart +++ b/lib/modules/stats/top/albums.dart @@ -4,8 +4,8 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; -import 'package:spotube/modules/stats/common/album_item.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/stats/common/album_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/albums.dart'; import 'package:spotube/provider/spotify/spotify.dart'; @@ -38,7 +38,7 @@ class TopAlbums extends HookConsumerWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - const Gap(50), + const Gap(64), Undraw( illustration: UndrawIllustration.happyMusic, color: context.theme.colorScheme.primary, diff --git a/lib/modules/stats/top/artists.dart b/lib/modules/stats/top/artists.dart index c53c34fd..9d077732 100644 --- a/lib/modules/stats/top/artists.dart +++ b/lib/modules/stats/top/artists.dart @@ -5,8 +5,8 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; -import 'package:spotube/modules/stats/common/artist_item.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/stats/common/artist_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/tracks.dart'; import 'package:spotube/provider/spotify/spotify.dart'; @@ -42,7 +42,7 @@ class TopArtists extends HookConsumerWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - const Gap(50), + const Gap(64), Undraw( illustration: UndrawIllustration.happyMusic, color: context.theme.colorScheme.primary, diff --git a/lib/modules/stats/top/top.dart b/lib/modules/stats/top/top.dart index 38f04ccb..9dbb3ef1 100644 --- a/lib/modules/stats/top/top.dart +++ b/lib/modules/stats/top/top.dart @@ -3,11 +3,10 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/extensions/constrains.dart'; +import 'package:spotube/extensions/context.dart'; import 'package:spotube/modules/stats/top/albums.dart'; import 'package:spotube/modules/stats/top/artists.dart'; import 'package:spotube/modules/stats/top/tracks.dart'; -import 'package:spotube/extensions/context.dart'; - import 'package:spotube/provider/history/top.dart'; class StatsPageTopSection extends HookConsumerWidget { diff --git a/lib/modules/stats/top/tracks.dart b/lib/modules/stats/top/tracks.dart index c4015431..c35917e4 100644 --- a/lib/modules/stats/top/tracks.dart +++ b/lib/modules/stats/top/tracks.dart @@ -4,8 +4,8 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; -import 'package:spotube/modules/stats/common/track_item.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/stats/common/track_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/tracks.dart'; import 'package:spotube/provider/spotify/spotify.dart'; @@ -40,7 +40,7 @@ class TopTracks extends HookConsumerWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - const Gap(50), + const Gap(64), Undraw( illustration: UndrawIllustration.happyMusic, color: context.theme.colorScheme.primary, diff --git a/lib/pages/album/album.dart b/lib/pages/album/album.dart index 5773f9fa..9946de37 100644 --- a/lib/pages/album/album.dart +++ b/lib/pages/album/album.dart @@ -1,5 +1,5 @@ -import 'package:flutter/material.dart' as material; import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart' as material; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; @@ -15,6 +15,7 @@ class AlbumPage extends HookConsumerWidget { final AlbumSimple album; final String id; + const AlbumPage({ super.key, @PathParam("id") required this.id, diff --git a/lib/pages/artist/artist.dart b/lib/pages/artist/artist.dart index 2037174a..81a0e1f9 100644 --- a/lib/pages/artist/artist.dart +++ b/lib/pages/artist/artist.dart @@ -1,26 +1,25 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart' as material; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/components/button/back_button.dart'; - import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/modules/artist/artist_album_list.dart'; import 'package:spotube/extensions/context.dart'; - +import 'package:spotube/modules/artist/artist_album_list.dart'; import 'package:spotube/pages/artist/section/footer.dart'; import 'package:spotube/pages/artist/section/header.dart'; import 'package:spotube/pages/artist/section/related_artists.dart'; import 'package:spotube/pages/artist/section/top_tracks.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class ArtistPage extends HookConsumerWidget { static const name = "artist"; final String artistId; + const ArtistPage( @PathParam("id") this.artistId, { super.key, @@ -70,9 +69,9 @@ class ArtistPage extends HookConsumerWidget { child: ArtistPageHeader(artistId: artistId), ), ), - const SliverGap(20), + const SliverGap(32), ArtistPageTopTracks(artistId: artistId), - const SliverGap(20), + const SliverGap(32), SliverToBoxAdapter(child: ArtistAlbumList(artistId)), SliverPadding( padding: const EdgeInsets.all(8.0), @@ -84,13 +83,13 @@ class ArtistPage extends HookConsumerWidget { ), ), ArtistPageRelatedArtists(artistId: artistId), - const SliverGap(20), + const SliverGap(32), if (artistQuery.asData?.value != null) SliverToBoxAdapter( child: ArtistPageFooter(artist: artistQuery.asData!.value), ), - const SliverSafeArea(sliver: SliverGap(10)), + const SliverSafeArea(sliver: SliverGap(16)), ], ), ); diff --git a/lib/pages/artist/section/footer.dart b/lib/pages/artist/section/footer.dart index 0fe2ab68..121601d4 100644 --- a/lib/pages/artist/section/footer.dart +++ b/lib/pages/artist/section/footer.dart @@ -1,17 +1,17 @@ import 'package:flutter/gestures.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/provider/spotify/spotify.dart'; - import 'package:url_launcher/url_launcher_string.dart'; class ArtistPageFooter extends ConsumerWidget { final Artist artist; + const ArtistPageFooter({super.key, required this.artist}); @override diff --git a/lib/pages/artist/section/header.dart b/lib/pages/artist/section/header.dart index b6224428..c17ef617 100644 --- a/lib/pages/artist/section/header.dart +++ b/lib/pages/artist/section/header.dart @@ -17,6 +17,7 @@ import 'package:spotube/utils/primitive_utils.dart'; class ArtistPageHeader extends HookConsumerWidget { final String artistId; + const ArtistPageHeader({super.key, required this.artistId}); @override @@ -161,7 +162,7 @@ class ArtistPageHeader extends HookConsumerWidget { fit: BoxFit.cover, ), ), - const Gap(20), + const Gap(32), Flexible( child: Column( mainAxisSize: MainAxisSize.min, @@ -175,14 +176,14 @@ class ArtistPageHeader extends HookConsumerWidget { Text(context.l10n.artist).small().muted(), ), if (isBlackListed) ...[ - const Gap(5), + const Gap(8), DestructiveBadge( child: Text(context.l10n.blacklisted).small(), ), ] ], ), - const Gap(10), + const Gap(16), Flexible( child: AutoSizeText( artist.name!, @@ -194,7 +195,7 @@ class ArtistPageHeader extends HookConsumerWidget { minFontSize: 14, ), ), - const Gap(5), + const Gap(8), Flexible( child: AutoSizeText( context.l10n.followers( @@ -208,7 +209,7 @@ class ArtistPageHeader extends HookConsumerWidget { ).muted(), ), if (constrains.mdAndUp) ...[ - const Gap(20), + const Gap(32), actions, ] ], @@ -217,7 +218,7 @@ class ArtistPageHeader extends HookConsumerWidget { ], ), if (constrains.smAndDown) ...[ - const Gap(20), + const Gap(32), actions, ] ], diff --git a/lib/pages/artist/section/related_artists.dart b/lib/pages/artist/section/related_artists.dart index 2db9ca94..556effde 100644 --- a/lib/pages/artist/section/related_artists.dart +++ b/lib/pages/artist/section/related_artists.dart @@ -1,10 +1,11 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/modules/artist/artist_card.dart'; import 'package:spotube/provider/spotify/spotify.dart'; class ArtistPageRelatedArtists extends ConsumerWidget { final String artistId; + const ArtistPageRelatedArtists({ super.key, required this.artistId, diff --git a/lib/pages/artist/section/top_tracks.dart b/lib/pages/artist/section/top_tracks.dart index 72709751..8898397c 100644 --- a/lib/pages/artist/section/top_tracks.dart +++ b/lib/pages/artist/section/top_tracks.dart @@ -8,12 +8,13 @@ import 'package:spotube/components/dialogs/select_device_dialog.dart'; import 'package:spotube/components/track_tile/track_tile.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/connect/connect.dart'; -import 'package:spotube/provider/connect/connect.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +import 'package:spotube/provider/connect/connect.dart'; import 'package:spotube/provider/spotify/spotify.dart'; class ArtistPageTopTracks extends HookConsumerWidget { final String artistId; + const ArtistPageTopTracks({super.key, required this.artistId}); @override @@ -131,7 +132,7 @@ class ArtistPageTopTracks extends HookConsumerWidget { ], ), ), - const SliverGap(10), + const SliverGap(16), SliverList.builder( itemCount: topTracks.length, itemBuilder: (context, index) { diff --git a/lib/pages/connect/connect.dart b/lib/pages/connect/connect.dart index bb8bbfae..8586cf03 100644 --- a/lib/pages/connect/connect.dart +++ b/lib/pages/connect/connect.dart @@ -1,13 +1,13 @@ +import 'package:auto_route/auto_route.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/components/ui/button_tile.dart'; -import 'package:spotube/modules/connect/local_devices.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; +import 'package:spotube/components/ui/button_tile.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/connect/local_devices.dart'; import 'package:spotube/provider/connect/clients.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class ConnectPage extends HookConsumerWidget { @@ -42,10 +42,10 @@ class ConnectPage extends HookConsumerWidget { ), ), ), - const SliverGap(10), + const SliverGap(16), SliverList.separated( itemCount: discoveredDevices?.length ?? 0, - separatorBuilder: (context, index) => const Gap(10), + separatorBuilder: (context, index) => const Gap(16), itemBuilder: (context, index) { final device = discoveredDevices![index]; final selected = diff --git a/lib/pages/connect/control/control.dart b/lib/pages/connect/control/control.dart index 2511809c..43697aed 100644 --- a/lib/pages/connect/control/control.dart +++ b/lib/pages/connect/control/control.dart @@ -1,11 +1,10 @@ import 'package:auto_route/auto_route.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:media_kit/media_kit.dart' hide Track; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/player/player_queue.dart'; -import 'package:spotube/modules/player/volume_slider.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/links/anchor_button.dart'; import 'package:spotube/components/links/artist_link.dart'; @@ -14,9 +13,10 @@ import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/duration.dart'; import 'package:spotube/extensions/image.dart'; +import 'package:spotube/modules/player/player_queue.dart'; +import 'package:spotube/modules/player/volume_slider.dart'; import 'package:spotube/provider/connect/clients.dart'; import 'package:spotube/provider/connect/connect.dart'; -import 'package:media_kit/media_kit.dart' hide Track; class RemotePlayerQueue extends ConsumerWidget { const RemotePlayerQueue({super.key}); @@ -134,7 +134,7 @@ class ConnectControlPage extends HookConsumerWidget { ], ), ), - const SliverGap(30), + const SliverGap(32), SliverToBoxAdapter( child: Consumer( builder: (context, ref, _) { @@ -185,7 +185,7 @@ class ConnectControlPage extends HookConsumerWidget { tooltip: TooltipContainer( child: Text( shuffled - ? context.l10n.unshuffle_playlist + ? context.l10n.not_shuffle_playlist : context.l10n.shuffle_playlist, ), ), @@ -294,7 +294,7 @@ class ConnectControlPage extends HookConsumerWidget { ], ), ), - const SliverGap(30), + const SliverGap(32), if (constrains.mdAndDown) SliverPadding( padding: const EdgeInsets.symmetric(horizontal: 20), @@ -329,7 +329,7 @@ class ConnectControlPage extends HookConsumerWidget { ), ), ), - const SliverGap(30), + const SliverGap(32), SliverPadding( padding: const EdgeInsets.symmetric(horizontal: 20), sliver: SliverToBoxAdapter( @@ -346,7 +346,7 @@ class ConnectControlPage extends HookConsumerWidget { }), ), ), - const SliverSafeArea(sliver: SliverGap(10)), + const SliverSafeArea(sliver: SliverGap(16)), ], ), ), diff --git a/lib/pages/getting_started/getting_started.dart b/lib/pages/getting_started/getting_started.dart index a576ed09..c61b22b1 100644 --- a/lib/pages/getting_started/getting_started.dart +++ b/lib/pages/getting_started/getting_started.dart @@ -1,14 +1,13 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; -import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/pages/getting_started/sections/greeting.dart'; import 'package:spotube/pages/getting_started/sections/playback.dart'; import 'package:spotube/pages/getting_started/sections/region.dart'; import 'package:spotube/pages/getting_started/sections/support.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class GettingStartedPage extends HookConsumerWidget { @@ -69,12 +68,7 @@ class GettingStartedPage extends HookConsumerWidget { ], floatingHeader: true, child: DecoratedBox( - decoration: BoxDecoration( - image: DecorationImage( - image: Assets.bengaliPatternsBg.provider(), - fit: BoxFit.cover, - ), - ), + decoration: const BoxDecoration(), child: PageView( controller: pageController, children: [ diff --git a/lib/pages/getting_started/sections/greeting.dart b/lib/pages/getting_started/sections/greeting.dart index 4b9c0a89..801ff805 100644 --- a/lib/pages/getting_started/sections/greeting.dart +++ b/lib/pages/getting_started/sections/greeting.dart @@ -3,35 +3,45 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/extensions/context.dart'; -import 'package:spotube/modules/getting_started/blur_card.dart'; import 'package:spotube/utils/platform.dart'; class GettingStartedPageGreetingSection extends HookConsumerWidget { final VoidCallback onNext; - const GettingStartedPageGreetingSection({super.key, required this.onNext}); + + const GettingStartedPageGreetingSection({ + super.key, + required this.onNext, + }); @override - Widget build(BuildContext context, ref) { + Widget build(BuildContext context, WidgetRef ref) { return Center( - child: BlurCard( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Assets.spotubeLogoPng.image(height: 200), + Assets.spotubeLogoStableNotWallpaper.image(height: 225), const Gap(24), - const Text("Spotube").semiBold().h4(), + const Text("SpoTube").semiBold().h4(), const Gap(4), Text( kIsMobile ? context.l10n.freedom_of_music_palm : context.l10n.freedom_of_music, textAlign: TextAlign.center, - ).light().large().italic(), + ).light().large().normal(), const Gap(84), Button.primary( onPressed: onNext, - trailing: const Icon(SpotubeIcons.angleRight), - child: Text(context.l10n.get_started), + trailing: const Icon( + SpotubeIcons.angleRight, + color: Colors.white, + ), + child: Text( + context.l10n.get_started, + style: const TextStyle(color: Colors.white), + ), ), ], ), diff --git a/lib/pages/getting_started/sections/playback.dart b/lib/pages/getting_started/sections/playback.dart index f122dbcd..0520acbd 100644 --- a/lib/pages/getting_started/sections/playback.dart +++ b/lib/pages/getting_started/sections/playback.dart @@ -4,10 +4,9 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/ui/button_tile.dart'; -import 'package:spotube/models/database/database.dart'; -import 'package:spotube/modules/getting_started/blur_card.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/string.dart'; +import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; final audioSourceToIconMap = { @@ -35,119 +34,129 @@ class GettingStartedPagePlaybackSection extends HookConsumerWidget { }); @override - Widget build(BuildContext context, ref) { + Widget build(BuildContext context, WidgetRef ref) { final preferences = ref.watch(userPreferencesProvider); final preferencesNotifier = ref.read(userPreferencesProvider.notifier); - final audioSourceToDescription = useMemoized( - () => { - AudioSource.youtube: "${context.l10n.youtube_source_description}\n" - "${context.l10n.highest_quality("148kbps mp4, 128kbps opus")}", - AudioSource.piped: context.l10n.piped_source_description, - AudioSource.jiosaavn: - "${context.l10n.jiosaavn_source_description}\n" - "${context.l10n.highest_quality("320kbps mp")}", - AudioSource.invidious: context.l10n.invidious_source_description, - }, - []); + final audioSourceToDescription = useMemoized(() => { + AudioSource.youtube: "${context.l10n.youtube_source_description}\n" + "${context.l10n.highest_quality("148kbps in mp4, 128kbps in opus")}", + AudioSource.piped: context.l10n.piped_source_description, + AudioSource.jiosaavn: "${context.l10n.jiosaavn_source_description}\n" + "${context.l10n.highest_quality("320kbps in mp3")}", + AudioSource.invidious: context.l10n.invidious_source_description, + }); - return Center( - child: BlurCard( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( + return SafeArea( + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 600), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + mainAxisSize: MainAxisSize.min, children: [ - const Icon(SpotubeIcons.album, size: 16), - const Gap(8), - Text(context.l10n.playback).semiBold().large(), - ], - ), - const Gap(16), - Align( - alignment: Alignment.centerLeft, - child: Text(context.l10n.select_audio_source).semiBold().large(), - ), - const Gap(16), - Select( - value: preferences.audioSource, - onChanged: (value) { - if (value == null) return; - preferencesNotifier.setAudioSource(value); - }, - placeholder: Text(preferences.audioSource.name.capitalize()), - itemBuilder: (context, value) => Row( - mainAxisSize: MainAxisSize.min, - spacing: 6, - children: [ - audioSourceToIconMap[value]!, - Text(value.name.capitalize()), - ], - ), - popup: (context) { - return SelectPopup( - items: SelectItemBuilder( - childCount: AudioSource.values.length, - builder: (context, index) { - final source = AudioSource.values[index]; - - return SelectItemButton( - value: source, - child: Row( - mainAxisSize: MainAxisSize.min, - spacing: 6, - children: [ - audioSourceToIconMap[source]!, - Text(source.name.capitalize()), - ], + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(SpotubeIcons.album, size: 16), + const Gap(8), + Text(context.l10n.playback).semiBold().large(), + ], + ), + const Gap(24), + Align( + alignment: Alignment.centerLeft, + child: Text(context.l10n.select_audio_source) + .semiBold() + .large() + .center(), + ), + const Gap(16), + Select( + value: preferences.audioSource, + onChanged: (value) { + if (value != null) { + preferencesNotifier.setAudioSource(value); + } + }, + placeholder: Text(preferences.audioSource.name.capitalize()), + itemBuilder: (context, value) => Row( + children: [ + audioSourceToIconMap[value]!, + const SizedBox(width: 6), + Text(value.name.capitalize()), + ], + ), + popup: (context) { + return SelectPopup( + items: SelectItemBuilder( + childCount: AudioSource.values.length, + builder: (context, index) { + final source = AudioSource.values[index]; + return SelectItemButton( + value: source, + child: Row( + children: [ + audioSourceToIconMap[source]!, + const SizedBox(width: 6), + Text(source.name.capitalize()), + ], + ), + ); + }, + ), + ); + }, + ), + const Gap(16), + Text( + audioSourceToDescription[preferences.audioSource]!, + textAlign: TextAlign.center, + ).small().muted(), + const Gap(24), + ButtonTile( + title: Text(context.l10n.endless_playback), + subtitle: Text(context.l10n.endless_playback_description) + .small() + .muted(), + onPressed: () { + preferencesNotifier + .setEndlessPlayback(!preferences.endlessPlayback); + }, + trailing: Switch( + value: preferences.endlessPlayback, + onChanged: preferencesNotifier.setEndlessPlayback, + ), + ), + const Gap(40), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Button.secondary( + leading: const Icon(SpotubeIcons.angleLeft), + onPressed: onPrevious, + child: Text(context.l10n.previous), + ), + Directionality( + textDirection: TextDirection.rtl, + child: Button.primary( + leading: const Icon( + SpotubeIcons.angleRight, + color: Colors.white, ), - ); - }, - ), - ); - }, - ), - const Gap(16), - Text( - audioSourceToDescription[preferences.audioSource]!, - ).small().muted(), - const Gap(16), - ButtonTile( - title: Text(context.l10n.endless_playback), - subtitle: Text( - context.l10n.endless_playback_description, - ).small().muted(), - onPressed: () { - preferencesNotifier - .setEndlessPlayback(!preferences.endlessPlayback); - }, - trailing: Switch( - value: preferences.endlessPlayback, - onChanged: (value) { - preferencesNotifier.setEndlessPlayback(value); - }, - ), - ), - const Gap(34), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Button.secondary( - leading: const Icon(SpotubeIcons.angleLeft), - onPressed: onPrevious, - child: Text(context.l10n.previous), - ), - Directionality( - textDirection: TextDirection.rtl, - child: Button.primary( - leading: const Icon(SpotubeIcons.angleRight), - onPressed: onNext, - child: Text(context.l10n.next), - ), + onPressed: onNext, + child: Text( + context.l10n.next, + style: const TextStyle(color: Colors.white), + ), + ), + ), + ], ), ], ), - ], + ), ), ), ); diff --git a/lib/pages/getting_started/sections/region.dart b/lib/pages/getting_started/sections/region.dart index f657f9d9..f712b236 100644 --- a/lib/pages/getting_started/sections/region.dart +++ b/lib/pages/getting_started/sections/region.dart @@ -4,13 +4,13 @@ import 'package:spotify/spotify.dart'; import 'package:spotube/collections/language_codes.dart'; import 'package:spotube/collections/spotify_markets.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/getting_started/blur_card.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/l10n/l10n.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; class GettingStartedPageLanguageRegionSection extends HookConsumerWidget { final void Function() onNext; + const GettingStartedPageLanguageRegionSection( {super.key, required this.onNext}); @@ -36,11 +36,17 @@ class GettingStartedPageLanguageRegionSection extends HookConsumerWidget { return SafeArea( child: Center( - child: BlurCard( + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 600, + ), child: Column( mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon( SpotubeIcons.language, @@ -50,15 +56,15 @@ class GettingStartedPageLanguageRegionSection extends HookConsumerWidget { Text(context.l10n.language_region).semiBold(), ], ), - const Gap(30), + const Gap(32), Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Text(context.l10n.choose_your_region).semiBold(), + // Text(context.l10n.choose_your_region).semiBold(), Text( context.l10n.choose_your_region_description, - ).small().muted(), + ).small().muted().center(), const Gap(16), Text(context.l10n.market_place_region).small(), const Gap(8), @@ -179,9 +185,15 @@ class GettingStartedPageLanguageRegionSection extends HookConsumerWidget { Align( alignment: Alignment.centerRight, child: Button.primary( - trailing: const Icon(SpotubeIcons.angleRight), + trailing: const Icon( + SpotubeIcons.angleRight, + color: Colors.white, + ), onPressed: onNext, - child: Text(context.l10n.next), + child: Text( + context.l10n.next, + style: const TextStyle(color: Colors.white), + ), ), ), ], diff --git a/lib/pages/getting_started/sections/support.dart b/lib/pages/getting_started/sections/support.dart index 9559d28d..5bb903ef 100644 --- a/lib/pages/getting_started/sections/support.dart +++ b/lib/pages/getting_started/sections/support.dart @@ -4,7 +4,6 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/env.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/getting_started/blur_card.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/pages/mobile_login/hooks/login_callback.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; @@ -17,136 +16,154 @@ class GettingStartedScreenSupportSection extends HookConsumerWidget { Widget build(BuildContext context, ref) { final onLogin = useLoginCallback(ref); - return Center( + return SafeArea( + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 500), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildSupportContent(context), + const Gap(48), + _buildActionButtons(context, ref, onLogin), + ], + ), + ), + ), + ); + } + + Widget _buildSupportContent(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + // const Icon(SpotubeIcons.heartFilled, color: Colors.pink), + // const SizedBox(width: 8), + Text( + context.l10n.help_project_grow, + style: const TextStyle(color: Colors.pink), + ).semiBold(), + ], + ), + const Gap(16), + Text(context.l10n.help_project_grow_description), + const Gap(16), + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildButton( + label: context.l10n.contribute_on_github, + icon: const Icon( + SpotubeIcons.github, + color: Colors.white, + ), + backgroundColor: Colors.blue, + url: "https://github.com/KRTirtho/spotube", + ), + if (!Env.hideDonations) ...[ + const Gap(16), + _buildButton( + label: context.l10n.donate_on_open_collective, + icon: const Icon(SpotubeIcons.openCollective), + backgroundColor: Colors.blue, + url: "https://opencollective.com/spotube", + ), + ], + ], + ), + ], + ); + } + + Widget _buildActionButtons( + BuildContext context, WidgetRef ref, Future Function() onLogin) { + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 250), child: Column( - mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - BlurCard( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - const Icon(SpotubeIcons.heartFilled, color: Colors.pink), - const SizedBox(width: 8), - Text( - context.l10n.help_project_grow, - style: const TextStyle(color: Colors.pink), - ).semiBold(), - ], - ), - const Gap(16), - Text(context.l10n.help_project_grow_description), - const Gap(16), - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Button( - leading: const Icon(SpotubeIcons.github), - style: ButtonVariance.primary.copyWith( - decoration: (context, states, value) { - if (states.isNotEmpty) { - return ButtonVariance.primary - .decoration(context, states); - } - - return BoxDecoration( - color: Colors.black, - borderRadius: BorderRadius.circular(8), - ); - }), - onPressed: () async { - await launchUrlString( - "https://github.com/KRTirtho/spotube", - mode: LaunchMode.externalApplication, - ); - }, - child: Text( - context.l10n.contribute_on_github, - style: const TextStyle(color: Colors.white), - ), - ), - if (!Env.hideDonations) ...[ - const Gap(16), - Button( - leading: const Icon(SpotubeIcons.openCollective), - style: ButtonVariance.primary.copyWith( - decoration: (context, states, value) { - if (states.isNotEmpty) { - return ButtonVariance.primary - .decoration(context, states); - } - - return BoxDecoration( - color: const Color(0xff4cb7f6), - borderRadius: BorderRadius.circular(8), - ); - }), - onPressed: () async { - await launchUrlString( - "https://opencollective.com/spotube", - mode: LaunchMode.externalApplication, - ); - }, - child: Text( - context.l10n.donate_on_open_collective, - style: const TextStyle(color: Colors.white), - ), - ), - ] - ], - ), - ], + SizedBox( + width: double.infinity, + child: Button.secondary( + leading: const Icon(SpotubeIcons.anonymous), + onPressed: () async { + await KVStoreService.setDoneGettingStarted(true); + if (context.mounted) { + context.navigateTo(const HomeRoute()); + } + }, + child: Text(context.l10n.browse_anonymously), ), ), - const Gap(48), - ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 250), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Button.secondary( - leading: const Icon(SpotubeIcons.anonymous), - onPressed: () async { - await KVStoreService.setDoneGettingStarted(true); - if (context.mounted) { - context.navigateTo(const HomeRoute()); - } - }, - child: Text(context.l10n.browse_anonymously), - ), - const Gap(16), - Button.primary( - leading: const Icon(SpotubeIcons.spotify), - style: ButtonVariance.primary.copyWith( - decoration: (context, states, value) { - if (states.isNotEmpty) { - return ButtonVariance.primary - .decoration(context, states); - } - - return BoxDecoration( - color: const Color(0xff1db954), - borderRadius: BorderRadius.circular(8), - ); - }, - ), - onPressed: () async { - await KVStoreService.setDoneGettingStarted(true); - await onLogin(); - }, - child: Text( - context.l10n.connect_with_spotify, - style: const TextStyle(color: Colors.white), - ), - ), - ], + const Gap(16), + SizedBox( + width: double.infinity, + child: Button.primary( + leading: const Icon( + SpotubeIcons.spotify, + color: Colors.white, + ), + style: ButtonVariance.primary.copyWith( + decoration: (context, states, value) { + return states.isNotEmpty + ? ButtonVariance.primary.decoration(context, states) + : BoxDecoration( + color: const Color(0xff1db954), + borderRadius: BorderRadius.circular(8), + ); + }, + ), + onPressed: () async { + await KVStoreService.setDoneGettingStarted(true); + await onLogin(); + }, + child: Text( + context.l10n.connect_with_spotify, + style: const TextStyle(color: Colors.white), + ), ), ), ], ), ); } + + Widget _buildButton({ + required String label, + required Icon icon, + required Color backgroundColor, + required String url, + }) { + return SizedBox( + width: double.infinity, + child: ConstrainedBox( + constraints: const BoxConstraints(minHeight: 48), + child: Button( + leading: icon, + style: ButtonVariance.primary.copyWith( + decoration: (context, states, value) { + return states.isNotEmpty + ? ButtonVariance.primary.decoration(context, states) + : BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(8), + ); + }, + ), + onPressed: () async { + await launchUrlString(url, mode: LaunchMode.externalApplication); + }, + child: Text( + label, + style: const TextStyle(color: Colors.white), + ), + ), + ), + ); + } } diff --git a/lib/pages/home/feed/feed_section.dart b/lib/pages/home/feed/feed_section.dart index 2b38d0ed..6166f9c3 100644 --- a/lib/pages/home/feed/feed_section.dart +++ b/lib/pages/home/feed/feed_section.dart @@ -5,10 +5,10 @@ import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/fake.dart'; import 'package:spotube/components/playbutton_view/playbutton_view.dart'; +import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/modules/album/album_card.dart'; import 'package:spotube/modules/artist/artist_card.dart'; import 'package:spotube/modules/playlist/playlist_card.dart'; -import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/provider/spotify/views/home_section.dart'; @RoutePage() @@ -16,6 +16,7 @@ class HomeFeedSectionPage extends HookConsumerWidget { static const name = "home_feed_section"; final String sectionUri; + const HomeFeedSectionPage({ super.key, @PathParam("feedId") required this.sectionUri, diff --git a/lib/pages/home/genres/genre_playlists.dart b/lib/pages/home/genres/genre_playlists.dart index ea421cb4..6f1b1d41 100644 --- a/lib/pages/home/genres/genre_playlists.dart +++ b/lib/pages/home/genres/genre_playlists.dart @@ -1,22 +1,20 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart' show CollapseMode, FlexibleSpaceBar; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; - import 'package:spotify/spotify.dart' hide Offset; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/components/button/back_button.dart'; -import 'package:spotube/components/playbutton_view/playbutton_view.dart'; -import 'package:spotube/hooks/utils/use_custom_status_bar_color.dart'; -import 'package:spotube/modules/playlist/playlist_card.dart'; import 'package:spotube/components/image/universal_image.dart'; +import 'package:spotube/components/playbutton_view/playbutton_view.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/extensions/constrains.dart'; +import 'package:spotube/hooks/utils/use_custom_status_bar_color.dart'; +import 'package:spotube/modules/playlist/playlist_card.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/utils/platform.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class GenrePlaylistsPage extends HookConsumerWidget { @@ -24,6 +22,7 @@ class GenrePlaylistsPage extends HookConsumerWidget { final Category category; final String id; + const GenrePlaylistsPage({ super.key, @PathParam("categoryId") required this.id, @@ -114,7 +113,7 @@ class GenrePlaylistsPage extends HookConsumerWidget { ), ), ), - const SliverGap(20), + const SliverGap(32), SliverSafeArea( top: false, sliver: SliverPadding( @@ -134,7 +133,7 @@ class GenrePlaylistsPage extends HookConsumerWidget { ), ), ), - const SliverGap(20), + const SliverGap(32), ], ), ), diff --git a/lib/pages/home/genres/genres.dart b/lib/pages/home/genres/genres.dart index 38d110db..f86ee43c 100644 --- a/lib/pages/home/genres/genres.dart +++ b/lib/pages/home/genres/genres.dart @@ -1,9 +1,8 @@ import 'dart:math'; +import 'package:auto_route/auto_route.dart'; import 'package:auto_size_text/auto_size_text.dart'; - import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; @@ -13,11 +12,11 @@ import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class GenrePage extends HookConsumerWidget { static const name = "genre"; + const GenrePage({super.key}); @override diff --git a/lib/pages/home/home.dart b/lib/pages/home/home.dart index 9ca71c04..220e1699 100644 --- a/lib/pages/home/home.dart +++ b/lib/pages/home/home.dart @@ -1,12 +1,13 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; +import 'package:spotube/components/titlebar/titlebar.dart'; +import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/modules/connect/connect_device.dart'; import 'package:spotube/modules/home/sections/featured.dart'; @@ -16,14 +17,13 @@ import 'package:spotube/modules/home/sections/genres/genres.dart'; import 'package:spotube/modules/home/sections/made_for_user.dart'; import 'package:spotube/modules/home/sections/new_releases.dart'; import 'package:spotube/modules/home/sections/recent.dart'; -import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/platform.dart'; @RoutePage() class HomePage extends HookConsumerWidget { static const name = "home"; + const HomePage({super.key}); @override @@ -45,24 +45,24 @@ class HomePage extends HookConsumerWidget { if (mediaQuery.smAndDown || layoutMode == LayoutMode.compact) SliverAppBar( floating: true, - title: Assets.spotubeLogoPng.image(height: 45), + title: Assets.spotubeLogoStableNotWallpaper.image(height: 45), backgroundColor: context.theme.colorScheme.background, foregroundColor: context.theme.colorScheme.foreground, actions: [ const ConnectDeviceButton(), - const Gap(10), + const Gap(16), IconButton.ghost( icon: const Icon(SpotubeIcons.settings, size: 20), onPressed: () { context.navigateTo(const SettingsRoute()); }, ), - const Gap(10), + const Gap(16), ], ) else if (kIsMacOS) - const SliverGap(10), - const SliverGap(10), + const SliverGap(16), + const SliverGap(16), SliverList.builder( itemCount: 5, itemBuilder: (context, index) { diff --git a/lib/pages/lastfm_login/lastfm_login.dart b/lib/pages/lastfm_login/lastfm_login.dart index ca0f5693..c5cf336e 100644 --- a/lib/pages/lastfm_login/lastfm_login.dart +++ b/lib/pages/lastfm_login/lastfm_login.dart @@ -1,5 +1,5 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/spotube_icons.dart'; @@ -8,11 +8,11 @@ import 'package:spotube/components/dialogs/prompt_dialog.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/scrobbler/scrobbler.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class LastFMLoginPage extends HookConsumerWidget { static const name = "lastfm_login"; + const LastFMLoginPage({super.key}); @override diff --git a/lib/pages/library/library.dart b/lib/pages/library/library.dart index 172d9af3..7b6d0458 100644 --- a/lib/pages/library/library.dart +++ b/lib/pages/library/library.dart @@ -77,7 +77,7 @@ class LibraryPage extends HookConsumerWidget { surfaceBlur: 0, height: 32, ), - const Gap(10), + const Gap(16), ], child: const AutoRouter(), ); diff --git a/lib/pages/library/playlist_generate/playlist_generate.dart b/lib/pages/library/playlist_generate/playlist_generate.dart index f1eca306..9a18eef6 100644 --- a/lib/pages/library/playlist_generate/playlist_generate.dart +++ b/lib/pages/library/playlist_generate/playlist_generate.dart @@ -1,7 +1,6 @@ +import 'package:auto_route/auto_route.dart'; import 'package:collection/collection.dart'; - import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; @@ -9,21 +8,19 @@ import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotify_markets.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/button/back_button.dart'; -import 'package:spotube/components/ui/button_tile.dart'; - -import 'package:spotube/modules/library/playlist_generate/recommendation_attribute_dials.dart'; -import 'package:spotube/modules/library/playlist_generate/recommendation_attribute_fields.dart'; -import 'package:spotube/modules/library/playlist_generate/seeds_multi_autocomplete.dart'; -import 'package:spotube/modules/library/playlist_generate/simple_track_tile.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; +import 'package:spotube/components/ui/button_tile.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/models/spotify/recommendation_seeds.dart'; +import 'package:spotube/modules/library/playlist_generate/recommendation_attribute_dials.dart'; +import 'package:spotube/modules/library/playlist_generate/recommendation_attribute_fields.dart'; +import 'package:spotube/modules/library/playlist_generate/seeds_multi_autocomplete.dart'; +import 'package:spotube/modules/library/playlist_generate/simple_track_tile.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; -import 'package:auto_route/auto_route.dart'; const RecommendationAttribute zeroValues = (min: 0, target: 0, max: 0); @@ -394,40 +391,40 @@ class PlaylistGeneratorPage extends HookConsumerWidget { ], const SizedBox(height: 16), RecommendationAttributeDials( - title: Text(context.l10n.acousticness), + title: Text(context.l10n.not_acoustic), values: ( - target: target.value.acousticness?.toDouble() ?? 0, - min: min.value.acousticness?.toDouble() ?? 0, - max: max.value.acousticness?.toDouble() ?? 0, + target: target.value.not_acoustic?.toDouble() ?? 0, + min: min.value.not_acoustic?.toDouble() ?? 0, + max: max.value.not_acoustic?.toDouble() ?? 0, ), onChanged: (value) { target.value = target.value.copyWith( - acousticness: value.target, + not_acoustic: value.target, ); min.value = min.value.copyWith( - acousticness: value.min, + not_acoustic: value.min, ); max.value = max.value.copyWith( - acousticness: value.max, + not_acoustic: value.max, ); }, ), RecommendationAttributeDials( - title: Text(context.l10n.danceability), + title: Text(context.l10n.dance_ability), values: ( - target: target.value.danceability?.toDouble() ?? 0, - min: min.value.danceability?.toDouble() ?? 0, - max: max.value.danceability?.toDouble() ?? 0, + target: target.value.dance_ability?.toDouble() ?? 0, + min: min.value.dance_ability?.toDouble() ?? 0, + max: max.value.dance_ability?.toDouble() ?? 0, ), onChanged: (value) { target.value = target.value.copyWith( - danceability: value.target, + dance_ability: value.target, ); min.value = min.value.copyWith( - danceability: value.min, + dance_ability: value.min, ); max.value = max.value.copyWith( - danceability: value.max, + dance_ability: value.max, ); }, ), @@ -451,22 +448,22 @@ class PlaylistGeneratorPage extends HookConsumerWidget { }, ), RecommendationAttributeDials( - title: Text(context.l10n.instrumentalness), + title: Text(context.l10n.not_instrumental), values: ( target: - target.value.instrumentalness?.toDouble() ?? 0, - min: min.value.instrumentalness?.toDouble() ?? 0, - max: max.value.instrumentalness?.toDouble() ?? 0, + target.value.not_instrumental?.toDouble() ?? 0, + min: min.value.not_instrumental?.toDouble() ?? 0, + max: max.value.not_instrumental?.toDouble() ?? 0, ), onChanged: (value) { target.value = target.value.copyWith( - instrumentalness: value.target, + not_instrumental: value.target, ); min.value = min.value.copyWith( - instrumentalness: value.min, + not_instrumental: value.min, ); max.value = max.value.copyWith( - instrumentalness: value.max, + not_instrumental: value.max, ); }, ), @@ -509,21 +506,21 @@ class PlaylistGeneratorPage extends HookConsumerWidget { }, ), RecommendationAttributeDials( - title: Text(context.l10n.speechiness), + title: Text(context.l10n.talkative), values: ( - target: target.value.speechiness?.toDouble() ?? 0, - min: min.value.speechiness?.toDouble() ?? 0, - max: max.value.speechiness?.toDouble() ?? 0, + target: target.value.talkative?.toDouble() ?? 0, + min: min.value.talkative?.toDouble() ?? 0, + max: max.value.talkative?.toDouble() ?? 0, ), onChanged: (value) { target.value = target.value.copyWith( - speechiness: value.target, + talkative: value.target, ); min.value = min.value.copyWith( - speechiness: value.min, + talkative: value.min, ); max.value = max.value.copyWith( - speechiness: value.max, + talkative: value.max, ); }, ), @@ -671,7 +668,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget { ); }, ), - const Gap(20), + const Gap(32), Center( child: Button.primary( leading: const Icon(SpotubeIcons.magic), diff --git a/lib/pages/library/playlist_generate/playlist_generate_result.dart b/lib/pages/library/playlist_generate/playlist_generate_result.dart index 9e6f2987..968d1a13 100644 --- a/lib/pages/library/playlist_generate/playlist_generate_result.dart +++ b/lib/pages/library/playlist_generate/playlist_generate_result.dart @@ -1,18 +1,17 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/button/back_button.dart'; -import 'package:spotube/modules/library/playlist_generate/simple_track_tile.dart'; -import 'package:spotube/modules/playlist/playlist_create_dialog.dart'; import 'package:spotube/components/dialogs/playlist_add_track_dialog.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/spotify/recommendation_seeds.dart'; +import 'package:spotube/modules/library/playlist_generate/simple_track_tile.dart'; +import 'package:spotube/modules/playlist/playlist_create_dialog.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/spotify/spotify.dart'; diff --git a/lib/pages/library/user_albums.dart b/lib/pages/library/user_albums.dart index 60ba7319..a5d81d7a 100644 --- a/lib/pages/library/user_albums.dart +++ b/lib/pages/library/user_albums.dart @@ -1,26 +1,25 @@ -import 'package:flutter/material.dart' as material; -import 'package:flutter_undraw/flutter_undraw.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide Image; -import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:auto_route/auto_route.dart'; import 'package:collection/collection.dart'; +import 'package:flutter/material.dart' as material; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_undraw/flutter_undraw.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Image; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; - import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/components/playbutton_view/playbutton_view.dart'; -import 'package:spotube/modules/album/album_card.dart'; -import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/fallbacks/anonymous_fallback.dart'; +import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; +import 'package:spotube/components/playbutton_view/playbutton_view.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/album/album_card.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class UserAlbumsPage extends HookConsumerWidget { static const name = 'user_albums'; + const UserAlbumsPage({super.key}); @override @@ -81,7 +80,7 @@ class UserAlbumsPage extends HookConsumerWidget { ), ), ), - const SliverGap(10), + const SliverGap(16), if (albums.isEmpty && !albumsQuery.isLoading && searchText.value.isEmpty) @@ -121,7 +120,7 @@ class UserAlbumsPage extends HookConsumerWidget { AlbumCard.tile(albums[index]), ), ), - const SliverSafeArea(sliver: SliverGap(10)), + const SliverSafeArea(sliver: SliverGap(16)), ], ), ), diff --git a/lib/pages/library/user_artists.dart b/lib/pages/library/user_artists.dart index 5f304f5e..8525ddc3 100644 --- a/lib/pages/library/user_artists.dart +++ b/lib/pages/library/user_artists.dart @@ -1,29 +1,28 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart' as material; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:collection/collection.dart'; import 'package:flutter_undraw/flutter_undraw.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/fake.dart'; - import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/fallbacks/anonymous_fallback.dart'; -import 'package:spotube/modules/artist/artist_card.dart'; import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/waypoint.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/artist/artist_card.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class UserArtistsPage extends HookConsumerWidget { static const name = 'user_artists'; + const UserArtistsPage({super.key}); @override @@ -85,7 +84,7 @@ class UserArtistsPage extends HookConsumerWidget { ), ), ), - const SliverGap(10), + const SliverGap(16), if (filteredArtists.isNotEmpty || artistQuery.isLoading) SliverLayoutBuilder(builder: (context, constrains) { return SliverGrid.builder( @@ -162,7 +161,7 @@ class UserArtistsPage extends HookConsumerWidget { ], ), ), - const SliverSafeArea(sliver: SliverGap(10)), + const SliverSafeArea(sliver: SliverGap(16)), ], ), ), diff --git a/lib/pages/library/user_downloads.dart b/lib/pages/library/user_downloads.dart index 1d8f560a..5adcd519 100644 --- a/lib/pages/library/user_downloads.dart +++ b/lib/pages/library/user_downloads.dart @@ -1,15 +1,15 @@ +import 'package:auto_route/auto_route.dart'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - -import 'package:spotube/modules/library/user_downloads/download_item.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/library/user_downloads/download_item.dart'; import 'package:spotube/provider/download_manager_provider.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class UserDownloadsPage extends HookConsumerWidget { static const name = 'user_downloads'; + const UserDownloadsPage({super.key}); @override diff --git a/lib/pages/library/user_local_tracks/local_folder.dart b/lib/pages/library/user_local_tracks/local_folder.dart index a6f3ad51..c3438f1e 100644 --- a/lib/pages/library/user_local_tracks/local_folder.dart +++ b/lib/pages/library/user_local_tracks/local_folder.dart @@ -1,9 +1,10 @@ import 'dart:io'; import 'dart:math'; -import 'package:flutter/material.dart' as material; +import 'package:auto_route/auto_route.dart'; import 'package:collection/collection.dart'; import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart' as material; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_undraw/flutter_undraw.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; @@ -14,24 +15,23 @@ import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/fake.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/button/back_button.dart'; -import 'package:spotube/extensions/constrains.dart'; -import 'package:spotube/extensions/string.dart'; -import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart'; -import 'package:spotube/modules/library/local_folder/cache_export_dialog.dart'; -import 'package:spotube/pages/library/user_local_tracks/user_local_tracks.dart'; import 'package:spotube/components/expandable_search/expandable_search.dart'; import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/components/track_presentation/sort_tracks_dropdown.dart'; import 'package:spotube/components/track_tile/track_tile.dart'; import 'package:spotube/extensions/artist_simple.dart'; +import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/extensions/string.dart'; +import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart'; import 'package:spotube/models/local_track.dart'; -import 'package:spotube/provider/local_tracks/local_tracks_provider.dart'; +import 'package:spotube/modules/library/local_folder/cache_export_dialog.dart'; +import 'package:spotube/pages/library/user_local_tracks/user_local_tracks.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +import 'package:spotube/provider/local_tracks/local_tracks_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/service_utils.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class LocalLibraryPage extends HookConsumerWidget { @@ -40,6 +40,7 @@ class LocalLibraryPage extends HookConsumerWidget { final String location; final bool isDownloads; final bool isCache; + const LocalLibraryPage( this.location, { super.key, @@ -223,7 +224,7 @@ class LocalLibraryPage extends HookConsumerWidget { padding: const EdgeInsets.all(8.0), child: Row( children: [ - const Gap(5), + const Gap(8), Button.primary( onPressed: trackSnapshot.asData?.value != null ? () async { @@ -268,14 +269,14 @@ class LocalLibraryPage extends HookConsumerWidget { searchFocus: searchFocus, ), ), - const Gap(5), + const Gap(8), SortTracksDropdown( value: sortBy.value, onChanged: (value) { sortBy.value = value; }, ), - const Gap(5), + const Gap(8), IconButton.outline( icon: const Icon(SpotubeIcons.refresh), onPressed: () { @@ -333,7 +334,7 @@ class LocalLibraryPage extends HookConsumerWidget { height: 200 * scale, color: context.theme.colorScheme.primary, ), - const Gap(10), + const Gap(16), Text( context.l10n.nothing_found, textAlign: TextAlign.center, diff --git a/lib/pages/library/user_local_tracks/user_local_tracks.dart b/lib/pages/library/user_local_tracks/user_local_tracks.dart index 67e02b0b..1f7727bb 100644 --- a/lib/pages/library/user_local_tracks/user_local_tracks.dart +++ b/lib/pages/library/user_local_tracks/user_local_tracks.dart @@ -4,11 +4,10 @@ import 'package:file_selector/file_selector.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/library/local_folder/local_folder_item.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/library/local_folder/local_folder_item.dart'; import 'package:spotube/provider/local_tracks/local_tracks_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/platform.dart'; @@ -28,6 +27,7 @@ enum SortBy { @RoutePage() class UserLocalLibraryPage extends HookConsumerWidget { static const name = 'user_local_library'; + const UserLocalLibraryPage({super.key}); @override @@ -49,10 +49,9 @@ class UserLocalLibraryPage extends HookConsumerWidget { String? dirStr = await getDirectoryPath( initialDirectory: preferences.downloadLocation, ); - if (dirStr == null) return; if (preferences.localLibraryLocation.contains(dirStr)) return; preferencesNotifier.setLocalLibraryLocation( - [...preferences.localLibraryLocation, dirStr]); + [...preferences.localLibraryLocation, dirStr!]); } }, [preferences.localLibraryLocation]); diff --git a/lib/pages/library/user_playlists.dart b/lib/pages/library/user_playlists.dart index 8249726d..54e09d37 100644 --- a/lib/pages/library/user_playlists.dart +++ b/lib/pages/library/user_playlists.dart @@ -1,27 +1,27 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart' as material; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; -import 'package:collection/collection.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart' hide Image; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; - import 'package:spotify/spotify.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/components/playbutton_view/playbutton_view.dart'; -import 'package:spotube/modules/playlist/playlist_create_dialog.dart'; -import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/fallbacks/anonymous_fallback.dart'; -import 'package:spotube/modules/playlist/playlist_card.dart'; +import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; +import 'package:spotube/components/playbutton_view/playbutton_view.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/playlist/playlist_card.dart'; +import 'package:spotube/modules/playlist/playlist_create_dialog.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class UserPlaylistsPage extends HookConsumerWidget { static const name = 'user_playlists'; + const UserPlaylistsPage({super.key}); @override @@ -103,7 +103,7 @@ class UserPlaylistsPage extends HookConsumerWidget { ), ), ), - const SliverGap(10), + const SliverGap(16), SliverPadding( padding: const EdgeInsets.symmetric(horizontal: 8), sliver: PlaybuttonView( @@ -111,7 +111,7 @@ class UserPlaylistsPage extends HookConsumerWidget { child: Row( children: [ const PlaylistCreateDialogButton(), - const Gap(10), + const Gap(16), Button.primary( leading: const Icon(SpotubeIcons.magic), child: Text(context.l10n.generate), @@ -119,7 +119,7 @@ class UserPlaylistsPage extends HookConsumerWidget { context.navigateTo(const PlaylistGeneratorRoute()); }, ), - const Gap(10), + const Gap(16), ], ), ), @@ -136,7 +136,7 @@ class UserPlaylistsPage extends HookConsumerWidget { }, ), ), - const SliverSafeArea(sliver: SliverGap(10)), + const SliverSafeArea(sliver: SliverGap(16)), ], ), ), diff --git a/lib/pages/lyrics/lyrics.dart b/lib/pages/lyrics/lyrics.dart index d3e77bf0..b2b67b81 100644 --- a/lib/pages/lyrics/lyrics.dart +++ b/lib/pages/lyrics/lyrics.dart @@ -1,19 +1,18 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; - -import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/components/image/universal_image.dart'; +import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/hooks/utils/use_palette_color.dart'; import 'package:spotube/pages/lyrics/plain_lyrics.dart'; import 'package:spotube/pages/lyrics/synced_lyrics.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; -import 'package:spotube/utils/platform.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:auto_route/auto_route.dart'; +import 'package:spotube/utils/platform.dart'; @RoutePage() class LyricsPage extends HookConsumerWidget { @@ -66,7 +65,7 @@ class LyricsPage extends HookConsumerWidget { ); }, ), - const Gap(5), + const Gap(8), ], ); diff --git a/lib/pages/lyrics/mini_lyrics.dart b/lib/pages/lyrics/mini_lyrics.dart index 3e50987d..2e5a421f 100644 --- a/lib/pages/lyrics/mini_lyrics.dart +++ b/lib/pages/lyrics/mini_lyrics.dart @@ -1,27 +1,27 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:palette_generator/palette_generator.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/player/player_controls.dart'; -import 'package:spotube/modules/player/player_queue.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/hooks/utils/use_force_update.dart'; +import 'package:spotube/modules/player/player_controls.dart'; +import 'package:spotube/modules/player/player_queue.dart'; import 'package:spotube/pages/lyrics/plain_lyrics.dart'; import 'package:spotube/pages/lyrics/synced_lyrics.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class MiniLyricsPage extends HookConsumerWidget { static const name = "mini_lyrics"; final Size prevSize; + const MiniLyricsPage({super.key, required this.prevSize}); @override @@ -73,7 +73,7 @@ class MiniLyricsPage extends HookConsumerWidget { child: Row( spacing: 2, children: [ - const Gap(10), + const Gap(16), if (kIsMacOS) const SizedBox(width: 65), if (showLyrics.value) Tabs( @@ -187,7 +187,7 @@ class MiniLyricsPage extends HookConsumerWidget { ), ) else - const Gap(20), + const Gap(32), AnimatedCrossFade( crossFadeState: areaActive.value ? CrossFadeState.showFirst @@ -268,7 +268,7 @@ class MiniLyricsPage extends HookConsumerWidget { const Duration(milliseconds: 200)); } finally { if (context.mounted) { - context.navigateTo(LyricsRoute()); + context.navigateTo(const LyricsRoute()); } } }, diff --git a/lib/pages/lyrics/plain_lyrics.dart b/lib/pages/lyrics/plain_lyrics.dart index 0b5354a0..9344155f 100644 --- a/lib/pages/lyrics/plain_lyrics.dart +++ b/lib/pages/lyrics/plain_lyrics.dart @@ -5,12 +5,11 @@ import 'package:palette_generator/palette_generator.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/lyrics/zoom_controls.dart'; import 'package:spotube/components/shimmers/shimmer_lyrics.dart'; import 'package:spotube/extensions/artist_simple.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; - +import 'package:spotube/modules/lyrics/zoom_controls.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/spotify/spotify.dart'; @@ -18,6 +17,7 @@ class PlainLyrics extends HookConsumerWidget { final PaletteColor palette; final bool? isModal; final int defaultTextZoom; + const PlainLyrics({ required this.palette, this.isModal, diff --git a/lib/pages/lyrics/synced_lyrics.dart b/lib/pages/lyrics/synced_lyrics.dart index b7423e14..96e70c90 100644 --- a/lib/pages/lyrics/synced_lyrics.dart +++ b/lib/pages/lyrics/synced_lyrics.dart @@ -3,21 +3,20 @@ import 'dart:async'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:palette_generator/palette_generator.dart'; +import 'package:scroll_to_index/scroll_to_index.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/lyrics/zoom_controls.dart'; import 'package:spotube/components/shimmers/shimmer_lyrics.dart'; import 'package:spotube/extensions/artist_simple.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/hooks/controllers/use_auto_scroll_controller.dart'; import 'package:spotube/modules/lyrics/use_synced_lyrics.dart'; -import 'package:scroll_to_index/scroll_to_index.dart'; +import 'package:spotube/modules/lyrics/zoom_controls.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/logger/logger.dart'; - import 'package:stroke_text/stroke_text.dart'; class SyncedLyrics extends HookConsumerWidget { diff --git a/lib/pages/mobile_login/hooks/login_callback.dart b/lib/pages/mobile_login/hooks/login_callback.dart index 986b7f4a..4e5b9b3c 100644 --- a/lib/pages/mobile_login/hooks/login_callback.dart +++ b/lib/pages/mobile_login/hooks/login_callback.dart @@ -2,13 +2,12 @@ import 'dart:io'; import 'package:auto_route/auto_route.dart'; import 'package:desktop_webview_window/desktop_webview_window.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide join; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide join; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/pages/mobile_login/no_webview_runtime_dialog.dart'; import 'package:spotube/provider/authentication/authentication.dart'; diff --git a/lib/pages/mobile_login/mobile_login.dart b/lib/pages/mobile_login/mobile_login.dart index eb50316f..2ccd4951 100644 --- a/lib/pages/mobile_login/mobile_login.dart +++ b/lib/pages/mobile_login/mobile_login.dart @@ -1,18 +1,17 @@ -import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:auto_route/auto_route.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/components/button/back_button.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; - import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/utils/platform.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class WebViewLoginPage extends HookConsumerWidget { static const name = "login"; + const WebViewLoginPage({super.key}); @override diff --git a/lib/pages/playlist/liked_playlist.dart b/lib/pages/playlist/liked_playlist.dart index 5f7591ab..b57fff12 100644 --- a/lib/pages/playlist/liked_playlist.dart +++ b/lib/pages/playlist/liked_playlist.dart @@ -1,3 +1,4 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart' as material; import 'package:flutter/widgets.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -6,13 +7,13 @@ import 'package:spotube/components/track_presentation/presentation_props.dart'; import 'package:spotube/components/track_presentation/track_presentation.dart'; import 'package:spotube/pages/playlist/playlist.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class LikedPlaylistPage extends HookConsumerWidget { static const name = PlaylistPage.name; final PlaylistSimple playlist; + const LikedPlaylistPage({ super.key, required this.playlist, diff --git a/lib/pages/playlist/playlist.dart b/lib/pages/playlist/playlist.dart index 62ced353..6465adc0 100644 --- a/lib/pages/playlist/playlist.dart +++ b/lib/pages/playlist/playlist.dart @@ -1,5 +1,6 @@ -import 'package:flutter/material.dart' as material; +import 'package:auto_route/auto_route.dart'; import 'package:collection/collection.dart'; +import 'package:flutter/material.dart' as material; import 'package:flutter/material.dart' hide Page; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; @@ -10,7 +11,6 @@ import 'package:spotube/components/track_presentation/use_is_user_playlist.dart' import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class PlaylistPage extends HookConsumerWidget { @@ -18,6 +18,7 @@ class PlaylistPage extends HookConsumerWidget { final PlaylistSimple _playlist; final String id; + const PlaylistPage({ super.key, @PathParam("id") required this.id, diff --git a/lib/pages/profile/profile.dart b/lib/pages/profile/profile.dart index b6c4a2cd..f99c0d92 100644 --- a/lib/pages/profile/profile.dart +++ b/lib/pages/profile/profile.dart @@ -1,3 +1,4 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; @@ -12,7 +13,6 @@ import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:url_launcher/url_launcher_string.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class ProfilePage extends HookConsumerWidget { @@ -30,7 +30,7 @@ class ProfilePage extends HookConsumerWidget { context.l10n.email: meData.email ?? "N/A", context.l10n.profile_followers: meData.followers?.total.toString() ?? "N/A", - context.l10n.birthday: meData.birthdate ?? context.l10n.not_born, + context.l10n.birthday: meData.birthdate ?? "N/A", context.l10n.country: spotifyMarkets .firstWhere((market) => market.$1 == meData.country) .$2, @@ -69,21 +69,21 @@ class ProfilePage extends HookConsumerWidget { ], ), ), - const SliverGap(10), + const SliverGap(16), SliverToBoxAdapter( child: Text( meData.displayName ?? context.l10n.no_name, textAlign: TextAlign.center, ).h4(), ), - const SliverGap(20), + const SliverGap(32), SliverCrossAxisConstrained( maxCrossAxisExtent: 500, child: SliverToBoxAdapter( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ - Button.text( + Button.ghost( leading: const Icon(SpotubeIcons.edit), onPressed: () { launchUrlString( @@ -133,7 +133,7 @@ class ProfilePage extends HookConsumerWidget { ), ), ), - const SliverGap(200), + const SliverGap(256), ], ), ), diff --git a/lib/pages/root/root_app.dart b/lib/pages/root/root_app.dart index 65b97d4f..d4bc0e24 100644 --- a/lib/pages/root/root_app.dart +++ b/lib/pages/root/root_app.dart @@ -4,10 +4,10 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/hooks/configurators/use_check_yt_dlp_installed.dart'; +import 'package:spotube/hooks/configurators/use_endless_playback.dart'; import 'package:spotube/modules/root/bottom_player.dart'; import 'package:spotube/modules/root/sidebar/sidebar.dart'; import 'package:spotube/modules/root/spotube_navigation_bar.dart'; -import 'package:spotube/hooks/configurators/use_endless_playback.dart'; import 'package:spotube/modules/root/use_downloader_dialogs.dart'; import 'package:spotube/modules/root/use_global_subscriptions.dart'; import 'package:spotube/provider/glance/glance.dart'; diff --git a/lib/pages/search/search.dart b/lib/pages/search/search.dart index 3826a0b6..222bacd6 100644 --- a/lib/pages/search/search.dart +++ b/lib/pages/search/search.dart @@ -1,17 +1,44 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart' + show + AnimatedCrossFade, + AnimatedSwitcher, + BoxConstraints, + BuildContext, + Column, + Container, + CrossAxisAlignment, + CrossFadeState, + EdgeInsets, + Expanded, + FontWeight, + Icon, + Icons, + KeyboardListener, + ListTile, + ListenableBuilder, + MainAxisAlignment, + MediaQuery, + Padding, + PopScope, + SafeArea, + SingleChildScrollView, + SizedBox, + Text, + TextInputAction, + TextStyle, + Widget; import 'package:flutter/services.dart'; -import 'package:flutter_undraw/flutter_undraw.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; - -import 'package:spotify/spotify.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_undraw/flutter_undraw.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:spotify/spotify.dart'; import 'package:spotube/collections/routes.gr.dart'; - import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/fallbacks/anonymous_fallback.dart'; -import 'package:spotube/components/titlebar/titlebar.dart'; +import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart'; @@ -21,8 +48,10 @@ import 'package:spotube/pages/search/sections/playlists.dart'; import 'package:spotube/pages/search/sections/tracks.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/spotify/spotify.dart'; -import 'package:spotube/services/kv_store/kv_store.dart'; -import 'package:auto_route/auto_route.dart'; + +final recentSearchesProvider = StateProvider>((ref) { + return []; +}); @RoutePage() class SearchPage extends HookConsumerWidget { @@ -48,14 +77,12 @@ class SearchPage extends HookConsumerWidget { final searchArtist = ref.watch(searchProvider(SearchType.artist)); final queries = [searchTrack, searchAlbum, searchPlaylist, searchArtist]; - final isFetching = queries.every((s) => s.isLoading); useEffect(() { controller.text = searchTerm; - return null; - }, []); + }, [searchTerm]); void onSubmitted(String value) { ref.read(searchTermStateProvider.notifier).state = value; @@ -63,11 +90,19 @@ class SearchPage extends HookConsumerWidget { return; } KVStoreService.setRecentSearches( - { - value, - ...KVStoreService.recentSearches, - }.toList(), + [ + ...{value, ...KVStoreService.recentSearches} + ].toList(), ); + controller.clear(); + } + + void removeRecentSearch(String search) { + final updatedSearches = + List.from(ref.read(recentSearchesProvider)); + updatedSearches.remove(search); + KVStoreService.setRecentSearches(updatedSearches); + ref.read(recentSearchesProvider.notifier).state = updatedSearches; } return PopScope( @@ -78,154 +113,192 @@ class SearchPage extends HookConsumerWidget { child: SafeArea( bottom: false, child: Scaffold( - headers: [ - if (kTitlebarVisible) - const TitleBar(automaticallyImplyLeading: false, height: 30) - ], child: auth.asData?.value == null ? const AnonymousFallback() : Column( children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: ListenableBuilder( - listenable: controller, - builder: (context, _) { - final suggestions = controller.text.isEmpty - ? KVStoreService.recentSearches - : KVStoreService.recentSearches - .where( - (s) => - weightedRatio( - s.toLowerCase(), - controller.text.toLowerCase(), - ) > - 50, - ) - .toList(); - - return KeyboardListener( - focusNode: focusNode, - autofocus: true, - onKeyEvent: (value) { - final isEnter = value.logicalKey == - LogicalKeyboardKey.enter; - - if (isEnter) { - onSubmitted(controller.text); - focusNode.unfocus(); - } - }, - child: AutoComplete( - suggestions: suggestions, - child: TextField( - autofocus: true, - controller: controller, - leading: - const Icon(SpotubeIcons.search), - textInputAction: TextInputAction.search, - placeholder: Text(context.l10n.search), - trailing: AnimatedCrossFade( - duration: - const Duration(milliseconds: 300), - crossFadeState: - controller.text.isNotEmpty - ? CrossFadeState.showFirst - : CrossFadeState.showSecond, - firstChild: IconButton.ghost( - size: ButtonSize.small, - icon: - const Icon(SpotubeIcons.close), - onPressed: () { - controller.clear(); - }, - ), - secondChild: const SizedBox.square( - dimension: 28), - ), - onSubmitted: onSubmitted, - ), - ), - ); - }), + // Custom App Bar + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), + child: Row( + children: [ + IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () => context.back(), + variance: ButtonVariance.ghost, ), - ), - ], - ), - Expanded( - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 300), - child: switch ((searchTerm.isEmpty, isFetching)) { - (true, false) => Column( - children: [ - SizedBox( - height: mediaQuery.height * 0.2, - ), - Undraw( - illustration: UndrawIllustration.explore, - color: theme.colorScheme.primary, - height: 200 * theme.scaling, - ), - const SizedBox(height: 20), - Text(context.l10n.search_to_get_results) - .large(), - ], + const SizedBox(width: 10), + Text( + "Search", + style: theme.typography.h3.copyWith( + fontWeight: FontWeight.bold, ), - (false, true) => Container( - constraints: BoxConstraints( - maxWidth: mediaQuery.lgAndUp - ? mediaQuery.width * 0.5 - : mediaQuery.width, + ), + ], + ), + ), + + // Search Bar + Padding( + padding: const EdgeInsets.all(20), + child: ListenableBuilder( + listenable: controller, + builder: (context, _) { + final suggestions = controller.text.isEmpty + ? ref.watch(recentSearchesProvider) + : ref + .watch(recentSearchesProvider) + .where( + (s) => + weightedRatio( + s.toLowerCase(), + controller.text.toLowerCase(), + ) > + 50, + ) + .toList(); + + return KeyboardListener( + focusNode: focusNode, + autofocus: true, + onKeyEvent: (value) { + final isEnter = + value.logicalKey == LogicalKeyboardKey.enter; + + if (isEnter) { + onSubmitted(controller.text); + focusNode.unfocus(); + } + }, + child: AutoComplete( + suggestions: suggestions, + child: TextField( + autofocus: true, + controller: controller, + leading: const Icon(SpotubeIcons.search), + trailing: AnimatedCrossFade( + duration: const Duration(milliseconds: 300), + crossFadeState: controller.text.isNotEmpty + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + firstChild: IconButton.text( + size: ButtonSize.small, + icon: const Icon(SpotubeIcons.close), + onPressed: () { + controller.clear(); + }, + ), + secondChild: + const SizedBox.square(dimension: 28), + ), + textInputAction: TextInputAction.search, + placeholder: Text(context.l10n.search), + onSubmitted: onSubmitted, ), - padding: const EdgeInsets.symmetric( - horizontal: 20, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + ), + ); + }, + ), + ), + + // Recent Searches or Search Results + if (controller.text.isEmpty) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 8), + ...ref.watch(recentSearchesProvider).map((search) { + return ListTile( + contentPadding: EdgeInsets.zero, + title: Text(search), + trailing: IconButton( + icon: const Icon(Icons.delete), + onPressed: () { + removeRecentSearch(search); + }, + variance: ButtonVariance.card, + ), + ); + }), + ], + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: switch ((searchTerm.isEmpty, isFetching)) { + (true, false) => Column( children: [ - Text( - context.l10n.crunching_results, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w900, - color: theme.colorScheme.foreground - .withOpacity(0.7), - ), + SizedBox( + height: mediaQuery.height * 0.2, + ), + Undraw( + illustration: UndrawIllustration.explore, + color: theme.colorScheme.primary, + height: 200 * theme.scaling, ), const SizedBox(height: 20), - const LinearProgressIndicator(), + Text(context.l10n.search_to_get_results) + .large(), ], ), - ), - _ => InterScrollbar( - controller: scrollController, - child: SingleChildScrollView( + (false, true) => Container( + constraints: BoxConstraints( + maxWidth: mediaQuery.lgAndUp + ? mediaQuery.width * 0.5 + : mediaQuery.width, + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + context.l10n.crunching_results, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w900, + color: theme.colorScheme.foreground + .withOpacity(0.7), + ), + ), + const SizedBox(height: 20), + const LinearProgressIndicator(), + ], + ), + ), + _ => InterScrollbar( controller: scrollController, - child: const Padding( - padding: EdgeInsets.symmetric(vertical: 8), - child: SafeArea( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SearchTracksSection(), - SearchPlaylistsSection(), - Gap(20), - SearchArtistsSection(), - Gap(20), - SearchAlbumsSection(), - ], + child: SingleChildScrollView( + controller: scrollController, + child: const Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: SafeArea( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SearchTracksSection(), + SearchPlaylistsSection(), + Gap(32), + SearchArtistsSection(), + Gap(32), + SearchAlbumsSection(), + ], + ), ), ), ), ), - ), - }, + }, + ), ), ), ], @@ -235,3 +308,11 @@ class SearchPage extends HookConsumerWidget { ); } } + +class KVStoreService { + static List recentSearches = []; + + static void setRecentSearches(List searches) { + recentSearches = searches; + } +} diff --git a/lib/pages/search/sections/albums.dart b/lib/pages/search/sections/albums.dart index 105c23d5..9fc1d6a8 100644 --- a/lib/pages/search/sections/albums.dart +++ b/lib/pages/search/sections/albums.dart @@ -1,7 +1,6 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotify/spotify.dart'; import 'package:spotube/components/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart'; import 'package:spotube/extensions/album_simple.dart'; diff --git a/lib/pages/search/sections/artists.dart b/lib/pages/search/sections/artists.dart index 9a94b3c1..ad984dcc 100644 --- a/lib/pages/search/sections/artists.dart +++ b/lib/pages/search/sections/artists.dart @@ -1,6 +1,5 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotify/spotify.dart'; import 'package:spotube/components/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart'; import 'package:spotube/extensions/context.dart'; diff --git a/lib/pages/search/sections/tracks.dart b/lib/pages/search/sections/tracks.dart index bacbbb57..993f40db 100644 --- a/lib/pages/search/sections/tracks.dart +++ b/lib/pages/search/sections/tracks.dart @@ -1,5 +1,4 @@ import 'package:collection/collection.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; @@ -8,8 +7,8 @@ import 'package:spotube/components/dialogs/select_device_dialog.dart'; import 'package:spotube/components/track_tile/track_tile.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/connect/connect.dart'; -import 'package:spotube/provider/connect/connect.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +import 'package:spotube/provider/connect/connect.dart'; import 'package:spotube/provider/spotify/spotify.dart'; class SearchTracksSection extends HookConsumerWidget { diff --git a/lib/pages/settings/about.dart b/lib/pages/settings/about.dart index 27775f3c..bdd348e6 100644 --- a/lib/pages/settings/about.dart +++ b/lib/pages/settings/about.dart @@ -1,4 +1,6 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/services.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/env.dart'; @@ -8,10 +10,7 @@ import 'package:spotube/components/links/hyper_link.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/hooks/controllers/use_package_info.dart'; - -import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:auto_route/auto_route.dart'; final _licenseProvider = FutureProvider((ref) async { return await rootBundle.loadString("LICENSE"); @@ -45,7 +44,7 @@ class AboutSpotubePage extends HookConsumerWidget { padding: const EdgeInsets.symmetric(horizontal: 16.0), child: Column( children: [ - Assets.spotubeLogoPng.image( + Assets.spotubeLogoStableNotWallpaper.image( height: 200, width: 200, ), diff --git a/lib/pages/settings/blacklist.dart b/lib/pages/settings/blacklist.dart index 8ac2c1b9..2c4bbb2d 100644 --- a/lib/pages/settings/blacklist.dart +++ b/lib/pages/settings/blacklist.dart @@ -1,9 +1,9 @@ -import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:auto_route/auto_route.dart'; import 'package:collection/collection.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; - import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/button/back_button.dart'; import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; @@ -11,7 +11,6 @@ import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/components/ui/button_tile.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/blacklist_provider.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class BlackListPage extends HookConsumerWidget { diff --git a/lib/pages/settings/logs.dart b/lib/pages/settings/logs.dart index 4985b57a..9db9e32d 100644 --- a/lib/pages/settings/logs.dart +++ b/lib/pages/settings/logs.dart @@ -1,3 +1,4 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_undraw/flutter_undraw.dart'; @@ -11,7 +12,6 @@ import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/logs/logs_provider.dart'; import 'package:spotube/services/logger/logger.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class LogsPage extends HookConsumerWidget { diff --git a/lib/pages/settings/sections/about.dart b/lib/pages/settings/sections/about.dart index 82c98e90..b249a886 100644 --- a/lib/pages/settings/sections/about.dart +++ b/lib/pages/settings/sections/about.dart @@ -1,15 +1,14 @@ import 'package:auto_route/auto_route.dart'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart' show ListTile; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart' hide ButtonStyle; import 'package:spotube/collections/env.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/components/adaptive/adaptive_list_tile.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:url_launcher/url_launcher_string.dart'; diff --git a/lib/pages/settings/sections/accounts.dart b/lib/pages/settings/sections/accounts.dart index 5e40b9ec..313e4940 100644 --- a/lib/pages/settings/sections/accounts.dart +++ b/lib/pages/settings/sections/accounts.dart @@ -1,16 +1,15 @@ import 'package:auto_route/auto_route.dart'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:flutter/material.dart' show ListTile; - import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/components/image/universal_image.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; +import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/pages/mobile_login/hooks/login_callback.dart'; import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/scrobbler/scrobbler.dart'; @@ -49,7 +48,7 @@ class SettingsAccountSection extends HookConsumerWidget { ), ), onTap: () { - context.navigateTo(ProfileRoute()); + context.navigateTo(const ProfileRoute()); }, ), if (auth.asData?.value == null) diff --git a/lib/pages/settings/sections/appearance.dart b/lib/pages/settings/sections/appearance.dart index 88f39a25..64ee585c 100644 --- a/lib/pages/settings/sections/appearance.dart +++ b/lib/pages/settings/sections/appearance.dart @@ -1,17 +1,18 @@ -import 'package:flutter/material.dart' show ListTile; -import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:flutter/material.dart' show BuildContext, DropdownMenuItem, ListTile; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/spotube_icons.dart'; +import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; +import 'package:spotube/extensions/context.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart'; import 'package:spotube/modules/settings/section_card_with_heading.dart'; -import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; -import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; class SettingsAppearanceSection extends HookConsumerWidget { final bool isGettingStarted; + const SettingsAppearanceSection({ super.key, this.isGettingStarted = false, @@ -41,18 +42,18 @@ class SettingsAppearanceSection extends HookConsumerWidget { } }, options: [ - SelectItemButton( + DropdownMenuItem( value: LayoutMode.adaptive, child: Text(context.l10n.adaptive), ), - SelectItemButton( + DropdownMenuItem( value: LayoutMode.compact, child: Text(context.l10n.compact), ), - SelectItemButton( - value: LayoutMode.extended, - child: Text(context.l10n.extended), - ), + // DropdownMenuItem( + // value: LayoutMode.extended, + // child: Text(context.l10n.extended), + // ), ], ), AdaptiveSelectTile( @@ -60,15 +61,15 @@ class SettingsAppearanceSection extends HookConsumerWidget { title: Text(context.l10n.theme), value: preferences.themeMode, options: [ - SelectItemButton( + DropdownMenuItem( value: ThemeMode.dark, child: Text(context.l10n.dark), ), - SelectItemButton( + DropdownMenuItem( value: ThemeMode.light, child: Text(context.l10n.light), ), - SelectItemButton( + DropdownMenuItem( value: ThemeMode.system, child: Text(context.l10n.system), ), diff --git a/lib/pages/settings/sections/desktop.dart b/lib/pages/settings/sections/desktop.dart index ad45c689..2ec921ed 100644 --- a/lib/pages/settings/sections/desktop.dart +++ b/lib/pages/settings/sections/desktop.dart @@ -1,11 +1,11 @@ -import 'package:flutter/material.dart' show ListTile; +import 'package:flutter/material.dart' show DropdownMenuItem, ListTile; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/models/database/database.dart'; -import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/models/database/database.dart'; +import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; class SettingsDesktopSection extends HookConsumerWidget { @@ -19,17 +19,17 @@ class SettingsDesktopSection extends HookConsumerWidget { return SectionCardWithHeading( heading: context.l10n.desktop, children: [ - const Gap(10), + const Gap(16), AdaptiveSelectTile( secondary: const Icon(SpotubeIcons.close), title: Text(context.l10n.close_behavior), value: preferences.closeBehavior, options: [ - SelectItemButton( + DropdownMenuItem( value: CloseBehavior.close, child: Text(context.l10n.close), ), - SelectItemButton( + DropdownMenuItem( value: CloseBehavior.minimizeToTray, child: Text(context.l10n.minimize_to_tray), ), diff --git a/lib/pages/settings/sections/developers.dart b/lib/pages/settings/sections/developers.dart index 0862e023..91afc441 100644 --- a/lib/pages/settings/sections/developers.dart +++ b/lib/pages/settings/sections/developers.dart @@ -1,12 +1,11 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart' show ListTile; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/settings/section_card_with_heading.dart'; class SettingsDevelopersSection extends HookWidget { const SettingsDevelopersSection({super.key}); diff --git a/lib/pages/settings/sections/downloads.dart b/lib/pages/settings/sections/downloads.dart index 516d2aca..f76fd9a7 100644 --- a/lib/pages/settings/sections/downloads.dart +++ b/lib/pages/settings/sections/downloads.dart @@ -5,8 +5,8 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/extensions/context.dart'; +import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/platform.dart'; @@ -29,8 +29,7 @@ class SettingsDownloadsSection extends HookConsumerWidget { String? dirStr = await getDirectoryPath( initialDirectory: preferences.downloadLocation, ); - if (dirStr == null) return; - preferencesNotifier.setDownloadLocation(dirStr); + preferencesNotifier.setDownloadLocation(dirStr!); } }, [preferences.downloadLocation]); diff --git a/lib/pages/settings/sections/language_region.dart b/lib/pages/settings/sections/language_region.dart index 44b364af..402f49ac 100644 --- a/lib/pages/settings/sections/language_region.dart +++ b/lib/pages/settings/sections/language_region.dart @@ -1,15 +1,16 @@ import 'package:collection/collection.dart'; +import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/language_codes.dart'; import 'package:spotube/collections/spotify_markets.dart'; import 'package:spotube/collections/spotube_icons.dart'; -import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/l10n/l10n.dart'; +import 'package:spotube/modules/settings/section_card_with_heading.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; final localWithName = L10n.all.map((e) { @@ -41,12 +42,12 @@ class SettingsLanguageRegionSection extends HookConsumerWidget { title: Text(context.l10n.language), secondary: const Icon(SpotubeIcons.language), options: [ - SelectItemButton( + DropdownMenuItem( value: const Locale("system", "system"), child: Text(context.l10n.system_default), ), for (final (:locale, :name) in localWithName) - SelectItemButton(value: locale, child: Text(name)), + DropdownMenuItem(value: locale, child: Text(name)), ], ), AdaptiveSelectTile( @@ -61,7 +62,7 @@ class SettingsLanguageRegionSection extends HookConsumerWidget { }, options: spotifyMarkets .map( - (country) => SelectItemButton( + (country) => DropdownMenuItem( value: country.$1, child: Text(country.$2), ), diff --git a/lib/pages/settings/sections/playback.dart b/lib/pages/settings/sections/playback.dart index f3b7d131..f5ab5ba2 100644 --- a/lib/pages/settings/sections/playback.dart +++ b/lib/pages/settings/sections/playback.dart @@ -3,29 +3,27 @@ import 'dart:io'; import 'package:auto_route/auto_route.dart'; import 'package:collection/collection.dart'; import 'package:flutter/gestures.dart'; -import 'package:flutter/material.dart' show ListTile; +import 'package:flutter/material.dart' show DropdownMenuItem, ListTile; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; - import 'package:google_fonts/google_fonts.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:piped_client/piped_client.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; +import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; import 'package:spotube/components/form/text_form_field.dart'; +import 'package:spotube/extensions/context.dart'; import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/modules/settings/section_card_with_heading.dart'; -import 'package:spotube/components/adaptive/adaptive_select_tile.dart'; -import 'package:spotube/extensions/context.dart'; import 'package:spotube/modules/settings/youtube_engine_not_installed_dialog.dart'; import 'package:spotube/provider/audio_player/sources/invidious_instances_provider.dart'; import 'package:spotube/provider/audio_player/sources/piped_instances_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; - import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/youtube_engine/yt_dlp_engine.dart'; import 'package:spotube/utils/platform.dart'; @@ -47,15 +45,15 @@ class SettingsPlaybackSection extends HookConsumerWidget { title: Text(context.l10n.audio_quality), value: preferences.audioQuality, options: [ - SelectItemButton( + DropdownMenuItem( value: SourceQualities.high, child: Text(context.l10n.high), ), - SelectItemButton( + DropdownMenuItem( value: SourceQualities.medium, child: Text(context.l10n.medium), ), - SelectItemButton( + DropdownMenuItem( value: SourceQualities.low, child: Text(context.l10n.low), ), @@ -71,7 +69,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { title: Text(context.l10n.audio_source), value: preferences.audioSource, options: AudioSource.values - .map((e) => SelectItemButton( + .map((e) => DropdownMenuItem( value: e, child: Text(e.label), )) @@ -130,7 +128,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { key: formKey, child: Column( children: [ - const Gap(10), + const Gap(16), TextFormBuilderField( name: "url", controller: controller, @@ -139,7 +137,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { validator: FormBuilderValidators.url(), ), - const Gap(10), + const Gap(16), Row( children: [ Expanded( @@ -151,7 +149,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { Text(context.l10n.cancel), ), ), - const Gap(10), + const Gap(16), Expanded( child: Button.primary( onPressed: () { @@ -185,7 +183,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { options: [ if (data .none((e) => e.apiUrl == preferences.pipedInstance)) - SelectItemButton( + DropdownMenuItem( value: preferences.pipedInstance, child: Text.rich( TextSpan( @@ -201,7 +199,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { ), ), for (final e in data.sortedBy((e) => e.name)) - SelectItemButton( + DropdownMenuItem( value: e.apiUrl, child: RichText( text: TextSpan( @@ -285,7 +283,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { key: formKey, child: Column( children: [ - const Gap(10), + const Gap(16), TextFormBuilderField( name: "url", controller: controller, @@ -294,7 +292,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { validator: FormBuilderValidators.url(), ), - const Gap(10), + const Gap(16), Row( children: [ Expanded( @@ -306,7 +304,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { Text(context.l10n.cancel), ), ), - const Gap(10), + const Gap(16), Expanded( child: Button.primary( onPressed: () { @@ -342,7 +340,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { options: [ if (data.none((e) => e.details.uri == preferences.invidiousInstance)) - SelectItemButton( + DropdownMenuItem( value: preferences.invidiousInstance, child: Text.rich( TextSpan( @@ -358,7 +356,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { ), ), for (final e in data.sortedBy((e) => e.name)) - SelectItemButton( + DropdownMenuItem( value: e.details.uri, child: RichText( text: TextSpan( @@ -402,7 +400,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { value: preferences.youtubeClientEngine, options: YoutubeClientEngine.values .where((e) => e.isAvailableForPlatform()) - .map((e) => SelectItemButton( + .map((e) => DropdownMenuItem( value: e, child: Text(e.label), )) @@ -433,7 +431,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { title: Text(context.l10n.search_mode), value: preferences.searchMode, options: SearchMode.values - .map((e) => SelectItemButton( + .map((e) => DropdownMenuItem( value: e, child: Text(e.label), )) @@ -510,13 +508,13 @@ class SettingsPlaybackSection extends HookConsumerWidget { ), if (preferences.audioSource != AudioSource.jiosaavn) ...[ AdaptiveSelectTile( - popupConstraints: const BoxConstraints(maxWidth: 300), + popup: const BoxConstraints(maxWidth: 300), secondary: const Icon(SpotubeIcons.stream), title: Text(context.l10n.streaming_music_codec), value: preferences.streamMusicCodec, showValueWhenUnfolded: false, options: SourceCodecs.values - .map((e) => SelectItemButton( + .map((e) => DropdownMenuItem( value: e, child: Text( e.label, @@ -530,13 +528,13 @@ class SettingsPlaybackSection extends HookConsumerWidget { }, ), AdaptiveSelectTile( - popupConstraints: const BoxConstraints(maxWidth: 300), + popup: const BoxConstraints(maxWidth: 300), secondary: const Icon(SpotubeIcons.file), title: Text(context.l10n.download_music_codec), value: preferences.downloadMusicCodec, showValueWhenUnfolded: false, options: SourceCodecs.values - .map((e) => SelectItemButton( + .map((e) => DropdownMenuItem( value: e, child: Text( e.label, diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index 0948bdeb..eddb3cde 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -1,3 +1,4 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' show Material, MaterialType; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -15,7 +16,6 @@ import 'package:spotube/pages/settings/sections/language_region.dart'; import 'package:spotube/pages/settings/sections/playback.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/utils/platform.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class SettingsPage extends HookConsumerWidget { @@ -57,9 +57,17 @@ class SettingsPage extends HookConsumerWidget { if (!kIsWeb) const SettingsDevelopersSection(), const SettingsAboutSection(), Center( - child: Button.destructive( - onPressed: preferencesNotifier.reset, - child: Text(context.l10n.restore_defaults), + child: ConstrainedBox( + constraints: const BoxConstraints( + minWidth: 150, + maxWidth: 250, + minHeight: 40, + maxHeight: 60, + ), + child: Button.destructive( + onPressed: preferencesNotifier.reset, + child: Text(context.l10n.restore_defaults), + ), ), ), const SizedBox(height: 200), diff --git a/lib/pages/stats/albums/albums.dart b/lib/pages/stats/albums/albums.dart index 834837af..eefdf2a2 100644 --- a/lib/pages/stats/albums/albums.dart +++ b/lib/pages/stats/albums/albums.dart @@ -1,20 +1,20 @@ +import 'package:auto_route/auto_route.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/modules/stats/common/album_item.dart'; import 'package:spotube/extensions/context.dart'; - +import 'package:spotube/modules/stats/common/album_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/albums.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class StatsAlbumsPage extends HookConsumerWidget { static const name = "stats_albums"; + const StatsAlbumsPage({super.key}); @override diff --git a/lib/pages/stats/artists/artists.dart b/lib/pages/stats/artists/artists.dart index f3d2f0dd..955f0e7a 100644 --- a/lib/pages/stats/artists/artists.dart +++ b/lib/pages/stats/artists/artists.dart @@ -1,21 +1,21 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/modules/stats/common/artist_item.dart'; import 'package:spotube/extensions/context.dart'; - +import 'package:spotube/modules/stats/common/artist_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/tracks.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class StatsArtistsPage extends HookConsumerWidget { static const name = "stats_artists"; + const StatsArtistsPage({super.key}); @override diff --git a/lib/pages/stats/fees/fees.dart b/lib/pages/stats/fees/fees.dart index 2f1e4107..a2f41842 100644 --- a/lib/pages/stats/fees/fees.dart +++ b/lib/pages/stats/fees/fees.dart @@ -1,3 +1,4 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; @@ -5,14 +6,12 @@ import 'package:skeletonizer/skeletonizer.dart'; import 'package:sliver_tools/sliver_tools.dart'; import 'package:spotube/collections/formatters.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/modules/stats/common/artist_item.dart'; import 'package:spotube/extensions/context.dart'; - +import 'package:spotube/modules/stats/common/artist_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/tracks.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class StatsStreamFeesPage extends HookConsumerWidget { @@ -67,7 +66,7 @@ class StatsStreamFeesPage extends HookConsumerWidget { padding: const EdgeInsets.all(16.0), sliver: SliverToBoxAdapter( child: Text( - context.l10n.spotify_hipotetical_calculation, + context.l10n.spotify_hypothetical_calculation, ).small().muted(), ), ), diff --git a/lib/pages/stats/minutes/minutes.dart b/lib/pages/stats/minutes/minutes.dart index 2ee4c8d7..88c0eeda 100644 --- a/lib/pages/stats/minutes/minutes.dart +++ b/lib/pages/stats/minutes/minutes.dart @@ -1,16 +1,15 @@ +import 'package:auto_route/auto_route.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/modules/stats/common/track_item.dart'; import 'package:spotube/extensions/context.dart'; - +import 'package:spotube/modules/stats/common/track_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/tracks.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class StatsMinutesPage extends HookConsumerWidget { @@ -52,7 +51,7 @@ class StatsMinutesPage extends HookConsumerWidget { return StatsTrackItem( track: track.track, info: Text( - context.l10n.count_mins(compactNumberFormatter + context.l10n.count_minutes(compactNumberFormatter .format(track.count * track.track.duration!.inMinutes)), ), ); diff --git a/lib/pages/stats/playlists/playlists.dart b/lib/pages/stats/playlists/playlists.dart index 03ea5126..459edebe 100644 --- a/lib/pages/stats/playlists/playlists.dart +++ b/lib/pages/stats/playlists/playlists.dart @@ -1,20 +1,20 @@ +import 'package:auto_route/auto_route.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/modules/stats/common/playlist_item.dart'; import 'package:spotube/extensions/context.dart'; - +import 'package:spotube/modules/stats/common/playlist_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/playlists.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class StatsPlaylistsPage extends HookConsumerWidget { static const name = "stats_playlists"; + const StatsPlaylistsPage({super.key}); @override diff --git a/lib/pages/stats/stats.dart b/lib/pages/stats/stats.dart index da7c64f3..1cea5207 100644 --- a/lib/pages/stats/stats.dart +++ b/lib/pages/stats/stats.dart @@ -1,11 +1,10 @@ +import 'package:auto_route/auto_route.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/modules/stats/summary/summary.dart'; -import 'package:spotube/modules/stats/top/top.dart'; import 'package:spotube/utils/platform.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class StatsPage extends HookConsumerWidget { @@ -29,9 +28,9 @@ class StatsPage extends HookConsumerWidget { ], child: CustomScrollView( slivers: [ - if (kIsMacOS) const SliverGap(20), + if (kIsMacOS) const SliverGap(32), const StatsPageSummarySection(), - const StatsPageTopSection(), + // const StatsPageTopSection(), const SliverToBoxAdapter( child: SafeArea( child: SizedBox(), diff --git a/lib/pages/stats/streams/streams.dart b/lib/pages/stats/streams/streams.dart index 0d919a44..09540c7c 100644 --- a/lib/pages/stats/streams/streams.dart +++ b/lib/pages/stats/streams/streams.dart @@ -1,16 +1,15 @@ +import 'package:auto_route/auto_route.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; import 'package:spotube/collections/formatters.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; -import 'package:spotube/modules/stats/common/track_item.dart'; import 'package:spotube/extensions/context.dart'; - +import 'package:spotube/modules/stats/common/track_item.dart'; import 'package:spotube/provider/history/top.dart'; import 'package:spotube/provider/history/top/tracks.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:very_good_infinite_list/very_good_infinite_list.dart'; -import 'package:auto_route/auto_route.dart'; @RoutePage() class StatsStreamsPage extends HookConsumerWidget { diff --git a/lib/pages/track/track.dart b/lib/pages/track/track.dart index 2918d1d7..3aeba800 100644 --- a/lib/pages/track/track.dart +++ b/lib/pages/track/track.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:auto_route/auto_route.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:skeletonizer/skeletonizer.dart'; @@ -12,6 +13,7 @@ import 'package:spotube/components/links/artist_link.dart'; import 'package:spotube/components/links/link_text.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/components/track_tile/track_options.dart'; +import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/image.dart'; import 'package:spotube/extensions/list.dart'; @@ -19,14 +21,12 @@ import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; -import 'package:spotube/extensions/constrains.dart'; -import 'package:auto_route/auto_route.dart'; - @RoutePage() class TrackPage extends HookConsumerWidget { static const name = "track"; final String trackId; + const TrackPage({ super.key, @PathParam("id") required this.trackId, @@ -136,12 +136,12 @@ class TrackPage extends HookConsumerWidget { Text( track.name!, ).large().semiBold(), - const Gap(10), + const Gap(16), Row( mainAxisSize: MainAxisSize.min, children: [ const Icon(SpotubeIcons.album), - const Gap(5), + const Gap(8), Flexible( child: LinkText( track.album!.name!, @@ -154,12 +154,12 @@ class TrackPage extends HookConsumerWidget { ), ], ), - const Gap(10), + const Gap(16), Row( mainAxisSize: MainAxisSize.min, children: [ const Icon(SpotubeIcons.artist), - const Gap(5), + const Gap(8), Flexible( child: ArtistLink( artists: track.artists!, @@ -168,7 +168,7 @@ class TrackPage extends HookConsumerWidget { ), ], ), - const Gap(10), + const Gap(16), ConstrainedBox( constraints: const BoxConstraints(maxWidth: 350), @@ -177,7 +177,7 @@ class TrackPage extends HookConsumerWidget { ? MainAxisSize.max : MainAxisSize.min, children: [ - const Gap(5), + const Gap(8), if (!isActive && !playlist.tracks .containsBy(track, (t) => t.id)) @@ -189,7 +189,7 @@ class TrackPage extends HookConsumerWidget { playlistNotifier.addTrack(track); }, ), - const Gap(5), + const Gap(8), if (!isActive && !playlist.tracks .containsBy(track, (t) => t.id)) @@ -206,7 +206,7 @@ class TrackPage extends HookConsumerWidget { }, ), ), - const Gap(5), + const Gap(8), Tooltip( tooltip: TooltipContainer( child: Text( @@ -225,17 +225,17 @@ class TrackPage extends HookConsumerWidget { onPressed: onPlay, ), ), - const Gap(5), + const Gap(8), if (mediaQuery.smAndDown) const Spacer() else - const Gap(20), + const Gap(32), TrackHeartButton(track: track), TrackOptions( track: track, userPlaylist: false, ), - const Gap(5), + const Gap(8), ], ), ), diff --git a/lib/provider/audio_player/audio_player_streams.dart b/lib/provider/audio_player/audio_player_streams.dart index 54c6d7cd..eb1565e8 100644 --- a/lib/provider/audio_player/audio_player_streams.dart +++ b/lib/provider/audio_player/audio_player_streams.dart @@ -7,9 +7,9 @@ import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/state.dart'; import 'package:spotube/provider/discord_provider.dart'; import 'package:spotube/provider/history/history.dart'; -import 'package:spotube/provider/skip_segments/skip_segments.dart'; import 'package:spotube/provider/scrobbler/scrobbler.dart'; import 'package:spotube/provider/server/sourced_track.dart'; +import 'package:spotube/provider/skip_segments/skip_segments.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_services/audio_services.dart'; @@ -18,6 +18,7 @@ import 'package:spotube/services/logger/logger.dart'; class AudioPlayerStreamListeners { final Ref ref; late final AudioServices notificationService; + AudioPlayerStreamListeners(this.ref) { AudioServices.create(ref, ref.read(audioPlayerProvider.notifier)).then( (value) => notificationService = value, @@ -39,9 +40,13 @@ class AudioPlayerStreamListeners { } ScrobblerNotifier get scrobbler => ref.read(scrobblerProvider.notifier); + UserPreferences get preferences => ref.read(userPreferencesProvider); + DiscordNotifier get discord => ref.read(discordProvider.notifier); + AudioPlayerState get audioPlayerState => ref.read(audioPlayerProvider); + PlaybackHistoryActions get history => ref.read(playbackHistoryActionsProvider); @@ -63,7 +68,9 @@ class AudioPlayerStreamListeners { final currentSegments = await ref.read(segmentProvider.future); if (currentSegments?.segments.isNotEmpty != true || - position < const Duration(seconds: 3)) return; + position < const Duration(seconds: 3)) { + return; + } for (final segment in currentSegments!.segments) { final seconds = position.inSeconds; diff --git a/lib/provider/audio_player/sources/piped_instances_provider.dart b/lib/provider/audio_player/sources/piped_instances_provider.dart index 3c5d5f04..965826dd 100644 --- a/lib/provider/audio_player/sources/piped_instances_provider.dart +++ b/lib/provider/audio_player/sources/piped_instances_provider.dart @@ -1,6 +1,6 @@ -import 'package:spotube/services/logger/logger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:piped_client/piped_client.dart'; +import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/sourced_track/sources/piped.dart'; final pipedInstancesFutureProvider = FutureProvider>( diff --git a/lib/provider/authentication/authentication.dart b/lib/provider/authentication/authentication.dart index 583955b0..41fe9429 100644 --- a/lib/provider/authentication/authentication.dart +++ b/lib/provider/authentication/authentication.dart @@ -10,6 +10,9 @@ import 'package:drift/drift.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart' hide X509Certificate; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:otp_util/otp_util.dart'; +// ignore: implementation_imports +import 'package:otp_util/src/utils/generic_util.dart'; import 'package:spotube/collections/routes.dart'; import 'package:spotube/components/dialogs/prompt_dialog.dart'; import 'package:spotube/extensions/context.dart'; @@ -17,9 +20,6 @@ import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/database/database.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/utils/platform.dart'; -import 'package:otp_util/otp_util.dart'; -// ignore: implementation_imports -import 'package:otp_util/src/utils/generic_util.dart'; import 'package:spotube/utils/service_utils.dart'; extension ExpirationAuthenticationTableData on AuthenticationTableData { diff --git a/lib/provider/connect/connect.dart b/lib/provider/connect/connect.dart index 000a28af..848ce4f3 100644 --- a/lib/provider/connect/connect.dart +++ b/lib/provider/connect/connect.dart @@ -1,16 +1,15 @@ import 'dart:convert'; -import 'package:media_kit/media_kit.dart' hide Track; -import 'package:spotube/provider/audio_player/state.dart'; -import 'package:spotube/services/audio_player/audio_player.dart'; -import 'package:spotube/services/logger/logger.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:media_kit/media_kit.dart' hide Track; import 'package:spotify/spotify.dart' hide Playlist; import 'package:spotube/models/connect/connect.dart'; - +import 'package:spotube/provider/audio_player/state.dart'; import 'package:spotube/provider/connect/clients.dart'; -import 'package:web_socket_channel/web_socket_channel.dart'; +import 'package:spotube/services/audio_player/audio_player.dart'; +import 'package:spotube/services/logger/logger.dart'; import 'package:web_socket_channel/status.dart' as status; +import 'package:web_socket_channel/web_socket_channel.dart'; final playingProvider = StateProvider( (ref) => false, diff --git a/lib/provider/discord_provider.dart b/lib/provider/discord_provider.dart index 8f81fc51..ac3d5147 100644 --- a/lib/provider/discord_provider.dart +++ b/lib/provider/discord_provider.dart @@ -90,7 +90,7 @@ class DiscordNotifier extends AsyncNotifier { track.album?.images?.first.url ?? "spotube-logo-foreground", largeText: track.album?.name ?? "Unknown album", smallImage: "spotube-logo-foreground", - smallText: "Spotube", + smallText: "SpoTube", ), buttons: [ RPCButton( diff --git a/lib/provider/download_manager_provider.dart b/lib/provider/download_manager_provider.dart index 5e9eda20..9fbf9c33 100644 --- a/lib/provider/download_manager_provider.dart +++ b/lib/provider/download_manager_provider.dart @@ -1,8 +1,6 @@ import 'dart:async'; import 'dart:io'; -import 'package:spotube/extensions/track.dart'; -import 'package:spotube/services/logger/logger.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -11,8 +9,10 @@ import 'package:path/path.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/extensions/artist_simple.dart'; import 'package:spotube/extensions/image.dart'; +import 'package:spotube/extensions/track.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/download_manager/download_manager.dart'; +import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; import 'package:spotube/utils/primitive_utils.dart'; @@ -46,7 +46,9 @@ class DownloadManagerProvider extends ChangeNotifier { //? WebA audiotagging is not supported yet //? Although in future by converting weba to opus & then tagging it //? is possible using vorbis comments - downloadCodec == SourceCodecs.weba) return; + downloadCodec == SourceCodecs.weba) { + return; + } final file = File(request.path); @@ -82,6 +84,7 @@ class DownloadManagerProvider extends ChangeNotifier { String get downloadDirectory => ref.read(userPreferencesProvider.select((s) => s.downloadLocation)); + SourceCodecs get downloadCodec => ref.read(userPreferencesProvider.select((s) => s.downloadMusicCodec)); @@ -96,6 +99,7 @@ class DownloadManagerProvider extends ChangeNotifier { .length; final Set $history; + // these are the tracks which metadata hasn't been fetched yet final Set $backHistory; final DownloadManager dl; diff --git a/lib/provider/history/history.dart b/lib/provider/history/history.dart index 0c20a9e5..3bf219fe 100644 --- a/lib/provider/history/history.dart +++ b/lib/provider/history/history.dart @@ -5,6 +5,7 @@ import 'package:spotube/provider/database/database.dart'; class PlaybackHistoryActions { final Ref ref; + AppDatabase get _db => ref.read(databaseProvider); PlaybackHistoryActions(this.ref); diff --git a/lib/provider/local_tracks/local_tracks_provider.dart b/lib/provider/local_tracks/local_tracks_provider.dart index b33fd7f6..d96618e2 100644 --- a/lib/provider/local_tracks/local_tracks_provider.dart +++ b/lib/provider/local_tracks/local_tracks_provider.dart @@ -1,20 +1,19 @@ import 'dart:async'; import 'dart:io'; -import 'package:spotube/services/logger/logger.dart'; import 'package:flutter/foundation.dart'; +// ignore: depend_on_referenced_packages +import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FrbException; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:metadata_god/metadata_god.dart'; import 'package:mime/mime.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; - import 'package:spotify/spotify.dart'; import 'package:spotube/extensions/track.dart'; import 'package:spotube/models/local_track.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; -// ignore: depend_on_referenced_packages -import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FrbException; +import 'package:spotube/services/logger/logger.dart'; const supportedAudioTypes = [ "audio/webm", diff --git a/lib/provider/scrobbler/scrobbler.dart b/lib/provider/scrobbler/scrobbler.dart index 8aff0438..a46aa369 100644 --- a/lib/provider/scrobbler/scrobbler.dart +++ b/lib/provider/scrobbler/scrobbler.dart @@ -13,6 +13,7 @@ import 'package:spotube/services/logger/logger.dart'; class ScrobblerNotifier extends AsyncNotifier { final StreamController _scrobbleController = StreamController.broadcast(); + @override build() async { final database = ref.watch(databaseProvider); diff --git a/lib/provider/server/routes/connect.dart b/lib/provider/server/routes/connect.dart index 0d35b473..57fd8363 100644 --- a/lib/provider/server/routes/connect.dart +++ b/lib/provider/server/routes/connect.dart @@ -7,9 +7,8 @@ import 'package:shelf/shelf.dart'; import 'package:shelf_web_socket/shelf_web_socket.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/models/connect/connect.dart'; - -import 'package:spotube/provider/history/history.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +import 'package:spotube/provider/history/history.dart'; import 'package:spotube/provider/volume_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/logger/logger.dart'; @@ -25,6 +24,7 @@ class ServerConnectRoutes { final Ref ref; final StreamController _connectClientStreamController; final List subscriptions; + ServerConnectRoutes(this.ref) : _connectClientStreamController = StreamController.broadcast(), subscriptions = [] { @@ -38,8 +38,10 @@ class ServerConnectRoutes { AudioPlayerNotifier get audioPlayerNotifier => ref.read(audioPlayerProvider.notifier); + PlaybackHistoryActions get historyNotifier => ref.read(playbackHistoryActionsProvider); + Stream get connectClientStream => _connectClientStreamController.stream; diff --git a/lib/provider/server/routes/playback.dart b/lib/provider/server/routes/playback.dart index 1c7d0de7..0773cafb 100644 --- a/lib/provider/server/routes/playback.dart +++ b/lib/provider/server/routes/playback.dart @@ -1,8 +1,8 @@ import 'dart:io'; import 'dart:math'; -import 'package:dio/dio.dart' hide Response; import 'package:dio/dio.dart' as dio_lib; +import 'package:dio/dio.dart' hide Response; import 'package:flutter/foundation.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:metadata_god/metadata_god.dart'; @@ -14,7 +14,6 @@ import 'package:spotube/extensions/track.dart'; import 'package:spotube/models/parser/range_headers.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/state.dart'; - import 'package:spotube/provider/server/active_sourced_track.dart'; import 'package:spotube/provider/server/sourced_track.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; @@ -40,7 +39,9 @@ String? get _randomUserAgent => _deviceClients class ServerPlaybackRoutes { final Ref ref; + UserPreferences get userPreferences => ref.read(userPreferencesProvider); + AudioPlayerState get playlist => ref.read(audioPlayerProvider); final Dio dio; diff --git a/lib/provider/skip_segments/skip_segments.dart b/lib/provider/skip_segments/skip_segments.dart index 005797f4..77fad1dd 100644 --- a/lib/provider/skip_segments/skip_segments.dart +++ b/lib/provider/skip_segments/skip_segments.dart @@ -1,12 +1,11 @@ -import 'package:spotube/models/database/database.dart'; -import 'package:spotube/provider/database/database.dart'; -import 'package:spotube/services/logger/logger.dart'; import 'package:dio/dio.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:spotube/models/database/database.dart'; +import 'package:spotube/provider/database/database.dart'; import 'package:spotube/provider/server/active_sourced_track.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; - import 'package:spotube/services/dio/dio.dart'; +import 'package:spotube/services/logger/logger.dart'; class SourcedSegments { final String source; diff --git a/lib/provider/spotify/artist/following.dart b/lib/provider/spotify/artist/following.dart index 3a3795b7..9b8dd5ca 100644 --- a/lib/provider/spotify/artist/following.dart +++ b/lib/provider/spotify/artist/following.dart @@ -27,6 +27,7 @@ class FollowedArtistsState extends CursorPaginatedState { class FollowedArtistsNotifier extends CursorPaginatedAsyncNotifier { final Dio dio; + FollowedArtistsNotifier() : dio = Dio(), super(); diff --git a/lib/provider/spotify/spotify.dart b/lib/provider/spotify/spotify.dart index a0753fcb..c4febb5b 100644 --- a/lib/provider/spotify/spotify.dart +++ b/lib/provider/spotify/spotify.dart @@ -3,85 +3,75 @@ library spotify; import 'dart:async'; import 'dart:math'; -import 'package:drift/drift.dart'; -import 'package:spotube/collections/assets.gen.dart'; -import 'package:spotube/collections/env.dart'; -import 'package:spotube/models/database/database.dart'; -import 'package:spotube/provider/authentication/authentication.dart'; -import 'package:spotube/provider/database/database.dart'; -import 'package:spotube/services/logger/logger.dart'; import 'package:collection/collection.dart'; import 'package:dio/dio.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:drift/drift.dart'; +import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:intl/intl.dart'; import 'package:lrc/lrc.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'package:spotify/spotify.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; // ignore: depend_on_referenced_packages, implementation_imports import 'package:riverpod/src/async_notifier.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:spotify/spotify.dart'; +import 'package:spotube/collections/assets.gen.dart'; +import 'package:spotube/collections/env.dart'; import 'package:spotube/extensions/album_simple.dart'; import 'package:spotube/extensions/track.dart'; +import 'package:spotube/models/database/database.dart'; import 'package:spotube/models/lyrics.dart'; import 'package:spotube/models/spotify/recommendation_seeds.dart'; import 'package:spotube/models/spotify_friends.dart'; +import 'package:spotube/provider/authentication/authentication.dart'; import 'package:spotube/provider/custom_spotify_endpoint_provider.dart'; +import 'package:spotube/provider/database/database.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/services/dio/dio.dart'; +import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/wikipedia/wikipedia.dart'; import 'package:spotube/utils/primitive_utils.dart'; - import 'package:wikipedia_api/wikipedia_api.dart'; part 'album/favorite.dart'; -part 'album/tracks.dart'; -part 'album/releases.dart'; part 'album/is_saved.dart'; - -part 'artist/artist.dart'; -part 'artist/is_following.dart'; -part 'artist/following.dart'; -part 'artist/top_tracks.dart'; +part 'album/releases.dart'; +part 'album/tracks.dart'; part 'artist/albums.dart'; -part 'artist/wikipedia.dart'; +part 'artist/artist.dart'; +part 'artist/following.dart'; +part 'artist/is_following.dart'; part 'artist/related.dart'; - -part 'category/genres.dart'; +part 'artist/top_tracks.dart'; +part 'artist/wikipedia.dart'; part 'category/categories.dart'; +part 'category/genres.dart'; part 'category/playlists.dart'; - part 'lyrics/synced.dart'; - part 'playlist/favorite.dart'; -part 'playlist/playlist.dart'; -part 'playlist/liked.dart'; -part 'playlist/tracks.dart'; part 'playlist/featured.dart'; part 'playlist/generate.dart'; - +part 'playlist/liked.dart'; +part 'playlist/playlist.dart'; +part 'playlist/tracks.dart'; part 'search/search.dart'; - -part 'user/me.dart'; -part 'user/friends.dart'; - part 'tracks/track.dart'; - -part 'views/view.dart'; - -part 'utils/mixin.dart'; -part 'utils/state.dart'; -part 'utils/provider.dart'; +part 'user/friends.dart'; +part 'user/me.dart'; part 'utils/async.dart'; - -part 'utils/provider/paginated.dart'; +part 'utils/mixin.dart'; +part 'utils/provider.dart'; part 'utils/provider/cursor.dart'; -part 'utils/provider/paginated_family.dart'; part 'utils/provider/cursor_family.dart'; +part 'utils/provider/paginated.dart'; +part 'utils/provider/paginated_family.dart'; +part 'utils/state.dart'; +part 'views/view.dart'; class SpotifyApiWrapper { final SpotifyApi api; final Ref ref; + SpotifyApiWrapper( this.ref, this.api, diff --git a/lib/provider/spotify/utils/provider/cursor.dart b/lib/provider/spotify/utils/provider/cursor.dart index c241827e..1ac5b3c9 100644 --- a/lib/provider/spotify/utils/provider/cursor.dart +++ b/lib/provider/spotify/utils/provider/cursor.dart @@ -1,7 +1,7 @@ part of '../../spotify.dart'; mixin CursorPaginatedAsyncNotifierMixin> - // ignore: invalid_use_of_internal_member +// ignore: invalid_use_of_internal_member on AsyncNotifierBase { Future<(List items, String nextCursor)> fetch(String? offset, int limit); diff --git a/lib/provider/spotify/utils/provider/paginated.dart b/lib/provider/spotify/utils/provider/paginated.dart index 30b66e67..2c8af032 100644 --- a/lib/provider/spotify/utils/provider/paginated.dart +++ b/lib/provider/spotify/utils/provider/paginated.dart @@ -1,7 +1,7 @@ part of '../../spotify.dart'; mixin PaginatedAsyncNotifierMixin> - // ignore: invalid_use_of_internal_member +// ignore: invalid_use_of_internal_member on AsyncNotifierBase { Future> fetch(int offset, int limit); diff --git a/lib/provider/tray_manager/tray_menu.dart b/lib/provider/tray_manager/tray_menu.dart index 42a3f948..07fbea51 100644 --- a/lib/provider/tray_manager/tray_menu.dart +++ b/lib/provider/tray_manager/tray_menu.dart @@ -1,9 +1,9 @@ import 'dart:io'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:media_kit/media_kit.dart' hide Track; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; -import 'package:media_kit/media_kit.dart' hide Track; import 'package:tray_manager/tray_manager.dart'; import 'package:window_manager/window_manager.dart'; diff --git a/lib/provider/user_preferences/user_preferences_provider.dart b/lib/provider/user_preferences/user_preferences_provider.dart index 75234241..629c263c 100644 --- a/lib/provider/user_preferences/user_preferences_provider.dart +++ b/lib/provider/user_preferences/user_preferences_provider.dart @@ -1,6 +1,6 @@ import 'package:drift/drift.dart'; - import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:open_file/open_file.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart' as paths; import 'package:shadcn_flutter/shadcn_flutter.dart' hide join; @@ -13,7 +13,6 @@ import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; -import 'package:open_file/open_file.dart'; typedef UserPreferences = PreferencesTableData; @@ -75,7 +74,9 @@ class UserPreferencesNotifier extends Notifier { } return paths.getDownloadsDirectory().then((dir) { - return join(dir!.path, "Spotube"); + return join( + dir!.path, + ); }); } diff --git a/lib/provider/youtube_engine/youtube_engine.dart b/lib/provider/youtube_engine/youtube_engine.dart index 0aa37db5..fdb528a8 100644 --- a/lib/provider/youtube_engine/youtube_engine.dart +++ b/lib/provider/youtube_engine/youtube_engine.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; -import 'package:spotube/services/youtube_engine/newpipe_engine.dart'; +// import 'package:spotube/services/youtube_engine/newpipe_engine.dart'; import 'package:spotube/services/youtube_engine/youtube_explode_engine.dart'; import 'package:spotube/services/youtube_engine/yt_dlp_engine.dart'; @@ -10,10 +10,12 @@ final youtubeEngineProvider = Provider((ref) { userPreferencesProvider.select((value) => value.youtubeClientEngine), ); - if (engineMode == YoutubeClientEngine.newPipe && - NewPipeEngine.isAvailableForPlatform) { - return NewPipeEngine(); - } else if (engineMode == YoutubeClientEngine.ytDlp && + // if (engineMode == YoutubeClientEngine.newPipe && + // NewPipeEngine.isAvailableForPlatform) { + // return NewPipeEngine(); + // } else if (engineMode == YoutubeClientEngine.ytDlp && + // YtDlpEngine.isAvailableForPlatform) { + if (engineMode == YoutubeClientEngine.ytDlp && YtDlpEngine.isAvailableForPlatform) { return YtDlpEngine(); } else { diff --git a/lib/services/audio_player/audio_player.dart b/lib/services/audio_player/audio_player.dart index 4febecdf..e09ddbbe 100644 --- a/lib/services/audio_player/audio_player.dart +++ b/lib/services/audio_player/audio_player.dart @@ -1,21 +1,19 @@ +import 'dart:async'; import 'dart:io'; -import 'package:media_kit/media_kit.dart' hide Track; -import 'package:spotube/services/logger/logger.dart'; import 'package:flutter/foundation.dart'; +import 'package:media_kit/media_kit.dart' as mk; +import 'package:media_kit/media_kit.dart' hide Track; import 'package:spotify/spotify.dart' hide Playlist; import 'package:spotube/models/local_track.dart'; import 'package:spotube/services/audio_player/custom_player.dart'; -import 'dart:async'; - -import 'package:media_kit/media_kit.dart' as mk; - import 'package:spotube/services/audio_player/playback_state.dart'; +import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; import 'package:spotube/utils/platform.dart'; -part 'audio_players_streams_mixin.dart'; part 'audio_player_impl.dart'; +part 'audio_players_streams_mixin.dart'; class SpotubeMedia extends mk.Media { final Track track; @@ -63,20 +61,20 @@ class SpotubeMedia extends mk.Media { ); } - // @override - // operator ==(Object other) { - // if (other is! SpotubeMedia) return false; + @override + operator ==(Object other) { + if (other is! SpotubeMedia) return false; - // final isLocal = track is LocalTrack && other.track is LocalTrack; - // return isLocal - // ? (other.track as LocalTrack).path == (track as LocalTrack).path - // : other.track.id == track.id; - // } + final isLocal = track is LocalTrack && other.track is LocalTrack; + return isLocal + ? (other.track as LocalTrack).path == (track as LocalTrack).path + : other.track.id == track.id; + } - // @override - // int get hashCode => track is LocalTrack - // ? (track as LocalTrack).path.hashCode - // : track.id.hashCode; + @override + int get hashCode => track is LocalTrack + ? (track as LocalTrack).path.hashCode + : track.id.hashCode; } abstract class AudioPlayerInterface { @@ -85,7 +83,7 @@ abstract class AudioPlayerInterface { AudioPlayerInterface() : _mkPlayer = CustomPlayer( configuration: const mk.PlayerConfiguration( - title: "Spotube", + title: "SpoTube", logLevel: kDebugMode ? mk.MPVLogLevel.info : mk.MPVLogLevel.error, ), ) { diff --git a/lib/services/audio_player/custom_player.dart b/lib/services/audio_player/custom_player.dart index f0dc8f13..f8cb0e45 100644 --- a/lib/services/audio_player/custom_player.dart +++ b/lib/services/audio_player/custom_player.dart @@ -1,11 +1,12 @@ import 'dart:async'; -import 'package:spotube/services/logger/logger.dart'; -import 'package:media_kit/media_kit.dart'; -import 'package:flutter_broadcasts/flutter_broadcasts.dart'; -import 'package:package_info_plus/package_info_plus.dart'; + import 'package:audio_session/audio_session.dart'; +import 'package:flutter_broadcasts/flutter_broadcasts.dart'; +import 'package:media_kit/media_kit.dart'; +import 'package:package_info_plus/package_info_plus.dart'; // ignore: implementation_imports import 'package:spotube/services/audio_player/playback_state.dart'; +import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/utils/platform.dart'; /// MediaKit [Player] by default doesn't have a state stream. @@ -89,7 +90,9 @@ class CustomPlayer extends Player { bool get shuffled => _shuffled; Stream get playerStateStream => _playerStateStream.stream; + Stream get shuffleStream => _shuffleStream.stream; + Stream get indexChangeStream { int oldIndex = state.playlist.index; return stream.playlist.map((event) => event.index).where((newIndex) { diff --git a/lib/services/audio_services/audio_services.dart b/lib/services/audio_services/audio_services.dart index 060a7f41..3867d8af 100644 --- a/lib/services/audio_services/audio_services.dart +++ b/lib/services/audio_services/audio_services.dart @@ -1,6 +1,6 @@ import 'package:audio_service/audio_service.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/collections/env.dart'; import 'package:spotube/extensions/artist_simple.dart'; diff --git a/lib/services/audio_services/mobile_audio_service.dart b/lib/services/audio_services/mobile_audio_service.dart index 16a3618e..28d282bd 100644 --- a/lib/services/audio_services/mobile_audio_service.dart +++ b/lib/services/audio_services/mobile_audio_service.dart @@ -3,10 +3,10 @@ import 'dart:io'; import 'package:audio_service/audio_service.dart'; import 'package:audio_session/audio_session.dart'; +import 'package:media_kit/media_kit.dart' hide Track; import 'package:spotube/provider/audio_player/audio_player.dart'; import 'package:spotube/provider/audio_player/state.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; -import 'package:media_kit/media_kit.dart' hide Track; import 'package:spotube/services/audio_player/playback_state.dart'; import 'package:spotube/services/logger/logger.dart'; import 'package:spotube/utils/platform.dart'; diff --git a/lib/services/device_info/device_info.dart b/lib/services/device_info/device_info.dart index 87ddd6eb..0c45438c 100644 --- a/lib/services/device_info/device_info.dart +++ b/lib/services/device_info/device_info.dart @@ -2,6 +2,7 @@ import 'package:device_info_plus/device_info_plus.dart'; class DeviceInfoService { final DeviceInfoPlugin deviceInfo; + DeviceInfoService._() : deviceInfo = DeviceInfoPlugin(); static final instance = DeviceInfoService._(); diff --git a/lib/services/download_manager/download_manager.dart b/lib/services/download_manager/download_manager.dart index d2072bd7..3f7bd0c9 100644 --- a/lib/services/download_manager/download_manager.dart +++ b/lib/services/download_manager/download_manager.dart @@ -1,13 +1,12 @@ import 'dart:async'; import 'dart:collection'; import 'dart:io'; -import 'package:collection/collection.dart'; +import 'package:collection/collection.dart'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; - import 'package:spotube/services/download_manager/chunked_download.dart'; import 'package:spotube/services/download_manager/download_request.dart'; import 'package:spotube/services/download_manager/download_status.dart'; @@ -35,6 +34,7 @@ class DownloadManager { final _statusStreamController = StreamController.broadcast(); + Stream get statusStream => _statusStreamController.stream; diff --git a/lib/services/kv_store/encrypted_kv_store.dart b/lib/services/kv_store/encrypted_kv_store.dart index 4eca0007..69a73836 100644 --- a/lib/services/kv_store/encrypted_kv_store.dart +++ b/lib/services/kv_store/encrypted_kv_store.dart @@ -1,7 +1,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:spotube/services/kv_store/kv_store.dart'; -import 'package:uuid/uuid.dart'; import 'package:spotube/utils/platform.dart'; +import 'package:uuid/uuid.dart'; abstract class EncryptedKvStoreService { static const _storage = FlutterSecureStorage( diff --git a/lib/services/kv_store/kv_store.dart b/lib/services/kv_store/kv_store.dart index e334322e..e22b1dde 100644 --- a/lib/services/kv_store/kv_store.dart +++ b/lib/services/kv_store/kv_store.dart @@ -8,6 +8,7 @@ import 'package:uuid/uuid.dart'; abstract class KVStoreService { static SharedPreferences? _sharedPreferences; + static SharedPreferences get sharedPreferences => _sharedPreferences!; static Future initialize() async { @@ -16,11 +17,13 @@ abstract class KVStoreService { static bool get doneGettingStarted => sharedPreferences.getBool('doneGettingStarted') ?? false; + static Future setDoneGettingStarted(bool value) async => await sharedPreferences.setBool('doneGettingStarted', value); static bool get askedForBatteryOptimization => sharedPreferences.getBool('askedForBatteryOptimization') ?? false; + static Future setAskedForBatteryOptimization(bool value) async => await sharedPreferences.setBool('askedForBatteryOptimization', value); @@ -81,11 +84,13 @@ abstract class KVStoreService { } static double get volume => sharedPreferences.getDouble('volume') ?? 1.0; + static Future setVolume(double value) async => await sharedPreferences.setDouble('volume', value); static bool get hasMigratedToDrift => sharedPreferences.getBool('hasMigratedToDrift') ?? false; + static Future setHasMigratedToDrift(bool value) async => await sharedPreferences.setBool('hasMigratedToDrift', value); diff --git a/lib/services/logger/logger.dart b/lib/services/logger/logger.dart index 1f15bf92..d8737043 100644 --- a/lib/services/logger/logger.dart +++ b/lib/services/logger/logger.dart @@ -3,13 +3,13 @@ import 'dart:io'; import 'dart:isolate'; import 'package:flutter/foundation.dart'; -import 'package:shadcn_flutter/shadcn_flutter.dart' hide join; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:logger/logger.dart'; +import 'package:logging/logging.dart' as logging; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:shadcn_flutter/shadcn_flutter.dart' hide join; import 'package:spotube/utils/platform.dart'; -import 'package:logging/logging.dart' as logging; final _loggingToLoggerLevel = { logging.Level.ALL: Level.all, diff --git a/lib/services/song_link/song_link.dart b/lib/services/song_link/song_link.dart index e3cffa52..3c028a31 100644 --- a/lib/services/song_link/song_link.dart +++ b/lib/services/song_link/song_link.dart @@ -2,18 +2,18 @@ library song_link; import 'dart:convert'; -import 'package:spotube/services/logger/logger.dart'; import 'package:dio/dio.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:html/parser.dart'; +import 'package:spotube/services/logger/logger.dart'; part 'model.dart'; - part 'song_link.freezed.dart'; part 'song_link.g.dart'; abstract class SongLinkService { static final dio = Dio(); + static Future> links(String spotifyId) async { try { final res = await dio.get( diff --git a/lib/services/sourced_track/enums.dart b/lib/services/sourced_track/enums.dart index e47ee6bd..c2d9d52a 100644 --- a/lib/services/sourced_track/enums.dart +++ b/lib/services/sourced_track/enums.dart @@ -6,6 +6,7 @@ enum SourceCodecs { weba._("WebA (Best for streamed music)\nDoesn't support audio metadata"); final String label; + const SourceCodecs._(this.label); } diff --git a/lib/services/sourced_track/models/video_info.dart b/lib/services/sourced_track/models/video_info.dart index e3452c61..65b45a79 100644 --- a/lib/services/sourced_track/models/video_info.dart +++ b/lib/services/sourced_track/models/video_info.dart @@ -1,7 +1,6 @@ import 'package:invidious/invidious.dart'; import 'package:piped_client/piped_client.dart'; import 'package:spotube/models/database/database.dart'; - import 'package:youtube_explode_dart/youtube_explode_dart.dart'; class YoutubeVideoInfo { diff --git a/lib/services/sourced_track/sourced_track.dart b/lib/services/sourced_track/sourced_track.dart index bf0b22e6..1f6fc45e 100644 --- a/lib/services/sourced_track/sourced_track.dart +++ b/lib/services/sourced_track/sourced_track.dart @@ -2,7 +2,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; - import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/models/source_info.dart'; import 'package:spotube/services/sourced_track/models/source_map.dart'; diff --git a/lib/services/sourced_track/sources/invidious.dart b/lib/services/sourced_track/sources/invidious.dart index 4a32ad41..54d4a032 100644 --- a/lib/services/sourced_track/sources/invidious.dart +++ b/lib/services/sourced_track/sources/invidious.dart @@ -1,6 +1,7 @@ import 'package:collection/collection.dart'; import 'package:drift/drift.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:invidious/invidious.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/database/database.dart'; @@ -11,7 +12,6 @@ import 'package:spotube/services/sourced_track/models/source_info.dart'; import 'package:spotube/services/sourced_track/models/source_map.dart'; import 'package:spotube/services/sourced_track/models/video_info.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; -import 'package:invidious/invidious.dart'; import 'package:spotube/services/sourced_track/sources/youtube.dart'; import 'package:spotube/utils/service_utils.dart'; diff --git a/lib/services/sourced_track/sources/jiosaavn.dart b/lib/services/sourced_track/sources/jiosaavn.dart index 1434e4f7..bf1400d3 100644 --- a/lib/services/sourced_track/sources/jiosaavn.dart +++ b/lib/services/sourced_track/sources/jiosaavn.dart @@ -1,7 +1,9 @@ import 'package:collection/collection.dart'; import 'package:drift/drift.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:jiosaavn/jiosaavn.dart'; import 'package:spotify/spotify.dart'; +import 'package:spotube/extensions/string.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/database/database.dart'; import 'package:spotube/services/sourced_track/enums.dart'; @@ -9,8 +11,6 @@ import 'package:spotube/services/sourced_track/exceptions.dart'; import 'package:spotube/services/sourced_track/models/source_info.dart'; import 'package:spotube/services/sourced_track/models/source_map.dart'; import 'package:spotube/services/sourced_track/sourced_track.dart'; -import 'package:jiosaavn/jiosaavn.dart'; -import 'package:spotube/extensions/string.dart'; final jiosaavnClient = JioSaavnClient(); diff --git a/lib/services/sourced_track/sources/piped.dart b/lib/services/sourced_track/sources/piped.dart index 7ab9df44..941afbd8 100644 --- a/lib/services/sourced_track/sources/piped.dart +++ b/lib/services/sourced_track/sources/piped.dart @@ -6,7 +6,6 @@ import 'package:spotify/spotify.dart'; import 'package:spotube/models/database/database.dart'; import 'package:spotube/provider/database/database.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; - import 'package:spotube/services/sourced_track/enums.dart'; import 'package:spotube/services/sourced_track/exceptions.dart'; import 'package:spotube/services/sourced_track/models/source_info.dart'; diff --git a/lib/services/wm_tools/wm_tools.dart b/lib/services/wm_tools/wm_tools.dart index f60b4ac9..21bcd59e 100644 --- a/lib/services/wm_tools/wm_tools.dart +++ b/lib/services/wm_tools/wm_tools.dart @@ -29,6 +29,7 @@ class WindowSize { class WindowManagerTools with WidgetsBindingObserver { static WindowManagerTools? _instance; + static WindowManagerTools get instance => _instance!; WindowManagerTools._(); @@ -40,7 +41,7 @@ class WindowManagerTools with WidgetsBindingObserver { await windowManager.waitUntilReadyToShow( const WindowOptions( - title: "Spotube", + title: "SpoTube", backgroundColor: Colors.transparent, minimumSize: Size(300, 700), titleBarStyle: TitleBarStyle.hidden, diff --git a/lib/services/youtube_engine/newpipe_engine.dart b/lib/services/youtube_engine/newpipe_engine.dart deleted file mode 100644 index f58fc333..00000000 --- a/lib/services/youtube_engine/newpipe_engine.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'package:flutter_new_pipe_extractor/flutter_new_pipe_extractor.dart' - hide Engagement; -import 'package:spotube/services/youtube_engine/youtube_engine.dart'; -import 'package:spotube/utils/platform.dart'; -import 'package:youtube_explode_dart/youtube_explode_dart.dart'; -import 'package:http_parser/http_parser.dart'; - -class NewPipeEngine implements YouTubeEngine { - static bool get isAvailableForPlatform => kIsAndroid; - - AudioOnlyStreamInfo _parseAudioStream(AudioStream stream, String videoId) { - return AudioOnlyStreamInfo( - VideoId(videoId), - stream.itag, - Uri.parse(stream.content), - StreamContainer.parse(stream.mediaFormat!.mimeType.split("/").last), - FileSize.unknown, - Bitrate(stream.bitrate), - stream.codec, - stream.quality, - [], - MediaType.parse(stream.mediaFormat!.mimeType), - null, - ); - } - - Video _parseVideo(VideoInfo info) { - return Video( - VideoId(info.id), - info.name, - info.uploaderName, - ChannelId(info.uploaderUrl), - info.uploadDate.offsetDateTime, - info.uploadDate.offsetDateTime.toString(), - info.uploadDate.offsetDateTime, - info.description.content ?? "", - Duration(seconds: info.duration), - ThumbnailSet(info.id), - info.tags, - Engagement( - info.viewCount, - info.likeCount, - info.dislikeCount, - ), - !info.streamType.name.toLowerCase().contains("live"), - ); - } - - Video _parseVideoResult(VideoSearchResultItem info) { - final id = Uri.parse(info.url).queryParameters["v"]!; - return Video( - VideoId(id), - info.name, - info.uploaderName, - ChannelId(info.uploaderUrl), - info.uploadDate?.offsetDateTime, - info.uploadDate?.offsetDateTime.toString(), - info.uploadDate?.offsetDateTime, - info.shortDescription ?? "", - Duration(seconds: info.duration), - ThumbnailSet(id), - [], - Engagement(info.viewCount, null, null), - !info.streamType.name.toLowerCase().contains("live"), - ); - } - - @override - Future getStreamManifest(String videoId) async { - final video = await NewPipeExtractor.getVideoInfo(videoId); - - final streams = - video.audioStreams.map((stream) => _parseAudioStream(stream, videoId)); - - return StreamManifest(streams); - } - - @override - Future