base on Minimalistic Android client app for Audiobookshelf # Lissen - Clean Audiobookshelf Player [![Build Lissen App](https://github.com/GrakovNe/lissen-android/actions/workflows/build_app.yml/badge.svg)](https://github.com/GrakovNe/lissen-android/actions/workflows/build_app.yml) <p align="center"> <a href="https://play.google.com/store/apps/details?id=org.grakovne.lissen"><img src="https://upload.wikimedia.org/wikipedia/commons/7/78/Google_Play_Store_badge_EN.svg" alt="Get it on Google Play" height="60"></a>&nbsp;&nbsp;&nbsp;<!-- --><a href="https://f-droid.org/packages/org.grakovne.lissen"><img src="https://upload.wikimedia.org/wikipedia/commons/a/a3/Get_it_on_F-Droid_%28material_design%29.svg" alt="Get it on F-Droid" height="60"></a> &nbsp;&nbsp;&nbsp;<!-- --><a href="https://www.rustore.ru/catalog/app/org.grakovne.lissen"><img src="https://www.rustore.ru/help/icons/logo-color-dark.svg" alt="Get it on RuStore" height="60"></a> </p> ### Project Update 05.06.25 Since the release of v1.5.0, a lot of feature requests have piled up — but many of them can’t just be added as-is. They require rethinking the app’s structure, screens, and overall UX. I’ll be taking some time until early July to explore ideas, sketch out alternatives, and figure out the best direction forward. Development will pick back up after that with a clearer vision. ### Features * Beautiful Interface: Intuitive design that makes browsing and listening to your audiobooks easy and enjoyable. * Cloud Sync: Automatically syncs your audiobook progress across devices, keeping everything up to date no matter where you are. * Streaming Support: Stream your audiobooks directly from the cloud without needing to download them first. * Offline Listening: Download audiobooks to listen offline, ideal for those who want to access their collection without an internet connection. ### Screenshots <p align="center"> <img src="https://github.com/GrakovNe/lissen-android/raw/main/metadata/en-US/images/phoneScreenshots/1.png" alt="Screenshot 1" width="200"> <img src="https://github.com/GrakovNe/lissen-android/raw/main/metadata/en-US/images/phoneScreenshots/2.png" alt="Screenshot 2" width="200"> <img src="https://github.com/GrakovNe/lissen-android/raw/main/metadata/en-US/images/phoneScreenshots/3.png" alt="Screenshot 3" width="200"> <img src="https://github.com/GrakovNe/lissen-android/raw/main/metadata/en-US/images/phoneScreenshots/4.png" alt="Screenshot 4" width="200"> </p> ### Disclaimer Lissen is not a clone of the official Audiobookshelf app and does not aim to replicate all of its features. The goal of this project is to provide a minimalistic interface and a seamless experience for listening to audiobooks and podcasts. If there’s a feature you feel is missing or would significantly improve your experience, feel free to open an issue and share your suggestion. While not every feature request will be implemented, all ideas are welcome and will be thoughtfully considered. ### Building 1. Clone the repository: ``` git clone https://github.com/grakovne/lissen.git ``` 2. Setup the SDK into your local.properties file ``` nano local.properties ``` 3. Open the project in Android Studio or build it manually ``` ./gradlew assembleDebug # Debug Build ./gradlew assembleRelease # Release Build ``` 5. Build and run the app on an Android device or emulator. ### Localization Help us translate Lissen into more languages! We use [Weblate](https://hosted.weblate.org/engage/lissen/) to manage translations. Current localization status: <a href="https://hosted.weblate.org/engage/lissen/"> <img src="https://hosted.weblate.org/widget/lissen/android-app/multi-auto.svg" alt="Translation status" /> </a> To contribute: 1. Visit the [Lissen translation project](https://hosted.weblate.org/engage/lissen/). 2. Sign up or log in to Weblate. 3. Start translating or reviewing existing translations for your preferred language. ### Demo Environment You can connect to a demo [Audiobookshelf](https://github.com/advplyr/audiobookshelf) instance through the Lissen app: ``` URL: https://demo.lissenapp.org Username: demo Password: demo ``` This instance contains only Public Domain audiobooks from [LibriVox](https://librivox.org/) and is intended solely for demonstrating the client’s functionality. ## License Lissen is open-source and licensed under the MIT License. See the LICENSE file for more details. ", Assign "at most 3 tags" to the expected json: {"id":"13575","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"