mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-10-20 06:28:27 +02:00
234 lines
10 KiB
Markdown
234 lines
10 KiB
Markdown
<div align="center">
|
|
|
|
<picture>
|
|
<source media="(prefers-color-scheme: dark)" srcset="assets/readme/banner-readme-dark.png">
|
|
<source media="(prefers-color-scheme: light)" srcset="assets/readme/banner-readme-light.png">
|
|
<img alt="SpotiFLAC Mobile" src="assets/readme/banner-readme-light.png" width="650" height="auto">
|
|
</picture>
|
|
|
|
<p align="center">
|
|
<a href="https://trendshift.io/repositories/25971" target="_blank">
|
|
<img src="https://trendshift.io/api/badge/repositories/25971" alt="spotiflacapp%2FSpotiFLAC-Mobile | Trendshift" width="250" height="55">
|
|
</a>
|
|
</p>
|
|
|
|
</div>
|
|
|
|
<div align="center">
|
|
|
|
[](https://github.com/spotiflacapp/SpotiFLAC-Mobile/releases)
|
|
[](https://crowdin.com/project/spotiflac-mobile)
|
|
|
|
[](https://t.me/spotiflac)
|
|
[](https://t.me/spotiflac_chat)
|
|
|
|
</div>
|
|
|
|
## Screenshots
|
|
|
|
<p align="center">
|
|
<img src="assets/readme/1.jpg?v=2" width="200" />
|
|
<img src="assets/readme/2.jpg?v=2" width="200" />
|
|
<img src="assets/readme/3.jpg?v=2" width="200" />
|
|
<img src="assets/readme/4.jpg?v=2" width="200" />
|
|
</p>
|
|
|
|
---
|
|
|
|
## Extensions
|
|
|
|
Extensions let the community add new music sources and features without waiting for app updates. When a streaming service API changes or a new source becomes available, extensions can be updated independently.
|
|
|
|
### Installing Extensions
|
|
|
|
1. Open the **Store** tab in the app
|
|
2. On first launch, enter an **Extension Repository URL** when prompted
|
|
3. Browse and install extensions with one tap
|
|
4. Or download a `.spotiflac-ext` file and install manually via **Settings > Extensions**
|
|
5. Configure extension settings if needed
|
|
6. Set provider priority under **Settings > Extensions > Provider Priority**
|
|
|
|
### Developing Extensions
|
|
|
|
> [!NOTE]
|
|
> Want to build your own extension? The
|
|
> [documentation site](https://spotiflac.zarz.moe/docs) contains the API reference.
|
|
|
|
---
|
|
|
|
## Development
|
|
|
|
SpotiFLAC Mobile combines a Flutter/Dart UI, a Rust backend from
|
|
[`rust_backend/`](rust_backend/), and thin Android/iOS platform bridges. Android
|
|
Gradle builds the Rust native artifacts automatically. Tool versions are pinned in
|
|
[`rust_backend/rust-toolchain.toml`](rust_backend/rust-toolchain.toml) and
|
|
[`rust_backend/Cargo.lock`](rust_backend/Cargo.lock).
|
|
|
|
Start with the [Contributing Guide](CONTRIBUTING.md) for the development setup,
|
|
project boundaries, validation commands, and pull request checklist.
|
|
|
|
Build production APKs with `bash scripts/build_android.sh --production`;
|
|
this requires the staged Discord SDK and rejects Lite. CI releases use this
|
|
mode and require Discord on both Android and iOS. Stage the official SDK with
|
|
`scripts/setup_discord_sdk.sh` in the build environment before releasing;
|
|
the SDK is not committed to the repository. A fresh hosted runner must be
|
|
provided with the SDK before these release checks can pass.
|
|
|
|
For development release APKs, use `bash scripts/build_android.sh`; use `--lite` to omit
|
|
the optional Discord SDK while keeping playback and downloads. Full builds
|
|
remain the default. To build only ARM64, set
|
|
`SPOTIFLAC_RUST_ANDROID_ABIS=arm64-v8a`. The script uses the Flutter version in
|
|
`.fvmrc` and audits the selected split APKs and universal APK. For iOS Lite,
|
|
run CocoaPods and the app build with `SPOTIFLAC_DISCORD_SDK=0`; an existing Pods
|
|
installation must be regenerated with that setting.
|
|
|
|
Android release builds, including plain `flutter build apk --release`, keep Dart
|
|
debug data in `build/symbols/android/app.<architecture>.symbols` to reduce APK
|
|
size. The release script also uses `--obfuscate` to shorten internal Dart names;
|
|
when building directly, add `--obfuscate --split-debug-info=build/symbols/android`
|
|
for the smaller APK. An explicit `--split-debug-info` path overrides the default;
|
|
plain `--analyze-size` builds retain Flutter's normal behavior. Keep these symbols
|
|
with the matching APK before another local build replaces them. Decode a trace
|
|
with `flutter symbolize --debug-info=<symbols-file> --input=crash.txt`.
|
|
|
|
CI and release jobs retain an `android-symbols-…` artifact with the commit, APK
|
|
SHA-256 hashes, Dart symbols, and R8 mapping, identified by run and attempt.
|
|
Archive it before its 90-day retention expires and match the reported APK hash
|
|
when choosing symbols; equal version numbers do not guarantee a match.
|
|
|
|
For native iOS codec checks, see the [FFmpeg capability probe](scripts/README_ios_ffmpeg_capabilities.md).
|
|
|
|
---
|
|
|
|
## Related Projects
|
|
|
|
### [SpotiFLAC (Desktop)](https://github.com/afkarxyz/SpotiFLAC)
|
|
Download music in true lossless FLAC from extension-provided sources on Windows, macOS & Linux.
|
|
|
|
### [SpotiFLAC (Python Module)](https://github.com/BartolomeoRusso9/SpotiFLAC-Module-Version)
|
|
Python library for SpotiFLAC integration, maintained by [@BartolomeoRusso9](https://github.com/BartolomeoRusso9).
|
|
|
|
---
|
|
|
|
## FAQ
|
|
|
|
<details>
|
|
<summary><b>Why does the Store tab ask me to enter a URL?</b></summary>
|
|
<br>
|
|
|
|
Starting from version 3.8.0, SpotiFLAC Mobile uses a decentralized extension
|
|
repository system. Extensions are hosted independently rather than on a
|
|
built-in server, so anyone can create and host a compatible repository. Enter
|
|
a repository URL in the Store tab to browse and install extensions.
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><b>Why is my download failing with "Song not found"?</b></summary>
|
|
<br>
|
|
|
|
The track may not be available from your enabled providers. Try enabling more providers under **Settings > Extensions > Provider Priority**, or install additional download extensions from the Store.
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><b>Why are some tracks downloading in lower quality?</b></summary>
|
|
<br>
|
|
|
|
Quality depends on what's available from the source and the installed download extension. Check each extension's quality options and service notes in the app.
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><b>Can I download playlists?</b></summary>
|
|
<br>
|
|
|
|
Yes! Just paste the playlist URL in the search bar. The app will fetch all tracks and queue them for download.
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><b>Why do I need to grant storage permission?</b></summary>
|
|
<br>
|
|
|
|
The app needs a writable destination for downloaded files. On Android, choose a
|
|
folder with the system folder picker (SAF), or use the app-specific folder. If
|
|
Android revokes a saved folder grant, select the folder again in Settings.
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><b>Is this app safe?</b></summary>
|
|
<br>
|
|
|
|
SpotiFLAC Mobile is open source, so its code and build workflows can be
|
|
inspected directly in this repository.
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><b>Why is downloading not working in my country?</b></summary>
|
|
<br>
|
|
|
|
Some countries have restricted access to certain streaming service APIs. If downloads are failing, try using a VPN to connect through a different region.
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary><b>Can I add SpotiFLAC Mobile to AltStore or SideStore?</b></summary>
|
|
<br>
|
|
|
|
Yes! Add the official source to receive updates directly within the app. Copy this link:
|
|
|
|
```
|
|
https://raw.githubusercontent.com/spotiflacapp/SpotiFLAC-Mobile/refs/heads/main/apps.json
|
|
```
|
|
|
|
In AltStore/SideStore, go to **Browse > Sources**, tap **+**, and paste the link.
|
|
|
|
</details>
|
|
|
|
> [!NOTE]
|
|
> If SpotiFLAC Mobile is useful to you, consider supporting development:
|
|
>
|
|
> [](https://ko-fi.com/zarzet)
|
|
|
|
---
|
|
|
|
## Contributors
|
|
|
|
Thanks to everyone who has contributed to SpotiFLAC Mobile!
|
|
|
|
<a href="https://github.com/spotiflacapp/SpotiFLAC-Mobile/graphs/contributors">
|
|
<img src="https://contrib.rocks/image?repo=spotiflacapp/SpotiFLAC-Mobile" />
|
|
</a>
|
|
|
|
We also appreciate everyone who helped with [translations on Crowdin](https://crowdin.com/project/spotiflac-mobile), reported bugs, suggested features, and spread the word.
|
|
|
|
Interested in contributing? Check out the [Contributing Guide](CONTRIBUTING.md) to get started!
|
|
|
|
---
|
|
|
|
## API Credits
|
|
|
|
| | | | | |
|
|
|---|---|---|---|---|
|
|
| [MusicDL](https://www.musicdl.me) | [LRCLib](https://lrclib.net) | [Paxsenix](https://lyrics.paxsenix.org) | [Cobalt](https://cobalt.tools) | [Song.link](https://song.link) |
|
|
| [UniTune](https://github.com/FlazeIGuess/unitune-api) | [MusicBrainz](https://musicbrainz.org) | [Squigly](https://squigly.link) | | |
|
|
|
|
---
|
|
|
|
## Disclaimer
|
|
|
|
This repository and its contents are provided strictly for educational and research purposes. The software is provided "as-is" without warranty of any kind, express or implied, as stated in the [MIT License](LICENSE).
|
|
|
|
- No copyrighted content is hosted, stored, mirrored, or distributed by this repository.
|
|
- Users must ensure that their use of this software is properly authorized and complies with all applicable laws, regulations, and third-party terms of service.
|
|
- This software is provided free of charge by the maintainer. If you paid a third party for access to this software in its original form from this repository, you may have been misled or scammed. Any redistribution or commercial use by third parties must comply with the terms of the repository license. No affiliation, endorsement, or support by the maintainer is implied unless explicitly stated in writing.
|
|
- SpotiFLAC Mobile is an independent project. It is not affiliated with, endorsed by, or connected to any other project or version on other platforms that may share a similar name. The maintainer of this repository has no control over or responsibility for third-party projects.
|
|
- The author(s) disclaim all liability for any direct, indirect, incidental, or consequential damages arising from the use or misuse of this software. Users assume all risk associated with its use.
|
|
- If you are a copyright holder or authorized representative and believe this repository infringes upon your rights, please contact the maintainer with sufficient detail (including relevant URLs and proof of ownership). The matter will be promptly investigated and appropriate action will be taken, which may include removal of the referenced material.
|
|
|
|
> [!TIP]
|
|
> **Star the repo** to get notified about all new releases directly from GitHub.
|