FLUTTER ECOSYSTEM

lohanidamodar/flutter_audiobooks_app

现在支持 Flutter 3 - 使用 Librivox API 的 Flutter 音频书下载器和播放器

有声读物 项目封面
Stars
180
Forks
54
最近推送(UTC)
2026年9月20日
项目状态
未归档
Damodar Lohani GitHub avatar
GITHUB User

Damodar Lohani ↗

Flutter & Full-stack Consultant | Open source enthusiast ❤

@appwrite PopupBitsKathmandu, Nepal官方网站 ↗
语言DartRubyPythonHTMLSwiftShellKotlinObjective-C

技术话题

关联插件与示例

使用的依赖

依赖清单 25 项

App 分类

原始 README

以下为英文项目原文快照,最新内容请访问 GitHub。

展开 / 收起项目 README

Listora

Listora — a beautiful, free audiobook player for the public-domain LibriVox catalogue (served via the Internet Archive). Browse, stream, download for offline listening, and pick up right where you left off — all free, forever.

Screenshots

https://raw.githubusercontent.com/lohanidamodar/flutter_audiobooks_app/HEAD/playstore_screenshots/01_home.png https://raw.githubusercontent.com/lohanidamodar/flutter_audiobooks_app/HEAD/playstore_screenshots/03_now_playing.png https://raw.githubusercontent.com/lohanidamodar/flutter_audiobooks_app/HEAD/playstore_screenshots/04_library.png https://raw.githubusercontent.com/lohanidamodar/flutter_audiobooks_app/HEAD/playstore_screenshots/05_search.png

Features

  • Browse — most-downloaded and recently-added books from the LibriVox collection
  • Search by title or author; tap any author to see all their readings ("More by …" rails + a full author page)
  • Immersive player — full-screen now-playing with a cover-colour gradient, scrubber, ±10s/30s, variable speed (persisted), and lock-screen / notification controls
  • Resume — playback position is bookmarked per book and restored automatically
  • Sleep timer — 15/30/45/60 min or end-of-chapter
  • Offline — download single chapters or a whole book; downloaded chapters play from disk; per-chapter and per-book removal
  • Library — Favourites, Continue listening, and Downloaded in one place
  • Favourites — heart a book from its page or directly on any cover
  • Theming — dark-first immersive UI (built on the popup_bits_design system) with light / dark / system modes

Tech stack

  • Flutter 3.44 / Dart 3.12
  • State: Riverpod 3 (hand-written providers, no codegen)
  • Audio: just_audio + just_audio_background
  • Downloads: background_downloader
  • Cache: sqflite (catalogue) + shared_preferences (bookmarks, favourites, settings)
  • Theme: popup_bits_design + google_fonts (Fraunces display)
  • Cover colours: palette_generator

Project layout

lib/
  main.dart                 app entry, ProviderScope, theme
  pages/                    main_shell, home, library, book_details,
                            now_playing, settings
  providers/                providers.dart (data/player/downloads/favourites),
                            settings_provider, sleep_timer_provider
  resources/                repository + archive.org API, sqflite cache,
                            audio_helper, downloads_service, favorites_service,
                            playback_bookmarks
  widgets/                  book_cards, mini_player, seek_bar, immersive_scrubber

Running

The app targets a real device/emulator (audio + downloads).

flutter pub get
flutter run

Release signing

Release builds are signed from credentials in android/key.properties, which is gitignored (this is a public repo — the keystore and passwords are never committed). If the file is absent, release falls back to debug signing so the project still builds for anyone who clones it.

To set it up, copy android/key.properties.example to android/key.properties, generate an upload keystore, and point storeFile at it:

keytool -genkey -v -keystore ~/upload-keystore.jks \
  -keyalg RSA -keysize 2048 -validity 10000 -alias upload

Keep the keystore and its passwords backed up somewhere safe and out of the repo. Using Google Play App Signing is recommended (your committed key is just an upload key, which can be reset if lost).

Store assets

Ready-to-upload Play Store art lives in playstore_screenshots/: the listing icon (play_store_icon_512.png), feature_graphic.png, raw phone screenshots, and branded marketing frames under marketing/. The launcher icon is generated with flutter_launcher_icons (dart run flutter_launcher_icons).

License & content

App code is open source. All audiobook content is public domain, provided by LibriVox volunteers via the Internet Archive.