How code-saksham-hash/resona works
Purpose and Entry Points
Resona is an anonymous Android music-streaming client for YouTube Music’s private InnerTube APIs. It searches, browses, resolves protected audio streams, plays via a foreground media service, and persists local likes, history, and downloads.
Android startup and app-level dependency wiring are in app/src/main/java/com/resona/music/ResonaApplication.kt, app/src/main/java/com/resona/music/MainActivity.kt, and app/src/main/java/com/resona/music/di/AppModule.kt.
Module Boundary and Dependency Direction
The architecture is intentionally layered:
• core/domain is pure Kotlin: shared models plus the MusicRepository contract at core/domain/src/main/kotlin/com/resona/music/domain/repository/MusicRepository.kt.
• core/data implements remote access, extraction, and local persistence, centered on core/data/src/main/java/com/resona/music/data/repository/MusicRepositoryImpl.kt.
• Feature UI modules consume domain interfaces, while app provides concrete bindings through app/src/main/java/com/resona/music/di/RepositoryModule.kt.
• Playback is isolated from feature UI in core/player.
This prevents feature modules from directly accessing network clients or data implementations.
Navigation and Compose Feature Surface
The app shell owns destination definitions and navigation composition in app/src/main/java/com/resona/music/ui/navigation/Destinations.kt and app/src/main/java/com/resona/music/ui/navigation/NavGraph.kt.
Feature modules supply screens and view models for independently scoped flows: home (feature/home/src/main/java/com/resona/music/ui/home/HomeScreen.kt), search (feature/search/src/main/java/com/resona/music/ui/search/SearchViewModel.kt), library (feature/library/src/main/java/com/resona/music/ui/library/LibraryScreen.kt), and now-playing UI (feature/player/src/main/java/com/resona/music/ui/nowplaying/NowPlayingScreen.kt). Shared visual tokens/components reside in core/ui/src/main/java/com/resona/music/ui/theme/Theme.kt.
Repository and InnerTube Data Flow
UI view models invoke MusicRepository; its implementation converts InnerTube responses into domain models. Network construction is app-provided in app/src/main/java/com/resona/music/di/NetworkModule.kt, while API calls and transport models live in core/data/src/main/java/com/resona/music/data/remote/innertube/InnerTubeApi.kt and core/data/src/main/java/com/resona/music/data/remote/innertube/models/.
The remote boundary is YouTube Music InnerTube endpoints for search, player, browse, and radio/next operations. The client uses anonymous visitor-token-based access and retries across client identities through core/data/src/main/java/com/resona/music/data/extractor/InnerTubeExtractionClient.kt.
Stream Extraction and Deciphering
Playback cannot consume a song until the extractor obtains a usable media URL. core/data/src/main/java/com/resona/music/data/extractor/YouTubeStreamExtractor.kt coordinates player-response retrieval and protected URL resolution.
Signature and CDN-throttling transforms are derived from YouTube player JavaScript via core/data/src/main/java/com/resona/music/data/extractor/decipher/DecipherService.kt and core/data/src/main/java/com/resona/music/data/extractor/decipher/PlayerJsRepository.kt. JavaScript executes in Android WebView rather than a bundled JS runtime, behind core/data/src/main/java/com/resona/music/data/extractor/WebViewJsEngine.kt.
Playback Control Plane
core/player/src/main/java/com/resona/music/playback/PlayerService.kt is the Media3/ExoPlayer foreground-service and MediaSession boundary. It receives resolved stream data through the playback data-source wiring in core/player/src/main/java/com/resona/music/playback/PlaybackDataSourceModule.kt.
core/player/src/main/java/com/resona/music/playback/PlayerViewModel.kt exposes shared player state and transport actions to mini-player and now-playing surfaces, including queue-aware navigation.
On-Device State and Offline Content
Local user state remains device-local, using dedicated stores: likes at core/data/src/main/java/com/resona/music/data/likes/LikedSongsStore.kt, bounded play history at core/data/src/main/java/com/resona/music/data/history/PlayHistoryStore.kt, and downloaded-song metadata at core/data/src/main/java/com/resona/music/data/download/DownloadedSongsStore.kt.
core/data/src/main/java/com/resona/music/data/download/SongDownloader.kt materializes resolved streams into app storage using download-specific orchestration, separating offline persistence from streaming playback.
Components 22
App shell
- Application startup · Initializes app-level dependency wiring.
app/src/main/java/com/resona/music/ResonaApplication.kt - Main activity
app/src/main/java/com/resona/music/MainActivity.kt - Navigation graph · Composes destinations and feature screens.
app/src/main/java/com/resona/music/ui/navigation/NavGraph.kt - Repository bindings · Binds domain contracts to data implementations.
app/src/main/java/com/resona/music/di/RepositoryModule.kt - Network bindings
app/src/main/java/com/resona/music/di/NetworkModule.kt
Compose features
- Home
feature/home/src/main/java/com/resona/music/ui/home/HomeScreen.kt - Search
feature/search/src/main/java/com/resona/music/ui/search/SearchViewModel.kt - Library
feature/library/src/main/java/com/resona/music/ui/library/LibraryScreen.kt - Now playing
feature/player/src/main/java/com/resona/music/ui/nowplaying/NowPlayingScreen.kt - Shared UI theme
core/ui/src/main/java/com/resona/music/ui/theme/Theme.kt
Domain
- Music repository · Pure Kotlin interface for music operations.
core/domain/src/main/kotlin/com/resona/music/domain/repository/MusicRepository.kt
Data and extraction
- Repository implementation · Maps remote and local data into domain models.
core/data/src/main/java/com/resona/music/data/repository/MusicRepositoryImpl.kt - InnerTube API · Searches, browses, resolves player data, and fetches radio queues.
core/data/src/main/java/com/resona/music/data/remote/innertube/InnerTubeApi.kt - Extraction client · Uses visitor tokens and retries client identities.
core/data/src/main/java/com/resona/music/data/extractor/InnerTubeExtractionClient.kt - Stream extractor · Obtains usable media URLs from player responses.
core/data/src/main/java/com/resona/music/data/extractor/YouTubeStreamExtractor.kt - Decipher service · Derives signature and throttling transforms from player JavaScript.
core/data/src/main/java/com/resona/music/data/extractor/decipher/DecipherService.kt - Player JS repository
core/data/src/main/java/com/resona/music/data/extractor/decipher/PlayerJsRepository.kt - WebView JS engine · Executes player JavaScript in Android WebView.
core/data/src/main/java/com/resona/music/data/extractor/WebViewJsEngine.kt - Local state stores · Stores likes, bounded history, and downloaded metadata.
core/data/src/main/java/com/resona/music/data/likes/LikedSongsStore.kt - Song downloader · Writes resolved streams to app storage.
core/data/src/main/java/com/resona/music/data/download/SongDownloader.kt
Playback
- Player service · MediaSession and ExoPlayer boundary for streaming playback.
core/player/src/main/java/com/resona/music/playback/PlayerService.kt - Player view model · Exposes transport actions and queue-aware player state.
core/player/src/main/java/com/resona/music/playback/PlayerViewModel.kt
Connections 30
- Application startup → Repository bindings: installs
- Application startup → Network bindings: installs
- Main activity → Navigation graph: hosts
- Navigation graph → Home: routes to
- Navigation graph → Search: routes to
- Navigation graph → Library: routes to
- Navigation graph → Now playing: routes to
- Home → Music repository: uses
- Search → Music repository: uses
- Library → Music repository: uses
- Home → Shared UI theme: uses
- Search → Shared UI theme: uses
- Library → Shared UI theme: uses
- Now playing → Shared UI theme: uses
- Now playing → Player view model: controls
- Repository bindings → Music repository: binds
- Repository bindings → Repository implementation: provides
- Network bindings → InnerTube API: constructs
- Repository implementation → InnerTube API: queries
- Repository implementation → Local state stores: persists state
- Repository implementation → Stream extractor: resolves streams
- Stream extractor → Extraction client: retrieves player response
- Extraction client → InnerTube API: calls endpoints
- Stream extractor → Decipher service: deciphers protected URLs
- Decipher service → Player JS repository: loads player JS
- Decipher service → WebView JS engine: executes transforms
- Song downloader → Stream extractor: gets resolved stream
- Song downloader → Local state stores: records download
- Player service → Stream extractor: receives resolved stream data
- Player view model → Player service: observes and controls