FLUTTER ECOSYSTEM

tsacdop/tsacdop

使用 Tsacdop 欣赏播客!一个用 Flutter 构建的播客播放器。

Tsacdop 项目封面
Stars
525
Forks
100
最近推送(UTC)
2026年9月26日
项目状态
未归档
Tsacdop GitHub avatar
GITHUB Organization

Tsacdop ↗

语言DartRubyJavaSwiftKotlinObjective-C

技术话题

关联插件与示例

使用的依赖

依赖清单 66 项

App 分类

原始 README

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

展开 / 收起项目 README

Tsacdop Banner

github action GitHub Release Github Downloads Localizely License badge fdroid install

About

Enjoy podcasts with Tsacdop.

Tsacdop is a podcast player developed with Flutter, a clean, simply beautiful, and friendly app, which is also free and open source.

Credit to the Flutter team and all involved plugins, especially webfeed, Just_Audio, and Provider.

The podcast search engine is powered by, ListenNotes & PodcastIndex.

Features

  • Podcast group management
  • Playlists support
  • Sleep timer / speed setting
  • OPML file export and import
  • Auto-syncing in the background
  • Listening and subscription history record
  • Dark mode / accent color
  • Download for offline play
  • Auto-download new episodes / auto-delete outdated downloads
  • Settings backup
  • Skip silence
  • Boost volume

More to come...

Preview

Home Page Group Podcast Episode Dark Mode
https://raw.githubusercontent.com/stonega/tsacdop/master/preview/1585893838840.png https://raw.githubusercontent.com/stonega/tsacdop/master/preview/1585894051734.png https://raw.githubusercontent.com/stonega/tsacdop/master/preview/1585893877702.png https://raw.githubusercontent.com/stonega/tsacdop/master/preview/1585896237809.png https://raw.githubusercontent.com/stonega/tsacdop/master/preview/1585893920721.png

Localization

Please [Email](mailto:<tsacdop.app@gmail.com>) me you'd like to contribute to support more languages!

Credit to Localizely for kind support to open source projects.

English
Chinese Simplified
French
Spanish
Portuguese

License

Tsacdop is licensed under the GPL v3.0 license.

Build

The current toolchain is Flutter 3.47.2, Dart 3.13.2, Android Gradle Plugin 9.3.1, Gradle 9.5, and JDK 21. Android release lint requires JDK 21. The iOS deployment target is 15.0.

  1. Install Flutter and JDK 21, then fetch the source code.
git clone https://github.com/stonega/tsacdop.git
cd tsacdop
flutter config --jdk-dir /path/to/jdk-21
  1. Resolve the dependencies.
flutter pub get
  1. Optionally supply a Listen Notes API key at build time. Without it, the app uses Podcast Index search only. Do not commit the key to the repository.
flutter run --flavor fdroid \
  --dart-define=LISTEN_NOTES_API_KEY=your_key
  1. Build Android artifacts. The F-Droid release is intentionally unsigned so that the store can sign it. The Play flavor reads its signing credentials from KEYSTORE, KEYSTORE_PASSWORD, KEY_ALIAS, and KEY_PASSWORD.
flutter build apk --debug --flavor fdroid

JAVA_HOME=/path/to/jdk-21 \
  ./android/gradlew -p android assembleFdroidRelease

flutter build appbundle --release --flavor play \
  --dart-define=LISTEN_NOTES_API_KEY=your_key
  1. For iOS, run pod install in ios/ on macOS, then build with Xcode or Flutter.
cd ios
pod install
cd ..
flutter build ios --release --no-codesign \
  --dart-define=LISTEN_NOTES_API_KEY=your_key

Plugins that need compatibility patches are vendored in third_party/. Each fork includes an UPSTREAM.md file recording its original repository, pinned commit, and local changes.

You can obtain a Listen Notes key from Listen Notes.

Contribute

If you have an issue or found a bug, please raise a GitHub issue. Pull requests are also welcome.

Architecture

Plugins
  • Local storage
    • sqflite
    • shared_preferences
  • Audio
    • just_audio
    • audio_service
  • State management
    • provider
  • Download
    • flutter_downloader
  • Background task
    • workmanager
Directory Structure
UI
src
└──home
   ├──home.dart [Homepage]
   ├──searc_podcast.dart [Search Page]
   └──playlist.dart [Playlist Page]
└──podcasts
   ├──podcast_manage.dart [Group Page]
   └──podcast_detail.dart [Podcast Page]
└──episodes
   └──episode_detail.dart [Episode Page]
└──settings
   └──setting.dart [Setting Page]

STATE
src
└──state
   ├──audio_state.dart [Audio State]
   ├──download_state.dart [Episode Download]
   ├──podcast_group.dart [Podcast Groups]
   ├──refresh_podcast.dart [Episode Refresh]
   └──setting_state.dart [Setting]

Service
src
└──service
   ├──api_service.dart [Podcast Search]
   ├──gpodder_api.dart [Gpodder intergate]
   └──ompl_builde.dart [OMPL export]

Known Issue

  • Playlist is unstable

Contact

You can reach out to me directly at [tsacdop.app@gmail.com](mailto:<tsacdop.app@gmail.com>).

Or you can join our Telegram Group.

Getting Started with Flutter

This project is a starting point for a Flutter application.

Here are a few resources to get you started if this is your first Flutter project:

For help getting started with Flutter, view our online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.