Compare commits

...

15 Commits

Author SHA1 Message Date
zarzet 2c614f9e2f chore: bump version to 1.0.5 2026-01-01 20:54:36 +07:00
zarzet f36bee1095 feat: add GitHub links and credits to Settings 2026-01-01 20:49:12 +07:00
zarzet e4218a1894 fix: correct GobackendSetDownloadDirectory call signature for iOS 2026-01-01 20:46:08 +07:00
zarzet db335f5ba6 chore: bump version to 1.0.3 2026-01-01 20:36:02 +07:00
zarzet ab9869a849 fix: add XCFramework to Xcode project dynamically for iOS build 2026-01-01 20:35:10 +07:00
zarzet 34791310b7 fix: remove empty assets/icons folder reference 2026-01-01 20:25:53 +07:00
zarzet 97e366b5ef chore: bump version to 1.0.2 2026-01-01 20:13:47 +07:00
zarzet 3a4019a55e fix: trigger release workflow directly from auto-release 2026-01-01 20:12:53 +07:00
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
16 changed files with 376 additions and 78 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:
+69
View File
@@ -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 }}
+48 -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,52 @@ 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)
- name: Add XCFramework to Xcode project
run: |
# Install xcodeproj gem for modifying Xcode project
sudo gem install xcodeproj
# Create Ruby script to add framework
cat > add_framework.rb << 'EOF'
require 'xcodeproj'
project_path = 'ios/Runner.xcodeproj'
project = Xcodeproj::Project.open(project_path)
# Get the main target
target = project.targets.find { |t| t.name == 'Runner' }
# Get or create Frameworks group
frameworks_group = project.main_group.find_subpath('Frameworks', true)
frameworks_group ||= project.main_group.new_group('Frameworks')
# Add XCFramework reference
framework_path = 'Frameworks/Gobackend.xcframework'
framework_ref = frameworks_group.new_file(framework_path, :project)
# Add to frameworks build phase
frameworks_build_phase = target.frameworks_build_phase
frameworks_build_phase.add_file_reference(framework_ref)
# Add to embed frameworks build phase
embed_phase = target.build_phases.find { |p| p.is_a?(Xcodeproj::Project::Object::PBXCopyFilesBuildPhase) && p.name == 'Embed Frameworks' }
if embed_phase
build_file = embed_phase.add_file_reference(framework_ref)
build_file.settings = { 'ATTRIBUTES' => ['CodeSignOnCopy', 'RemoveHeadersOnCopy'] }
end
project.save
puts "Successfully added Gobackend.xcframework to Xcode project"
EOF
ruby add_framework.rb
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
+94 -35
View File
@@ -12,17 +12,14 @@ on:
default: 'v1.0.0'
jobs:
build-android:
# Get version first (quick job)
get-version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get_version.outputs.version }}
version: ${{ steps.version.outputs.version }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Get version
id: get_version
id: version
run: |
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
@@ -30,6 +27,15 @@ jobs:
echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
fi
# Android and iOS build in PARALLEL
build-android:
runs-on: ubuntu-latest
needs: get-version
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
@@ -42,6 +48,16 @@ jobs:
go-version: '1.21'
cache-dependency-path: go_backend/go.sum
# Cache Gradle for faster builds
- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: gradle-${{ runner.os }}-
- name: Install Android SDK & NDK
uses: android-actions/setup-android@v3
@@ -71,12 +87,16 @@ 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
VERSION=${{ needs.get-version.outputs.version }}
cd build/app/outputs/flutter-apk
mv app-arm64-v8a-release.apk SpotiFLAC-${VERSION}-arm64.apk || true
mv app-armeabi-v7a-release.apk SpotiFLAC-${VERSION}-arm32.apk || true
mv app-release.apk SpotiFLAC-${VERSION}-universal.apk || true
ls -la
- name: Upload APK artifact
uses: actions/upload-artifact@v4
@@ -86,7 +106,7 @@ jobs:
build-ios:
runs-on: macos-latest
needs: build-android
needs: get-version # Only depends on version, NOT android build!
steps:
- name: Checkout repository
@@ -98,6 +118,14 @@ jobs:
go-version: '1.21'
cache-dependency-path: go_backend/go.sum
# Cache CocoaPods
- name: Cache CocoaPods
uses: actions/cache@v4
with:
path: ios/Pods
key: pods-${{ runner.os }}-${{ hashFiles('ios/Podfile.lock') }}
restore-keys: pods-${{ runner.os }}-
- name: Install gomobile
run: |
go install golang.org/x/mobile/cmd/gomobile@latest
@@ -111,6 +139,51 @@ jobs:
env:
CGO_ENABLED: 1
- name: Verify XCFramework created
run: |
ls -la ios/Frameworks/
ls -la ios/Frameworks/Gobackend.xcframework/ || (echo "ERROR: XCFramework not found!" && exit 1)
- name: Add XCFramework to Xcode project
run: |
# Install xcodeproj gem for modifying Xcode project
sudo gem install xcodeproj
# Create Ruby script to add framework
cat > add_framework.rb << 'EOF'
require 'xcodeproj'
project_path = 'ios/Runner.xcodeproj'
project = Xcodeproj::Project.open(project_path)
# Get the main target
target = project.targets.find { |t| t.name == 'Runner' }
# Get or create Frameworks group
frameworks_group = project.main_group.find_subpath('Frameworks', true)
frameworks_group ||= project.main_group.new_group('Frameworks')
# Add XCFramework reference
framework_path = 'Frameworks/Gobackend.xcframework'
framework_ref = frameworks_group.new_file(framework_path, :project)
# Add to frameworks build phase
frameworks_build_phase = target.frameworks_build_phase
frameworks_build_phase.add_file_reference(framework_ref)
# Add to embed frameworks build phase
embed_phase = target.build_phases.find { |p| p.is_a?(Xcodeproj::Project::Object::PBXCopyFilesBuildPhase) && p.name == 'Embed Frameworks' }
if embed_phase
build_file = embed_phase.add_file_reference(framework_ref)
build_file.settings = { 'ATTRIBUTES' => ['CodeSignOnCopy', 'RemoveHeadersOnCopy'] }
end
project.save
puts "Successfully added Gobackend.xcframework to Xcode project"
EOF
ruby add_framework.rb
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
@@ -128,7 +201,7 @@ jobs:
- name: Create IPA
run: |
VERSION=${{ needs.build-android.outputs.version }}
VERSION=${{ needs.get-version.outputs.version }}
mkdir -p build/ios/ipa
cd build/ios/iphoneos
mkdir Payload
@@ -144,14 +217,11 @@ jobs:
create-release:
runs-on: ubuntu-latest
needs: [build-android, build-ios]
needs: [get-version, build-android, build-ios]
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download Android APK
uses: actions/download-artifact@v4
with:
@@ -167,33 +237,22 @@ jobs:
- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ needs.build-android.outputs.version }}
name: SpotiFLAC ${{ needs.build-android.outputs.version }}
tag_name: ${{ needs.get-version.outputs.version }}
name: SpotiFLAC ${{ needs.get-version.outputs.version }}
body: |
## SpotiFLAC ${{ needs.build-android.outputs.version }}
## SpotiFLAC ${{ needs.get-version.outputs.version }}
Download Spotify tracks in FLAC quality from Tidal, Qobuz & Amazon Music.
### Downloads
- **Android**: `SpotiFLAC-${{ needs.build-android.outputs.version }}-android.apk`
- **iOS**: `SpotiFLAC-${{ needs.build-android.outputs.version }}-ios-unsigned.ipa` (requires sideloading)
### 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
- **Android (arm64)**: `SpotiFLAC-${{ needs.get-version.outputs.version }}-arm64.apk` (recommended)
- **Android (arm32)**: `SpotiFLAC-${{ needs.get-version.outputs.version }}-arm32.apk` (older devices)
- **iOS**: `SpotiFLAC-${{ needs.get-version.outputs.version }}-ios-unsigned.ipa` (sideload required)
### Installation
**Android**: Enable "Install from unknown sources" and install the APK
**iOS**: Use AltStore, Sideloadly, or similar tools to sideload the IPA
---
*Note: iOS IPA is unsigned and requires sideloading*
files: |
./release/*
files: ./release/*
draft: false
prerelease: false
env:
+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 -1
View File
@@ -93,7 +93,8 @@ import Gobackend // Import Go framework
case "setDownloadDirectory":
let args = call.arguments as! [String: Any]
let path = args["path"] as! String
try GobackendSetDownloadDirectory(path)
GobackendSetDownloadDirectory(path, &error)
if let error = error { throw error }
return nil
case "checkDuplicate":
+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';
+40 -3
View File
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:file_picker/file_picker.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/providers/theme_provider.dart';
@@ -126,18 +127,47 @@ class SettingsScreen extends ConsumerWidget {
onChanged: (value) => ref.read(settingsProvider.notifier).setMaxQualityCover(value),
),
const Divider(),
// GitHub & Credits Section
_buildSectionHeader(context, 'GitHub & Credits', colorScheme),
ListTile(
leading: Icon(Icons.code, color: colorScheme.primary),
title: const Text('SpotiFLAC Mobile'),
subtitle: const Text('github.com/zarzet/SpotiFLAC-Mobile'),
onTap: () => _launchUrl('https://github.com/zarzet/SpotiFLAC-Mobile'),
),
ListTile(
leading: Icon(Icons.computer, color: colorScheme.primary),
title: const Text('Original SpotiFLAC (Desktop)'),
subtitle: const Text('github.com/afkarxyz/SpotiFLAC'),
onTap: () => _launchUrl('https://github.com/afkarxyz/SpotiFLAC'),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Text(
'Mobile version maintained by zarzet\nOriginal project by afkarxyz',
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: colorScheme.onSurfaceVariant,
),
),
),
const Divider(),
// About
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.5'),
onTap: () => showAboutDialog(
context: context,
applicationName: 'SpotiFLAC',
applicationVersion: '1.0.0',
applicationLegalese: '© 2024 SpotiFLAC',
applicationVersion: '1.0.5',
applicationLegalese: '© 2024 SpotiFLAC\n\nMobile: zarzet\nOriginal: afkarxyz',
),
),
],
@@ -423,4 +453,11 @@ class SettingsScreen extends ConsumerWidget {
ref.read(settingsProvider.notifier).setDownloadDirectory(result);
}
}
Future<void> _launchUrl(String url) async {
final uri = Uri.parse(url);
if (await canLaunchUrl(uri)) {
await launchUrl(uri, mode: LaunchMode.externalApplication);
}
}
}
+40 -3
View File
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:file_picker/file_picker.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/providers/theme_provider.dart';
@@ -133,18 +134,47 @@ class _SettingsTabState extends ConsumerState<SettingsTab> with AutomaticKeepAli
onChanged: (value) => ref.read(settingsProvider.notifier).setMaxQualityCover(value),
),
const Divider(),
// GitHub & Credits Section
_buildSectionHeader(context, 'GitHub & Credits', colorScheme),
ListTile(
leading: Icon(Icons.code, color: colorScheme.primary),
title: const Text('SpotiFLAC Mobile'),
subtitle: const Text('github.com/zarzet/SpotiFLAC-Mobile'),
onTap: () => _launchUrl('https://github.com/zarzet/SpotiFLAC-Mobile'),
),
ListTile(
leading: Icon(Icons.computer, color: colorScheme.primary),
title: const Text('Original SpotiFLAC (Desktop)'),
subtitle: const Text('github.com/afkarxyz/SpotiFLAC'),
onTap: () => _launchUrl('https://github.com/afkarxyz/SpotiFLAC'),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Text(
'Mobile version maintained by zarzet\nOriginal project by afkarxyz',
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: colorScheme.onSurfaceVariant,
),
),
),
const Divider(),
// About
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.5'),
onTap: () => showAboutDialog(
context: context,
applicationName: 'SpotiFLAC',
applicationVersion: '1.0.0',
applicationLegalese: '© 2024 SpotiFLAC',
applicationVersion: '1.0.5',
applicationLegalese: '© 2024 SpotiFLAC\n\nMobile: zarzet\nOriginal: afkarxyz',
),
),
@@ -392,4 +422,11 @@ class _SettingsTabState extends ConsumerState<SettingsTab> with AutomaticKeepAli
ref.read(settingsProvider.notifier).setDownloadDirectory(result);
}
}
Future<void> _launchUrl(String url) async {
final uri = Uri.parse(url);
if (await canLaunchUrl(uri)) {
await launchUrl(uri, mode: LaunchMode.externalApplication);
}
}
}
+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 -4
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.5+6
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:
@@ -75,4 +75,3 @@ flutter:
assets:
- assets/images/
- assets/icons/