mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-07-04 11:48:00 +02:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 203e6bc4eb | |||
| 5f1ffbee4e | |||
| b29dc63337 |
@@ -71,7 +71,7 @@ jobs:
|
|||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "1.21"
|
go-version: "1.25"
|
||||||
cache-dependency-path: go_backend/go.sum
|
cache-dependency-path: go_backend/go.sum
|
||||||
|
|
||||||
# Cache Gradle for faster builds
|
# Cache Gradle for faster builds
|
||||||
@@ -174,7 +174,7 @@ jobs:
|
|||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "1.21"
|
go-version: "1.25"
|
||||||
cache-dependency-path: go_backend/go.sum
|
cache-dependency-path: go_backend/go.sum
|
||||||
|
|
||||||
# Cache CocoaPods
|
# Cache CocoaPods
|
||||||
|
|||||||
+4
-3
@@ -1,6 +1,6 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## [3.3.0] - 2026-01-31
|
## [3.3.1] - 2026-02-01
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
@@ -15,12 +15,13 @@
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- **Amazon Download API**: Switched to AfkarXYZ API ([#108](https://github.com/zarzet/SpotiFLAC-Mobile/issues/108))
|
- **Amazon Download API**: Switched to AfkarXYZ API
|
||||||
- **Qobuz Download API**: Added Jumo API as fallback ([#108](https://github.com/zarzet/SpotiFLAC-Mobile/issues/108))
|
- **Qobuz Download API**: Added Jumo API as fallback
|
||||||
- **Search Results**: Reduced artist limit from 5 to 2
|
- **Search Results**: Reduced artist limit from 5 to 2
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- **MP3 Download Error 403**: Fixed 403 Forbidden error when downloading MP3 files ([#108](https://github.com/zarzet/SpotiFLAC-Mobile/issues/108))
|
||||||
- **Opus Cover Art**: Implemented METADATA_BLOCK_PICTURE for proper cover embedding
|
- **Opus Cover Art**: Implemented METADATA_BLOCK_PICTURE for proper cover embedding
|
||||||
- **Deezer Pagination**: Fixed >25 tracks only showing first 25 ([#112](https://github.com/zarzet/SpotiFLAC-Mobile/issues/112))
|
- **Deezer Pagination**: Fixed >25 tracks only showing first 25 ([#112](https://github.com/zarzet/SpotiFLAC-Mobile/issues/112))
|
||||||
- **Duplicate Embed Lyrics Setting**: Removed from Options page ([#110](https://github.com/zarzet/SpotiFLAC-Mobile/issues/110))
|
- **Duplicate Embed Lyrics Setting**: Removed from Options page ([#110](https://github.com/zarzet/SpotiFLAC-Mobile/issues/110))
|
||||||
|
|||||||
Vendored
+71
-2
@@ -5,6 +5,7 @@
|
|||||||
-keep class io.flutter.view.** { *; }
|
-keep class io.flutter.view.** { *; }
|
||||||
-keep class io.flutter.** { *; }
|
-keep class io.flutter.** { *; }
|
||||||
-keep class io.flutter.plugins.** { *; }
|
-keep class io.flutter.plugins.** { *; }
|
||||||
|
-keep class io.flutter.embedding.** { *; }
|
||||||
|
|
||||||
# Ignore missing Play Core classes (not used, but referenced by Flutter)
|
# Ignore missing Play Core classes (not used, but referenced by Flutter)
|
||||||
-dontwarn com.google.android.play.core.splitcompat.**
|
-dontwarn com.google.android.play.core.splitcompat.**
|
||||||
@@ -14,9 +15,15 @@
|
|||||||
# Ignore missing javax.xml.stream (not used on Android)
|
# Ignore missing javax.xml.stream (not used on Android)
|
||||||
-dontwarn javax.xml.stream.**
|
-dontwarn javax.xml.stream.**
|
||||||
|
|
||||||
# Go backend (gobackend.aar)
|
# Go backend (gobackend.aar) - CRITICAL for release builds
|
||||||
-keep class gobackend.** { *; }
|
-keep class gobackend.** { *; }
|
||||||
-keep class go.** { *; }
|
-keep class go.** { *; }
|
||||||
|
-keep interface gobackend.** { *; }
|
||||||
|
-keepclassmembers class gobackend.** { *; }
|
||||||
|
|
||||||
|
# Go mobile binding internals
|
||||||
|
-keep class org.golang.** { *; }
|
||||||
|
-dontwarn org.golang.**
|
||||||
|
|
||||||
# FFmpeg Kit
|
# FFmpeg Kit
|
||||||
-keep class com.arthenica.ffmpegkit.** { *; }
|
-keep class com.arthenica.ffmpegkit.** { *; }
|
||||||
@@ -30,15 +37,77 @@
|
|||||||
native <methods>;
|
native <methods>;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Kotlin coroutines
|
# Kotlin coroutines - expanded rules
|
||||||
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
|
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
|
||||||
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
|
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
|
||||||
-keepclassmembers class kotlinx.coroutines.** {
|
-keepclassmembers class kotlinx.coroutines.** {
|
||||||
volatile <fields>;
|
volatile <fields>;
|
||||||
}
|
}
|
||||||
|
-keepclassmembernames class kotlinx.** {
|
||||||
|
volatile <fields>;
|
||||||
|
}
|
||||||
|
-dontwarn kotlinx.coroutines.**
|
||||||
|
|
||||||
|
# Kotlin serialization
|
||||||
|
-keepattributes RuntimeVisibleAnnotations,AnnotationDefault
|
||||||
|
-dontwarn kotlin.**
|
||||||
|
-keep class kotlin.** { *; }
|
||||||
|
-keep class kotlin.Metadata { *; }
|
||||||
|
|
||||||
|
# Keep MainActivity and related classes
|
||||||
|
-keep class com.zarz.spotiflac.** { *; }
|
||||||
|
|
||||||
# Prevent R8 from removing metadata
|
# Prevent R8 from removing metadata
|
||||||
-keepattributes *Annotation*
|
-keepattributes *Annotation*
|
||||||
-keepattributes SourceFile,LineNumberTable
|
-keepattributes SourceFile,LineNumberTable
|
||||||
-keepattributes Signature
|
-keepattributes Signature
|
||||||
-keepattributes Exceptions
|
-keepattributes Exceptions
|
||||||
|
-keepattributes InnerClasses
|
||||||
|
-keepattributes EnclosingMethod
|
||||||
|
|
||||||
|
# JSON parsing (used by Go backend responses)
|
||||||
|
-keep class org.json.** { *; }
|
||||||
|
|
||||||
|
# Shared Preferences
|
||||||
|
-keep class androidx.datastore.** { *; }
|
||||||
|
-dontwarn androidx.datastore.**
|
||||||
|
|
||||||
|
# Flutter Plugins - CRITICAL: Prevent R8 from removing plugin implementations
|
||||||
|
# Path Provider
|
||||||
|
-keep class io.flutter.plugins.pathprovider.** { *; }
|
||||||
|
-keep class dev.flutter.pigeon.** { *; }
|
||||||
|
|
||||||
|
# Local Notifications
|
||||||
|
-keep class com.dexterous.** { *; }
|
||||||
|
-keep class com.dexterous.flutterlocalnotifications.** { *; }
|
||||||
|
|
||||||
|
# Receive Sharing Intent
|
||||||
|
-keep class com.kasem.receive_sharing_intent.** { *; }
|
||||||
|
|
||||||
|
# Permission Handler
|
||||||
|
-keep class com.baseflow.permissionhandler.** { *; }
|
||||||
|
|
||||||
|
# File Picker
|
||||||
|
-keep class com.mr.flutter.plugin.filepicker.** { *; }
|
||||||
|
|
||||||
|
# URL Launcher
|
||||||
|
-keep class io.flutter.plugins.urllauncher.** { *; }
|
||||||
|
|
||||||
|
# Share Plus
|
||||||
|
-keep class dev.fluttercommunity.plus.share.** { *; }
|
||||||
|
|
||||||
|
# Device Info Plus
|
||||||
|
-keep class dev.fluttercommunity.plus.device_info.** { *; }
|
||||||
|
|
||||||
|
# Open File
|
||||||
|
-keep class com.crazecoder.openfile.** { *; }
|
||||||
|
|
||||||
|
# Sqflite
|
||||||
|
-keep class com.tekartik.sqflite.** { *; }
|
||||||
|
|
||||||
|
# Dynamic Color
|
||||||
|
-keep class io.material.** { *; }
|
||||||
|
|
||||||
|
# Keep all Flutter plugin registrants
|
||||||
|
-keep class io.flutter.plugins.GeneratedPluginRegistrant { *; }
|
||||||
|
-keep class ** extends io.flutter.embedding.engine.plugins.FlutterPlugin { *; }
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import io.flutter.embedding.android.FlutterActivity
|
|||||||
import io.flutter.embedding.engine.FlutterEngine
|
import io.flutter.embedding.engine.FlutterEngine
|
||||||
import io.flutter.embedding.engine.FlutterShellArgs
|
import io.flutter.embedding.engine.FlutterShellArgs
|
||||||
import io.flutter.plugin.common.MethodChannel
|
import io.flutter.plugin.common.MethodChannel
|
||||||
|
import io.flutter.plugins.GeneratedPluginRegistrant
|
||||||
import gobackend.Gobackend
|
import gobackend.Gobackend
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -157,6 +158,7 @@ class MainActivity: FlutterActivity() {
|
|||||||
|
|
||||||
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
||||||
super.configureFlutterEngine(flutterEngine)
|
super.configureFlutterEngine(flutterEngine)
|
||||||
|
GeneratedPluginRegistrant.registerWith(flutterEngine)
|
||||||
|
|
||||||
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
|
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
|
||||||
scope.launch {
|
scope.launch {
|
||||||
|
|||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
module github.com/zarz/spotiflac_android/go_backend
|
module github.com/zarz/spotiflac_android/go_backend
|
||||||
|
|
||||||
go 1.24.0
|
go 1.25.0
|
||||||
|
|
||||||
toolchain go1.24.5
|
toolchain go1.25.6
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/dop251/goja v0.0.0-20260106131823-651366fbe6e3
|
github.com/dop251/goja v0.0.0-20260106131823-651366fbe6e3
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/// App version and info constants
|
/// App version and info constants
|
||||||
/// Update version here only - all other files will reference this
|
/// Update version here only - all other files will reference this
|
||||||
class AppInfo {
|
class AppInfo {
|
||||||
static const String version = '3.3.0';
|
static const String version = '3.3.1';
|
||||||
static const String buildNumber = '67';
|
static const String buildNumber = '68';
|
||||||
static const String fullVersion = '$version+$buildNumber';
|
static const String fullVersion = '$version+$buildNumber';
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2133,70 +2133,70 @@ class AppLocalizationsId extends AppLocalizations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographyDownload => 'Unduh Diskografi';
|
String get discographyDownload => 'Download Discography';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographyDownloadAll => 'Unduh Semua';
|
String get discographyDownloadAll => 'Unduh Semua';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String discographyDownloadAllSubtitle(int count, int albumCount) {
|
String discographyDownloadAllSubtitle(int count, int albumCount) {
|
||||||
return '$count lagu dari $albumCount rilis';
|
return '$count tracks from $albumCount releases';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographyAlbumsOnly => 'Album Saja';
|
String get discographyAlbumsOnly => 'Albums Only';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String discographyAlbumsOnlySubtitle(int count, int albumCount) {
|
String discographyAlbumsOnlySubtitle(int count, int albumCount) {
|
||||||
return '$count lagu dari $albumCount album';
|
return '$count tracks from $albumCount albums';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographySinglesOnly => 'Single & EP Saja';
|
String get discographySinglesOnly => 'Singles & EPs Only';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String discographySinglesOnlySubtitle(int count, int albumCount) {
|
String discographySinglesOnlySubtitle(int count, int albumCount) {
|
||||||
return '$count lagu dari $albumCount single';
|
return '$count tracks from $albumCount singles';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographySelectAlbums => 'Pilih Album...';
|
String get discographySelectAlbums => 'Select Albums...';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographySelectAlbumsSubtitle =>
|
String get discographySelectAlbumsSubtitle =>
|
||||||
'Pilih album atau single tertentu';
|
'Choose specific albums or singles';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographyFetchingTracks => 'Mengambil lagu...';
|
String get discographyFetchingTracks => 'Fetching tracks...';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String discographyFetchingAlbum(int current, int total) {
|
String discographyFetchingAlbum(int current, int total) {
|
||||||
return 'Mengambil $current dari $total...';
|
return 'Fetching $current of $total...';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String discographySelectedCount(int count) {
|
String discographySelectedCount(int count) {
|
||||||
return '$count dipilih';
|
return '$count selected';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographyDownloadSelected => 'Unduh yang Dipilih';
|
String get discographyDownloadSelected => 'Download Selected';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String discographyAddedToQueue(int count) {
|
String discographyAddedToQueue(int count) {
|
||||||
return 'Menambahkan $count lagu ke antrian';
|
return 'Added $count tracks to queue';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String discographySkippedDownloaded(int added, int skipped) {
|
String discographySkippedDownloaded(int added, int skipped) {
|
||||||
return '$added ditambahkan, $skipped sudah diunduh';
|
return '$added added, $skipped already downloaded';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographyNoAlbums => 'Tidak ada album tersedia';
|
String get discographyNoAlbums => 'No albums available';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get discographyFailedToFetch => 'Gagal mengambil beberapa album';
|
String get discographyFailedToFetch => 'Failed to fetch some albums';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get sectionStorageAccess => 'Storage Access';
|
String get sectionStorageAccess => 'Storage Access';
|
||||||
|
|||||||
+1
-1
@@ -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: 3.3.0+67
|
version: 3.3.1+68
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.10.0
|
sdk: ^3.10.0
|
||||||
|
|||||||
Reference in New Issue
Block a user