No description
Find a file
Jarne Demeulemeester 00c84fa9d5
Items and downloads rework (#329)
* refactor WIP: stop using `BaseItemDto` but use custom items specific to Findroid

This will make it easier to support downloaded items

* refactor: split `MediaInfoFragment` into `MovieFragment` and `ShowFragment`

* feat: add download icons to items

* feat WIP: download movies

* feat: download movie and play local file

* fix: remove `VideoVersionDialogFragment` from `ShowFragment`

* feat: select which version you want to download

* feat: delete downloaded movie

* feat: download progress indicator

* refactor: rename JellyfinItems to FindroidItems

* feat: offline mode (movies only)

* feat: offline mode card

* feat: download external files

* feat: toggle played on downloads

* feat: convert intros to `FindroidIntro`

* refactor: add itemId and sourceId to external downloaded subtitle filenames

* refactor: simplify `onMediaItemTransition`

* refactor: clean up some player item logic

* feat: download trickPlay data

* refactor: downloading of item to only require the item and a source id

* fix: external subtitle title

* feat: add `DownloadsFragment`

* feat: download episodes

* fix: cascade deletion if last item

* feat: download intro timestamps

* feat WIP: add storage activity

* feat: user data in separate table

* feat: add buttons to season fragment

* fix: improve responsiveness of the watched and favorite buttons

* fix: move `ic_database.xml` to main

* perf: optimize home fragment by limiting the number of items

* fix: database improvements

- use compound primary key for FindroidUserDataDto instead of id
- set played to false when playback percentage is below 90%
- capitalize SQL keywords
- update favorite in userdata
- set primary key of TrickPlayManifestDto to itemId
- prepare to sync data back to server

* feat: sync playback progress

This includes playback position, played and favorite

* fix: use non-transitive r classes

* lint: ktlint fix

* refactor: centralize item buttons in `item_actions.xml`

* feat: show intermediate progress when progress is less than 5

Also remove delete button from item_actions.xml

* feat: remove intros

* feat: check available storage space before downloading

* fix: trailer button

* refactor: make indexNumberEnd nullable

* feat: add offline mode toggle in settings

* fix: download over mobile data and roaming

* feat: immediately show spinner when tapping download

* revert: season fragment buttons

* feat: snackbar in downloads fragment

This snackbar is displayed when there is no connection to the server but the app is not in Offline Mode (Offline Mode is required to play content when the server is unavailable)

* refactor: make onReceive arguments non nullable

* fix: handle download finished / failed when BroadcastReceiver does not work

* fix: download multiple episodes

* feat: download to external storage (SD card)

* fix: reset download button when dialog is dismissed

* feat(offline): show "continue watching" episodes on home

* fix: watch progress bar on episode item in season

* feat(offline): next up items

* lint: fix some linting issues

* lint: fix some linting issues

* lint: fix some linting issues

* feat: remove StorageActivity

StorageActivity is not ready yet and out of scope for this PR

* fix: collection types that are not known crash the media fragment

* fix: downloading trick play data

* fix: sort downloaded items

* fix: navigate back if item is deleted instead of showing error

Navigate back based on NullPointerException in loadData method of viewmodels. This may not be the best approach but it works well enough.

Navigating back from BottomSheetFragment does not trigger onResume of previous fragment which in turn does not refresh its contents.

* fix: play from local storage instead of server when downloaded

* fix: missing items

* fix: `SyncWorker` using the app JellyfinApi instance instead of it's own

* fix: only show downloaded items when navigating from `DownloadsFragment`

* fix: make chips horizontal scrollable

* feat: migrate database (retain) and downloads (wipe)

Also add indexes on seriesId and seasonId

* fix: remove temp testing in downloadsMigrated

* lint: fix some linting issues

* fix: add error handling to downloading item

* feat: add "Preparing download" dialog to make sure the user waits for the download to start

* refactor: first show dialog then start downloading

* fix: add error handling to user configuration in `PlayerViewModel`

* feat: allow downloads to be cancelled

* fix: "View details" is cut off when text is too long

* lint: fix indent
2023-05-07 16:05:40 +02:00
.github chore(deps): update android-plugin to v8 (major) (#333) 2023-04-15 00:43:42 +02:00
app/phone Items and downloads rework (#329) 2023-05-07 16:05:40 +02:00
core Items and downloads rework (#329) 2023-05-07 16:05:40 +02:00
data Items and downloads rework (#329) 2023-05-07 16:05:40 +02:00
gradle Items and downloads rework (#329) 2023-05-07 16:05:40 +02:00
images Update showcase images (#148) 2022-08-23 21:33:07 +02:00
libs Add lib-decoder-ffmpeg to app:phone 2023-01-21 17:05:36 +01:00
player Items and downloads rework (#329) 2023-05-07 16:05:40 +02:00
preferences Items and downloads rework (#329) 2023-05-07 16:05:40 +02:00
.gitignore Update .gitignore 2022-06-17 15:40:07 +02:00
build.gradle.kts chore(deps): update dependency gradle to v8.1 (#332) 2023-04-15 01:01:41 +02:00
gradle.properties chore(deps): update android-plugin to v8 (major) (#333) 2023-04-15 00:43:42 +02:00
gradlew chore(deps): update dependency gradle to v8.1 (#332) 2023-04-15 01:01:41 +02:00
gradlew.bat Update dependency gradle to v7.6 (#204) 2022-12-03 21:09:15 +01:00
LICENSE Add LICENSE 2021-08-13 16:49:36 +02:00
PRIVACY docs: update privacy policy 2023-02-08 09:28:16 +01:00
README.md docs: add Huawei AppGallery badge 2023-02-15 12:52:15 +01:00
renovate.json chore(renovate): enable semantic commits 2023-04-24 10:41:04 +02:00
settings.gradle.kts Modularize the codebase (#230) 2023-01-13 23:51:20 +01:00

Findroid banner

Findroid

Findroid is third-party Android application for Jellyfin that provides a native user interface to browse and play movies and series.

I am developing this application in my spare time.

This project is in its early stages so expect bugs.

Get it on Google PlayAvailable at Amazon AppstoreExplore it on Huawei AppGalleryGet it on IzzyOnDroid

Screenshots

Home Library Movie Season Episode
Home Library Movie Season Episode

Features

  • Completely native interface
  • Supported media items: movies, series, seasons, episodes
    • Direct play only, (no transcoding)
  • Offline playback / downloads
  • ExoPlayer
    • Video codecs: H.263, H.264, H.265, VP8, VP9, AV1
      • Support depends on Android device
    • Audio codecs: Vorbis, Opus, FLAC, ALAC, PCM, MP3, AMR-NB, AMR-WB, AAC, AC-3, E-AC-3, DTS, DTS-HD, TrueHD
      • Support provided by ExoPlayer FFmpeg extension
    • Subtitle codecs: SRT, VTT, SSA/ASS, PGSSUB
      • SSA/ASS has limited styling support see this issue
  • NEW MPV Player
    • Container formats: mkv, mov, mp4, avi
    • Video codecs: H.264, H.265, VP8, VP9, AV1
    • Audio codecs: Opus, FLAC, MP3, AAC, AC-3, E-AC-3, TrueHD, DTS, DTS-HD
    • Subtitle codecs: SRT, VTT, SSA/ASS, DVDSUB
    • Optionally force software decoding when hardware decoding has issues.

Planned features

  • Android TV
  • Websocket connection (Syncplay)
  • Picture in picture mode
  • Chromecast support

Translating

JDTech Weblate is a selfhosted instance of Weblate where you can translate this project and future projects of mine.

Questions?

We have a Discord server to discuss future development or ask general questions. Click here to join.

License

This project is licensed under GPLv3.

The logo is a combination of the Jellyfin logo and the Android robot.

The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

Android is a trademark of Google LLC.

Google Play and the Google Play logo are trademarks of Google LLC.