mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-07-04 19:57:55 +02:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 97e366b5ef | |||
| 3a4019a55e | |||
| 320bc09b57 | |||
| c033c73a95 | |||
| d4d3a48167 | |||
| 52310dd801 | |||
| f374af2023 | |||
| b0016fb510 | |||
| b3f5c7b2dc |
@@ -2,9 +2,8 @@ name: Android Build
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main, develop]
|
tags:
|
||||||
pull_request:
|
- 'v*'
|
||||||
branches: [main]
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
name: Auto Release on Version Bump
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
paths:
|
||||||
|
- 'pubspec.yaml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-version:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
version_changed: ${{ steps.check.outputs.changed }}
|
||||||
|
new_version: ${{ steps.check.outputs.version }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 2
|
||||||
|
|
||||||
|
- name: Check if version changed
|
||||||
|
id: check
|
||||||
|
run: |
|
||||||
|
# Get current version
|
||||||
|
CURRENT_VERSION=$(grep '^version:' pubspec.yaml | sed 's/version: //' | cut -d'+' -f1)
|
||||||
|
|
||||||
|
# Get previous version
|
||||||
|
git show HEAD~1:pubspec.yaml > /tmp/old_pubspec.yaml 2>/dev/null || echo "version: 0.0.0" > /tmp/old_pubspec.yaml
|
||||||
|
PREVIOUS_VERSION=$(grep '^version:' /tmp/old_pubspec.yaml | sed 's/version: //' | cut -d'+' -f1)
|
||||||
|
|
||||||
|
echo "Current version: $CURRENT_VERSION"
|
||||||
|
echo "Previous version: $PREVIOUS_VERSION"
|
||||||
|
|
||||||
|
if [ "$CURRENT_VERSION" != "$PREVIOUS_VERSION" ]; then
|
||||||
|
echo "Version changed!"
|
||||||
|
echo "changed=true" >> $GITHUB_OUTPUT
|
||||||
|
echo "version=v$CURRENT_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "Version unchanged"
|
||||||
|
echo "changed=false" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
create-tag-and-trigger-release:
|
||||||
|
needs: check-version
|
||||||
|
if: needs.check-version.outputs.version_changed == 'true'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
actions: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Create and push tag
|
||||||
|
run: |
|
||||||
|
git config user.name "github-actions[bot]"
|
||||||
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git tag ${{ needs.check-version.outputs.new_version }}
|
||||||
|
git push origin ${{ needs.check-version.outputs.new_version }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Trigger Release workflow
|
||||||
|
run: |
|
||||||
|
gh workflow run release.yml -f version=${{ needs.check-version.outputs.new_version }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -2,9 +2,8 @@ name: iOS Build
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main, develop]
|
tags:
|
||||||
pull_request:
|
- 'v*'
|
||||||
branches: [main]
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -34,6 +33,16 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
CGO_ENABLED: 1
|
CGO_ENABLED: 1
|
||||||
|
|
||||||
|
- name: Verify XCFramework created
|
||||||
|
run: |
|
||||||
|
echo "=== Checking XCFramework ==="
|
||||||
|
ls -la ios/Frameworks/
|
||||||
|
ls -la ios/Frameworks/Gobackend.xcframework/ || (echo "ERROR: XCFramework not found!" && exit 1)
|
||||||
|
echo "=== Debug.xcconfig ==="
|
||||||
|
cat ios/Flutter/Debug.xcconfig
|
||||||
|
echo "=== Release.xcconfig ==="
|
||||||
|
cat ios/Flutter/Release.xcconfig
|
||||||
|
|
||||||
- name: Setup Flutter
|
- name: Setup Flutter
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -71,12 +71,18 @@ jobs:
|
|||||||
run: dart run flutter_launcher_icons
|
run: dart run flutter_launcher_icons
|
||||||
|
|
||||||
- name: Build APK (Release)
|
- name: Build APK (Release)
|
||||||
run: flutter build apk --release
|
run: flutter build apk --release --split-per-abi
|
||||||
|
|
||||||
- name: Rename APK
|
- name: Rename APKs
|
||||||
run: |
|
run: |
|
||||||
VERSION=${{ steps.get_version.outputs.version }}
|
VERSION=${{ steps.get_version.outputs.version }}
|
||||||
mv build/app/outputs/flutter-apk/app-release.apk build/app/outputs/flutter-apk/SpotiFLAC-${VERSION}-android.apk
|
cd build/app/outputs/flutter-apk
|
||||||
|
# Rename split APKs
|
||||||
|
mv app-arm64-v8a-release.apk SpotiFLAC-${VERSION}-arm64.apk || true
|
||||||
|
mv app-armeabi-v7a-release.apk SpotiFLAC-${VERSION}-arm32.apk || true
|
||||||
|
# Also rename universal if exists
|
||||||
|
mv app-release.apk SpotiFLAC-${VERSION}-universal.apk || true
|
||||||
|
ls -la
|
||||||
|
|
||||||
- name: Upload APK artifact
|
- name: Upload APK artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -111,6 +117,16 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
CGO_ENABLED: 1
|
CGO_ENABLED: 1
|
||||||
|
|
||||||
|
- name: Verify XCFramework created
|
||||||
|
run: |
|
||||||
|
echo "=== Checking XCFramework ==="
|
||||||
|
ls -la ios/Frameworks/
|
||||||
|
ls -la ios/Frameworks/Gobackend.xcframework/ || (echo "ERROR: XCFramework not found!" && exit 1)
|
||||||
|
echo "=== Debug.xcconfig ==="
|
||||||
|
cat ios/Flutter/Debug.xcconfig
|
||||||
|
echo "=== Release.xcconfig ==="
|
||||||
|
cat ios/Flutter/Release.xcconfig
|
||||||
|
|
||||||
- name: Setup Flutter
|
- name: Setup Flutter
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
@@ -175,7 +191,8 @@ jobs:
|
|||||||
Download Spotify tracks in FLAC quality from Tidal, Qobuz & Amazon Music.
|
Download Spotify tracks in FLAC quality from Tidal, Qobuz & Amazon Music.
|
||||||
|
|
||||||
### Downloads
|
### Downloads
|
||||||
- **Android**: `SpotiFLAC-${{ needs.build-android.outputs.version }}-android.apk`
|
- **Android (arm64)**: `SpotiFLAC-${{ needs.build-android.outputs.version }}-arm64.apk` (recommended for most devices)
|
||||||
|
- **Android (arm32)**: `SpotiFLAC-${{ needs.build-android.outputs.version }}-arm32.apk` (for older devices)
|
||||||
- **iOS**: `SpotiFLAC-${{ needs.build-android.outputs.version }}-ios-unsigned.ipa` (requires sideloading)
|
- **iOS**: `SpotiFLAC-${{ needs.build-android.outputs.version }}-ios-unsigned.ipa` (requires sideloading)
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[](https://github.com/zarzet/SpotiFLAC-Android/releases)
|
[](https://github.com/zarzet/SpotiFLAC-Mobile/releases)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
@@ -11,26 +11,16 @@ Get Spotify tracks in true FLAC from Tidal, Qobuz & Amazon Music — no account
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
### [Download](https://github.com/zarzet/SpotiFLAC-Android/releases)
|
### [Download](https://github.com/zarzet/SpotiFLAC-Mobile/releases)
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- 🔍 Search Spotify tracks, albums, and playlists
|
|
||||||
- 📥 Download in FLAC quality from multiple sources
|
|
||||||
- 🔄 Automatic fallback to available services
|
|
||||||
- 🎵 Embedded metadata and cover art
|
|
||||||
- 📝 Lyrics support (synced and plain)
|
|
||||||
- 🎨 Material 3 Expressive UI with dynamic colors
|
|
||||||
|
|
||||||
## Screenshot
|
## Screenshot
|
||||||
|
|
||||||
<!-- Add your screenshot here -->
|
<!--  -->
|
||||||
<!--  -->
|
|
||||||
|
|
||||||
## Related Project
|
## Other project
|
||||||
|
|
||||||
### [SpotiFLAC (Desktop)](https://github.com/afkarxyz/SpotiFLAC)
|
### [SpotiFLAC (Desktop)](https://github.com/afkarxyz/SpotiFLAC)
|
||||||
The original desktop version for Windows, macOS, and Linux.
|
Get Spotify tracks in true FLAC from Tidal, Qobuz & Amazon Music for Windows, macOS & Linux
|
||||||
|
|
||||||
## Disclaimer
|
## Disclaimer
|
||||||
|
|
||||||
|
|||||||
@@ -29,13 +29,34 @@ android {
|
|||||||
versionCode = flutter.versionCode
|
versionCode = flutter.versionCode
|
||||||
versionName = flutter.versionName
|
versionName = flutter.versionName
|
||||||
multiDexEnabled = true
|
multiDexEnabled = true
|
||||||
|
|
||||||
|
// Only include arm64-v8a for smaller APK (most modern devices)
|
||||||
|
// Remove this line if you need to support older 32-bit devices
|
||||||
|
ndk {
|
||||||
|
abiFilters += listOf("arm64-v8a", "armeabi-v7a")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
signingConfig = signingConfigs.getByName("debug")
|
signingConfig = signingConfigs.getByName("debug")
|
||||||
isMinifyEnabled = false
|
// Enable code shrinking and resource shrinking
|
||||||
isShrinkResources = false
|
isMinifyEnabled = true
|
||||||
|
isShrinkResources = true
|
||||||
|
proguardFiles(
|
||||||
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
|
"proguard-rules.pro"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Split APKs by ABI for smaller individual downloads
|
||||||
|
splits {
|
||||||
|
abi {
|
||||||
|
isEnable = true
|
||||||
|
reset()
|
||||||
|
include("arm64-v8a", "armeabi-v7a")
|
||||||
|
isUniversalApk = true // Also generate universal APK
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+33
@@ -0,0 +1,33 @@
|
|||||||
|
# Flutter specific rules
|
||||||
|
-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.** { *; }
|
||||||
|
|
||||||
|
# Go backend (gobackend.aar)
|
||||||
|
-keep class gobackend.** { *; }
|
||||||
|
-keep class go.** { *; }
|
||||||
|
|
||||||
|
# FFmpeg Kit
|
||||||
|
-keep class com.arthenica.ffmpegkit.** { *; }
|
||||||
|
-keep class com.arthenica.smartexception.** { *; }
|
||||||
|
|
||||||
|
# Keep native methods
|
||||||
|
-keepclasseswithmembernames class * {
|
||||||
|
native <methods>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Kotlin coroutines
|
||||||
|
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
|
||||||
|
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
|
||||||
|
-keepclassmembers class kotlinx.coroutines.** {
|
||||||
|
volatile <fields>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Prevent R8 from removing metadata
|
||||||
|
-keepattributes *Annotation*
|
||||||
|
-keepattributes SourceFile,LineNumberTable
|
||||||
|
-keepattributes Signature
|
||||||
|
-keepattributes Exceptions
|
||||||
@@ -1 +1,5 @@
|
|||||||
#include "Generated.xcconfig"
|
#include "Generated.xcconfig"
|
||||||
|
|
||||||
|
// Go backend framework (Gobackend.xcframework)
|
||||||
|
FRAMEWORK_SEARCH_PATHS=$(inherited) $(PROJECT_DIR)/Frameworks
|
||||||
|
OTHER_LDFLAGS=$(inherited) -framework Gobackend
|
||||||
|
|||||||
@@ -1 +1,5 @@
|
|||||||
#include "Generated.xcconfig"
|
#include "Generated.xcconfig"
|
||||||
|
|
||||||
|
// Go backend framework (Gobackend.xcframework)
|
||||||
|
FRAMEWORK_SEARCH_PATHS=$(inherited) $(PROJECT_DIR)/Frameworks
|
||||||
|
OTHER_LDFLAGS=$(inherited) -framework Gobackend
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import 'dart:async';
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart';
|
import 'package:ffmpeg_kit_flutter_new_audio/ffmpeg_kit.dart';
|
||||||
import 'package:ffmpeg_kit_flutter_new/return_code.dart';
|
import 'package:ffmpeg_kit_flutter_new_audio/return_code.dart';
|
||||||
import 'package:spotiflac_android/models/download_item.dart';
|
import 'package:spotiflac_android/models/download_item.dart';
|
||||||
import 'package:spotiflac_android/models/settings.dart';
|
import 'package:spotiflac_android/models/settings.dart';
|
||||||
import 'package:spotiflac_android/models/track.dart';
|
import 'package:spotiflac_android/models/track.dart';
|
||||||
|
|||||||
@@ -132,11 +132,11 @@ class SettingsScreen extends ConsumerWidget {
|
|||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.info, color: colorScheme.primary),
|
leading: Icon(Icons.info, color: colorScheme.primary),
|
||||||
title: const Text('About'),
|
title: const Text('About'),
|
||||||
subtitle: const Text('SpotiFLAC v1.0.0'),
|
subtitle: const Text('SpotiFLAC v1.0.2'),
|
||||||
onTap: () => showAboutDialog(
|
onTap: () => showAboutDialog(
|
||||||
context: context,
|
context: context,
|
||||||
applicationName: 'SpotiFLAC',
|
applicationName: 'SpotiFLAC',
|
||||||
applicationVersion: '1.0.0',
|
applicationVersion: '1.0.2',
|
||||||
applicationLegalese: '© 2024 SpotiFLAC',
|
applicationLegalese: '© 2024 SpotiFLAC',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -139,11 +139,11 @@ class _SettingsTabState extends ConsumerState<SettingsTab> with AutomaticKeepAli
|
|||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.info, color: colorScheme.primary),
|
leading: Icon(Icons.info, color: colorScheme.primary),
|
||||||
title: const Text('About'),
|
title: const Text('About'),
|
||||||
subtitle: const Text('SpotiFLAC v1.0.0'),
|
subtitle: const Text('SpotiFLAC v1.0.2'),
|
||||||
onTap: () => showAboutDialog(
|
onTap: () => showAboutDialog(
|
||||||
context: context,
|
context: context,
|
||||||
applicationName: 'SpotiFLAC',
|
applicationName: 'SpotiFLAC',
|
||||||
applicationVersion: '1.0.0',
|
applicationVersion: '1.0.2',
|
||||||
applicationLegalese: '© 2024 SpotiFLAC',
|
applicationLegalese: '© 2024 SpotiFLAC',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart';
|
import 'package:ffmpeg_kit_flutter_new_audio/ffmpeg_kit.dart';
|
||||||
import 'package:ffmpeg_kit_flutter_new/return_code.dart';
|
import 'package:ffmpeg_kit_flutter_new_audio/return_code.dart';
|
||||||
|
|
||||||
/// FFmpeg service for audio conversion and remuxing
|
/// FFmpeg service for audio conversion and remuxing
|
||||||
class FFmpegService {
|
class FFmpegService {
|
||||||
|
|||||||
+4
-4
@@ -313,14 +313,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.4"
|
version: "2.1.4"
|
||||||
ffmpeg_kit_flutter_new:
|
ffmpeg_kit_flutter_new_audio:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: ffmpeg_kit_flutter_new
|
name: ffmpeg_kit_flutter_new_audio
|
||||||
sha256: d127635f27e93a7f21f0a14ce0a1a148e80919c402dac4a2118d73bfb17ce841
|
sha256: "0a698b46cd163c8e9917af75325c84d27871a2a8b2c37de3b40486cd0ab662ae"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.0"
|
version: "2.0.0"
|
||||||
ffmpeg_kit_flutter_platform_interface:
|
ffmpeg_kit_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
name: spotiflac_android
|
name: spotiflac_android
|
||||||
description: Download Spotify tracks in FLAC from Tidal, Qobuz & Amazon Music
|
description: Download Spotify tracks in FLAC from Tidal, Qobuz & Amazon Music
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
version: 1.0.0+1
|
version: 1.0.2+3
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.10.0
|
sdk: ^3.10.0
|
||||||
@@ -48,8 +48,8 @@ dependencies:
|
|||||||
device_info_plus: ^12.3.0
|
device_info_plus: ^12.3.0
|
||||||
share_plus: ^10.1.4
|
share_plus: ^10.1.4
|
||||||
|
|
||||||
# FFmpeg for audio conversion
|
# FFmpeg for audio conversion (audio-only version - much smaller)
|
||||||
ffmpeg_kit_flutter_new: ^4.1.0
|
ffmpeg_kit_flutter_new_audio: ^2.0.0
|
||||||
open_filex: ^4.7.0
|
open_filex: ^4.7.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
|||||||
Reference in New Issue
Block a user