Compare commits

..

7 Commits

Author SHA1 Message Date
zarzet 320bc09b57 chore: bump version to 1.0.1 2026-01-01 19:57:23 +07:00
zarzet c033c73a95 perf: reduce APK size - switch to audio-only FFmpeg, enable ProGuard, split APK by ABI 2026-01-01 19:54:45 +07:00
zarzet d4d3a48167 fix: add Gobackend framework search paths for iOS build 2026-01-01 19:50:54 +07:00
zarzet 52310dd801 Remove ignored files from tracking 2026-01-01 19:40:43 +07:00
zarzet f374af2023 Add auto-release on version bump, update repo URLs to SpotiFLAC-Mobile 2026-01-01 19:40:14 +07:00
zarzet b0016fb510 Build only on version tag push 2026-01-01 19:39:01 +07:00
zarzet b3f5c7b2dc Clean up README 2026-01-01 19:35:34 +07:00
15 changed files with 182 additions and 43 deletions
+2 -3
View File
@@ -2,9 +2,8 @@ name: Android Build
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
tags:
- 'v*'
workflow_dispatch:
jobs:
+62
View File
@@ -0,0 +1,62 @@
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-release:
needs: check-version
if: needs.check-version.outputs.version_changed == 'true'
runs-on: ubuntu-latest
permissions:
contents: 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 }}
+12 -3
View File
@@ -2,9 +2,8 @@ name: iOS Build
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
tags:
- 'v*'
workflow_dispatch:
jobs:
@@ -34,6 +33,16 @@ jobs:
env:
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
uses: subosito/flutter-action@v2
with:
+21 -4
View File
@@ -71,12 +71,18 @@ jobs:
run: dart run flutter_launcher_icons
- name: Build APK (Release)
run: flutter build apk --release
run: flutter build apk --release --split-per-abi
- name: Rename APK
- name: Rename APKs
run: |
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
uses: actions/upload-artifact@v4
@@ -111,6 +117,16 @@ jobs:
env:
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
uses: subosito/flutter-action@v2
with:
@@ -175,7 +191,8 @@ jobs:
Download Spotify tracks in FLAC quality from Tidal, Qobuz & Amazon Music.
### 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)
### Features
+6 -16
View File
@@ -1,6 +1,6 @@
[![GitHub All Releases](https://img.shields.io/github/downloads/zarzet/SpotiFLAC-Android/total?style=for-the-badge)](https://github.com/zarzet/SpotiFLAC-Android/releases)
[![GitHub All Releases](https://img.shields.io/github/downloads/zarzet/SpotiFLAC-Mobile/total?style=for-the-badge)](https://github.com/zarzet/SpotiFLAC-Mobile/releases)
![SpotiFLAC](icon.png)
![Image](icon.png)
<div align="center">
@@ -11,26 +11,16 @@ Get Spotify tracks in true FLAC from Tidal, Qobuz & Amazon Music — no account
</div>
### [Download](https://github.com/zarzet/SpotiFLAC-Android/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
### [Download](https://github.com/zarzet/SpotiFLAC-Mobile/releases)
## Screenshot
<!-- Add your screenshot here -->
<!-- ![Screenshot](screenshot.png) -->
<!-- ![Image](screenshot.png) -->
## Related Project
## Other project
### [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
+23 -2
View File
@@ -29,13 +29,34 @@ android {
versionCode = flutter.versionCode
versionName = flutter.versionName
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 {
release {
signingConfig = signingConfigs.getByName("debug")
isMinifyEnabled = false
isShrinkResources = false
// Enable code shrinking and resource shrinking
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
}
}
}
+33
View File
@@ -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
+4
View File
@@ -1 +1,5 @@
#include "Generated.xcconfig"
// Go backend framework (Gobackend.xcframework)
FRAMEWORK_SEARCH_PATHS=$(inherited) $(PROJECT_DIR)/Frameworks
OTHER_LDFLAGS=$(inherited) -framework Gobackend
+4
View File
@@ -1 +1,5 @@
#include "Generated.xcconfig"
// Go backend framework (Gobackend.xcframework)
FRAMEWORK_SEARCH_PATHS=$(inherited) $(PROJECT_DIR)/Frameworks
OTHER_LDFLAGS=$(inherited) -framework Gobackend
+2 -2
View File
@@ -2,8 +2,8 @@ import 'dart:async';
import 'dart:io';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path_provider/path_provider.dart';
import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter_new/return_code.dart';
import 'package:ffmpeg_kit_flutter_new_audio/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter_new_audio/return_code.dart';
import 'package:spotiflac_android/models/download_item.dart';
import 'package:spotiflac_android/models/settings.dart';
import 'package:spotiflac_android/models/track.dart';
+2 -2
View File
@@ -132,11 +132,11 @@ class SettingsScreen extends ConsumerWidget {
ListTile(
leading: Icon(Icons.info, color: colorScheme.primary),
title: const Text('About'),
subtitle: const Text('SpotiFLAC v1.0.0'),
subtitle: const Text('SpotiFLAC v1.0.1'),
onTap: () => showAboutDialog(
context: context,
applicationName: 'SpotiFLAC',
applicationVersion: '1.0.0',
applicationVersion: '1.0.1',
applicationLegalese: '© 2024 SpotiFLAC',
),
),
+2 -2
View File
@@ -139,11 +139,11 @@ class _SettingsTabState extends ConsumerState<SettingsTab> with AutomaticKeepAli
ListTile(
leading: Icon(Icons.info, color: colorScheme.primary),
title: const Text('About'),
subtitle: const Text('SpotiFLAC v1.0.0'),
subtitle: const Text('SpotiFLAC v1.0.1'),
onTap: () => showAboutDialog(
context: context,
applicationName: 'SpotiFLAC',
applicationVersion: '1.0.0',
applicationVersion: '1.0.1',
applicationLegalese: '© 2024 SpotiFLAC',
),
),
+2 -2
View File
@@ -1,6 +1,6 @@
import 'dart:io';
import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter_new/return_code.dart';
import 'package:ffmpeg_kit_flutter_new_audio/ffmpeg_kit.dart';
import 'package:ffmpeg_kit_flutter_new_audio/return_code.dart';
/// FFmpeg service for audio conversion and remuxing
class FFmpegService {
+4 -4
View File
@@ -313,14 +313,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
ffmpeg_kit_flutter_new:
ffmpeg_kit_flutter_new_audio:
dependency: "direct main"
description:
name: ffmpeg_kit_flutter_new
sha256: d127635f27e93a7f21f0a14ce0a1a148e80919c402dac4a2118d73bfb17ce841
name: ffmpeg_kit_flutter_new_audio
sha256: "0a698b46cd163c8e9917af75325c84d27871a2a8b2c37de3b40486cd0ab662ae"
url: "https://pub.dev"
source: hosted
version: "4.1.0"
version: "2.0.0"
ffmpeg_kit_flutter_platform_interface:
dependency: transitive
description:
+3 -3
View File
@@ -1,7 +1,7 @@
name: spotiflac_android
description: Download Spotify tracks in FLAC from Tidal, Qobuz & Amazon Music
publish_to: 'none'
version: 1.0.0+1
version: 1.0.1+2
environment:
sdk: ^3.10.0
@@ -48,8 +48,8 @@ dependencies:
device_info_plus: ^12.3.0
share_plus: ^10.1.4
# FFmpeg for audio conversion
ffmpeg_kit_flutter_new: ^4.1.0
# FFmpeg for audio conversion (audio-only version - much smaller)
ffmpeg_kit_flutter_new_audio: ^2.0.0
open_filex: ^4.7.0
dev_dependencies: