{"id":50491513,"url":"https://github.com/michaeldvinci/swiftshelf-androidtv","last_synced_at":"2026-06-02T03:04:43.845Z","repository":{"id":322173718,"uuid":"1088413613","full_name":"michaeldvinci/swiftshelf-androidtv","owner":"michaeldvinci","description":"AndroidTV client for Audiobookshelf not built in Swift","archived":false,"fork":false,"pushed_at":"2026-03-16T07:00:20.000Z","size":26952,"stargazers_count":8,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-16T19:09:45.589Z","etag":null,"topics":["androidtv","androidtv-app","audiobookshelf","nvidia-shield","self-hosted","selfhosted"],"latest_commit_sha":null,"homepage":"https://michaeldvinci.com","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/michaeldvinci.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-02T23:01:49.000Z","updated_at":"2026-03-16T06:59:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/michaeldvinci/swiftshelf-androidtv","commit_stats":null,"previous_names":["michaeldvinci/swiftshelf-androidtv"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/michaeldvinci/swiftshelf-androidtv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaeldvinci%2Fswiftshelf-androidtv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaeldvinci%2Fswiftshelf-androidtv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaeldvinci%2Fswiftshelf-androidtv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaeldvinci%2Fswiftshelf-androidtv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/michaeldvinci","download_url":"https://codeload.github.com/michaeldvinci/swiftshelf-androidtv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michaeldvinci%2Fswiftshelf-androidtv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33803759,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["androidtv","androidtv-app","audiobookshelf","nvidia-shield","self-hosted","selfhosted"],"created_at":"2026-06-02T03:04:43.174Z","updated_at":"2026-06-02T03:04:43.838Z","avatar_url":"https://github.com/michaeldvinci.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SwiftShelf for Android TV\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"screenshots/banner.jpg\" alt=\"SwiftShelf Icon\" width=\"500\"/\u003e\n\u003c/p\u003e\n\nA native Android TV client for [Audiobookshelf](https://www.audiobookshelf.org/), offering a sleek, remote-friendly interface for browsing and playing your audiobooks.\n\n![Screenshot: Home](screenshots/home.png)\n\n## Features\n\n### Authenticated Connection \u0026 Secure Storage\n- Logs in with Audiobookshelf host and API key\n- Credentials securely stored using Android's EncryptedSharedPreferences\n- Seamless reconnection after app relaunch\n\n![Screenshot: Library Selection](screenshots/library-select.png)\n\n### Library Selection \u0026 Persistence\n- Choose from available Audiobookshelf libraries\n- Select multiple libraries to browse at once\n- Remembers your selected libraries\n\n### Recent \u0026 Continue Listening Carousels\n- Browse recently added audiobooks\n- Pick up where you left off with in-progress items\n- Cover artwork with author, duration, and playback progress\n- Smooth horizontal scrolling carousels\n\n\u003c!-- ![Screenshot: Library Browse](screenshots/library-browse.png) --\u003e\n\n### Search\n- Query your library with natural search\n- Results display books with cover art and metadata\n- Quick access to search functionality\n\n![Screenshot: Search](screenshots/search.png)\n\n### Detailed Item Popup \u0026 Quick Play\n- Material Design dialog with book details\n- Author, narrator, series information\n- Duration and progress tracking\n- Chapter selection for direct playback\n- Play and Read buttons for audiobooks with ebooks\n\n![Screenshot: Book Details](screenshots/book-details.png)\n\n### Full-Screen Media Player\n- Immersive playback experience with blurred cover background\n- Transport controls: play/pause, skip forward/back (30s/10s)\n- Playback speed adjustments (0.5x - 3.0x)\n- Chapter navigation with expandable chapter list\n- Progress scrubbing with time display\n- D-pad optimized for Android TV remotes\n\n![Screenshot: Media Player](screenshots/full-player.png)\n\n### EPUB Reader\n- Two-page landscape layout optimized for TV\n- Sepia reading theme for comfortable viewing\n- Chapter navigation menu\n- Swipe or button navigation between pages\n\n### Customizable Experience\n- Adjust library item fetch count (default: 10)\n- Choose carousel progress-bar color\n- Set default playback speed\n- Persistent settings across sessions\n\n![Screenshot: Settings](screenshots/settings.png)\n\n### Authenticated Cover Fetching\n- Securely fetch cover images with authentication\n- Cached for smooth browsing performance\n- High-quality artwork display\n\n### Android TV Optimized\n- Remote-friendly navigation\n- D-pad and touch support\n- Focus-aware UI elements\n- Material Design 3 components\n- Landscape-optimized layouts\n\n## Technical Features\n\n- **Progress Sync**: Automatically syncs playback progress to Audiobookshelf (session sync every 15s, progress sync every 90s)\n- **Session Management**: Proper playback session handling with Audiobookshelf server\n- **MediaSession Integration**: System-level playback controls and notifications\n- **ExoPlayer**: High-quality audio playback with chapter support\n- **EPUB Support**: Built-in EPUB parser and reader for ebook content\n- **Jetpack Compose**: Modern, declarative UI framework\n- **Material Design 3**: Latest Android design guidelines\n\n## Requirements\n\n- Android TV device or Android device running Android 8.0 (API 26) or higher\n- Audiobookshelf server instance with API access\n- Network connection to your Audiobookshelf server\n\n## Installation\n\n### From Release\n1. Download the latest APK from the [Releases](https://github.com/michaeldvinci/swiftshelf-android/releases) page\n2. Install via ADB: `adb install swiftshelf-\u003cversion\u003e.apk`\n3. Or sideload using your preferred method\n\n### Building from Source\n1. Clone the repository\n2. Open in Android Studio\n3. Ensure you have JDK 17 installed\n4. Build and run on your Android TV device or emulator\n\n```bash\n./gradlew assembleDebug\nadb install app/build/outputs/apk/debug/app-debug.apk\n```\n\n## Configuration\n\n### First Launch\n1. Launch SwiftShelf on your Android TV\n2. Enter your Audiobookshelf host URL (e.g., `https://abs.example.com`)\n3. Enter your API key (found in Audiobookshelf settings)\n4. Select one or more libraries to browse\n\n### Debug Configuration (Development)\nFor testing during development, you can create a config file:\n\n```json\n// .swiftshelf-config.json\n{\n  \"host\": \"https://your-abs-server.com\",\n  \"apiKey\": \"your-api-key-here\"\n}\n```\n\n## Architecture\n\n- **MVVM Pattern**: Clean separation of concerns\n- **Repository Pattern**: Data layer abstraction\n- **Kotlin Coroutines**: Asynchronous operations\n- **StateFlow**: Reactive state management\n- **Retrofit**: Network communication\n- **Room** (planned): Local caching\n- **Coil**: Image loading and caching\n\n## Development\n\n### Project Structure\n```\napp/src/main/java/com/swiftshelf/\n├── MainActivity.kt              # Main entry point\n├── SwiftShelfViewModel.kt       # App state management\n├── audio/\n│   ├── GlobalAudioManager.kt    # Audio playback management\n│   └── MediaSessionManager.kt   # System media controls\n├── data/\n│   ├── model/                   # Data models\n│   ├── network/                 # API client\n│   └── repository/              # Data repositories\n├── epub/\n│   └── EPUBParser.kt            # EPUB file parsing\n├── ui/\n│   ├── screens/                 # Composable screens\n│   │   ├── BookDetailsDialog.kt # Book info popup\n│   │   ├── CompactPlayer.kt     # Mini player banner\n│   │   ├── EpubReaderScreen.kt  # EPUB reader\n│   │   ├── LibraryBrowseScreen.kt # Main browse UI\n│   │   ├── MediaPlayerScreen.kt # Full-screen player\n│   │   └── ...\n│   └── theme/                   # App theming\n└── util/\n    └── SecurePreferences.kt     # Encrypted storage\n```\n\n### Building\n- Minimum SDK: 26 (Android 8.0)\n- Target SDK: 34 (Android 14)\n- Kotlin: 1.9.20\n- Gradle: 8.11.1\n- Android Gradle Plugin: 8.10.1\n\n## Roadmap\n\n- [ ] Offline playback support\n- [ ] Sleep timer\n- [ ] Playback queue management\n- [ ] Bookmarks\n- [ ] Android Auto integration\n- [ ] Cast support\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\n[License information to be added]\n\n## Acknowledgments\n\n- [Audiobookshelf](https://www.audiobookshelf.org/) - The amazing audiobook server\n- The Android and Jetpack Compose communities\n\n## Support\n\nFor issues and feature requests, please use the [GitHub Issues](https://github.com/michaeldvinci/swiftshelf-android/issues) page.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichaeldvinci%2Fswiftshelf-androidtv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichaeldvinci%2Fswiftshelf-androidtv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichaeldvinci%2Fswiftshelf-androidtv/lists"}