Compare commits
1 Commits
eda81a6740
...
1b5110b32e
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1b5110b32e |
@ -1,3 +1,7 @@
|
|||||||
|
# The format:
|
||||||
|
# SPOTIFY_SECRETS=clintId1:clientSecret1,clientId2:clientSecret2
|
||||||
|
SPOTIFY_SECRETS=$SPOTIFY_SECRETS
|
||||||
|
|
||||||
# 0 or 1
|
# 0 or 1
|
||||||
# 0 = disable
|
# 0 = disable
|
||||||
# 1 = enable
|
# 1 = enable
|
||||||
@ -10,3 +14,4 @@ LASTFM_API_SECRET=$LASTFM_API_SECRET
|
|||||||
RELEASE_CHANNEL=$RELEASE_CHANNEL
|
RELEASE_CHANNEL=$RELEASE_CHANNEL
|
||||||
|
|
||||||
HIDE_DONATIONS=$HIDE_DONATIONS
|
HIDE_DONATIONS=$HIDE_DONATIONS
|
||||||
|
DISABLE_SPOTIFY_IMAGES=$DISABLE_SPOTIFY_IMAGES
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"flutterSdkVersion": "3.35.2"
|
"flutterSdkVersion": "3.29.2"
|
||||||
}
|
}
|
2
.fvmrc
@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"flutter": "3.35.2",
|
"flutter": "3.29.2",
|
||||||
"flavors": {}
|
"flavors": {}
|
||||||
}
|
}
|
3
.github/workflows/pr-lint.yml
vendored
@ -4,7 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: 3.35.2
|
FLUTTER_VERSION: 3.29.2
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
@ -21,6 +21,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
envsubst < .env.example > .env
|
envsubst < .env.example > .env
|
||||||
env:
|
env:
|
||||||
|
SPOTIFY_SECRETS: xxx:xxx
|
||||||
ENABLE_UPDATE_CHECK: true
|
ENABLE_UPDATE_CHECK: true
|
||||||
LASTFM_API_KEY: xxx
|
LASTFM_API_KEY: xxx
|
||||||
LASTFM_API_SECRET: xxx
|
LASTFM_API_SECRET: xxx
|
||||||
|
6
.github/workflows/spotube-release-binary.yml
vendored
@ -20,7 +20,7 @@ on:
|
|||||||
description: Dry run without uploading to release
|
description: Dry run without uploading to release
|
||||||
|
|
||||||
env:
|
env:
|
||||||
FLUTTER_VERSION: 3.35.2
|
FLUTTER_VERSION: 3.29.2
|
||||||
FLUTTER_CHANNEL: master
|
FLUTTER_CHANNEL: master
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
@ -56,7 +56,7 @@ jobs:
|
|||||||
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-14
|
- os: macos-latest
|
||||||
platform: ios
|
platform: ios
|
||||||
arch: all
|
arch: all
|
||||||
files: |
|
files: |
|
||||||
@ -95,7 +95,7 @@ jobs:
|
|||||||
if: ${{matrix.platform == 'ios'}}
|
if: ${{matrix.platform == 'ios'}}
|
||||||
uses: maxim-lobanov/setup-xcode@v1
|
uses: maxim-lobanov/setup-xcode@v1
|
||||||
with:
|
with:
|
||||||
xcode-version: "16.2"
|
xcode-version: "16.1"
|
||||||
|
|
||||||
- name: Install ${{matrix.platform}} dependencies
|
- name: Install ${{matrix.platform}} dependencies
|
||||||
run: |
|
run: |
|
||||||
|
10
.metadata
@ -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: "d7b523b356d15fb81e7d340bbe52b47f93937323"
|
revision: "300451adae589accbece3490f4396f10bdf15e6e"
|
||||||
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: d7b523b356d15fb81e7d340bbe52b47f93937323
|
create_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||||
base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
|
base_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||||
- platform: windows
|
- platform: windows
|
||||||
create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
|
create_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||||
base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
|
base_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||||
|
|
||||||
# User provided section
|
# User provided section
|
||||||
|
|
||||||
|
11
.vscode/launch.json
vendored
@ -17,17 +17,6 @@
|
|||||||
"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",
|
||||||
|
4
.vscode/settings.json
vendored
@ -5,12 +5,10 @@
|
|||||||
"ambiguate",
|
"ambiguate",
|
||||||
"Amoled",
|
"Amoled",
|
||||||
"Buildless",
|
"Buildless",
|
||||||
"configurators",
|
|
||||||
"danceability",
|
"danceability",
|
||||||
"fuzzywuzzy",
|
"fuzzywuzzy",
|
||||||
"gapless",
|
"gapless",
|
||||||
"instrumentalness",
|
"instrumentalness",
|
||||||
"isrc",
|
|
||||||
"Mpris",
|
"Mpris",
|
||||||
"RGBO",
|
"RGBO",
|
||||||
"riverpod",
|
"riverpod",
|
||||||
@ -30,5 +28,5 @@
|
|||||||
"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"
|
"dart.flutterSdkPath": ".fvm/versions/3.29.2"
|
||||||
}
|
}
|
63
CHANGELOG.md
@ -1,68 +1,5 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [5.0.0](https://github.com/KRTirtho/spotube/compare/v4.0.2...v5.0.0) (2025-09-08)
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
- Add ISRC track search for YouTube ([#2594](https://github.com/KRTirtho/spotube/issues/2594))
|
|
||||||
- Add new icons #2676 by @alexio-dev ([#2678](https://github.com/KRTirtho/spotube/issues/2678))
|
|
||||||
- Add connect confirmation dialog
|
|
||||||
- Add metadata api service and models
|
|
||||||
- **metadata-plugin**: Add pagination support, feed and playlist CRUD endpoints
|
|
||||||
- **metadata-plugin**: Add local storage api
|
|
||||||
- Add webview, totp and setInterval apis for plugins
|
|
||||||
- Enhance local storage and webview APIs with improved error handling and resource management
|
|
||||||
- **metadata_plugin**: Add logout method
|
|
||||||
- Update plugin configuration with more fields
|
|
||||||
- Implement metadata plugins based on hetu
|
|
||||||
- Update models to match hetu_spotube_plugin signature
|
|
||||||
- Add user endpoint calls in metadata and paginated async notifiers
|
|
||||||
- Add playlist endpoint and providers
|
|
||||||
- Add albums metadata endpoint and provider
|
|
||||||
- Add artist and album providers
|
|
||||||
- Add track endpoint for metadata service
|
|
||||||
- Remove green corp names formally
|
|
||||||
- **metadata**: Add plugin form
|
|
||||||
- Add support for entity specific search
|
|
||||||
- Enhance image handling
|
|
||||||
- Add support for automatic plugin repository from github and codeberg
|
|
||||||
- Use isolate for youtube_explode engine
|
|
||||||
- Add repository and plugin API version fields to metadata plugins
|
|
||||||
- Update new pipe version
|
|
||||||
- **metadata**: Add plugin update checker and dialog for available updates
|
|
||||||
- Optimize track options and related artists
|
|
||||||
- Add plugin scrobbling support and support button
|
|
||||||
- Add ErrorBox and NoDefaultMetadataPlugin components
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
- Calling /track/:streamId endpoint causes active sourced track to be anything
|
|
||||||
- **mobile**: Dialogs in bottom sheet are not opening
|
|
||||||
- Default accent color is orange but it shows blue in settings
|
|
||||||
- Artist images are not loading up
|
|
||||||
- CVE: Remote path traversal through websocket when devices are on same network
|
|
||||||
- Endless playback not working
|
|
||||||
- **android**: NewPipe invalid search content filters
|
|
||||||
- Make YoutubeExplode engine faster
|
|
||||||
- Create and delete playlist not working
|
|
||||||
- Local track not working and images of local not showing up
|
|
||||||
- Local playback not working for tracks with special # (hashtag) characters
|
|
||||||
- Inaccessible streaming url causing rapid skips
|
|
||||||
- **yt**: Fallback to different search result if all streaming url is inaccessible
|
|
||||||
- **playback**: Skip network requests if cached file already exists
|
|
||||||
- Yt-dlp playback not working and add partial support for HLS streaming
|
|
||||||
- Windows webview2 environment permission issue
|
|
||||||
- **playback**: Play not fetching full playlist if playlist is too long
|
|
||||||
- **track_options**: Tapping on option doesn't close the menu
|
|
||||||
- **playback**: Alternative track sources switch not working
|
|
||||||
- **ui**: Lyrics white text in white background and small player buttons
|
|
||||||
|
|
||||||
### Translation
|
|
||||||
|
|
||||||
- Add Traditional Chinese translation ([#2762](https://github.com/KRTirtho/spotube/issues/2762))
|
|
||||||
- Fix Japanese translations ([#2732](https://github.com/KRTirtho/spotube/issues/2732))
|
|
||||||
- Correction of the dutch language ([#1306](https://github.com/KRTirtho/spotube/issues/1306))
|
|
||||||
|
|
||||||
## [4.0.2](https://github.com/krtirtho/spotube/compare/v4.0.1...v4.0.2) (2025-03-16)
|
## [4.0.2](https://github.com/krtirtho/spotube/compare/v4.0.1...v4.0.2) (2025-03-16)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
@ -119,7 +119,7 @@ Enhancement suggestions are tracked as [GitHub issues](https://github.com/KRTirt
|
|||||||
|
|
||||||
Do the following:
|
Do the following:
|
||||||
|
|
||||||
- Install [Dart](https://dart.dev/get-dart) and [fvm](https://fvm.app/documentation/getting-started/installation)
|
- Download the latest Flutter SDK (>=3.16.0) & enable desktop support
|
||||||
- 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
|
||||||
fvm flutter pub get && fvm dart run build_runner build --delete-conflicting-outputs
|
flutter pub get && dart run build_runner build --delete-conflicting-outputs --enable-experiment=records,patterns
|
||||||
```
|
```
|
||||||
- Finally run these following commands in the root of the project to start the Spotube Locally
|
- Finally run these following commands in the root of the project to start the Spotube Locally
|
||||||
```bash
|
```bash
|
||||||
fvm flutter run -d <window|macos|linux|(<android-device-id>)>
|
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
|
||||||
|
5
Makefile
@ -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/branding/spotube-logo.png $(TEMP_DIR)\
|
&& cp assets/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)
|
||||||
@ -53,6 +53,3 @@ dmg:
|
|||||||
then rm dist/Spotube-macos-universal.dmg;\
|
then rm dist/Spotube-macos-universal.dmg;\
|
||||||
fi &&\
|
fi &&\
|
||||||
appdmg appdmg.json dist/Spotube-macos-universal.dmg
|
appdmg appdmg.json dist/Spotube-macos-universal.dmg
|
||||||
|
|
||||||
changelog:
|
|
||||||
git-cliff --unreleased
|
|
62
README.md
@ -1,8 +1,9 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<img width="600" src="assets/branding/spotube_banner.png" alt="Spotube Logo">
|
<img width="600" src="assets/spotube_banner.png" alt="Spotube Logo">
|
||||||
|
|
||||||
A cross-platform extensible open-source music streaming platform.<br>
|
An open source, cross-platform Spotify client compatible across multiple platforms<br />
|
||||||
Bring your own music metadata/playlist with plugins created by community or by yourself. A small step towards the decentralized music streaming era!
|
utilizing Spotify's data API and YouTube, Piped.video or JioSaavn as an audio source,<br />
|
||||||
|
eliminating the need for Spotify Premium
|
||||||
|
|
||||||
Btw it's not just another Electron app 😉
|
Btw it's not just another Electron app 😉
|
||||||
|
|
||||||
@ -18,24 +19,31 @@ Btw it's not just another Electron app 😉
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## 🌃 Features
|
## 🌃 Features
|
||||||
|
|
||||||
- 🧩 Plugin powered, supports any platform or custom music service through plugins.
|
- 🚫 No ads, thanks to the use of public & free Spotify and YT Music APIs¹
|
||||||
- 🗺️ Community driven plugins for popular platforms or create your own.
|
- ⬇️ Freely downloadable tracks
|
||||||
- ⬇️ Freely downloadable tracks with tagged metadata.
|
- 🖥️ 📱 Cross-platform support
|
||||||
- 🖥️ 📱 Cross-platform support.
|
- 🪶 Small size & less data usage
|
||||||
- 🪶 Small size & less data usage.
|
- 🕵️ Anonymous/guest login
|
||||||
- 🕒 Time synced lyrics regardless of the plugin support.
|
- 🕒 Time synced lyrics
|
||||||
- ✋ 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
|
||||||
|
|
||||||
@ -58,13 +66,17 @@ 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://memory-map.com/wp-content/uploads/download-mac-OS-01.svg">
|
<img width="220" alt="MacOS Download" src="https://reachify.io/wp-content/uploads/2018/09/mac-download-button-1.png">
|
||||||
</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>
|
||||||
@ -184,7 +196,9 @@ 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
|
||||||
|
|
||||||
@ -192,7 +206,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 curious, you can [read the reason of choosing this license](https://dev.to/krtirtho/choosing-open-source-license-wisely-1m3p).
|
If you are concerned, you can [read the reason of choosing this license](https://dev.to/krtirtho/choosing-open-source-license-wisely-1m3p).
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>
|
<summary>
|
||||||
@ -203,14 +217,15 @@ If you are curious, you can [read the reason of choosing this license](https://d
|
|||||||
|
|
||||||
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. [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. [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. [Spotify API](https://developer.spotify.com/documentation/web-api) - The Spotify Web API is a RESTful API that provides access to Spotify data
|
||||||
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. [Invidious](https://invidious.io/) - Invidious is an open source alternative front-end to YouTube.
|
1. [Invidious](https://invidious.io/) - Invidious is an open source alternative front-end to YouTube.
|
||||||
1. [yt-dlp](https://github.com/yt-dlp/yt-dlp) - A feature-rich command-line audio/video downloader.
|
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. [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) - NewPipe's core library for extracting data from streaming sites.
|
1. [yt-dlp](https://github.com/yt-dlp/yt-dlp) - A feature-rich command-line audio/video downloader
|
||||||
|
1. [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) - NewPipe's core library for extracting data from streaming sites
|
||||||
|
1. [JioSaavn](https://www.jiosaavn.com) - JioSaavn is an Indian online music streaming service and a digital distributor of Bollywood, English and other regional Indian music across the world. Since it was founded in 2007 as Saavn, the company has acquired rights to over 5 crore (50 million) music tracks in 15 languages
|
||||||
1. [SongLink](https://song.link) - SongLink is a free smart link service that helps you share music with your audience. It's a one-stop-shop for creating smart links for music, podcasts, and other audio content
|
1. [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
|
||||||
@ -296,6 +311,7 @@ If you are curious, you can [read the reason of choosing this license](https://d
|
|||||||
1. [sliding_up_panel](https://github.com/akshathjain/sliding_up_panel) - A draggable Flutter widget that makes implementing a SlidingUpPanel much easier!
|
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://pub.dev/packages/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](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. [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
|
||||||
@ -341,4 +357,4 @@ If you are curious, you can [read the reason of choosing this license](https://d
|
|||||||
1. [flutter_new_pipe_extractor](https://github.com/KRTirtho/flutter_new_pipe_extractor) - NewPipeExtractor binding for Flutter (Android only)
|
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 2025</h4></div>
|
<div align="center"><h4>© Copyright Spotube 2024</h4></div>
|
||||||
|
@ -33,7 +33,7 @@ def composeVersion = "1.4.8"
|
|||||||
android {
|
android {
|
||||||
namespace "oss.krtirtho.spotube"
|
namespace "oss.krtirtho.spotube"
|
||||||
|
|
||||||
compileSdkVersion 36
|
compileSdkVersion 35
|
||||||
|
|
||||||
ndkVersion = "27.0.12077973"
|
ndkVersion = "27.0.12077973"
|
||||||
|
|
||||||
|
38
android/app/proguard-rules.pro
vendored
@ -1,12 +1,3 @@
|
|||||||
#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
|
-keep class androidx.lifecycle.DefaultLifecycleObserver
|
||||||
|
|
||||||
-keepnames class kotlinx.serialization.** { *; }
|
-keepnames class kotlinx.serialization.** { *; }
|
||||||
@ -28,32 +19,3 @@
|
|||||||
-keep class org.mozilla.javascript.** { *; }
|
-keep class org.mozilla.javascript.** { *; }
|
||||||
-keep class org.mozilla.classfile.ClassFileWriter
|
-keep class org.mozilla.classfile.ClassFileWriter
|
||||||
-dontwarn org.mozilla.javascript.tools.**
|
-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
|
|
@ -3,17 +3,4 @@
|
|||||||
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" />
|
||||||
<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>
|
</manifest>
|
@ -57,6 +57,10 @@
|
|||||||
|
|
||||||
<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:host="open.spotify.com"
|
||||||
|
android:scheme="https" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@ -70,6 +74,8 @@
|
|||||||
|
|
||||||
<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="spotify" />
|
||||||
<data android:scheme="spotube" />
|
<data android:scheme="spotube" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 91 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 214 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 253 KiB |
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 3.1 MiB |
@ -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 android:bottom="0dp">
|
<item>
|
||||||
<bitmap android:gravity="bottom" android:src="@drawable/branding"/>
|
<bitmap android:gravity="bottom" android:src="@drawable/branding"/>
|
||||||
</item>
|
</item>
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 91 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 214 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 247 KiB After Width: | Height: | Size: 253 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 3.1 MiB |
@ -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 android:bottom="0dp">
|
<item>
|
||||||
<bitmap android:gravity="bottom" android:src="@drawable/branding"/>
|
<bitmap android:gravity="bottom" android:src="@drawable/branding"/>
|
||||||
</item>
|
</item>
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
<?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>
|
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||||
<inset
|
<monochrome android:drawable="@drawable/ic_launcher_monochrome"/>
|
||||||
android:drawable="@drawable/ic_launcher_foreground"
|
|
||||||
android:inset="16%" />
|
|
||||||
</foreground>
|
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 7.7 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 220 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 276 KiB After Width: | Height: | Size: 213 KiB |
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 3.1 MiB |
@ -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 android:bottom="0dp">
|
<item>
|
||||||
<bitmap android:gravity="bottom" android:src="@drawable/branding"/>
|
<bitmap android:gravity="bottom" android:src="@drawable/branding"/>
|
||||||
</item>
|
</item>
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 48 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 220 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 276 KiB After Width: | Height: | Size: 213 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 3.1 MiB |
@ -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 android:bottom="0dp">
|
<item>
|
||||||
<bitmap android:gravity="bottom" android:src="@drawable/branding"/>
|
<bitmap android:gravity="bottom" android:src="@drawable/branding"/>
|
||||||
</item>
|
</item>
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|