Strep is a Flutter Android music player for local audio playback, file import, queue management, background playback controls, custom thumbnails, and permitted YouTube audio downloads.
- Import local audio files with Android's file picker.
- Play, pause, seek, skip, and manage a playback queue.
- Keep the mini player, now playing screen, and Android media notification in sync through
audio_serviceand onejust_audioplayer. - Download audio from normal public YouTube videos supported by
youtube_explode_dart. - Track foreground/background download progress, cancellation, retry, and persistence.
- Edit song title, artist, album, and custom thumbnails.
- Persist the library with SharedPreferences.
Imports allow:
- MP3
- M4A
- AAC
- WAV
- FLAC
- OGG
- WEBM
Actual playback support can still depend on the Android device codecs and the stream/container produced by the source.
Only download content you own or have permission to download. Strep does not implement DRM bypass, cookie login, age-gate bypass, region-lock bypass, anti-bot evasion, or any workaround for YouTube restrictions. Downloads are limited to normal public content accessible through youtube_explode_dart.
Known limitations:
- Private, members-only, purchased, age-restricted, region-blocked, live-only, or otherwise unavailable videos may fail.
- Network failures and upstream YouTube changes can interrupt downloads.
- Playlist and quality-selection workflows are not implemented yet.
- Flutter stable and Dart
providerfor app statejust_audiofor playbackaudio_servicefor Android media notification/session controlsyoutube_explode_dartfor public YouTube metadata and streamsfile_pickerfor Storage Access Framework-style importspath_providerfor app-owned download storageshared_preferencesfor library persistencepermission_handleranddevice_info_plusfor version-aware optional media scanning permissions
- Flutter stable SDK
- Dart SDK bundled with Flutter
- Android Studio or an Android SDK installation
- Android emulator or device
Check your local toolchain:
flutter --version
dart --version
flutter doctorgit clone https://github.com/lucifron28/strep_app.git
cd strep_app
flutter pub getflutter runUseful checks:
flutter analyze
flutter test
flutter build apk --debugDebug APK:
flutter build apk --debugRelease APKs must be signed with your own key. Do not commit keystores, passwords, APKs, AABs, or android/key.properties.
Create android/key.properties locally:
storePassword=your-store-password
keyPassword=your-key-password
keyAlias=upload
storeFile=app/upload-keystore.jksThen build:
flutter build apk --releasePublish installable APKs through GitHub Releases or GitHub Actions artifacts, not by committing files under build/.
Strep requests only the Android permissions needed for its implemented behavior:
INTERNETfor YouTube metadata and downloads.- Foreground media playback service permissions for background audio controls.
READ_MEDIA_AUDIOon Android 13+ only when scanning shared audio folders.READ_EXTERNAL_STORAGEup to Android 12L only when scanning shared audio folders.
Normal file imports use the system file picker, so broad storage access and MANAGE_EXTERNAL_STORAGE are not required. Custom thumbnails use Android Photo Picker where available rather than broad image-library permission.
MusicProviderowns library state, queue state, import/download integration, and persistence coordination.AudioServiceIntegrationinitializesaudio_serviceand exposes oneStrepAudioHandler.StrepAudioHandlerowns the singlejust_audioplayer used for normal playback and notification controls.YouTubeDownloadServicevalidates URLs, fetches video info, downloads to.partfiles, handles cancellation, and returns typed results.DownloadManagerServicequeues background downloads, throttles progress updates, supports cancellation/retry, and reports completed songs back toMusicProvider.SongStorageServicepersists the library as JSON in SharedPreferences.
SharedPreferences is sufficient for the current library size and compatibility needs. A future migration to a local database should be considered before adding playlists, full-text search, large-library indexing, or richer relational metadata.
- If imports show no files, confirm the selected files use one of the supported extensions.
- If folder scanning is denied, enable audio/media permission in Android app settings.
- If a song no longer plays, the underlying file may have been moved or deleted.
- If YouTube info or downloads fail, try a normal public video URL and verify network access.
- If release signing fails, check
android/key.propertiespaths and passwords.
- Local database migration for larger libraries.
- Folder browser and explicit media-store scanning UI.
- Playlists and favorites.
- Lyrics and richer metadata extraction.
- Optional audio effects and crossfade.
- Better artwork caching.
Bug reports should include Android version, device/emulator, steps to reproduce, expected behavior, actual behavior, and any relevant flutter analyze or log output. Pull requests should run:
flutter format .
flutter analyze
flutter test
flutter build apk --debugMIT License. See LICENSE.