This commit is contained in:
@@ -1,31 +1,70 @@
|
||||
# Memby (Android TV)
|
||||
|
||||
An independent Android TV client for Emby, by **ponzischeme89**. Sign in to browse your
|
||||
personalised home screen, resume titles, play recent movies, and choose audio or subtitle
|
||||
tracks during playback. The screensaver (Dream) code remains isolated from the client work.
|
||||
An independent Android TV client for Emby, by **ponzischeme89**. Memby combines a
|
||||
personalised television launcher, full media player, system screensaver and an optional
|
||||
self-hosted gateway that shapes the experience for every viewer in the household.
|
||||
|
||||
Source: [g.sublogue.com/admin/memby](https://g.sublogue.com/admin/memby)
|
||||
|
||||
## Features
|
||||
|
||||
- **System screensaver** via `DreamService` — auto-starts on idle once selected in the
|
||||
TV's Screensaver settings. Also previewable from the app's home screen.
|
||||
- Random, cross-fading **backdrops** of Movies and Series that have backdrop images.
|
||||
- **Interactive**: OK reveals Play / Favorite actions; ◄ ► change the backdrop; Back exits.
|
||||
- **In-app playback** with Media3/ExoPlayer (movies play directly; a series plays its
|
||||
next-up / first episode).
|
||||
- **Favorites** managed through the Emby API and shown on the home screen.
|
||||
- A dedicated **For You** destination, shaped by Tracearr completion/device history,
|
||||
Memby browsing signals and a viewer-selected 30/60/120-minute time window. Every pick
|
||||
says why it was chosen and whether it has direct-play evidence on that television.
|
||||
### Browse and discover
|
||||
|
||||
- Personalised, server-composed Home rows with a cached instant-start launcher.
|
||||
- A cinematic featured hero that rotates through ranked films and series premieres.
|
||||
- Continue Watching merged with Next Up, ordered by the viewer's recent activity.
|
||||
- Favourites, latest films, recommendations, curated shelves and schedule rows.
|
||||
- Dedicated Movies, TV Shows, Favourites and For You destinations.
|
||||
- Instant search with an on-screen keyboard, voice input and session result caching.
|
||||
- Optional, server-controlled genre browsing with paged film and series catalogues.
|
||||
- A dedicated For You page combining viewing history, browsing signals, available time
|
||||
and direct-play evidence; every recommendation explains why it was selected.
|
||||
- More Like This, cast and technical details on film and series pages.
|
||||
- Per-title IMDb, Rotten Tomatoes, Metacritic, Letterboxd and TMDb ratings where available.
|
||||
- My Shows tracking, upcoming episodes, lifecycle badges and personal return alerts.
|
||||
- Themes, seasonal colour schemes and optional launcher decorations.
|
||||
|
||||
### Playback
|
||||
|
||||
- Media3/ExoPlayer playback with direct play, compatible-stream remuxing and HLS fallback.
|
||||
- Resume playback, progress reporting, watched state and immediate poster badge updates.
|
||||
- Audio and subtitle track selection with per-viewer language preferences.
|
||||
- Missing-subtitle search and download through Bazarr or OpenSubtitles when configured.
|
||||
- Configurable Left/Right seeking with trickplay thumbnail previews.
|
||||
- Skip-intro prompts or automatic skipping from Emby's chapter markers.
|
||||
- Automatic next-episode playback with an on-screen countdown.
|
||||
- Closing-credits presentation with the next episode alongside and adaptive 2× playback.
|
||||
- Episode pages with season navigation, watched markers and estimated completion dates.
|
||||
- In-player cast lookup, pause artwork, time-remaining reminders and service-status banners.
|
||||
|
||||
### Profiles, televisions and administration
|
||||
|
||||
- Multiple saved viewer profiles with quick switching from the navigation rail.
|
||||
- Per-viewer settings synchronised through the gateway across every signed-in television.
|
||||
- Device management, session revocation and stable television identity.
|
||||
- Gateway-controlled feature flags, maintenance mode, forced app updates and live themes.
|
||||
- Service alerts for new library items, aired episodes, deployments and Emby outages.
|
||||
- A dependency-free web console for accounts, devices, settings history, features,
|
||||
updates, library imports, recommendations, searches, row engagement and logs.
|
||||
- Postgres catalogue import, Redis caching, full-text search and background recommendation
|
||||
and ratings warming.
|
||||
|
||||
### Screensaver and updates
|
||||
|
||||
- A system `DreamService` screensaver with cross-fading library backdrops.
|
||||
- Interactive screensaver controls for playback, favourites and artwork navigation.
|
||||
- An in-app screensaver preview using the same rendering surface as the system Dream.
|
||||
- Self-hosted signed APK updates with SHA-256, package and signing-key verification.
|
||||
- Mandatory and optional update policy controlled by the gateway.
|
||||
|
||||
## Tech stack
|
||||
|
||||
- Kotlin + Jetpack **Compose for TV** (`androidx.tv:tv-material`)
|
||||
- Kotlin + Jetpack **Compose for TV** (`androidx.tv:tv-material3`)
|
||||
- **Media3 / ExoPlayer** for playback
|
||||
- Retrofit + OkHttp + kotlinx.serialization for the Emby REST API
|
||||
- DataStore for persisted connection/session
|
||||
- DataStore for persisted profiles, settings and cached launcher state
|
||||
- Coil for backdrop image loading
|
||||
- Go gateway with Postgres and Redis
|
||||
|
||||
## Project layout
|
||||
|
||||
@@ -36,7 +75,7 @@ app/src/main/java/com/ponzischeme89/memby/
|
||||
data/
|
||||
SettingsStore.kt DataStore-backed connection/session state
|
||||
ServerConfig.kt Which backend this build talks to
|
||||
EmbyRepository.kt Content, favorites, playback; dual gateway/direct paths
|
||||
EmbyRepository.kt Content, favourites, playback; dual gateway/direct paths
|
||||
analytics/RowAnalytics.kt Row engagement buffering
|
||||
model/ Emby + gateway DTOs (kotlinx.serialization)
|
||||
remote/EmbyApi.kt Retrofit interface for Emby
|
||||
@@ -86,7 +125,7 @@ and the TV holds a revocable gateway token rather than a live Emby token.
|
||||
```
|
||||
direct: TV ──────────────────────────────► Emby
|
||||
gateway: TV ──► Memby gateway ──► Emby (metadata + artwork)
|
||||
TV ─────────────────────► Emby (video, always direct-play)
|
||||
TV ─────────────────────► Emby (video stream; never proxied by the gateway)
|
||||
```
|
||||
|
||||
Which one a build uses is decided by `memby.gatewayUrl` in `gradle.properties`: set it and
|
||||
@@ -186,13 +225,11 @@ decides what the app offers, so rolling back is editing one file.
|
||||
|
||||
### How TVs update themselves
|
||||
|
||||
In Memby's Settings, set the update URL to `https://nas.example.com/memby/latest.json`.
|
||||
**Check for updates** then downloads and installs on the TV, no computer involved. A URL
|
||||
ending in `.json` is read as a static manifest; anything else is treated as a Gitea host
|
||||
(`/api/v1/repos/{owner}/{repo}/releases/latest`), so either source works.
|
||||
|
||||
The manifest's `apkUrl` may be relative (`memby-0.1.54.apk`) and is resolved against the
|
||||
manifest's own URL, so the folder keeps working if the NAS is reached by another name.
|
||||
The gateway checks the running app version on launch and returns an optional or mandatory
|
||||
update with its download address. Memby downloads the APK, verifies its checksum, package
|
||||
and release signature, then commits it through Android's package installer. Update policy
|
||||
and the download address are managed in the gateway's admin console; viewers do not need
|
||||
to configure an update source on the television.
|
||||
|
||||
First install on each TV still has to be manual — the **Downloader** app pointed at the
|
||||
landing page is the usual route, and the page explains it.
|
||||
@@ -233,4 +270,3 @@ Playback capability probing and device-profile generation contain GPLv2 adaptati
|
||||
[Wholphin](https://github.com/damontecres/Wholphin), itself derived in part from
|
||||
[Jellyfin Android TV](https://github.com/jellyfin/jellyfin-androidtv). Attribution and
|
||||
modification notices are preserved in the adapted source files.
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user