Compare commits

...

350 Commits

Author SHA1 Message Date
Kingkor Roy Tirtho
a8f70f201e
Merge pull request #2772 from KRTirtho/dev
Release v5.0.0
2025-09-11 22:42:36 +06:00
Kingkor Roy Tirtho
b8ecd758cf chore: fix plugin import not working inside flatpak 2025-09-11 22:36:02 +06:00
Kingkor Roy Tirtho
70970f62f1 chore: fix connect play playlist/album and clear queue not working 2025-09-11 21:52:43 +06:00
Kingkor Roy Tirtho
4ed40d95b2 chore: remove print 2025-09-09 21:18:54 +06:00
Kingkor Roy Tirtho
b24dcd2951 chore: show loading indicator for alternative sourced track 2025-09-09 21:18:10 +06:00
Kingkor Roy Tirtho
8ff90bafd7 chore: fix not alternative source not working 2025-09-09 21:09:45 +06:00
Kingkor Roy Tirtho
9190af92ef chore: fix shuffling not working 2025-09-09 20:54:22 +06:00
Kingkor Roy Tirtho
151a440e7e chore: bump version to v5 and generate changelogs 2025-09-09 00:51:09 +06:00
Kingkor Roy Tirtho
9471e008e3 fix(ui): lyrics white text in white background and small player buttons 2025-09-09 00:45:45 +06:00
Kingkor Roy Tirtho
ecc0bdcc42 chore: slate color by default 2025-09-09 00:13:43 +06:00
Kingkor Roy Tirtho
49c04af302 chore: add translation attribute for conventional-commit 2025-09-08 23:47:55 +06:00
Kingkor Roy Tirtho
afe0bea306 docs: add updated screenshots 2025-09-08 22:50:06 +06:00
Stephan Paternotte
eadf2d928f
translation: correction of the dutch language (#1306)
Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>
2025-09-08 20:10:03 +06:00
Richard Hajek
a299a97ca4
doc: compilation with fvm (#2254)
* doc: compilation with fvm

* Update bootstrap command in CONTRIBUTION.md

Removed the 'enable-experiment=records,patterns' option from the build_runner command.

---------

Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>
2025-09-08 20:06:03 +06:00
Kingkor Roy Tirtho
cbbd0a2b40 chore: update podfile 2025-09-08 19:42:48 +06:00
Kingkor Roy Tirtho
216fdadf25 chore: fix dependency issues 2025-09-08 16:45:55 +06:00
Lorenzo
3599a4340f
docs: Removed Google Play Store link from readme file (#2638)
* Update README.md

* Update README.md

---------

Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>
2025-09-08 16:34:37 +06:00
Kingkor Roy Tirtho
719229b2b7 chore: add gap between metadata plugin 2025-09-08 16:30:10 +06:00
Kingkor Roy Tirtho
49db82083c chore: add support for language dialects 2025-09-08 16:29:05 +06:00
maboroshin
84f119e482
translation: fix Japanese translations (#2732)
Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>
2025-09-08 16:15:07 +06:00
SamHacker
aeb8caf059
translation: add Traditional Chinese translation (#2762)
* add: Add the translation file for Chinese Traditional

* i18n: fix wrong translation in Chinese Simpfied

* i18n: Finish the translation in Chinese Traditional file

* i18n: Add Traditional Chinese locale support

* i18n: Add Traditional Chinese language code

---------

Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>
2025-09-08 16:11:54 +06:00
Kingkor Roy Tirtho
7c4956153a chore: allow for any libjsoncpp 2025-09-08 16:04:23 +06:00
Kingkor Roy Tirtho
58dc80aa09 fix(playback): alternative track sources switch not working 2025-09-08 15:31:29 +06:00
Kingkor Roy Tirtho
4a07945214 fix(track_options): tapping on option doesn't close the menu 2025-09-08 14:27:29 +06:00
Kingkor Roy Tirtho
7b21eca37b fix(playback): play not fetching full playlist if playlist is too long 2025-09-08 14:09:16 +06:00
Kingkor Roy Tirtho
43ddf90c48 docs: remove legal notice warning 2025-09-07 20:36:32 +06:00
Kingkor Roy Tirtho
878a441a9f fix: windows webview2 environment permission issue 2025-09-06 22:32:41 +06:00
Kingkor Roy Tirtho
90493f0ea3 chore: add changelog generator config 2025-09-06 00:40:33 +06:00
Kingkor Roy Tirtho
db22b4fcce chore: syntax errors 2025-09-05 23:39:07 +06:00
Kingkor Roy Tirtho
0d6d482630 chore: build runner error 2025-09-05 23:33:55 +06:00
Kingkor Roy Tirtho
a4162dc2ad chore: upgrade drift schema for new plugin metadata fields 2025-09-05 22:52:06 +06:00
Kingkor Roy Tirtho
469a76dbd6 fix: yt-dlp playback not working and add partial support for HLS streaming 2025-09-05 22:40:18 +06:00
Kingkor Roy Tirtho
6940e92142 chore: system tray icon and pagination not working 2025-09-05 21:16:24 +06:00
Kingkor Roy Tirtho
4d57b134a3 cd: use xcode 16.2 2025-09-05 20:01:33 +06:00
Kingkor Roy Tirtho
a370166576 chore: add metadata plugin version 2025-09-05 18:47:46 +06:00
Kingkor Roy Tirtho
69d50eec35 chore: fix artist top tracks play button not showing loading indicator 2025-09-05 17:53:06 +06:00
Kingkor Roy Tirtho
2e48ac380b chore(translation): update missing translations 2025-09-05 17:31:09 +06:00
Kingkor Roy Tirtho
d22b5349a3 chore: fix pagination not working 2025-09-05 17:06:12 +06:00
Kingkor Roy Tirtho
83172f198c chore: fix saving/removing tracks, albums, artists and playlists from library not working 2025-09-05 16:57:29 +06:00
Kingkor Roy Tirtho
f870e12011 fix(playback): skip network requests if cached file already exists 2025-09-05 11:03:56 +06:00
Kingkor Roy Tirtho
345c6ac714 chore: fix pagination for liked tracks and saved albums not working 2025-09-05 10:50:14 +06:00
Kingkor Roy Tirtho
005355e267 chore(translation): add l10n support for new metadata plugin pages 2025-09-03 18:45:38 +06:00
Kingkor Roy Tirtho
aee2c9282d chore: avoid checking stream accessibility all the time
Only check stream accessible or not when first time it fails or gets blocked
2025-09-03 17:31:38 +06:00
Kingkor Roy Tirtho
ea329f40e8 fix(yt): fallback to different search result if all streaming url is inaccessible 2025-09-02 20:56:28 +06:00
Kingkor Roy Tirtho
b248f90403 chore: remove log in TrackSourceQuery.parseUri 2025-09-02 20:10:43 +06:00
Kingkor Roy Tirtho
e2c0ddef24 fix: inaccessible streaming url causing rapid skips
Now it filters the inaccessible streaming urls out so weird stuff won't happen
2025-09-02 20:10:02 +06:00
Kingkor Roy Tirtho
2a0853026a fix: local playback not working for tracks with special # (hashtag) characters 2025-08-31 00:45:29 +06:00
Kingkor Roy Tirtho
dddaa5a964 chore: upgrade new pipe extractor 2025-08-30 23:40:48 +06:00
Kingkor Roy Tirtho
412f3dd81c chore: optimize assets and app size 2025-08-29 17:33:54 +06:00
Kingkor Roy Tirtho
7f30ae8d31 chore: disable caching of plugin download file 2025-08-29 15:05:29 +06:00
Kingkor Roy Tirtho
c0d50d441e fix: use plugin author and name as slug 2025-08-29 14:56:24 +06:00
Kingkor Roy Tirtho
66cae6c7ac chore: upgrade Flutter version 2025-08-29 13:08:28 +06:00
Kingkor Roy Tirtho
308c417ed3 cd: use macos 14 instead 15 2025-08-25 19:27:18 +06:00
Kingkor Roy Tirtho
0823629fb5 chore: upgrade dependencies 2025-08-23 10:07:41 +06:00
Kingkor Roy Tirtho
7037145519 feat: add ErrorBox and NoDefaultMetadataPlugin components
- Implemented ErrorBox for displaying error messages with retry functionality and log viewing.
- Created NoDefaultMetadataPlugin to inform users about missing default metadata providers and provide navigation to manage them.
2025-08-19 22:34:37 +06:00
Kingkor Roy Tirtho
08d1c98674 refactor: move scrobbler to their own place 2025-08-19 20:22:48 +06:00
Kingkor Roy Tirtho
c0dcc87eb2 chore: upgrade hetu_spotube_plugin 2025-08-19 19:07:37 +06:00
Kingkor Roy Tirtho
b4f8d2dfbf chore: upgrade packages 2025-08-18 20:13:49 +06:00
Kingkor Roy Tirtho
48490cf168 chore(windows): fix Runner.rc not getting version information 2025-08-16 19:01:47 +06:00
Kingkor Roy Tirtho
ea7138e95b chore: remove print 2025-08-16 16:41:11 +06:00
Kingkor Roy Tirtho
5add53e269 fix: local track not working and images of local not showing up 2025-08-16 16:11:04 +06:00
Kingkor Roy Tirtho
c615d48e27 Merge branch 'astro-website' into website 2025-08-15 21:06:37 +06:00
Kingkor Roy Tirtho
92c05a51e1 website: migrate to astro and add plugin docs 2025-08-15 21:06:33 +06:00
Kingkor Roy Tirtho
71bcf355ec website: add back warning 2025-08-15 20:48:29 +06:00
Kingkor Roy Tirtho
089a3445a1 website: add SEO metadata 2025-08-15 20:43:12 +06:00
Kingkor Roy Tirtho
dbba55606b website: fix astro not compiling because it can't detect server-side component 2025-08-15 19:21:40 +06:00
Kingkor Roy Tirtho
a2894db652 website: add ads and mobile screen adaptability 2025-08-15 13:49:41 +06:00
Kingkor Roy Tirtho
edcd784335 website: update button styles and enhance background in global CSS 2025-08-15 11:19:43 +06:00
Kingkor Roy Tirtho
0a153fe770 docs: fix invalid links and redirection 2025-08-14 22:29:12 +06:00
Kingkor Roy Tirtho
3f18f35c0b docs: add search bar and libraries page 2025-08-14 22:20:09 +06:00
Kingkor Roy Tirtho
30fd4acf37 docs: add plugin API docs 2025-08-14 21:21:09 +06:00
Kingkor Roy Tirtho
0e34057794 docs: merge some endpoints together to reduce too much elements on the side bar 2025-08-14 20:19:16 +06:00
Kingkor Roy Tirtho
032309a2c6 feat: enhance markdown configuration and styling with rehype plugins and update global styles 2025-08-14 15:10:14 +06:00
Kingkor Roy Tirtho
858cbd17ad docs: update model documentation and add new model files for Spotube objects 2025-08-14 14:10:04 +06:00
Kingkor Roy Tirtho
fbd7b771ef docs: add detailed documentation for BrowseEndpoint, CoreEndpoint, and SearchEndpoint 2025-08-14 09:55:28 +06:00
Kingkor Roy Tirtho
8bdbe7dfba docs: add detailed documentation for plugin endpoints and methods 2025-08-14 09:25:13 +06:00
Kingkor Roy Tirtho
b3f6824a94 docs: add plugin create guide 2025-08-11 21:03:28 +06:00
Kingkor Roy Tirtho
7bb69c02de website: write into and sidebar and developing plugins pages 2025-08-08 23:54:00 +06:00
Kingkor Roy Tirtho
a734ded6f8 website: add documentation structure and navigation components 2025-08-04 21:25:24 +06:00
Kingkor Roy Tirtho
f228937e3e website: hide older releases before 4.0.2 2025-08-04 13:06:44 +06:00
Kingkor Roy Tirtho
ee7d0cfeb5 website: markdown mdx support and wrap up other pages 2025-08-04 13:04:22 +06:00
Kingkor Roy Tirtho
7a630507fb website: add downloads pages 2025-08-04 12:45:28 +06:00
Kingkor Roy Tirtho
dffd494d4a Revert "website: remove vercel trashes"
This reverts commit 49e2d1b759.
2025-08-02 22:51:25 +06:00
Kingkor Roy Tirtho
49e2d1b759 website: remove vercel trashes 2025-08-02 22:50:20 +06:00
Kingkor Roy Tirtho
fd3ddfece9 Merge branch 'dev' into website 2025-08-02 20:05:00 +06:00
Kingkor Roy Tirtho
2bb91feb34
Merge pull request #2746 from KRTirtho/code-greedy-green-corp-removal
Code greedy green corp removal
2025-08-02 20:01:33 +06:00
Kingkor Roy Tirtho
eb3fcfdd6f chore: add animation for browse sections loadingb 2025-08-01 23:28:54 +06:00
Kingkor Roy Tirtho
066fe2a326 fix: create and delete playlist not working 2025-08-01 22:39:15 +06:00
Kingkor Roy Tirtho
93d6e0642b chore: improve image display by adding rounded corners to plugin logos 2025-08-01 22:19:47 +06:00
Kingkor Roy Tirtho
1e61bca1e9 feat: add plugin scrobbling support and support button 2025-08-01 22:18:29 +06:00
Kingkor Roy Tirtho
3bb7f0d78f refactor: change updater to core 2025-08-01 14:48:42 +06:00
Kingkor Roy Tirtho
75bdbeccc0 chore: fix track options causing track page exception 2025-07-25 14:51:30 +06:00
Kingkor Roy Tirtho
846fa679f6 chore: fix changing default plugin doesn't wortk 2025-07-23 21:38:10 +06:00
Kingkor Roy Tirtho
3a5ddd6214 feat: optimize track options and related artists 2025-07-23 17:34:05 +06:00
Kingkor Roy Tirtho
3b21b05fdc chore: fix SliverLayoutBuilder rebuilds too much 2025-07-22 17:37:52 +06:00
Kingkor Roy Tirtho
53ef9e15e1 fix: make YoutubeExplode engine faster 2025-07-22 16:34:56 +06:00
Kingkor Roy Tirtho
7309e900bc feat(metadata): add plugin update checker and dialog for available updates 2025-07-22 00:11:20 +06:00
Kingkor Roy Tirtho
c9556c2ecb chore: fix playback issues 2025-07-21 18:49:23 +06:00
Kingkor Roy Tirtho
efdf091894 fix(android): NewPipe invalid search content filters 2025-07-20 21:46:05 +06:00
Kingkor Roy Tirtho
92dde7286f chore: SafeArea 2025-07-20 21:22:37 +06:00
Kingkor Roy Tirtho
0a604a9ad5 chore: fix queue order 2025-07-19 21:39:31 +06:00
Kingkor Roy Tirtho
cfda46e07e chore: fix saving tracks not working 2025-07-19 14:03:22 +06:00
Kingkor Roy Tirtho
60f032039f fix: endless playback not working 2025-07-19 13:58:05 +06:00
Kingkor Roy Tirtho
d2e0dc1ac9 chore: re-enable endless playback 2025-07-19 11:56:51 +06:00
Kingkor Roy Tirtho
3e7b36f4e6 feat: update new pipe version 2025-07-18 16:47:53 +06:00
Kingkor Roy Tirtho
cdc64e4bb0 feat: Add repository and plugin API version fields to metadata plugins
- Updated database schema to include `repository` and `pluginApiVersion` columns in the `MetadataPluginsTable`.
- Modified `PluginConfiguration` model to include new fields for `repository` and `pluginApiVersion`.
- Enhanced JSON serialization and deserialization for the new fields in `PluginConfiguration`.
- Refactored `SettingsMetadataProviderPage` to display installed plugins with their repository information.
- Created new components `MetadataInstalledPluginItem` and `MetadataPluginRepositoryItem` for better UI representation of plugins.
- Updated plugin installation logic to handle new fields and display relevant information.
- Bumped `youtube_explode_dart` dependency version to `2.5.1`.
2025-07-18 15:55:28 +06:00
Kingkor Roy Tirtho
2f304fa943 feat: use isolate for youtube_explode engine 2025-07-18 10:34:21 +06:00
Kingkor Roy Tirtho
e83a4bb388 feat: add support for automatic plugin repository from github and codeberg 2025-07-17 01:02:04 +06:00
Kingkor Roy Tirtho
90f9cc28eb feat: enhance image handling 2025-07-16 22:34:59 +06:00
Kingkor Roy Tirtho
f23a078b64 chore: fix spotube logo color on light mode 2025-07-16 14:43:32 +06:00
Kingkor Roy Tirtho
d2827a52d3 chore: upgrade to flutter 3.32.5 2025-07-13 21:21:17 +06:00
Kingkor Roy Tirtho
7de6423935 feat: add support for entity specific search 2025-07-13 15:11:56 +06:00
Kingkor Roy Tirtho
5573deb52a website: bring back download buttons for Nightly version 2025-07-11 14:09:28 +06:00
Kingkor Roy Tirtho
412c427cec chore: fix bad certificate error 2025-07-05 21:46:35 +06:00
Kingkor Roy Tirtho
5be4747c66 feat(metadata): add plugin form 2025-07-03 23:55:29 +06:00
Kingkor Roy Tirtho
5b457fc4bd chore: fix streaming quality is worse then available 2025-06-21 22:40:20 +06:00
Kingkor Roy Tirtho
cb97f4352c chore: fix android build not working 2025-06-21 21:28:39 +06:00
Kingkor Roy Tirtho
ee71dbf552 chore: fix login not working and source quality not good when high quality source not found 2025-06-21 19:21:00 +06:00
Kingkor Roy Tirtho
1538dc6d52 chore: fix macos issues 2025-06-21 08:33:22 +06:00
Kingkor Roy Tirtho
53ad5bd448 feat: remove green corp names formally 2025-06-19 23:04:24 +06:00
Kingkor Roy Tirtho
aa65bf291d refactor: use metadata plugin authentication instead 2025-06-19 22:32:22 +06:00
Kingkor Roy Tirtho
41cc79b5e6 chore: make playback working 2025-06-19 21:09:49 +06:00
Kingkor Roy Tirtho
86e55f7a3d chore: fix connect freezed model not working 2025-06-19 15:52:05 +06:00
Kingkor Roy Tirtho
1eb0b5f847 chore: uncomment important lines of code 2025-06-19 15:01:58 +06:00
Kingkor Roy Tirtho
d898d45b4a refactor: add database schema migrations 2025-06-19 14:52:45 +06:00
Kingkor Roy Tirtho
5f47dc3d6d refactor: remove old spotify.dart types and custom spotube metadata types 2025-06-19 14:42:29 +06:00
Kingkor Roy Tirtho
4e6db8b9e1 refactor: move from Track to SpotubeTrackObject and use TrackSources object for providers 2025-06-18 21:30:32 +06:00
Kingkor Roy Tirtho
b979a6ede9 feat: add track endpoint for metadata service 2025-06-16 14:09:20 +06:00
Kingkor Roy Tirtho
fcc05a4243 refactor: search to use metadata plugin 2025-06-16 09:52:02 +06:00
Kingkor Roy Tirtho
7569c37739 refactor: home browse and browse section 2025-06-15 22:14:04 +06:00
Kingkor Roy Tirtho
b8cae569b4 refactor: use metadata artist object for artist card and artist page 2025-06-15 17:30:02 +06:00
Kingkor Roy Tirtho
4b09f6c96b refactor: use metadata album & playlist object for card and pages 2025-06-15 14:00:34 +06:00
Kingkor Roy Tirtho
758b0bc9d9 feat: add artist and album providers 2025-06-14 22:43:20 +06:00
Kingkor Roy Tirtho
326d8212f6 feat: add albums metadata endpoint and provider 2025-06-14 21:07:07 +06:00
Kingkor Roy Tirtho
a9ba2582fb feat: add playlist endpoint and providers 2025-06-14 20:53:18 +06:00
Kingkor Roy Tirtho
f8211cbcc7 feat: add user endpoint calls in metadata and paginated async notifiers 2025-06-14 20:25:38 +06:00
Kingkor Roy Tirtho
3306f21860 feat: update models to match hetu_spotube_plugin signature 2025-06-14 19:18:32 +06:00
Kingkor Roy Tirtho
7a6821f28d feat: implement metadata plugins based on hetu 2025-06-14 08:41:38 +06:00
Kingkor Roy Tirtho
69c0333327 feat: update plugin configuration with more fields 2025-06-13 17:00:59 +06:00
Kingkor Roy Tirtho
2d6fe886e2 chore: metadata 2025-06-13 16:23:41 +06:00
Kingkor Roy Tirtho
67713c60d4 feat(metadata_plugin): add logout method 2025-05-09 23:30:57 +06:00
Kingkor Roy Tirtho
bb0afa5a0c feat: enhance local storage and webview APIs with improved error handling and resource management 2025-05-09 23:02:55 +06:00
Kingkor Roy Tirtho
f4306ad1c3 feat: add webviiew, totp and setInterval apis for plugins 2025-05-07 23:39:44 +06:00
Kingkor Roy Tirtho
b9c6c98e38 Merge branch 'dev' 2025-05-02 20:47:10 +06:00
Kingkor Roy Tirtho
0326630a19 docs: add legal notice 2025-05-02 20:46:13 +06:00
Kingkor Roy Tirtho
abe04b28b2 feat(metadata-plugin): add local storage api 2025-05-02 13:52:07 +06:00
Kingkor Roy Tirtho
8ac30c0031 feat(metadata-plugin): add pagination support, feed and playlist CRUD endpoints 2025-05-02 11:36:09 +06:00
Kingkor Roy Tirtho
9a861b9954 chore: add proper error handling 2025-05-01 23:51:22 +06:00
Kingkor Roy Tirtho
7491175bb6 feat: add metadata api service and models 2025-05-01 13:20:05 +06:00
Kingkor Roy Tirtho
a65846d15e
Merge pull request #2692 from KRTirtho/dev
Dev
2025-05-01 00:06:45 +06:00
Kingkor Roy Tirtho
4f72f3b424 chore: remove greedy green music platform's references in images 2025-04-30 21:42:18 +06:00
Kingkor Roy Tirtho
ecb43f64ad chore: removal of all mentions/references of that greedy green music provider 2025-04-30 21:23:37 +06:00
Kingkor Roy Tirtho
e575d23c4a chore: add cookie font for logo 2025-04-28 00:01:55 +06:00
Kingkor Roy Tirtho
76f0f18592
Merge pull request #2687 from KRTirtho/fix/path-traversal-through-websocket
fix: path traversal through websocket
2025-04-27 23:19:19 +06:00
Kingkor Roy Tirtho
ae0f24d34a chore: update translations 2025-04-27 22:41:57 +06:00
Kingkor Roy Tirtho
a06614bc5c feat: add connect confirmation dialog 2025-04-27 22:39:16 +06:00
Kingkor Roy Tirtho
7c26d29d06 fix: remote path traversal through websocket when devices are on same network 2025-04-27 20:30:32 +06:00
Kingkor Roy Tirtho
b6c0926efc chore: expand android foreground icon by 20% 2025-04-27 10:19:59 +06:00
Kingkor Roy Tirtho
89cf73d95f chore: generate splash screen for default flavor 2025-04-27 09:53:45 +06:00
Kingkor Roy Tirtho
e6a9011c5c chore: fix flutter new pipe not building 2025-04-26 20:56:38 +06:00
Kingkor Roy Tirtho
7143913bba chore: fix icon asset name 2025-04-25 22:08:37 +06:00
Kingkor Roy Tirtho
5567214588
feat: add new icons #2676 by @alexio-dev (#2678)
* feat: add new improved logo

* feat: add new improved logo

* feat: add new improved logo

* feat: add new improved logo

* chore: update the logos in app

* Merge branch 'alexio-dev-refactor/new-icons' into refactor/new-icons #2676

* chore: generate icons for every flavor

* chore: add readme banner

* chore: add back deleted images

* chore: update native splash screen

* chore: fix dart analyzer warnings
2025-04-25 21:55:59 +06:00
Kingkor Roy Tirtho
5ff1fc9f82 fix: artist images are not loading up 2025-04-25 16:27:07 +06:00
Kingkor Roy Tirtho
d3edf07ac9 fix: default accent color in orange but it shows blue in settings 2025-04-07 16:16:43 +06:00
Kingkor Roy Tirtho
8fc319d980 fix(mobile): dialogs in bottom sheet are not opening 2025-04-07 14:53:05 +06:00
Seungmin Kim
e986baa0aa
chore: revise filter for ISRC search (#2614) 2025-04-07 13:12:45 +06:00
Kingkor Roy Tirtho
8a7f5c4008 chore: fix weird hovered mode on track tile options 2025-03-28 22:32:05 +06:00
Kingkor Roy Tirtho
9d2ad1c626 chore: upgrade shadcn_flutter version 2025-03-28 22:24:23 +06:00
Kingkor Roy Tirtho
b74c2eab8f fix: calling /track/:streamId endpoint causes active sourced track to be anything 2025-03-28 20:57:46 +06:00
Seungmin Kim
2c4cc94985
feat: add ISRC track search for YouTube (#2594)
* Add ISRC track search for YouTube

* Do not probe Song.Link when ISRC results are valid, fix rate limit
2025-03-28 19:10:54 +06:00
Kingkor Roy Tirtho
ba27dc70e4
Merge pull request #2550 from KRTirtho/dev
Release 4.0.2
2025-03-16 23:57:54 +06:00
Kingkor Roy Tirtho
0ec9f3535b chore: bump to 4.0.2 and generate changelog 2025-03-16 23:52:08 +06:00
Kingkor Roy Tirtho
df72ba6960 chore: convert all spotify calls to invoke signature to capture invalid access token exception 2025-03-16 21:22:29 +06:00
Kingkor Roy Tirtho
d9057dae57 fix: invalid access token exception #2525 2025-03-16 10:32:41 +06:00
Kingkor Roy Tirtho
e61b79585e chore: remove print statement 2025-03-15 21:09:51 +06:00
Kingkor Roy Tirtho
a9e5636e96 chore: add a fallback init token retrieval method 2025-03-15 21:07:59 +06:00
Kingkor Roy Tirtho
723b6b1f38
Merge pull request #2524 from KRTirtho/dev
Release 4.0.1
2025-03-15 17:21:27 +06:00
Kingkor Roy Tirtho
764950b286 Revert "chore: spotify home feed recommendations now showing up"
This reverts commit 290affd435.
2025-03-15 17:15:29 +06:00
Kingkor Roy Tirtho
290affd435 chore: spotify home feed recommendations now showing up 2025-03-15 17:00:57 +06:00
Kingkor Roy Tirtho
c59b5c651e chore: reenable impeller 2025-03-15 16:48:24 +06:00
Kingkor Roy Tirtho
e4ac7cacc9 chore: generate changelogs and migrate to non synthetic l10n 2025-03-15 16:44:57 +06:00
Kingkor Roy Tirtho
26b1c31f8f chore: flutter 3.29.2 and bump of to 4.0.1 2025-03-15 16:31:20 +06:00
VARUN M
4bfe334419
feat(translation): add tamil translation for spotube (#2501)
* feat: add tamil language for spotube

* fix: syntax error lib/l10n/app_ta.arb

---------

Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>
2025-03-15 16:28:27 +06:00
Justin May
48fcfbc928
feat(translation): add tagalog language support
Added Tagalog translation
2025-03-15 16:26:49 +06:00
Kingkor Roy Tirtho
95e09ffc94 chore: remove certificate check for dio 2025-03-15 14:23:38 +06:00
Kingkor Roy Tirtho
968fd09eb3 chore: add random user agent 2025-03-15 10:48:34 +06:00
Kingkor Roy Tirtho
1a32264bc7 fix: spotify authentication 429 errors 2025-03-15 10:37:29 +06:00
Kingkor Roy Tirtho
59f298a935 fix: spotify login broken due to new totp requirement #2494 2025-03-15 01:41:51 +06:00
Kingkor Roy Tirtho
bbe3394e9e fix: lastfm form broken in other locales #2447 2025-03-12 15:05:32 +06:00
Kingkor Roy Tirtho
7cde803bee feat(local_library): add support for x-flac, opus and x-wav 2025-03-12 14:20:19 +06:00
Kingkor Roy Tirtho
cd475e93d0 chore: upgrade action flutter to 3.29.1 2025-03-12 13:48:07 +06:00
Kingkor Roy Tirtho
3d334d96fd fix(desktop): double titlebar in local library folders and massive space in overlay player 2025-03-11 21:28:57 +06:00
Kingkor Roy Tirtho
bd4cd22e4e fix(generate_playlist): create playlist not adding tracks nor navigating to playlist page 2025-03-11 00:16:53 +06:00
Kingkor Roy Tirtho
c709de6bf1 fix: language picker search broken 2025-03-10 20:44:52 +06:00
Kingkor Roy Tirtho
ccbac85171 chore: remove GeistMono 2025-03-10 20:15:28 +06:00
Kingkor Roy Tirtho
50123b235c fix: add to playlist not working in smaller screen devices 2025-03-10 20:07:51 +06:00
Kingkor Roy Tirtho
4072531c62 fix(android): navigation overlaying in app navigation 2025-03-09 10:05:02 +06:00
Kingkor Roy Tirtho
464666c01a
Merge pull request #2410 from KRTirtho/dev
chore: update linux appdata screenshot
2025-03-07 20:22:32 +06:00
Kingkor Roy Tirtho
4db9a95a91 chore: update linux appdata screenshot 2025-03-07 20:20:56 +06:00
Kingkor Roy Tirtho
0e58cd0e99
Merge pull request #2408 from KRTirtho/dev
chore: add new images
2025-03-07 20:18:03 +06:00
Kingkor Roy Tirtho
3cce2868de website: remove playstore button 2025-03-07 20:12:05 +06:00
Kingkor Roy Tirtho
894b0d7e5e Merge branch 'dev' into website 2025-03-07 20:08:09 +06:00
Kingkor Roy Tirtho
7befbca8e5 chore: update images 2025-03-07 20:06:58 +06:00
Kingkor Roy Tirtho
d4f70f56e4
Merge pull request #2405 from KRTirtho/dev
Release 4.0.0
2025-03-07 18:05:55 +06:00
Kingkor Roy Tirtho
180d07a1be chore: bump version to v4.0.0 and generate changelogs, translations and credits 2025-03-07 17:38:25 +06:00
Kingkor Roy Tirtho
91871d0d26 feat: custom piped & invidious instance support 2025-03-07 11:50:39 +06:00
Kingkor Roy Tirtho
c3bbc129ad fix: piped api not working 2025-03-07 10:22:09 +06:00
Kingkor Roy Tirtho
a9586a64f2 chore: enable sliding transition for queue, alternative source and lyrics page for small screen 2025-03-06 23:04:04 +06:00
Kingkor Roy Tirtho
677f95f266 fix: youtube_explode_dart failing for many videos due to youtube ios client visitor data change 2025-03-05 22:13:42 +06:00
Kingkor Roy Tirtho
f4b1e550bf chore: use latest flutter_new_pipe_extractor 2025-03-05 22:02:07 +06:00
Kingkor Roy Tirtho
bb71fc0eea chore: use pages instead of drawer for queue, lyrics, sources in mobile 2025-03-04 18:26:59 +06:00
Kingkor Roy Tirtho
7eb0e69dd7 chore: upgrade to latest working shadcn_flutter 2025-03-03 22:23:29 +06:00
Kingkor Roy Tirtho
30bf0bed62 chore: add back pull down to refresh 2025-03-02 22:04:22 +06:00
Kingkor Roy Tirtho
c82b68a513 fix: follow artist not working #2057 2025-03-02 21:19:28 +06:00
Kingkor Roy Tirtho
edc9636940 chore: fix adaptive select tile scrolling not working 2025-02-23 11:33:44 +06:00
Kingkor Roy Tirtho
47edb8bf96 chore: improve home screen performance 2025-02-23 09:55:46 +06:00
Kingkor Roy Tirtho
e8e2d78529 chore: upgrade to flutter 3.29.0 2025-02-21 20:54:36 +06:00
Kingkor Roy Tirtho
0248dd3c23 chore: show better authentication failure message 2025-02-11 22:35:51 +06:00
Kingkor Roy Tirtho
1e6d709e04
feat: implement yt-dlp for desktop and NewPipeExtractor for Android (#2316)
* feat: add youtube engine abstraction and yt-dlp integration

* chore: add yt-dlp as optional dependency

* feat: implement custom path support for youtube engines

* chore: check for custom path in setting engine select dropdown

* chore: update yt_dlp_dart

* chore: setting video url instead of video id in fetchSiblings

* feat: implement NewPipe engine

* chore: update local path to git url for flutter_new_pipe_extractor package

* chore: fix android build isn't working

* chore: fix routes not working when initially signing in

* refactor: drop fallback support to different sources
2025-02-11 21:36:07 +06:00
Kingkor Roy Tirtho
698fb6ba27 fix: youtube tracks keeps skipping despite being matched correctly 2025-02-05 00:36:23 +06:00
Kingkor Roy Tirtho
043eaba81f fix: youtube source taking too long to buffer 2025-02-03 20:53:48 +06:00
Kingkor Roy Tirtho
b1780e0cf8 fix: duplicates in recent section 2025-02-01 19:14:50 +06:00
Kingkor Roy Tirtho
cd39bbf87c
Merge pull request #2291 from KRTirtho/migrate/auto-routes
refactor: migrate to auto_route from go_router
2025-02-01 17:22:51 +06:00
Kingkor Roy Tirtho
d4504722d8 fix(android): back button and safe area issues 2025-01-31 23:07:37 +06:00
Kingkor Roy Tirtho
6ddf6b9cce fix: remove automaticallyImplyLeading from root tabs 2025-01-31 22:37:10 +06:00
Kingkor Roy Tirtho
4b2d259add chore: use navigateTo instead of pushRoute 2025-01-31 22:10:40 +06:00
Kingkor Roy Tirtho
0037677383 refactor: migrate to auto_route from go_router 2025-01-31 21:07:51 +06:00
Kingkor Roy Tirtho
2b0b5eae1d
Merge pull request #2288 from KRTirtho/new-ui
feat: shadcn_flutter based UI
2025-01-30 21:53:07 +06:00
Kingkor Roy Tirtho
6cf4ca9179 chore: use shadcn in all places that's using material 2025-01-30 21:44:07 +06:00
Malik Miran
2ea8070771
fix(ios): downloads not working due to permission errors (#2180)
* Update AppDelegate.swift

store the Documents directory path which the app can then use for downloads instead of trying to create a Downloads directory

* Update Info.plist

should resolve the permission issues because  using Documents directory instead of trying to create a Downloads directory.

---------

Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>
2025-01-30 20:50:50 +06:00
KRTirtho
e0760e6250 chore: fix linux resizing blocking scrollbar 2025-01-30 20:37:13 +06:00
Kingkor Roy Tirtho
ada0ca1472 chore: remove obsolete appearance customization 2025-01-28 21:42:16 +06:00
Kingkor Roy Tirtho
42158a99ff refactor: use shadcn for mini lyrics window 2025-01-28 21:23:57 +06:00
Kingkor Roy Tirtho
5c6cb770a8 chore: fix where loading images not working 2025-01-28 21:07:02 +06:00
Kingkor Roy Tirtho
4c3718467d chore: local library not working 2025-01-26 22:36:11 +06:00
Kingkor Roy Tirtho
4e8a50ec58 chore: fix logs not showing up and nightly crashing on track change on android 2025-01-26 22:05:24 +06:00
Kingkor Roy Tirtho
75e189344e cd: update workflow and build command for Ubuntu 22.04 compatibility 2025-01-24 14:19:44 +06:00
Kingkor Roy Tirtho
8c0a47374d cd: artifact nested directory glob 2025-01-24 13:55:57 +06:00
Kingkor Roy Tirtho
697ba1ed7b cd: sha and md5 sum error 2025-01-24 13:27:20 +06:00
Kingkor Roy Tirtho
e05645c46e cd: enable caching for Flutter SDK in release workflow 2025-01-24 12:43:44 +06:00
Kingkor Roy Tirtho
ee95b3b26a chore: fix build cli argument access 2025-01-24 12:32:01 +06:00
Kingkor Roy Tirtho
b2b38a9191 cd: use git source for flutter action 2025-01-24 12:18:33 +06:00
Kingkor Roy Tirtho
219ae9dcb3 cd: use git source for flutter action 2025-01-24 12:15:30 +06:00
Kingkor Roy Tirtho
ed1f4ad6f5 cd: use cache less Flutter SDK 2025-01-24 12:08:01 +06:00
Kingkor Roy Tirtho
15773e1ce7 cd: use alternative flutter action setup action 2025-01-24 11:44:22 +06:00
Kingkor Roy Tirtho
b7bb35d299 cd: upgrade flutter action 2025-01-24 11:32:41 +06:00
Kingkor Roy Tirtho
1937b1b840 cd: use default caching key 2025-01-24 11:31:01 +06:00
Kingkor Roy Tirtho
85ebaf69de cd: use new hosted github runners 2025-01-24 11:15:48 +06:00
Kingkor Roy Tirtho
becba8956f cd: artifact name need to be specified 2025-01-24 10:15:24 +06:00
Kingkor Roy Tirtho
343198a7e8 cd: use individual artifacts 2025-01-24 09:55:09 +06:00
Kingkor Roy Tirtho
0aee8b3399 cd: use upload-artifact v4 2025-01-23 21:16:40 +06:00
Kingkor Roy Tirtho
768bab8bbb chore: settings popup menu constraints 2025-01-23 21:11:59 +06:00
Kingkor Roy Tirtho
082f711018 chore: use angle 2025-01-23 20:39:04 +06:00
Kingkor Roy Tirtho
6e357230ac refactor: use expanded sidebar tiles for library 2025-01-23 20:34:04 +06:00
Kingkor Roy Tirtho
2411f46877 fix: youtube video unplayable issue and use more ytClients 2025-01-21 10:15:06 +06:00
Kingkor Roy Tirtho
4fead5f504 feat: pause playback when no internet connection 2025-01-20 22:04:12 +06:00
Kingkor Roy Tirtho
086107b2cd refactor: adaptive list tile to use shadcn 2025-01-20 13:24:24 +06:00
Kingkor Roy Tirtho
74a328e529 refactor: logs page to shadcn 2025-01-19 21:00:49 +06:00
Kingkor Roy Tirtho
e470f50e81 chore: remove xmas background from glance widget 2025-01-19 19:59:42 +06:00
Kingkor Roy Tirtho
6c005592e3 refactor: color scheme support based on shadcn colors 2025-01-16 21:13:42 +06:00
Kingkor Roy Tirtho
696875e4b5 chore: use youtube_explode from github 2025-01-12 23:21:28 +06:00
Kingkor Roy Tirtho
5930c342b5 chore: fix window resizing 2025-01-12 21:32:33 +06:00
Kingkor Roy Tirtho
3649b67869 refactor: use undraw for not_found component 2025-01-12 14:22:54 +06:00
Kingkor Roy Tirtho
b8ffb9b75f feat: show placeholder images where there is no item or on empty page 2025-01-12 14:16:18 +06:00
Kingkor Roy Tirtho
a8694a7a8b refactor: blacklist and about page 2025-01-11 20:08:04 +06:00
Kingkor Roy Tirtho
b25ae332b8 feat: flag to hide spotify generated images with patterns 2025-01-10 23:41:22 +06:00
Kingkor Roy Tirtho
5a14f587a0 chore: titlebar buttons not working 2025-01-10 20:33:59 +06:00
Kingkor Roy Tirtho
2daea2b3ef chore: make genre carousel items better in light mode 2025-01-10 19:51:21 +06:00
Kingkor Roy Tirtho
88906098dd refactor: use shadcn for TrackTile 2025-01-08 22:16:46 +06:00
Kingkor Roy Tirtho
e54a646073 refactor: downloads page to shadcn 2025-01-08 19:11:29 +06:00
Kingkor Roy Tirtho
3ffcb48db9 chore: improve carousel performance 2025-01-06 21:44:06 +06:00
Kingkor Roy Tirtho
46852545a9 refactor: add genre carousel buttons and indicators 2025-01-06 21:33:26 +06:00
Kingkor Roy Tirtho
bf94a490bb refactor: genres section 2025-01-06 20:45:37 +06:00
Kingkor Roy Tirtho
6dd9b753b0 refactor: migrate stats to shadcn 2025-01-06 14:13:53 +06:00
Kingkor Roy Tirtho
e6408ccc0d refactor: genre home section 2025-01-05 17:11:58 +06:00
Kingkor Roy Tirtho
dff8fe2e64 chore: fix alternative source list item theme inconsistency 2025-01-05 16:50:04 +06:00
Kingkor Roy Tirtho
b734985199 refactor: track page 2025-01-05 16:32:14 +06:00
Kingkor Roy Tirtho
dd0bb01af5 refactor: generate playlist to shadcn 2025-01-05 16:16:57 +06:00
Kingkor Roy Tirtho
b8f2495acb refactor: user local library 2025-01-05 11:54:50 +06:00
Kingkor Roy Tirtho
4afe0cca68 refactor: artist page 2025-01-05 09:47:32 +06:00
Kingkor Roy Tirtho
bbad701c07 refactor: dialogs to shadcn dialog 2025-01-05 08:58:57 +06:00
Kingkor Roy Tirtho
af295be8c6 refactor: remote playback page to shadcn 2025-01-04 23:31:09 +06:00
Kingkor Roy Tirtho
780f5dee2e cd: upgrade flutter version to 3.28.0-0.1.pre 2025-01-04 20:34:42 +06:00
Kingkor Roy Tirtho
30e03786bf refactor: alternative track sheet to use shadcn 2025-01-03 23:10:26 +06:00
Kingkor Roy Tirtho
f96b5eae97 refactor: floating player to use shadcn 2025-01-03 21:11:36 +06:00
Kingkor Roy Tirtho
684e595d16 refactor: use shadcn widgets for create playlist and add tracks to playlist dialog 2024-12-29 15:07:48 +06:00
Kingkor Roy Tirtho
047eccfa82 fix: SafeArea not working for bottom floating widgets 2024-12-29 13:36:44 +06:00
Kingkor Roy Tirtho
b558cc17f1 fix: SafeArea for global bottom items not working 2024-12-28 21:55:36 +06:00
Kingkor Roy Tirtho
d845180e60 fix: mobile keyboard overflow 2024-12-28 21:18:35 +06:00
Kingkor Roy Tirtho
2ee0ca44c7 refactor: profile page to use shadcn design 2024-12-28 19:51:04 +06:00
Kingkor Roy Tirtho
d53782da23 refactor: playlist and album pages 2024-12-28 14:30:25 +06:00
Kingkor Roy Tirtho
ced85d3f0c chore: fix scaling issue in android and status bar being black 2024-12-24 21:33:24 +06:00
Kingkor Roy Tirtho
e2143a0625 chore: fix android build and player controls slider layout builder exception 2024-12-24 20:19:10 +06:00
Kingkor Roy Tirtho
db3aaa4b83 chore: upgrade to flutter 3.27.1 2024-12-23 19:23:10 +06:00
Kingkor Roy Tirtho
ccf84c568e website: show overlay ads at bottom not blocking the view 2024-12-23 09:02:49 +06:00
Kingkor Roy Tirtho
fdb5ed8f56 website: publish from idea to impact 2024-12-22 23:12:12 +06:00
Kingkor Roy Tirtho
b40c0b7772 chore: use latest shadcn 2024-12-22 22:55:40 +06:00
Kingkor Roy Tirtho
b09263d128 chore: fix queue close causing exceptions 2024-12-22 15:03:49 +06:00
Kingkor Roy Tirtho
a6720d5392 feat: grid/list customizable playbutton view 2024-12-22 14:48:48 +06:00
Kingkor Roy Tirtho
05d544fe5a refactor: update FriendItem and HorizontalPlaybuttonCardView styles, remove unused imports, and clean up dependencies 2024-12-22 11:58:06 +06:00
Kingkor Roy Tirtho
2fefd65f51 refactor: settings using shadcn components 2024-12-22 11:25:01 +06:00
Kingkor Roy Tirtho
7ee071f2e3 refactor: connected device button 2024-12-21 21:40:34 +06:00
Kingkor Roy Tirtho
418a0d29bd refactor: artist card to use shadcn card 2024-12-21 21:12:49 +06:00
Kingkor Roy Tirtho
2925dd6748 refactor: library page filter fields and update home sections 2024-12-21 18:23:45 +06:00
Kingkor Roy Tirtho
f80ea32de4 refactor: use Appbar titlebar throughout the app 2024-12-21 17:02:13 +06:00
Kingkor Roy Tirtho
fcefce4b1b refactor: titlebar to use shadcn appbar and library tabs to use shadcn TabList 2024-12-21 16:05:35 +06:00
Kingkor Roy Tirtho
1089e90511 refactor: use shadcn CardImage for playbutton card 2024-12-21 15:21:13 +06:00
Kingkor Roy Tirtho
2488da2279 refactor: bottom player border, player queue using shadcn drawer 2024-12-21 14:38:54 +06:00
Kingkor Roy Tirtho
04190f2dda refactor: use DropdownMenu for adaptive pop sheet list, shadcn widgets for bottom player and player controls and actions 2024-12-21 12:42:51 +06:00
Kingkor Roy Tirtho
fe2f0a373f refactor: use NavigationSidebar and NavigationRail for desktop sidebar 2024-12-21 09:34:56 +06:00
Kingkor Roy Tirtho
e73d2d06d8 refactor: use shadcn NavigationBar for mobile navigation bar 2024-12-21 09:28:55 +06:00
Kingkor Roy Tirtho
5ad151932a feat: initial integration of shadcn-ui 2024-12-21 09:22:30 +06:00
Kingkor Roy Tirtho
b52bf0f448
feat(android): home widget support (#2148)
* feat: add android home widget support

* feat: style widget player and add intent and callbacks on action

* feat: responsive and working android home widget

* fix(android): models stripping causing it to not work for release apks

* chore: ios lockfile update

* feat: config for iOS widget

* cd: upgrade xcode

* cd: reduce xcode version

* feat: add a christmas background
2024-12-16 22:47:44 +06:00
Kingkor Roy Tirtho
55871e3cdd website: change download page ad 2024-12-16 11:50:12 +06:00
Kingkor Roy Tirtho
0aa44520ac website: redirect from /other-downloads/stable-downloads/ to /downloads 2024-12-16 11:43:41 +06:00
Kingkor Roy Tirtho
4595eb169f fix: finally fix gradle build 2024-12-14 12:05:25 +06:00
Kingkor Roy Tirtho
08f624ece1 chore: upgrade to flutter 3.27.0 and fix gradle errors 2024-12-14 09:52:53 +06:00
Kingkor Roy Tirtho
f524a40062 chore: flex view 2024-12-13 00:43:17 +06:00
Kingkor Roy Tirtho
f28fe5a682 fix: no spacing from the ads 2024-12-13 00:39:23 +06:00
Kingkor Roy Tirtho
efa2b77ac3 Merge branch 'website-ads-integration' into website 2024-12-13 00:17:38 +06:00
Kingkor Roy Tirtho
12f3ec1776 downgrade: chose the path of ads 2024-12-13 00:17:19 +06:00
Kingkor Roy Tirtho
8c1337d1fc
Merge pull request #2118 from KRTirtho/dev
chore: release 3.9.0
2024-12-09 00:04:29 +06:00
Kingkor Roy Tirtho
b32ec667a9 chore: add iOS IPA download section 2024-12-08 23:56:58 +06:00
Kingkor Roy Tirtho
18a68d85a5 chore: bump version and generate changelogs 2024-12-08 23:36:55 +06:00
Kingkor Roy Tirtho
2d972c8f57 chore: update macos logo 2024-12-08 22:47:13 +06:00
Kingkor Roy Tirtho
083b366308 chore: upgrade to fluter 3.24.5 2024-12-08 20:13:36 +06:00
Kingkor Roy Tirtho
8ca2115ef0
feat: track caching and cached track export support (#2117)
* feat: add caching support with track metadata

* feat(settings): add cache music toggle

* fix(mobile): cache dir not open-able

* feat(local folder): add cache export/clear actions and size of the folder

* chore: ios deps upgrades

* chore: upgrade lint flutter version

* chore: lint secrets causing error

* cd: invalid value for env var
2024-12-08 20:03:01 +06:00
Kingkor Roy Tirtho
499ecfba26 fix(mobile): ensure audio session is activated when playback is resumed after interruption #2092 2024-12-01 19:01:24 +06:00
Kingkor Roy Tirtho
3fd7a18159 chore: upgrade dependency version 2024-12-01 17:49:35 +06:00
Kingkor Roy Tirtho
e3285bd4da fix: selecting an Alternative Track Source removes the current song from the queue #2039 2024-11-10 11:27:56 +06:00
Kingkor Roy Tirtho
9f2d423cfe
feat: add invidious audio source and fix auto skipping tracks (#2005)
* feat: add invidious audio source with automatic track switch even on server playback endpoint

* fix: switching to different source on playback endpoint error not working

* chore: update invidious version

* feat: invidious instances customizability
2024-10-17 22:33:03 +06:00
Kingkor Roy Tirtho
3c45732b0a fix: UI glitch when loading more user artists and albums 2024-10-17 22:20:26 +06:00
Kingkor Roy Tirtho
cab61631ef Merge branch 'dev' into website 2024-10-13 11:07:19 +06:00
Kingkor Roy Tirtho
6e1cd96903 website: fix older version download not working #1985 2024-10-13 10:44:05 +06:00
Kingkor Roy Tirtho
9cd839cfd9 cd: fix env not getting updated 2024-10-09 22:08:02 +06:00
Kingkor Roy Tirtho
94e704087f Merge branch 'dev' 2024-10-09 16:38:23 +06:00
Kingkor Roy Tirtho
f553e43b17 chore: hide donations link for playstore version to adhere with Google Play's iae policy
This commit keeps food on one google PM's table by not stealing their 30% pay cut
2024-10-09 16:37:41 +06:00
Kingkor Roy Tirtho
8e287ab1e5
Merge pull request #1981 from KRTirtho/dev
Release 3.8.3
2024-10-09 15:39:31 +06:00
Kingkor Roy Tirtho
fdde972a77 chore: bump version to 3.8.3 and generate changelogs 2024-10-09 14:51:24 +06:00
Kingkor Roy Tirtho
8c5ece5335 Merge branch 'master' into dev 2024-10-09 14:48:21 +06:00
Xavi Fortes
a76b5c4c7f
fix: update youtube_explode_dart to 2.2.3 to fix no playback (#1980)
* chore: update bug reports template

* chore: update bug reports template

* Update youtube_explode_dart to 2.2.3 fixes 403

---------

Co-authored-by: Kingkor Roy Tirtho <krtirtho@gmail.com>
2024-10-09 14:47:11 +06:00
Kingkor Roy Tirtho
70bbb4af5a feat(macos): enable same window webview support 2024-10-09 14:45:16 +06:00
Kingkor Roy Tirtho
2a317397ee Merge branch 'chore/upgrade-deps' into dev 2024-10-09 14:44:15 +06:00
Kingkor Roy Tirtho
4e0de13075 cd: upgrade flutter version 2024-10-09 11:55:32 +06:00
Kingkor Roy Tirtho
58f6142d2f chore: add fvm local flutter symlink in vscode settings 2024-10-09 11:38:48 +06:00
Kingkor Roy Tirtho
34d8bc26fe chore: upgrade to Flutter 3.24.3 2024-09-30 21:53:12 +06:00
Kingkor Roy Tirtho
57ac3177c0 Merge branch 'dev' into website 2024-03-05 22:56:42 +06:00
Kingkor Roy Tirtho
26db4f3350 Merge branch 'dev' into website 2024-02-17 13:51:19 +06:00
Kingkor Roy Tirtho
79a371f9b1 docs: update the getting-started guide 2023-09-14 22:30:59 +06:00
Kingkor Roy Tirtho
806b22ec85 website: upgrade to next 13 2023-08-23 11:13:46 +06:00
992 changed files with 130680 additions and 37739 deletions

View File

@ -1,14 +1,12 @@
# The format:
# SPOTIFY_SECRETS=clintId1:clientSecret1,clientId2:clientSecret2
SPOTIFY_SECRETS=
# 0 or 1 # 0 or 1
# 0 = disable # 0 = disable
# 1 = enable # 1 = enable
ENABLE_UPDATE_CHECK= ENABLE_UPDATE_CHECK=$ENABLE_UPDATE_CHECK
LASTFM_API_KEY= LASTFM_API_KEY=$LASTFM_API_KEY
LASTFM_API_SECRET= LASTFM_API_SECRET=$LASTFM_API_SECRET
# Release channel. Can be: nightly, stable # Release channel. Can be: nightly, stable
RELEASE_CHANNEL= RELEASE_CHANNEL=$RELEASE_CHANNEL
HIDE_DONATIONS=$HIDE_DONATIONS

View File

@ -1,4 +1,3 @@
{ {
"flutterSdkVersion": "3.22.3", "flutterSdkVersion": "3.35.2"
"flavors": {}
} }

4
.fvmrc Normal file
View File

@ -0,0 +1,4 @@
{
"flutter": "3.35.2",
"flavors": {}
}

View File

@ -9,7 +9,8 @@ body:
attributes: attributes:
label: Is there an existing issue for this? (Please read the description) label: Is there an existing issue for this? (Please read the description)
description: | description: |
PLEASE! Make sure to check if this issue is a duplicate. 🚨 PLEASE! Make sure to check if this issue is a duplicate. 🚨
Don't waste our time, we are working hard to make Spotube better for you. Don't waste our time, we are working hard to make Spotube better for you.
Try with multiple similar keywords, and check the closed issues too. Try with multiple similar keywords, and check the closed issues too.
@ -50,7 +51,7 @@ body:
value: | value: |
<details> <details>
<summary>Logs</summary> <summary>Logs</summary>
``` ```
<Replace this line by pasting your logs here> <Replace this line by pasting your logs here>
``` ```
@ -60,7 +61,7 @@ body:
- type: input - type: input
attributes: attributes:
label: Operating System label: Operating System
description: The OS in which you used Spotube to face the issue. description: The OS in which you used Spotube to face the issue. Use comma to separate multiple OS.
placeholder: Android, Linux, macOS or Windows? Make sure to include the version too. placeholder: Android, Linux, macOS or Windows? Make sure to include the version too.
validations: validations:
required: true required: true
@ -96,7 +97,10 @@ body:
- type: checkboxes - type: checkboxes
attributes: attributes:
label: Self grab label: Self grab
description: If you are a developer and want to work on this issue yourself, you can check this box and wait for maintainer response. Any contributions are welcome! description: |
If you are a developer and want to work on this issue yourself, you can check this box and wait for maintainer response. Any contributions are welcome!
This project is maintained by one person. So PRs are always welcome. This is the best way to get your issue fixed faster.
options: options:
- label: I'm ready to work on this issue! - label: I'm ready to work on this issue!
required: false required: false

View File

@ -4,7 +4,7 @@ on:
pull_request: pull_request:
env: env:
FLUTTER_VERSION: 3.22.2 FLUTTER_VERSION: 3.35.2
jobs: jobs:
lint: lint:
@ -17,18 +17,21 @@ jobs:
with: with:
flutter-version: ${{ env.FLUTTER_VERSION }} flutter-version: ${{ env.FLUTTER_VERSION }}
- name: Dummy Envs
run: |
envsubst < .env.example > .env
env:
ENABLE_UPDATE_CHECK: true
LASTFM_API_KEY: xxx
LASTFM_API_SECRET: xxx
RELEASE_CHANNEL: nightly
HIDE_DONATIONS: 0
- name: Configure repo - name: Configure repo
run: | run: |
flutter pub get flutter pub get
echo '${{ secrets.DOTENV_NIGHTLY }}' > .env
dart run build_runner build --delete-conflicting-outputs dart run build_runner build --delete-conflicting-outputs
- name: Lint Dart files - name: Lint Dart files
run: | run: |
dart analyze --no-fatal-warnings dart analyze --no-fatal-warnings
- name: Lint translations & config files
run: |
npm install -g @prantlf/jsonlint
jsonlint -q -D --enforce-double-quotes ./lib/l10n/*.arb
jsonlint -q -D --enforce-double-quotes -T .vscode/*.json

View File

@ -4,7 +4,7 @@ on:
inputs: inputs:
version: version:
description: Version to publish (x.x.x) description: Version to publish (x.x.x)
default: 3.8.2 default: 4.0.0
required: true required: true
dry_run: dry_run:
description: Dry run description: Dry run
@ -55,7 +55,7 @@ jobs:
- uses: dsaltares/fetch-gh-release-asset@master - uses: dsaltares/fetch-gh-release-asset@master
with: with:
version: tags/v${{ inputs.version }} # mind the "v" prefix version: tags/v${{ inputs.version }} # mind the "v" prefix
file: spotube-linux-${{inputs.version}}-x86_64.tar.xz file: spotube-linux-${{inputs.version}}-x86_64.tar.xz
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
- name: Update PKGBUILD versions - name: Update PKGBUILD versions
@ -111,7 +111,7 @@ jobs:
steps: steps:
- name: Tagname (workflow dispatch) - name: Tagname (workflow dispatch)
run: echo 'TAG_NAME=${{inputs.version}}' >> $GITHUB_ENV run: echo 'TAG_NAME=${{inputs.version}}' >> $GITHUB_ENV
- uses: robinraju/release-downloader@main - uses: robinraju/release-downloader@main
with: with:
repository: KRTirtho/spotube repository: KRTirtho/spotube
@ -120,11 +120,11 @@ jobs:
zipBall: false zipBall: false
out-file-path: dist out-file-path: dist
fileName: "Spotube-playstore-all-arch.aab" fileName: "Spotube-playstore-all-arch.aab"
- name: Create service-account.json - name: Create service-account.json
run: | run: |
echo "${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_BASE64 }}" | base64 -d > service-account.json echo "${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_BASE64 }}" | base64 -d > service-account.json
- name: Upload Android Release to Play Store - name: Upload Android Release to Play Store
if: ${{!inputs.dry_run}} if: ${{!inputs.dry_run}}
uses: r0adkll/upload-google-play@v1 uses: r0adkll/upload-google-play@v1

View File

@ -20,7 +20,8 @@ on:
description: Dry run without uploading to release description: Dry run without uploading to release
env: env:
FLUTTER_VERSION: 3.22.3 FLUTTER_VERSION: 3.35.2
FLUTTER_CHANNEL: master
permissions: permissions:
contents: write contents: write
@ -30,64 +31,72 @@ jobs:
strategy: strategy:
matrix: matrix:
include: include:
- os: ubuntu-latest - os: ubuntu-22.04
platform: linux platform: linux
arch: x86
files: | files: |
dist/Spotube-linux-x86_64.deb dist/Spotube-linux-x86_64.deb
dist/Spotube-linux-x86_64.rpm dist/Spotube-linux-x86_64.rpm
dist/spotube-linux-*-x86_64.tar.xz dist/spotube-linux-*-x86_64.tar.xz
- os: ubuntu-latest - os: ubuntu-22.04-arm
platform: linux_arm platform: linux
arch: arm64
files: | files: |
dist/Spotube-linux-aarch64.deb dist/Spotube-linux-aarch64.deb
dist/spotube-linux-*-aarch64.tar.xz dist/spotube-linux-*-aarch64.tar.xz
- os: ubuntu-latest - os: ubuntu-22.04
platform: android platform: android
arch: all
files: | files: |
build/Spotube-android-all-arch.apk build/Spotube-android-all-arch.apk
build/Spotube-playstore-all-arch.aab build/Spotube-playstore-all-arch.aab
- os: windows-latest - os: windows-latest
platform: windows platform: windows
arch: x86
files: | files: |
dist/Spotube-windows-x86_64.nupkg dist/Spotube-windows-x86_64.nupkg
dist/Spotube-windows-x86_64-setup.exe dist/Spotube-windows-x86_64-setup.exe
- os: macos-latest - os: macos-14
platform: ios platform: ios
arch: all
files: | files: |
Spotube-iOS.ipa Spotube-iOS.ipa
- os: macos-14 - os: macos-14
platform: macos platform: macos
arch: all
files: | files: |
build/Spotube-macos-universal.dmg build/Spotube-macos-universal.dmg
build/Spotube-macos-universal.pkg build/Spotube-macos-universal.pkg
runs-on: ${{matrix.os}} runs-on: ${{matrix.os}}
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: subosito/flutter-action@v2.12.0 - uses: subosito/flutter-action@v2.18.0
with: with:
cache: true
cache-key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.yaml') }}
flutter-version: ${{ env.FLUTTER_VERSION }} flutter-version: ${{ env.FLUTTER_VERSION }}
channel: ${{ env.FLUTTER_CHANNEL }}
cache: true
git-source: https://github.com/flutter/flutter.git
- name: Setup Java - name: Setup Java
if: ${{matrix.platform == 'android'}} if: ${{matrix.platform == 'android'}}
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
distribution: 'zulu' distribution: "zulu"
java-version: '17' java-version: "17"
cache: 'gradle' cache: "gradle"
check-latest: true check-latest: true
- name: Set up QEMU
if: ${{matrix.platform == 'linux_arm'}}
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
if: ${{matrix.platform == 'linux_arm'}}
uses: docker/setup-buildx-action@v3
- name: Setup Rust toolchain - name: Setup Rust toolchain
if: ${{matrix.platform != 'linux_arm'}}
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
with: with:
toolchain: stable toolchain: stable
- name: Install Xcode
if: ${{matrix.platform == 'ios'}}
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: "16.2"
- name: Install ${{matrix.platform}} dependencies - name: Install ${{matrix.platform}} dependencies
run: | run: |
flutter pub get flutter pub get
@ -98,29 +107,17 @@ jobs:
run: | run: |
echo '${{ secrets.KEYSTORE }}' | base64 --decode > android/app/upload-keystore.jks echo '${{ secrets.KEYSTORE }}' | base64 --decode > android/app/upload-keystore.jks
echo '${{ secrets.KEY_PROPERTIES }}' > android/key.properties echo '${{ secrets.KEY_PROPERTIES }}' > android/key.properties
- name: Unessary hosted tools
if: ${{matrix.platform == 'linux_arm'}}
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
swap-storage: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
- name: Build ${{matrix.platform}} binaries - name: Build ${{matrix.platform}} binaries
run: dart cli/cli.dart build ${{matrix.platform}} run: dart cli/cli.dart build --arch=${{matrix.arch}} ${{matrix.platform}}
env: env:
CHANNEL: ${{inputs.channel}} CHANNEL: ${{inputs.channel}}
DOTENV: ${{secrets.DOTENV_RELEASE}} DOTENV: ${{secrets.DOTENV_RELEASE}}
- uses: actions/upload-artifact@v3 - uses: actions/upload-artifact@v4
with: with:
if-no-files-found: error if-no-files-found: error
name: Spotube-Release-Binaries name: ${{matrix.platform}}-${{matrix.arch}}
path: ${{matrix.files}} path: ${{matrix.files}}
- name: Debug With SSH When fails - name: Debug With SSH When fails
@ -130,14 +127,13 @@ jobs:
limit-access-to-actor: true limit-access-to-actor: true
upload: upload:
runs-on: ubuntu-latest runs-on: ubuntu-22.04
needs: needs:
- build_platform - build_platform
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/download-artifact@v3 - uses: actions/download-artifact@v4
with: with:
name: Spotube-Release-Binaries
path: ./Spotube-Release-Binaries path: ./Spotube-Release-Binaries
- name: Install dependencies - name: Install dependencies
@ -146,18 +142,19 @@ jobs:
- name: Generate Checksums - name: Generate Checksums
run: | run: |
tree . tree .
md5sum Spotube-Release-Binaries/* >> RELEASE.md5sum find Spotube-Release-Binaries -type f -exec md5sum {} \; >> RELEASE.md5sum
sha256sum Spotube-Release-Binaries/* >> RELEASE.sha256sum find Spotube-Release-Binaries -type f -exec sha256sum {} \; >> RELEASE.sha256sum
sed -i 's|Spotube-Release-Binaries/.*/\([^/]*\)$|\1|' RELEASE.sha256sum RELEASE.md5sum
sed -i 's|Spotube-Release-Binaries/||' RELEASE.sha256sum RELEASE.md5sum sed -i 's|Spotube-Release-Binaries/||' RELEASE.sha256sum RELEASE.md5sum
- name: Extract pubspec version - name: Extract pubspec version
run: | run: |
echo "PUBSPEC_VERSION=$(grep -oP 'version:\s*\K[^+]+(?=\+)' pubspec.yaml)" >> $GITHUB_ENV echo "PUBSPEC_VERSION=$(grep -oP 'version:\s*\K[^+]+(?=\+)' pubspec.yaml)" >> $GITHUB_ENV
- uses: actions/upload-artifact@v3 - uses: actions/upload-artifact@v4
with: with:
if-no-files-found: error if-no-files-found: error
name: Spotube-Release-Binaries name: sums
path: | path: |
RELEASE.md5sum RELEASE.md5sum
RELEASE.sha256sum RELEASE.sha256sum
@ -172,7 +169,7 @@ jobs:
omitNameDuringUpdate: true omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true omitPrereleaseDuringUpdate: true
allowUpdates: true allowUpdates: true
artifacts: Spotube-Release-Binaries/*,RELEASE.sha256sum,RELEASE.md5sum artifacts: Spotube-Release-Binaries/**/*,RELEASE.sha256sum,RELEASE.md5sum
- name: Upload Release Binaries (nightly) - name: Upload Release Binaries (nightly)
if: ${{ !inputs.dry_run && inputs.channel == 'nightly' }} if: ${{ !inputs.dry_run && inputs.channel == 'nightly' }}
@ -184,9 +181,15 @@ jobs:
omitNameDuringUpdate: true omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true omitPrereleaseDuringUpdate: true
allowUpdates: true allowUpdates: true
artifacts: Spotube-Release-Binaries/*,RELEASE.sha256sum,RELEASE.md5sum artifacts: Spotube-Release-Binaries/**/*,RELEASE.sha256sum,RELEASE.md5sum
body: | body: |
Build Number: ${{github.run_number}} Build Number: ${{github.run_number}}
Nightly release includes newest features but may contain bugs Nightly release includes newest features but may contain bugs
It is preferred to use the stable version unless you know what you're doing It is preferred to use the stable version unless you know what you're doing
- name: Debug With SSH When fails
if: ${{ failure() && inputs.debug && inputs.channel == 'nightly' }}
uses: mxschmitt/action-tmate@v3
with:
limit-access-to-actor: true

7
.gitignore vendored
View File

@ -73,8 +73,13 @@ dist
appimage-build appimage-build
android/key.properties android/key.properties
.fvm/flutter_sdk
**/pb_data **/pb_data
tm.json tm.json
# FVM Version Cache
.fvm/
android/build
android/app/.cxx

View File

@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited. # This file should be version controlled and should not be manually edited.
version: version:
revision: "300451adae589accbece3490f4396f10bdf15e6e" revision: "d7b523b356d15fb81e7d340bbe52b47f93937323"
channel: "stable" channel: "stable"
project_type: app project_type: app
@ -13,11 +13,11 @@ project_type: app
migration: migration:
platforms: platforms:
- platform: root - platform: root
create_revision: 300451adae589accbece3490f4396f10bdf15e6e create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
base_revision: 300451adae589accbece3490f4396f10bdf15e6e base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
- platform: windows - platform: windows
create_revision: 300451adae589accbece3490f4396f10bdf15e6e create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
base_revision: 300451adae589accbece3490f4396f10bdf15e6e base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
# User provided section # User provided section

22
.vscode/launch.json vendored
View File

@ -17,6 +17,17 @@
"dev" "dev"
] ]
}, },
{
"name": "spotube (mobile-skia)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": [
"--flavor",
"dev",
"--no-enable-impeller"
]
},
{ {
"name": "spotube (profile)", "name": "spotube (profile)",
"type": "dart", "type": "dart",
@ -30,6 +41,17 @@
"request": "launch", "request": "launch",
"program": "lib/main.dart", "program": "lib/main.dart",
"flutterMode": "release" "flutterMode": "release"
},
{
"name": "spotube (mobile) (release)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"flutterMode": "release",
"args": [
"--flavor",
"dev"
]
} }
], ],
"compounds": [] "compounds": []

View File

@ -5,14 +5,17 @@
"ambiguate", "ambiguate",
"Amoled", "Amoled",
"Buildless", "Buildless",
"configurators",
"danceability", "danceability",
"fuzzywuzzy", "fuzzywuzzy",
"gapless", "gapless",
"instrumentalness", "instrumentalness",
"isrc",
"Mpris", "Mpris",
"RGBO", "RGBO",
"riverpod", "riverpod",
"Scrobblenaut", "Scrobblenaut",
"shadcn",
"skeletonizer", "skeletonizer",
"songlink", "songlink",
"speechiness", "speechiness",
@ -25,6 +28,7 @@
"explorer.fileNesting.patterns": { "explorer.fileNesting.patterns": {
"pubspec.yaml": "pubspec.lock,analysis_options.yaml,.packages,.flutter-plugins,.flutter-plugins-dependencies,flutter_launcher_icons*.yaml,flutter_native_splash*.yaml", "pubspec.yaml": "pubspec.lock,analysis_options.yaml,.packages,.flutter-plugins,.flutter-plugins-dependencies,flutter_launcher_icons*.yaml,flutter_native_splash*.yaml",
"README.md": "LICENSE,CODE_OF_CONDUCT.md,CONTRIBUTING.md,SECURITY.md,CONTRIBUTION.md,CHANGELOG.md,PRIVACY_POLICY.md", "README.md": "LICENSE,CODE_OF_CONDUCT.md,CONTRIBUTING.md,SECURITY.md,CONTRIBUTION.md,CHANGELOG.md,PRIVACY_POLICY.md",
"*.dart": "${capture}.g.dart,${capture}.freezed.dart", "*.dart": "${capture}.g.dart,${capture}.freezed.dart"
} },
"dart.flutterSdkPath": ".fvm/versions/3.35.2"
} }

File diff suppressed because it is too large Load Diff

View File

@ -119,7 +119,7 @@ Enhancement suggestions are tracked as [GitHub issues](https://github.com/KRTirt
Do the following: Do the following:
- Download the latest Flutter SDK (>=3.16.0) & enable desktop support - Install [Dart](https://dart.dev/get-dart) and [fvm](https://fvm.app/documentation/getting-started/installation)
- Install Development dependencies in linux - Install Development dependencies in linux
- Debian (>=12/Bookworm)/Ubuntu - Debian (>=12/Bookworm)/Ubuntu
```bash ```bash
@ -138,11 +138,11 @@ Do the following:
- Create a `.env` in root of the project following the `.env.example` template - Create a `.env` in root of the project following the `.env.example` template
- Now run the following to bootstrap the project - Now run the following to bootstrap the project
```bash ```bash
flutter pub get && dart run build_runner build --delete-conflicting-outputs --enable-experiment=records,patterns fvm flutter pub get && fvm dart run build_runner build --delete-conflicting-outputs
``` ```
- 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 ```bash
flutter run -d <window|macos|linux|(<android-device-id>)> fvm flutter run -d <window|macos|linux|(<android-device-id>)>
``` ```
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 development branch (dev) & we'll review your code

View File

@ -1,12 +1,12 @@
BSD-4-Clause License BSD-4-Clause License
Copyright (c) 2023 Kingkor Roy Tirtho. All rights reserved. Copyright (c) 2025 Kingkor Roy Tirtho. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. All advertising materials mentioning features or use of this software must display the following acknowledgement: 3. All advertising materials mentioning features or use of this software must display the following acknowledgement:
This product includes software developed by Kingkor Roy Tirtho. This product includes software developed by Kingkor Roy Tirtho.
4. Neither the name of the Software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 4. Neither the name of the Software nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY KINGKOR ROY TIRTHO AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KINGKOR ROY TIRTHO AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS SOFTWARE IS PROVIDED BY KINGKOR ROY TIRTHO AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KINGKOR ROY TIRTHO AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -8,7 +8,7 @@ tar:
mkdir -p $(TEMP_DIR)\ mkdir -p $(TEMP_DIR)\
&& cp -r $(BUNDLE_DIR)/* $(TEMP_DIR)\ && cp -r $(BUNDLE_DIR)/* $(TEMP_DIR)\
&& cp linux/spotube.desktop $(TEMP_DIR)\ && cp linux/spotube.desktop $(TEMP_DIR)\
&& cp assets/spotube-logo.png $(TEMP_DIR)\ && cp assets/branding/spotube-logo.png $(TEMP_DIR)\
&& cp linux/com.github.KRTirtho.Spotube.appdata.xml $(TEMP_DIR)\ && cp linux/com.github.KRTirtho.Spotube.appdata.xml $(TEMP_DIR)\
&& tar -cJf build/spotube-linux-${VERSION}-${PKG_ARCH}.tar.xz -C $(TEMP_DIR) .\ && tar -cJf build/spotube-linux-${VERSION}-${PKG_ARCH}.tar.xz -C $(TEMP_DIR) .\
&& rm -rf $(TEMP_DIR) && rm -rf $(TEMP_DIR)
@ -42,4 +42,17 @@ apk:
mv build/app/outputs/apk/release/app-release.apk build/Spotube-android-all-arch.apk mv build/app/outputs/apk/release/app-release.apk build/Spotube-android-all-arch.apk
gensums: gensums:
sh -c scripts/gensums.sh sh -c scripts/gensums.sh
migrate:
dart run drift_dev make-migrations
dmg:
flutter build macos &&\
if [ -f dist/Spotube-macos-universal.dmg ];\
then rm dist/Spotube-macos-universal.dmg;\
fi &&\
appdmg appdmg.json dist/Spotube-macos-universal.dmg
changelog:
git-cliff --unreleased

178
README.md
View File

@ -1,9 +1,8 @@
<div align="center"> <div align="center">
<img width="600" src="assets/spotube_banner.png" alt="Spotube Logo"> <img width="600" src="assets/branding/spotube_banner.png" alt="Spotube Logo">
An open source, cross-platform Spotify client compatible across multiple platforms<br /> A cross-platform extensible open-source music streaming platform.<br>
utilizing Spotify's data API and YouTube, Piped.video or JioSaavn as an audio source,<br /> Bring your own music metadata/playlist with plugins created by community or by yourself. A small step towards the decentralized music streaming era!
eliminating the need for Spotify Premium
Btw it's not just another Electron app 😉 Btw it's not just another Electron app 😉
@ -19,31 +18,24 @@ Btw it's not just another Electron app 😉
--- ---
![Spotube Desktop](assets/spotube-screenshot.png) ![Spotube Desktop](assets/branding/spotube-screenshot.png)
![Spotube Mobile](assets/mobile-screenshots/combined.png) ![Spotube Mobile](assets/branding/mobile-screenshots/combined.jpg)
</div> </div>
## 🌃 Features ## 🌃 Features
- 🚫 No ads, thanks to the use of public & free Spotify and YT Music APIs¹ - 🧩 Plugin powered, supports any platform or custom music service through plugins.
- ⬇️ Freely downloadable tracks - 🗺️ Community driven plugins for popular platforms or create your own.
- 🖥️ 📱 Cross-platform support - ⬇️ Freely downloadable tracks with tagged metadata.
- 🪶 Small size & less data usage - 🖥️ 📱 Cross-platform support.
- 🕵️ Anonymous/guest login - 🪶 Small size & less data usage.
- 🕒 Time synced lyrics - 🕒 Time synced lyrics regardless of the plugin support.
- ✋ No telemetry, diagnostics or user data collection - ✋ No telemetry, diagnostics or user data collection.
- 🚀 Native performance - 🚀 Native performance.
- 📖 Open source/libre software - 📖 Open source/libre software.
- 🔉 Playback control is done locally, not on the server - 🔉 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).
### ❌ Unsupported features
- 🗣️ **Spotify Shows & Podcasts:** Shows and Podcasts will <ins>**never be supported**</ins> because the audio tracks are <ins>_only_</ins> 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
@ -66,17 +58,13 @@ This handy table lists all the methods you can use to install Spotube:
<td>MacOS</td> <td>MacOS</td>
<td> <td>
<a href="https://github.com/KRTirtho/spotube/releases/latest/download/Spotube-macos-universal.dmg"> <a href="https://github.com/KRTirtho/spotube/releases/latest/download/Spotube-macos-universal.dmg">
<img width="220" alt="MacOS Download" src="https://reachify.io/wp-content/uploads/2018/09/mac-download-button-1.png"> <img width="220" alt="MacOS Download" src="https://memory-map.com/wp-content/uploads/download-mac-OS-01.svg">
</a> </a>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Android</td> <td>Android</td>
<td> <td>
<a href="https://play.google.com/store/apps/details?id=oss.krtirtho.spotube">
<img width="220" alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png">
</a>
<br>
<a href="https://github.com/KRTirtho/spotube/releases/latest/download/Spotube-android-all-arch.apk"> <a href="https://github.com/KRTirtho/spotube/releases/latest/download/Spotube-android-all-arch.apk">
<img width="220" alt="APK download" src="https://user-images.githubusercontent.com/114044633/223920025-83687de0-e463-4c5d-8122-e06e4bb7d40c.png"> <img width="220" alt="APK download" src="https://user-images.githubusercontent.com/114044633/223920025-83687de0-e463-4c5d-8122-e06e4bb7d40c.png">
</a> </a>
@ -86,6 +74,19 @@ This handy table lists all the methods you can use to install Spotube:
</a> </a>
</td> </td>
</tr> </tr>
<tr>
<tr>
<td>iOS</td>
<td>
<a href="https://github.com/KRTirtho/spotube/releases/latest/download/Spotube-iOS.ipa">
<img width="220" alt="Download iOS IPA" src="https://github.com/user-attachments/assets/3e50d93d-fb39-435c-be6b-337745f7c423">
</a>
<br/>
<blockquote style="color:red">
*iPA file only. Requires sideloading with <a href="https://altstore.io/">AltStore</a> or similar tools.
</blockquote>
</td>
</tr>
<tr> <tr>
<td>Flatpak</td> <td>Flatpak</td>
<td> <td>
@ -97,7 +98,7 @@ This handy table lists all the methods you can use to install Spotube:
</tr> </tr>
<tr> <tr>
<td>AppImage</td> <td>AppImage</td>
<td>AppImage's lacking stability led to it's temporal removal. More information at https://github.com/KRTirtho/spotube/issues/1082</td> <td>AppImage's lacking stability led to it's temporary removal. More information at https://github.com/KRTirtho/spotube/issues/1082</td>
</tr> </tr>
<tr> <tr>
<td>Debian/Ubuntu</td> <td>Debian/Ubuntu</td>
@ -176,9 +177,7 @@ You can compile Spotube's source code by [following these instructions](CONTRIBU
## 👥 The Spotube team ## 👥 The Spotube team
- [Kingkor Roy Tirtho](https://github.com/KRTirtho) - The Founder, Maintainer and Lead Developer - [Kingkor Roy Tirtho](https://github.com/KRTirtho) - The Founder, Maintainer and Lead Developer
- [RaptaG](https://github.com/RaptaG) - The GitHub Moderator and Community Manager
- [Owen Connor](https://github.com/owencz1998) - The Cool Discord Moderator - [Owen Connor](https://github.com/owencz1998) - The Cool Discord Moderator
- [Meenbeese](https://github.com/meenbeese) - The Android Developer
- [Piotr Rogowski](https://github.com/karniv00l) - The MacOS Developer - [Piotr Rogowski](https://github.com/karniv00l) - The MacOS Developer
- [Rusty Apple](https://github.com/RustyApple) - The Mysterious Unknown Guy - [Rusty Apple](https://github.com/RustyApple) - The Mysterious Unknown Guy
@ -186,7 +185,7 @@ You can compile Spotube's source code by [following these instructions](CONTRIBU
Spotube is open source and licensed under the [BSD-4-Clause](/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 curious, you can [read the reason of choosing this license](https://dev.to/krtirtho/choosing-open-source-license-wisely-1m3p).
<details> <details>
<summary> <summary>
@ -194,118 +193,107 @@ If you are concerned, you can [read the reason of choosing this license](https:/
</summary> </summary>
### Services ### 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. [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. [Spotify API](https://developer.spotify.com/documentation/web-api) - The Spotify Web API is a RESTful API that provides access to Spotify data 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. [Musicbrainz](https://musicbrainz.org) - MusicBrainz is a MetaBrainz project that aims to create a collaborative music database that is similar to the freedb project.
1. [Listenbrainz](https://listenbrainz.org) - ListenBrainz is a open-source project by the MetaBrainz Foundation that allows users to crowdsource and publicly store their digital music listening data.
1. [Piped](https://piped-docs.kavin.rocks/) - Piped is a privacy friendly alternative YouTube frontend, which is efficient and scalable by design. 1. [Piped](https://piped-docs.kavin.rocks/) - Piped is a privacy friendly alternative YouTube frontend, which is efficient and scalable by design.
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. [Invidious](https://invidious.io/) - Invidious is an open source alternative front-end to YouTube.
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. [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. [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. [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. [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. [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. [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. [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. [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. [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. [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. [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 ### 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. [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. [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. [async](https://pub.dev/packages/async) - Utility functions and classes related to the 'dart:async' library.
1. [audio_service_mpris](https://github.com/bdrazhzhov/audio-service-mpris) - audio_service platform interface supporting Media Player Remote Interfacing Specification.
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](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. [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. [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. [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. [build_runner](https://pub.dev/packages/build_runner) - A build system for Dart code generation and modular compilation.
1. [buttons_tabbar](https://afonsoraposo.com) - A Flutter package that implements a TabBar where each label is a toggle button.
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. [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. [catcher_2](https://github.com/ThexXTURBOXx/catcher_2) - Plugin for error catching which provides multiple handlers for dealing with errors when they are not caught by the developer. 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. [collection](https://pub.dev/packages/collection) - Collections and utilities functions and classes related to collections. 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. [crypto](https://pub.dev/packages/crypto) - Implementations of SHA, MD5, and HMAC cryptographic functions.
1. [curved_navigation_bar](https://github.com/rafalbednarczuk/curved_navigation_bar) - Stunning Animating Curved Shape Navigation Bar. Adjustable color, background color, animation curve, animation duration.
1. [custom_lint](https://pub.dev/packages/custom_lint) - Lint rules are a powerful way to improve the maintainability of a project. Custom Lint allows package authors and developers to easily write custom lint rules.
1. [dart_discord_rpc](https://github.com/alexmercerind/dart_discord_rpc) - Discord Rich Presence for Flutter & Dart apps & games.
1. [dbus](https://github.com/canonical/dbus.dart) - A native Dart implementation of the D-Bus message bus client. This package allows Dart applications to directly access services on the Linux desktop.
1. [device_info_plus](https://plus.fluttercommunity.dev/) - 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. [dio](https://github.com/cfug/dio) - A powerful HTTP networking package,supports Interceptors,Aborting and canceling a request,Custom adapters, Transformers, etc.
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. [drift](https://drift.simonbinder.eu/) - Drift is a reactive library to store relational data in Dart and Flutter applications.
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. [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. [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. [envied_generator](https://github.com/petercinibulk/envied) - Generator for the Envied package. See https://pub.dev/packages/envied. 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. [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_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. [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. [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_broadcasts](https://pub.dev/packages/flutter_broadcasts) - A plugin for sending and receiving broadcasts with Android intents and iOS notifications.
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_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_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_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_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_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_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_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_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. [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_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_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_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_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_svg](https://pub.dev/packages/flutter_svg) - An SVG rendering and widget library for Flutter, which allows painting and displaying Scalable Vector Graphics 1.1 files. 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. [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. [freezed_annotation](https://pub.dev/packages/freezed_annotation) - Annotations for the freezed code-generator. This package does nothing without freezed too.
1. [freezed](https://pub.dev/packages/freezed) - Code generation for immutable classes that has a simple syntax/API without compromising on the features.
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. [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. [gap](https://github.com/letsar/gap) - Flutter widgets for easily adding gaps inside Flex widgets such as Columns and Rows or scrolling views.
1. [go_router](https://pub.dev/packages/go_router) - A declarative router for Flutter based on Navigation 2 supporting deep linking, data-driven routes and more
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. [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. [hive_flutter](https://github.com/hivedb/hive/tree/master/hive_flutter) - Extension for Hive. Makes it easier to use Hive in Flutter apps. 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. [hive_generator](https://github.com/hivedb/hive/tree/master/hive_generator) - Extension for Hive. Automatically generates TypeAdapters to store any class.
1. [hive](https://github.com/hivedb/hive/tree/master/hive) - Lightweight and blazing fast key-value database written in pure Dart. Strongly encrypted using AES-256.
1. [hooks_riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze. 1. [hooks_riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze.
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. [html](https://pub.dev/packages/html) - APIs for parsing and manipulating HTML content outside the browser. 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. [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. [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. [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. [introduction_screen](https://pub.dev/packages/introduction_screen) - Introduction/Onboarding package for flutter app with some customizations possibilities 1. [invidious](https://pub.dev/packages/invidious) - Invidious API client for Dart and Flutter.
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. [jiosaavn](https://github.com/KRTirtho/jiosaavn) - Unofficial API client for jiosaavn.com 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. [json_annotation](https://pub.dev/packages/json_annotation) - Classes and helper functions that support JSON code generation via the `json_serializable` package.
1. [json_serializable](https://pub.dev/packages/json_serializable) - Automatically generate code for converting to and from JSON by annotating Dart classes.
1. [local_notifier](https://github.com/leanflutter/local_notifier) - This plugin allows Flutter desktop apps to displaying local notifications. 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. [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. [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_libs_audio](https://github.com/media-kit/media-kit.git) - package:media_kit audio (only) playback native libraries for all platforms.
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](https://github.com/media-kit/media-kit) - A cross-platform video player & audio player for Flutter & Dart. Performant, stable, feature-proof & modular.
1. [metadata_god](https://github.com/KRTirtho/metadata_god) - Plugin for retrieving and writing audio tags/metadata from audio files 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. [mime](https://pub.dev/packages/mime) - Utilities for handling media (MIME) types, including determining a type from a file extension and file contents.
1. [package_info_plus](https://plus.fluttercommunity.dev/) - Flutter plugin for querying information about the application package, such as CFBundleVersion on iOS or versionCode on Android. 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. [palette_generator](https://pub.dev/packages/palette_generator) - Flutter package for generating palette colors from a source image.
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. [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](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. [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. [piped_client](https://github.com/KRTirtho/piped_client) - API Client for piped.video
1. [popover](https://github.com/minikin/popover) - A popover is a transient view that appears above other content onscreen when you tap a control or in an area. 1. [riverpod](https://riverpod.dev) - A reactive caching and data-binding framework. Riverpod makes working with asynchronous code a breeze.
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. [pub_api_client](https://github.com/leoafarias/pub_api_client) - An API Client for Pub to interact with public package information.
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. [riverpod_lint](https://riverpod.dev) - Riverpod_lint is a developer tool for users of Riverpod, designed to help stop common issues and simplify repetitive tasks.
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. [scroll_to_index](https://github.com/quire-io/scroll-to-index) - Scroll to a specific child of any scrollable widget in Flutter 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. [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_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. [shelf_web_socket](https://pub.dev/packages/shelf_web_socket) - A shelf handler that wires up a listener for every connection.
1. [shelf](https://pub.dev/packages/shelf) - A model for web server middleware that encourages composition and easy reuse.
1. [sidebarx](https://github.com/Frezyx/sidebarx) - flutter multiplatform navigation sidebar / side navigationbar / drawer widget
1. [simple_icons](https://teavelopment.com/) - The Simple Icon pack available as Flutter Icons. Provides over 1500 Free SVG icons for popular brands. 1. [simple_icons](https://teavelopment.com/) - The Simple Icon pack available as Flutter Icons. Provides over 1500 Free SVG icons for popular brands.
1. [skeleton_text](https://github.com/101Loop/Skeleton-Text) - A package that provides an easy way to add skeleton text loading animation in Flutter project. This project is a part of 101Loop community.
1. [skeletonizer](https://github.com/Milad-Akarie/skeletonizer) - Converts already built widgets into skeleton loaders with no extra effort. 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. [sliver_tools](https://github.com/Kavantix) - A set of useful sliver tools that are missing from the flutter framework
1. [smtc_windows](https://github.com/KRTirtho/smtc_windows) - Windows `SystemMediaTransportControls` implementation for Flutter giving access to Windows OS Media Control applet. 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. [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://pub.dev/packages/system_theme) - A plugin to get the current system theme info. Supports Android, Web, Windows, Linux and macOS 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. [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. [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. [tray_manager](https://github.com/leanflutter/tray_manager) - This plugin allows Flutter desktop apps to defines system tray.
@ -318,8 +306,32 @@ If you are concerned, you can [read the reason of choosing this license](https:/
1. [wikipedia_api](https://github.com/KRTirtho/wikipedia_api) - Wikipedia API for dart and flutter 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. [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. [window_manager](https://github.com/leanflutter/window_manager) - This plugin allows Flutter desktop apps to resizing and repositioning the window.
1. [xml](https://github.com/renggli/dart-xml) - A lightweight library for parsing, traversing, querying, transforming and building XML documents.
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. [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)
</details> </details>
<div align="center"><h4>© Copyright Spotube 2024</h4></div> <div align="center"><h4>© Copyright Spotube 2025</h4></div>

View File

@ -32,10 +32,9 @@ linter:
analyzer: analyzer:
errors: errors:
invalid_annotation_target: ignore invalid_annotation_target: ignore
plugins:
- custom_lint
exclude: exclude:
- "**.freezed.dart" - "**.freezed.dart"
- "**.g.dart" - "**.g.dart"
- "**.gr.dart" - "**.gr.dart"
- "**/generated_plugin_registrant.dart" - "**/generated_plugin_registrant.dart"
- test/**/*.dart

View File

@ -28,12 +28,17 @@ if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
} }
android { def composeVersion = "1.4.8"
compileSdkVersion 34
ndkVersion "25.1.8937393" android {
namespace "oss.krtirtho.spotube"
compileSdkVersion 36
ndkVersion = "27.0.12077973"
compileOptions { compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
} }
@ -46,10 +51,18 @@ android {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'
} }
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion "$composeVersion" // Correlates with org.jetbrains.kotlin.android plugin in settings.gradle
}
defaultConfig { defaultConfig {
applicationId "oss.krtirtho.spotube" applicationId "oss.krtirtho.spotube"
minSdkVersion 24 minSdkVersion 24
targetSdkVersion 34 targetSdkVersion 35
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
multiDexEnabled true multiDexEnabled true
@ -63,6 +76,7 @@ android {
storePassword keystoreProperties['storePassword'] storePassword keystoreProperties['storePassword']
} }
} }
buildTypes { buildTypes {
release { release {
signingConfig signingConfigs.release signingConfig signingConfigs.release
@ -96,15 +110,30 @@ android {
} }
} }
packagingOptions {
resources.excludes += "DebugProbesKt.bin"
}
} }
flutter { flutter {
source '../..' source '../..'
} }
def glanceVersion = "1.1.1"
dependencies { dependencies {
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
// other deps so just ignore // other deps so just ignore
implementation 'com.android.support:multidex:2.0.1' implementation 'com.android.support:multidex:2.0.1'
implementation "androidx.glance:glance-appwidget:$glanceVersion"
implementation "androidx.glance:glance-appwidget-preview:$glanceVersion"
implementation "androidx.glance:glance-preview:$glanceVersion"
implementation "androidx.glance:glance-material3:$glanceVersion"
implementation "androidx.glance:glance-material:$glanceVersion"
implementation "androidx.work:work-runtime-ktx:2.8.1"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3"
implementation 'com.google.code.gson:gson:2.11.0'
} }

View File

@ -1 +1,59 @@
-keep class androidx.lifecycle.DefaultLifecycleObserver #Flutter Wrapper
# -keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
# -keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
-keep class de.prosiebensat1digital.** { *; }
-keep class androidx.lifecycle.DefaultLifecycleObserver
-keepnames class kotlinx.serialization.** { *; }
-keepnames class oss.krtirtho.spotube.glance.models.** { *; }
-keep @kotlinx.serialization.Serializable class *
-keepclassmembers class ** {
@kotlinx.serialization.* <fields>;
}
## We don't need beans
-dontwarn java.beans.BeanDescriptor
-dontwarn java.beans.BeanInfo
-dontwarn java.beans.IntrospectionException
-dontwarn java.beans.Introspector
-dontwarn java.beans.PropertyDescriptor
## Rules for NewPipeExtractor
-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
-keep class org.mozilla.javascript.** { *; }
-keep class org.mozilla.classfile.ClassFileWriter
-dontwarn org.mozilla.javascript.tools.**
-dontwarn javax.script.AbstractScriptEngine
-dontwarn javax.script.Bindings
-dontwarn javax.script.Compilable
-dontwarn javax.script.CompiledScript
-dontwarn javax.script.Invocable
-dontwarn javax.script.ScriptContext
-dontwarn javax.script.ScriptEngine
-dontwarn javax.script.ScriptEngineFactory
-dontwarn javax.script.ScriptException
-dontwarn javax.script.SimpleBindings
-dontwarn jdk.dynalink.CallSiteDescriptor
-dontwarn jdk.dynalink.DynamicLinker
-dontwarn jdk.dynalink.DynamicLinkerFactory
-dontwarn jdk.dynalink.NamedOperation
-dontwarn jdk.dynalink.Namespace
-dontwarn jdk.dynalink.NamespaceOperation
-dontwarn jdk.dynalink.Operation
-dontwarn jdk.dynalink.RelinkableCallSite
-dontwarn jdk.dynalink.StandardNamespace
-dontwarn jdk.dynalink.StandardOperation
-dontwarn jdk.dynalink.linker.GuardedInvocation
-dontwarn jdk.dynalink.linker.GuardingDynamicLinker
-dontwarn jdk.dynalink.linker.LinkRequest
-dontwarn jdk.dynalink.linker.LinkerServices
-dontwarn jdk.dynalink.linker.TypeBasedGuardingDynamicLinker
-dontwarn jdk.dynalink.linker.support.CompositeTypeBasedGuardingDynamicLinker
-dontwarn jdk.dynalink.linker.support.Guards
-dontwarn jdk.dynalink.support.ChainedCallSite

View File

@ -1,7 +1,19 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="oss.krtirtho.spotube"> <!-- Flutter needs it to communicate with the running application
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.
--> -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET" />
</manifest> <application
android:name="${applicationName}"
android:allowBackup="false"
android:fullBackupContent="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name_en"
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true">
<!-- Disable Impeller -->
<meta-data
android:name="io.flutter.embedding.android.EnableImpeller"
android:value="false" />
</application>
</manifest>

View File

@ -1,4 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="oss.krtirtho.spotube"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
@ -17,38 +17,36 @@
</queries> </queries>
<application <application
android:name="${applicationName}"
android:allowBackup="false" android:allowBackup="false"
android:fullBackupContent="false" android:fullBackupContent="false"
android:label="@string/app_name_en"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true" android:label="@string/app_name_en"
android:requestLegacyExternalStorage="true" android:requestLegacyExternalStorage="true"
> android:usesCleartextTraffic="true">
<!-- Enable Impeller --> <!-- Enable Impeller -->
<!-- <meta-data <!-- <meta-data
android:name="io.flutter.embedding.android.EnableImpeller" android:name="io.flutter.embedding.android.EnableImpeller"
android:value="true" /> --> android:value="false" /> -->
<activity <activity
android:name="com.ryanheise.audioservice.AudioServiceActivity" android:name="com.ryanheise.audioservice.AudioServiceActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true" android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleInstance" android:launchMode="singleInstance"
android:theme="@style/LaunchTheme" android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:windowSoftInputMode="adjustResize">
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
>
<!-- <!--
Specifies an Android theme to apply to this Activity as soon as Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. to determine the Window background behind the Flutter UI.
--> -->
<meta-data <meta-data
android:name="io.flutter.embedding.android.NormalTheme" android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" android:resource="@style/NormalTheme" />
/>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
@ -56,12 +54,9 @@
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="open.spotify.com"
/>
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
@ -72,23 +67,28 @@
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "spotify:// --> <data android:scheme="spotube" />
<data android:scheme="spotify" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="es.antonborri.home_widget.action.LAUNCH" />
</intent-filter>
</activity> </activity>
<!-- AudioService Config --> <!-- AudioService Config -->
<service android:name="com.ryanheise.audioservice.AudioService" <service
android:foregroundServiceType="mediaPlayback" android:name="com.ryanheise.audioservice.AudioService"
android:exported="true"> android:exported="true"
android:foregroundServiceType="mediaPlayback">
<intent-filter> <intent-filter>
<action android:name="android.media.browse.MediaBrowserService" /> <action android:name="android.media.browse.MediaBrowserService" />
</intent-filter> </intent-filter>
</service> </service>
<receiver android:name="com.ryanheise.audioservice.MediaButtonReceiver" <receiver
android:name="com.ryanheise.audioservice.MediaButtonReceiver"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" /> <action android:name="android.intent.action.MEDIA_BUTTON" />
@ -96,11 +96,40 @@
</receiver> </receiver>
<!-- =================== --> <!-- =================== -->
<meta-data android:name="com.google.android.gms.car.application" <meta-data
android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc" /> android:resource="@xml/automotive_app_desc" />
<!-- Home Widget config -->
<receiver
android:name=".glance.HomePlayerWidgetReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/home_player_widget_config" />
</receiver>
<receiver
android:name="es.antonborri.home_widget.HomeWidgetBackgroundReceiver"
android:exported="true">
<intent-filter>
<action android:name="es.antonborri.home_widget.action.BACKGROUND" />
</intent-filter>
</receiver>
<service
android:name="es.antonborri.home_widget.HomeWidgetBackgroundService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
<!-- =================== -->
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data android:name="flutterEmbedding" android:value="2" /> <meta-data
android:name="flutterEmbedding"
android:value="2" />
</application> </application>
</manifest> </manifest>

View File

@ -0,0 +1,207 @@
package oss.krtirtho.spotube.glance
import HomeWidgetGlanceState
import HomeWidgetGlanceStateDefinition
import android.R
import android.content.Context
import android.graphics.drawable.Icon
import android.net.Uri
import android.util.Log
import androidx.compose.runtime.Composable
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.glance.GlanceId
import androidx.glance.GlanceModifier
import androidx.glance.GlanceTheme
import androidx.glance.Image
import androidx.glance.ImageProvider
import androidx.glance.LocalSize
import androidx.glance.action.ActionParameters
import androidx.glance.action.actionParametersOf
import androidx.glance.action.clickable
import androidx.glance.background
import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.SizeMode
import androidx.glance.appwidget.action.ActionCallback
import androidx.glance.appwidget.action.actionRunCallback
import androidx.glance.appwidget.background
import androidx.glance.appwidget.components.CircleIconButton
import androidx.glance.appwidget.components.Scaffold
import androidx.glance.appwidget.cornerRadius
import androidx.glance.appwidget.provideContent
import androidx.glance.background
import androidx.glance.currentState
import androidx.glance.layout.Alignment
import androidx.glance.layout.Box
import androidx.glance.layout.Column
import androidx.glance.layout.ContentScale
import androidx.glance.layout.Row
import androidx.glance.layout.Spacer
import androidx.glance.layout.fillMaxSize
import androidx.glance.layout.fillMaxWidth
import androidx.glance.layout.padding
import androidx.glance.layout.size
import androidx.glance.preview.ExperimentalGlancePreviewApi
import androidx.glance.preview.Preview
import androidx.glance.state.GlanceStateDefinition
import com.google.gson.Gson
import es.antonborri.home_widget.HomeWidgetBackgroundIntent
import es.antonborri.home_widget.actionStartActivity
import oss.krtirtho.spotube.MainActivity
import oss.krtirtho.spotube.glance.models.Track
import oss.krtirtho.spotube.glance.widgets.FlutterAssetImageProvider
import oss.krtirtho.spotube.glance.widgets.TrackDetailsView
import oss.krtirtho.spotube.glance.widgets.TrackProgress
val gson = Gson()
val serverAddressKey = ActionParameters.Key<String>("serverAddress")
class Breakpoints {
companion object {
val SMALL_SQUARE = DpSize(100.dp, 100.dp)
val HORIZONTAL_RECTANGLE = DpSize(250.dp, 100.dp)
val BIG_SQUARE = DpSize(250.dp, 250.dp)
}
}
class HomePlayerWidget : GlanceAppWidget() {
override val sizeMode = SizeMode.Responsive(
setOf(
Breakpoints.SMALL_SQUARE,
Breakpoints.HORIZONTAL_RECTANGLE,
Breakpoints.BIG_SQUARE
)
)
override val stateDefinition: GlanceStateDefinition<*>?
get() = HomeWidgetGlanceStateDefinition()
override suspend fun provideGlance(context: Context, id: GlanceId) {
provideContent {
GlanceContent(context, currentState())
}
}
@OptIn(ExperimentalGlancePreviewApi::class)
@Preview(widthDp = 100, heightDp = 100)
@Composable
private fun GlanceContent(context: Context, currentState: HomeWidgetGlanceState) {
val prefs = currentState.preferences
val size = LocalSize.current
val activeTrackStr = prefs.getString("activeTrack", null)
val isPlaying = prefs.getBoolean("isPlaying", false)
val playbackServerAddress = prefs.getString("playbackServerAddress", null) ?: ""
var activeTrack: Track? = null
if (activeTrackStr != null) {
activeTrack = gson.fromJson(activeTrackStr, Track::class.java)
}
val playIcon = Icon.createWithResource(context, R.drawable.ic_media_play);
val pauseIcon = Icon.createWithResource(context, R.drawable.ic_media_pause);
val previousIcon = Icon.createWithResource(context, R.drawable.ic_media_previous);
val nextIcon = Icon.createWithResource(context, R.drawable.ic_media_next);
GlanceTheme {
Box(
modifier = GlanceModifier
.fillMaxSize()
.cornerRadius(8.dp)
.background(
color = GlanceTheme.colors.surface.getColor(context)
)
.clickable {
actionStartActivity<MainActivity>(context)
}
,
) {
Box(
modifier = GlanceModifier
.background(
color =
GlanceTheme.colors.surface.getColor(context)
.copy(alpha = 0.5f),
)
.fillMaxSize(),
) {}
Column(
modifier = GlanceModifier.padding(top = 10.dp, start = 10.dp, end = 10.dp)
) {
Row(verticalAlignment = Alignment.Vertical.CenterVertically) {
TrackDetailsView(activeTrack)
}
Spacer(modifier = GlanceModifier.size(6.dp))
if (size != Breakpoints.SMALL_SQUARE) {
TrackProgress(prefs)
}
Spacer(modifier = GlanceModifier.size(6.dp))
Row(
modifier = GlanceModifier.fillMaxWidth(),
horizontalAlignment = Alignment.Horizontal.CenterHorizontally
) {
CircleIconButton(
imageProvider = ImageProvider(previousIcon),
contentDescription = "Previous",
onClick = actionRunCallback<PreviousAction>(
parameters = actionParametersOf(serverAddressKey to playbackServerAddress)
)
)
Spacer(modifier = GlanceModifier.size(6.dp))
CircleIconButton(
imageProvider =
if (isPlaying) ImageProvider(pauseIcon)
else ImageProvider(playIcon),
contentDescription = "Play/Pause",
onClick = actionRunCallback<PlayPauseAction>(
parameters = actionParametersOf(serverAddressKey to playbackServerAddress)
)
)
Spacer(modifier = GlanceModifier.size(6.dp))
CircleIconButton(
imageProvider = ImageProvider(nextIcon),
contentDescription = "Previous",
onClick = actionRunCallback<NextAction>(
parameters = actionParametersOf(
serverAddressKey to playbackServerAddress
)
)
)
}
}
}
}
}
}
class PlayPauseAction : InteractiveAction("toggle-playback")
class NextAction : InteractiveAction("next")
class PreviousAction : InteractiveAction("previous")
abstract class InteractiveAction(val command: String) : ActionCallback {
override suspend fun onAction(
context: Context,
glanceId: GlanceId,
parameters: ActionParameters
) {
val serverAddress = parameters[serverAddressKey] ?: ""
Log.d("HomePlayerWidget", "Sending command $command to $serverAddress")
if (serverAddress == null || serverAddress.isEmpty()) {
return
}
val backgroundIntent = HomeWidgetBackgroundIntent.getBroadcast(
context,
Uri.parse("spotube://playback/$command?serverAddress=$serverAddress")
)
backgroundIntent.send()
}
}

View File

@ -0,0 +1,7 @@
package oss.krtirtho.spotube.glance
import HomeWidgetGlanceWidgetReceiver
class HomePlayerWidgetReceiver : HomeWidgetGlanceWidgetReceiver<HomePlayerWidget>() {
override val glanceAppWidget = HomePlayerWidget()
}

View File

@ -0,0 +1,40 @@
package oss.krtirtho.spotube.glance.models
import com.google.gson.annotations.SerializedName
import kotlinx.serialization.Serializable
@Serializable
data class AlbumSimple(
@SerializedName("album_type")
val albumType: AlbumType?,
@SerializedName("available_markets")
val availableMarkets: List<Market>?,
val href: String?,
val id: String?,
val images: List<Image>?,
val name: String?,
@SerializedName("release_date")
val releaseDate: String?,
@SerializedName("release_date_precision")
val releaseDatePrecision: DatePrecision?,
val type: String?,
val uri: String?,
)
@Serializable
enum class AlbumType {
album,
single,
compilation
}
enum class DatePrecision {
year,
month,
day
}

View File

@ -0,0 +1,25 @@
package oss.krtirtho.spotube.glance.models
import com.google.gson.annotations.SerializedName
import kotlinx.serialization.Serializable
@Serializable
data class Artist(
val href: String?,
val id: String?,
val name: String?,
val type: String?,
val uri: String?,
val followers: Followers?,
val genres: List<String>?,
val images: List<Image>?,
@SerializedName("popularity")
val popularity: Int?
)
@Serializable
data class Followers(
val total: Int?
)

View File

@ -0,0 +1,10 @@
package oss.krtirtho.spotube.glance.models
import kotlinx.serialization.Serializable
@Serializable
data class Image(
val height: Int?,
val width: Int?,
val path: String,
)

View File

@ -0,0 +1,37 @@
package oss.krtirtho.spotube.glance.models
import com.google.gson.annotations.SerializedName
import kotlinx.serialization.Serializable
import kotlin.time.Duration.Companion.milliseconds
@Serializable
data class Track(
val album: AlbumSimple?, val artists: List<Artist>?,
@SerializedName("available_markets") val availableMarkets: List<Market>?,
@SerializedName("disc_number") val discNumber: Int?,
@SerializedName("duration_ms") val durationMs: Int,
val explicit: Boolean?, val href: String?, val id: String?,
@SerializedName("is_playable") val isPlayable: Boolean?,
val name: String?,
@SerializedName("popularity") val popularity: Int?,
@SerializedName("preview_url") val previewUrl: String?,
@SerializedName("track_number") val trackNumber: Int?,
val type: String?, val uri: String?
) {
val duration: kotlin.time.Duration
get() = durationMs.toLong().milliseconds
}
enum class Market {
AD, AE, AF, AG, AI, AL, AM, AO, AQ, AR, AS, AT, AU, AW, AX, AZ, BA, BB, BD, BE, BF, BG, BH, BI, BJ, BL, BM, BN, BO, BQ, BR, BS, BT, BV, BW, BY, BZ, CA, CC, CD, CF, CG, CH, CI, CK, CL, CM, CN, CO, CR, CU, CV, CW, CX, CY, CZ, DE, DJ, DK, DM, DO, DZ, EC, EE, EG, EH, ER, ES, ET, FI, FJ, FK, FM, FO, FR, GA, GB, GD, GE, GF, GG, GH, GI, GL, GM, GN, GP, GQ, GR, GS, GT, GU, GW, GY, HK, HM, HN, HR, HT, HU, ID, IE, IL, IM, IN, IO, IQ, IR, IS, IT, JE, JM, JO, JP, KE, KG, KH, KI, KM, KN, KP, KR, KW, KY, KZ, LA, LB, LC, LI, LK, LR, LS, LT, LU, LV, LY, MA, MC, MD, ME, MF, MG, MH, MK, ML, MM, MN, MO, MP, MQ, MR, MS, MT, MU, MV, MW, MX, MY, MZ, NA, NC, NE, NF, NG, NI, NL, NO, NP, NR, NU, NZ, OM, PA, PE, PF, PG, PH, PK, PL, PM, PN, PR, PS, PT, PW, PY, QA, RE, RO, RS, RU, RW, SA, SB, SC, SD, SE, SG, SH, SI, SJ, SK, SL, SM, SN, SO, SR, SS, ST, SV, SX, SY, SZ, TC, TD, TF, TG, TH, TJ, TK, TL, TM, TN, TO, TR, TT, TV, TW, TZ, UA, UG, UM, US, UY, UZ, VA, VC, VE, VG, VI, VN, VU, WF, WS, XK, YE, YT, ZA, ZM, ZW,
}

View File

@ -0,0 +1,14 @@
package oss.krtirtho.spotube.glance.widgets
import android.graphics.BitmapFactory
import android.util.Base64
import androidx.glance.ImageProvider
@Suppress("FunctionName")
fun Base64ImageProvider(base64: String): ImageProvider {
var bytes = Base64.decode(base64, Base64.DEFAULT);
var bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size);
return ImageProvider(bitmap)
}

View File

@ -0,0 +1,14 @@
package oss.krtirtho.spotube.glance.widgets
import android.content.Context
import android.graphics.BitmapFactory
import androidx.glance.ImageProvider
@Suppress("FunctionName")
fun FlutterAssetImageProvider(context: Context, path: String): ImageProvider {
var inputStream = context.assets.open("flutter_assets/$path")
return ImageProvider(
BitmapFactory.decodeStream(inputStream)
)
}

View File

@ -0,0 +1,78 @@
package oss.krtirtho.spotube.glance.widgets
import android.graphics.BitmapFactory
import android.net.Uri
import android.util.Log
import androidx.compose.runtime.Composable
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.glance.GlanceModifier
import androidx.glance.GlanceTheme
import androidx.glance.Image
import androidx.glance.ImageProvider
import androidx.glance.LocalContext
import androidx.glance.LocalSize
import androidx.glance.appwidget.cornerRadius
import androidx.glance.layout.Alignment
import androidx.glance.layout.Row
import androidx.glance.layout.Column
import androidx.glance.layout.ContentScale
import androidx.glance.layout.Spacer
import androidx.glance.layout.size
import androidx.glance.text.FontWeight
import androidx.glance.text.Text
import androidx.glance.text.TextStyle
import oss.krtirtho.spotube.glance.Breakpoints
import oss.krtirtho.spotube.glance.models.Track
@Composable
fun TrackDetailsView(activeTrack: Track?) {
val context = LocalContext.current
val size = LocalSize.current
val artistStr = activeTrack?.artists?.map { it.name }?.joinToString(", ") ?: "<No Artist>"
val imgLocalPath = activeTrack?.album?.images?.get(0)?.path;
val title = activeTrack?.name ?: "<No Track>"
Image(
provider =
if (imgLocalPath == null)
ImageProvider(
BitmapFactory.decodeResource(
context.resources,
android.R.drawable.ic_delete
)
)
else ImageProvider(BitmapFactory.decodeFile(imgLocalPath)),
contentDescription = "Album Art",
modifier = GlanceModifier.cornerRadius(8.dp)
.size(
if (size.height < 200.dp) 50.dp
else 100.dp
),
contentScale = ContentScale.Fit
)
Spacer(modifier = GlanceModifier.size(6.dp))
Column {
Text(
text = title,
style = TextStyle(
fontSize = 16.sp,
fontWeight = FontWeight.Bold,
color = GlanceTheme.colors.onBackground
),
)
if (size != Breakpoints.SMALL_SQUARE) {
Spacer(modifier = GlanceModifier.size(6.dp))
Text(
text = artistStr,
style = TextStyle(
fontSize = 14.sp,
color = GlanceTheme.colors.onBackground
),
)
}
}
}

View File

@ -0,0 +1,77 @@
package oss.krtirtho.spotube.glance.widgets
import android.content.SharedPreferences
import androidx.compose.runtime.Composable
import androidx.compose.ui.unit.dp
import androidx.glance.GlanceModifier
import androidx.glance.GlanceTheme
import androidx.glance.LocalSize
import androidx.glance.appwidget.LinearProgressIndicator
import androidx.glance.layout.Column
import androidx.glance.layout.Row
import androidx.glance.layout.Spacer
import androidx.glance.layout.fillMaxWidth
import androidx.glance.layout.size
import androidx.glance.text.Text
import androidx.glance.text.TextStyle
import kotlin.math.max
import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
import oss.krtirtho.spotube.glance.Breakpoints
fun Duration.format(): String {
return this.toComponents { hour, minutes, seconds, nanoseconds ->
var paddedSeconds = seconds.toString().padStart(2, '0')
var paddedMinutes = minutes.toString().padStart(2, '0')
var paddedHour = hour.toString().padStart(2, '0')
if (hour == 0L) {
"$paddedMinutes:$paddedSeconds"
} else {
"$paddedHour:$paddedMinutes:$paddedSeconds"
}
}
}
@Composable
fun TrackProgress(prefs: SharedPreferences) {
val size = LocalSize.current
val position = prefs.getInt("position", 0).seconds
var duration = prefs.getInt("duration", 0).seconds
var progress = position.inWholeSeconds.toFloat() / max(duration.inWholeSeconds.toFloat(), 1.0f)
var textStyle =
TextStyle(
color = GlanceTheme.colors.onBackground,
)
if (size == Breakpoints.HORIZONTAL_RECTANGLE) {
Row(modifier = GlanceModifier.fillMaxWidth()) {
Text(text = position.format(), style = textStyle)
Spacer(modifier = GlanceModifier.size(6.dp))
LinearProgressIndicator(
progress = progress,
modifier = GlanceModifier.defaultWeight(),
color = GlanceTheme.colors.primary,
backgroundColor = GlanceTheme.colors.primaryContainer,
)
Spacer(modifier = GlanceModifier.size(6.dp))
Text(text = duration.format(), style = textStyle)
}
} else {
Column(modifier = GlanceModifier.fillMaxWidth()) {
LinearProgressIndicator(
progress = progress,
modifier = GlanceModifier.fillMaxWidth(),
color = GlanceTheme.colors.primary,
backgroundColor = GlanceTheme.colors.primaryContainer,
)
Spacer(modifier = GlanceModifier.size(6.dp))
Row(modifier = GlanceModifier.fillMaxWidth()) {
Text(text = position.format(), style = textStyle)
Spacer(modifier = GlanceModifier.defaultWeight())
Text(text = duration.format(), style = textStyle)
}
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 MiB

After

Width:  |  Height:  |  Size: 3.0 MiB

View File

@ -6,7 +6,7 @@
<item> <item>
<bitmap android:gravity="center" android:src="@drawable/splash"/> <bitmap android:gravity="center" android:src="@drawable/splash"/>
</item> </item>
<item> <item android:bottom="0dp">
<bitmap android:gravity="bottom" android:src="@drawable/branding"/> <bitmap android:gravity="bottom" android:src="@drawable/branding"/>
</item> </item>
</layer-list> </layer-list>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 MiB

After

Width:  |  Height:  |  Size: 3.0 MiB

View File

@ -6,7 +6,7 @@
<item> <item>
<bitmap android:gravity="center" android:src="@drawable/splash"/> <bitmap android:gravity="center" android:src="@drawable/splash"/>
</item> </item>
<item> <item android:bottom="0dp">
<bitmap android:gravity="bottom" android:src="@drawable/branding"/> <bitmap android:gravity="bottom" android:src="@drawable/branding"/>
</item> </item>
</layer-list> </layer-list>

View File

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/> <foreground>
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/> <inset
android:drawable="@drawable/ic_launcher_foreground"
android:inset="16%" />
</foreground>
</adaptive-icon> </adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -0,0 +1,7 @@
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/glance_default_loading_layout"
android:minWidth="100dp"
android:minHeight="100dp"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="10000">
</appwidget-provider>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 MiB

After

Width:  |  Height:  |  Size: 3.0 MiB

View File

@ -6,7 +6,7 @@
<item> <item>
<bitmap android:gravity="center" android:src="@drawable/splash"/> <bitmap android:gravity="center" android:src="@drawable/splash"/>
</item> </item>
<item> <item android:bottom="0dp">
<bitmap android:gravity="bottom" android:src="@drawable/branding"/> <bitmap android:gravity="bottom" android:src="@drawable/branding"/>
</item> </item>
</layer-list> </layer-list>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Some files were not shown because too many files have changed in this diff Show More