A clean Flutter audio player focused on local music, playlists, device audio discovery, and a smooth player experience.
Yahya Mansoub
Orpheus is a Flutter-based local audio player. It is designed around a modular architecture with separated app setup, models, services, controllers, screens, and widgets.
The app currently supports local audio imports, a unified Radar-based library, playlist work, playback controls, a mini-player, a full player screen, device audio discovery, and theme settings.
- Import audio files from the device.
- Store imported tracks locally.
- Prevent duplicate tracks.
- Keep added tracks after app restart.
- Handle missing or unavailable files gracefully.
- Mini-player with current track and progress.
- Full player screen.
- Play / pause support.
- Seek support.
- Previous / next controls.
- Queue-based playback.
- Radar is the main audio library and device-audio discovery area.
- Shows your library tracks at the top.
- Supports manual audio selection.
- Native Android MediaStore scanning can be wired through the app’s
orpheus/radarMethodChannel. - Uses Android audio permissions:
READ_MEDIA_AUDIOfor Android 13+READ_EXTERNAL_STORAGEfor Android 12 and below
- Switch between system, light, and dark themes.
- Theme preference persists after restart.
- Dedicated playlists area.
- Intended playlist support:
- create playlists
- add name
- add description
- add image
- add tracks
- play playlist tracks
- Home screen navigation hub.
- Drawer/sidebar navigation.
- Separate screens for Home, Radar, Playlists, Settings, and Player.
- Flutter for cross-platform UI.
- Dart for app logic.
- Android / Kotlin for native MediaStore access.
- just_audio for playback.
- file_picker for manual audio selection.
- shared_preferences for lightweight local persistence.
- GitHub Actions for CI checks.
lib/
main.dart
app/
orpheus_app.dart
app_routes.dart
models/
audio_track.dart
playlist.dart
services/
audio_library_service.dart
audio_player_service.dart
permission_service.dart
radar_service.dart
playlist_service.dart
settings_service.dart
controllers/
library_controller.dart
player_controller.dart
playlist_controller.dart
settings_controller.dart
screens/
home_screen.dart
radar_screen.dart
playlists_screen.dart
settings_screen.dart
player_screen.dart
widgets/
app_drawer.dart
empty_state.dart
mini_player.dart
player_controls.dart
track_tile.dart
Some playlist files may be added as playlist development progresses.
Install:
- Flutter stable
- Dart SDK
- Android Studio
- Android SDK
- Android emulator or physical Android device
Check your setup:
flutter doctorClone the repository:
git clone https://github.com/YOUR_USERNAME/Orpheus.git
cd OrpheusInstall dependencies:
flutter pub getRun checks:
dart format .
flutter analyze
flutter testRun on Android emulator:
flutter devices
flutter run -d emulator-5554If your emulator has a different ID, use the ID shown by:
flutter devicesPush a song into the emulator:
adb push ~/Music/song.mp3 /sdcard/Music/song.mp3Ask Android to index the file:
adb shell am broadcast \
-a android.intent.action.MEDIA_SCANNER_SCAN_FILE \
-d file:///sdcard/Music/song.mp3Then open the app:
Radar → Scan device
or manually:
Radar → Select audio
Format:
dart format .Analyze:
flutter analyzeRun tests:
flutter testRun app:
flutter run -d emulator-5554Build debug APK:
flutter build apk --debugClean project:
flutter clean
flutter pub getThe repository uses GitHub Actions for Flutter checks.
Recommended CI steps:
flutter pub get
dart format --output=none --set-exit-if-changed .
flutter analyze
flutter test
flutter build apk --debug
i'll need to test this out more and also expand the features as i think there still work to be done right there.
This project is licensed under the MIT License.
See the LICENSE file for details.