Repository navigation
Conversation
- Streaming from any S3-compatible endpoint (Cloudeka etc.) using ListObjectsV2 + SigV4 signing and presigned GET URLs (path-style) - Local stream proxy with cached resolved URLs (55 min) and 1h presign TTL - Folder-based sync: pick bucket prefixes, sync to Room (DB v45), mirrored into the unified library - Background metadata queue (S3MetadataWorker): embedded tags, duration and album artwork probed via presigned range fetch after sync, 4 files in parallel; live progress banner on the dashboard - Editable saved connection, logout, per-folder re-sync - Queue snapshots keep original cloud URIs so playback survives proxy restarts; stale 127.0.0.1 entries are dropped on restore - SigV4 unit tests against AWS test vectors (plain JVM)
- CloudStreamProxy: dedicated upstream client with 15s connect / 30s read timeouts instead of the shared 8s API client; slow clouds (Cloudeka) routinely exceeded 8s to first byte, especially while the metadata probe queue was running - resolveCloudUri: retry once after 400ms before falling back — proxy warm-up races and network blips previously left a raw s3:// URI for ExoPlayer and failed with "unknown protocol" - Log each S3 resolve failure path (offline / proxy not ready / null resolution) for easier diagnosis
Align the download pipeline with SpotiFLAC-Mobile's gobackend contract: - Parse GetInstalledExtensions as the flat ExtensionInfo object (display_name, types, quality_options, has_download_provider, error_message, capabilities) instead of a nested manifest, so download providers and their quality options are detected. - Send service/download_provider = chosen download extension and source = search extension (was hard-coded "spotify", which Go's strict mode locked onto and always failed), plus provider/ISRC ids. - Write into a per-item output_dir so the extension picks the real file extension. - Add DownloadFinalizer: decrypt "ffmpeg.mov_key" streams (Amazon) with FFmpegKit using the reference key/muxer fallback ladder, then fill missing tags and cover art with TagLib before publishing. - Handle spotiflac://session-grant (and OAuth) browser callbacks in ExtensionCallbackActivity, completing the grant and retrying the downloads waiting on that extension's verification. - Download sheet: preselect the track's own, last used or only download extension; quality options follow the chosen extension. - Downloads page shows the extension home feed as a catalog before searching; restyle the queue as cards with cover, rounded progress and icon actions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sort installed and repository extensions A-Z (Go returns map order) - Show version, type and description on installed extension rows - Add a registry URL guide with a link to compatible SpotiFLAC extensions - Move download worker notifications and errors to string resources - Translate download, extension and S3 strings for every app language Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Local CPU caps are machine-specific and stay out of upstream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Search now runs through the chosen extension's customSearch with its manifest filters. Album, artist and playlist results open a page loaded via getProviderMetadata, with per-track download and download all. Catalog collections open the same page instead of a name search. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Moved to the okuru-id organization fork; supersedes #2920. Same commits, nothing changed.
Summary
Adds extension-based track downloads to a new Downloads screen. Extensions are SpotiFLAC-compatible
.sflxpackages, run through thegobackendAAR built from SpotiFLAC-Mobilego_backend(MIT). Finished files are saved into a SAF folder the user picks and media-scanned into the library..sflxfiles from storage, or browse and install from a user-configured registry URL (a GitHub repo or a directregistry.jsonlink).homeFeed.DownloadWorker, WorkManager, serial queue):downloadByStrategyin strict mode, locked to the chosen extension.ffmpeg.mov_key).spotiflac://callback activity completes the grant and automatically retries the waiting jobs.New dependency:
com.antonkarpenko:ffmpeg-kit-min(stream decryption). The bundledapp/libs/gobackend.aaris MIT-licensed SpotiFLAC-Mobile code.Notes for reviewers
docs/.Testing
Manually verified on a Galaxy A51 (Android 13):
No automated tests cover the download flow.
🤖 Generated with Claude Code