Jdiesel 1501 Posted 2 hours ago Posted 2 hours ago (edited) Hi everyone, I've been slowly learning and building something I'm excited to finally share with this community. It's called Embrr, a from-scratch Android TV client for Emby, written in Kotlin with Jetpack Compose for TV, Hilt, Retrofit, Coil, and Media3 ExoPlayer. This post is a sneak peek only. Embrr is still in active development, but I'm planning a limited beta test in the near future for Emby forum members who want to kick the tires and give feedback. I'll share signup details in a follow-up once the build is stable enough for outside testers. For now, I want to show what's coming and what makes Embrr different. What sets Embrr apart from the official Emby app: Smart bandwidth monitoring & connection-quality health checks Embrr watches your network conditions in real time and adapts. A connection-quality health check runs during playback so transcode decisions, bitrate caps, and direct-play fallbacks are made against your actual current throughput, not a static setting you configured once and forgot. Bad Wi-Fi? Embrr notices and degrades gracefully instead of stalling into an endless buffer. Embrr doesn't just trust the "max streaming bitrate" number you set once in a menu and hope for the best. Here's how it works. In the background, Embrr requests a representative chunk of real media bytes from your Emby server over the same HTTP path a transcode or direct-stream would use — same TLS, same reverse proxy, same CDN hop, same server-side decode overhead. That's the critical difference from a generic bandwidth test: it measures the end-to-end path your video actually travels, including any buffering, contention, or transcoding latency the server introduces under load. A plain ping or throughput test to a fast CDN won't tell you that your Emby box is choking on a transcode at 9 PM when the whole house is streaming. From those probes Embrr computes a sustained-throughput figure with headroom built in, it doesn't recommend right at the measured ceiling, because real-world bandwidth varies second to second and a recommendation that stalls into buffering is worse than one that plays cleanly at a lower bitrate. The result is an accurate, current bitrate recommendation tuned to your setup right now: a wired gigabit link to a local server will get a very different recommendation than Wi-Fi across the house to a remote Emby instance through a tunnel. That recommendation then feeds directly into the playback decision engine, direct-play vs. transcode, and which transcode bitrate cap to request so the choice is made against live conditions rather than a stale config value. If conditions degrade mid-session, Embrr notices and can renegotiate down instead of endless buffering. If you'd rather force a fixed cap, that's still available in settings; the adaptive mode is opt-in but on by default. "What to Watch" wizard + natural-language search, powered by an LLM Can't decide what to watch? Embrr's guided wizard walks you through a handful of branch-aware questions (format commitment, mood, intensity, dealbreakers, language preferences, etc.) and returns six ranked picks, each with a human-readable explanation of why it matched you, plus vibe tags. The questions adapt based on your prior answers, so you never get conflicting or redundant prompts. Prefer to just describe what you're in the mood for? The natural-language search takes a free-text query ("something atmospheric and slow-burn, foreign language, under two hours") and returns the same kind of ranked, explained results. Both paths are powered by an LLM via a companion Emby server plugin (Embrr-Helper) so the heavy lifting happens server-side. Library view with hero sections Library browsing isn't a flat grid. Embrr uses a dynamic, per-user home screen driven by your Emby home-section configuration, with hero backdrops, resume rows, next-up, latest media, and per-library rows. Library views lead with a hero section so the first thing you see is a cinematic backdrop of a featured item, not just a wall of posters. It's all designed on finding something to watch with the fewest clicks possible. Last.fm top tracks & popularity metadata For music libraries, Embrr enriches albums and artists with Last.fm top-track rankings and popularity signals. Instead of just listing tracks in album order, you get a sense of what's actually popular with other listeners. It makes music browsing feel curated rather than just a file listing. Music mini-player When you play music, Embrr keeps it in a mini-player that persists while you browse. Track info, and controls docked and visible without taking over the screen. You can keep exploring your library while your music keeps playing What's next A limited beta is coming soon. If you'd like to be considered, keep an eye on this thread. I'll post beta signup instructions once the build is ready for outside testers. Feedback from this community will directly shape what ships first. Happy to answer questions about architecture, the Embrr-Helper plugin, or anything else. Thanks for reading, and thanks to the Emby team for building such a great server to build a client against. Edited 2 hours ago by Jdiesel 2
IAmHugh 82 Posted 1 hour ago Posted 1 hour ago (edited) 50 minutes ago, Jdiesel said: Smart bandwidth monitoring & connection-quality health checks I like that with a recent issue I ran into with buffering issues in Emby. 50 minutes ago, Jdiesel said: powered by an LLM Now that's a no go. Need to ask even though the Emby devs will probably have strokes, are you including a per library search and perhaps a proper search for settings? Thanks Edited 1 hour ago by IAmHugh
Jdiesel 1501 Posted 1 hour ago Author Posted 1 hour ago 1 minute ago, IAmHugh said: I like that with a recent issue I ran into. Now that's a no go. Completely optional. If you don't configure it, it's not available.
IAmHugh 82 Posted 1 hour ago Posted 1 hour ago Please reread my previous post. I edited it for clarity.
Jdiesel 1501 Posted 50 minutes ago Author Posted 50 minutes ago (edited) I'm not sure I fully understand the question but the app uses a local search by calling GET emby/Users/{userId}/Items with some some specific filters enabled to limit the types of results. This is the Emby way of searching and will return the same results as the official apps. The LLM enabled search is completely separate and lives under its own Discovery tab. If you don't have the Embrr-Helper plugin installed on the server and the Discovery feature enabled in the plugin, the Discovery tab will not be visible in the app. Think of the plugin as a librarian who has read every movie and series in your Emby library and can understand what you mean — not just match keywords. 1. Building the index (one-time setup, runs in background) The plugin walks through your library's Movies and Series, and for each one it gathers a "summary card" — the title, overview, genres, tags, studios, cast, year, rating, runtime, etc. This is done locally by DiscoveryMetadataExtractor. Then it sends those text summaries to the external LLM/embedding service. The embedding service turns each summary into a list of numbers called an embedding, basically a "meaning fingerprint" of the item. These fingerprints are stored in a local SQLite database that lives alongside the plugin. 2. Searching (when you ask for something) When you type something like "a smart sci-fi movie that isn't too long": 1. The plugin sends your sentence to a LLM and gets back an embedding for your query, the same kind of "meaning fingerprint." 2. Locally, it compares your query's fingerprint against every stored item fingerprint using cosine similarity. No external call is needed for this part, it's all done locally and fast. 3. The top candidates are pulled back from Emby as real items, and the plugin checks each one against your account's permissions and parental controls so you only see things you're actually allowed to see. Played/unplayed filters are applied here too. 4. Optionally, the LLM is asked once more to rank and explain the top candidates — producing human-readable "reasons" like "Thoughtful science fiction, moderate runtime". If the LLM is unavailable, it falls back to pure similarity scores. 3. Guided Wizard (the question flow) Instead of typing a sentence, the wizard asks you up to 5 multiple-choice questions (mood, runtime, genre, etc.). Each answer narrows the candidate pool locally using local tag-filtering logic, and after the last answer (or when you tap "Finish"), it returns the same kind of ranked, hydrated results. Edited 46 minutes ago by Jdiesel
Jdiesel 1501 Posted 40 minutes ago Author Posted 40 minutes ago 54 minutes ago, IAmHugh said: perhaps a proper search for settings? Thanks Do you mean a search bar in the settings menu to find a specific setting? It isn't currently implemented but I do like the idea. I use that feature frequently on my Android phone to find obscure settings.
IAmHugh 82 Posted 40 minutes ago Posted 40 minutes ago (edited) So it's going to send info out of one's system. Or is that something that can be completely disabled / not enabled? Edited 36 minutes ago by IAmHugh
Jdiesel 1501 Posted 37 minutes ago Author Posted 37 minutes ago Just now, IAmHugh said: So it's goi ng to send info out of one's system. Or is that something that can be completely disabled / not enabled? No info on your system or library is sent out if you don't enable the feature. You can also choose to run your own models locally. It was developed with Gemini and it's free tiers in mind though.
IAmHugh 82 Posted 36 minutes ago Posted 36 minutes ago Just now, Jdiesel said: Do you mean a search bar in the settings menu to find a specific setting? It isn't currently implemented but I do like the idea. I use that feature frequently on my Android phone to find obscure settings. Emby has yet to fix a major issue that they have had since at least 2018 and that is when you search for something it search all one's libraries not just the library you're in. If I'm searching for something in TV series I only want results from within that library. On top of this if you're in settings and search you only get results from your libraries not from settings.
IAmHugh 82 Posted 35 minutes ago Posted 35 minutes ago 1 minute ago, Jdiesel said: It was developed with Gemini and it's free tiers in mind though. I actually have Gemini disable on my phone.
Jdiesel 1501 Posted 31 minutes ago Author Posted 31 minutes ago I appreciate that AI isn't for everyone. I choose to implement as an optional feature to improve search and discoverability. I hope others will find it useful too.
Jdiesel 1501 Posted 26 minutes ago Author Posted 26 minutes ago 1 minute ago, IAmHugh said: So the AI functions are completely optional? Correct 1
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now