Podcast Queue Manager
Build an Android podcast app in Kotlin focused on listening offline: subscribe to podcasts by their RSS feed (downloaded with the Ktor client), pick episodes to download, arrange them in a queue, and listen with the app remembering exactly where you stopped in each episode. Downloads run in the background with WorkManager, only on Wi-Fi if you prefer, resume after interruptions, and old finished episodes are cleaned up to save space. Podcasts, episodes, the queue and playback positions are stored with Room. You'll learn parsing RSS feeds, background downloads with WorkManager, Room, audio playback with Media3 ExoPlayer, managing storage, and designing for unreliable connections.
- Estimate
- ~12.5h
- Steps
- 7
- Completed by
- 0
- Proposed by
- codeseed.app
Room · Ktor
Project roadmap
- 01
Define the app
~1.5hWrite DESIGN.md: podcasts (feed URL, title and artwork), episodes (guid, title, audio URL, size, duration, publish date, download state, local file, playback position and whether it's finished), the queue order, the download rules (Wi-Fi only option, a limit on concurrent downloads, and retries), and the storage cleanup rules. Create a Compose project with Room, WorkManager, the Ktor client and Media3. Done when: DESIGN.md covers the data and rules.
- 02
Subscribe to feeds
~2hDownload a feed with the Ktor client (with a timeout) and parse the RSS XML (with XmlPullParser) into podcast and episode details, including the enclosure URL and size. Store them in Room, matching episodes by guid so refreshing a feed only adds new episodes. Refresh subscriptions periodically with a WorkManager job. Done when: subscribing to a real feed lists its episodes, and refreshing doesn't duplicate them.
- 03
Download episodes in the background
~2.5hQueue downloads as WorkManager jobs (with a network constraint, unmetered when Wi-Fi only is on), streaming the audio to a temporary file with the Ktor client, showing progress in a notification (as a foreground worker), and moving the file into place when complete. Resume interrupted downloads with an HTTP Range request when the server supports it, and retry failures with backoff. Done when: episodes download in the background with progress, and an interrupted download resumes.
- 04
Manage the queue
~1.5hBuild a queue screen where episodes can be added, reordered by dragging and removed, showing each one's download state (not downloaded, downloading with progress, downloaded or failed with a retry button). Download queued episodes automatically if the user chooses. Done when: the queue can be managed, and its order is kept after restarting.
- 05
Play and remember positions
~2hPlay episodes with Media3 ExoPlayer in a MediaSessionService (so playback continues in the background and shows media controls), from the local file when downloaded or streaming otherwise. Save the playback position every few seconds and on pause, resume from it next time, mark episodes finished near the end, and move to the next queued episode automatically. Done when: playback resumes where it stopped, even after restarting the phone.
- 06
Clean up storage
~1hShow how much storage downloads use, and delete finished episodes' files automatically after a configurable number of days (with a periodic WorkManager job), and let users delete downloads by hand. Done when: finished episodes are cleaned up, and the storage total updates.
- 07
Test it
~2hWrite tests: RSS parsing with saved feeds (including missing fields), Room DAO tests for the queue and positions, the download worker with a fake server (success, interruption and resume, and failure), and cleanup rules with fixed dates. Test by hand in airplane mode. Done when: all tests pass, and offline playback works.
Ready to build this?
Get a GitHub repo and start building. Your AI reviewer checks each step as you go.
Tech stack