u/superuser404notfound

Looking for testers with a Dolby Vision TV
▲ 8 r/appletv+2 crossposts

Looking for testers with a Dolby Vision TV

Hey guys!

I am currently testing my app „Sodalite“. A native apple TV Jellyfin Client with Seerr Integration.

I am looking for active testers to test the dolby vision funcionality because i dont have a dv capable tv at home.

You would also need to send me photos or screenshots from the on screen logs to help me fix the dolby vision part of the player.

The App is using „AetherEngine“ as the video/audio backend, which i also made for this project.

The TestFlight link for the app:

https://testflight.apple.com/join/nWeQzmBX

Links for the open source projects:

https://github.com/superuser404notfound/Sodalite

https://github.com/superuser404notfound/AetherEngine

u/superuser404notfound — 4 days ago

The problem. Jellyfin's built-in TMDB image provider respects the library language for language-matched posters, but when no exact match exists it falls back to textless (no-language-tag) posters instead of the English fallback. Textless on TMDB is often awkwardly chosen — cropped stills, alt-art, foreign-market exports without
text. Result: a library that looks visually inconsistent. (jellyfin/jellyfin#9878)

What the plugin does. Drop-in IRemoteImageProvider running at Order = -1 so it preempts the built-in:

  • Strict language cascade: preferred → original (opt-in) → English → textless (opt-in per image type)
  • Sorts within each bucket by vote_count DESC, vote_average DESC — the same order TMDB's own /images UI uses. The most popular language-matched poster wins instead of a random one.
  • Per-image-type textless toggle. Logos and backdrops allow textless by default (logos are usually designed that way), posters don't (you never want a textless poster).
  • Picks up each library's metadata language automatically. Override available if you want to force a global language.
  • Optional original-language bucket — Japanese poster for Princess Mononoke in a German library.

Install. Admin → Plugins → Repositories → +:

https://raw.githubusercontent.com/superuser404notfound/jellyfin-plugin-language-aware-images/main/manifest.json

Then Catalog → Metadata → Language-Aware Images → Install. After install, drag Language-Aware TMDB Images to the top of Library → Image Fetchers — otherwise the
built-in still wins.

Source / issues / feedback: https://github.com/superuser404notfound/jellyfin-plugin-language-aware-images

GPL-3.0. PRs, bug reports, edge cases all welcome, especially if you find a TMDB cascade case my bucket logic gets wrong.

Edit: Claude Code was used to build this as i am not that advanced with my coding skills. But with multiple years of IT knowledge you can be sure that this is not another AI slop.

u/superuser404notfound — 10 days ago
▲ 30 r/iOSProgramming+1 crossposts

Hi r/appledevelopers ,

Sharing a project I've been building because it touches a few corners of Apple's media stack that don't get a lot of public-source examples. Maybe useful as a reference, or worth a poke if you spot architectural mistakes.

Engine (LGPL-3.0): https://github.com/superuser404notfound/AetherEngine Client built on it (Sodalite, GPL-3.0 with Apple Store Exception): https://github.com/superuser404notfound/Sodalite TestFlight if you want to see it run: https://testflight.apple.com/join/nWeQzmBX

Basically I needed a Jellyfin client for Apple TV that engaged real Dolby Vision / HDR10+ / Atmos modes on the TV side rather than silently degrading to base layers. The existing options (VLCKit-wrappers, AVPlayer with bare-URL handoff) didn't reliably do that, so the engine got built from scratch. It now powers Sodalite (the Jellyfin client) but the engine is its own Swift package and reusable in any other Apple-platform player.

A few things in there that might be interesting

Dolby Vision format-description tagging

The CMVideoFormatDescription needs to be kCMVideoCodecType_DolbyVisionHEVC ('dvh1') with a dvcC extension built from FFmpeg's AVDOVIDecoderConfigurationRecord. Without that the TV stays in HDR10 / HLG base-layer mode regardless of how proudly the bitstream carries an RPU.

// Build the 24-byte ISO BMFF dvcC box body from the FFmpeg record
let dvcCData = buildDvcCAtom(from: record)
let atoms: NSMutableDictionary = ["hvcC": hvcCExtraData, "dvcC": dvcCData]
let extensions: NSDictionary = [
    kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms: atoms
]
CMVideoFormatDescriptionCreate(
    allocator: kCFAllocatorDefault,
    codecType: kCMVideoCodecType_DolbyVisionHEVC,  // 'dvh1'
    width: width, height: height,
    extensions: extensions,
    formatDescriptionOut: &formatDesc
)

HDR10+ dynamic metadata

Apple added kCMSampleAttachmentKey_HDR10PlusPerFrameData (in CMSampleBuffer.h) since iOS / tvOS 16. It takes a CFData of the user-data-registered ITU-T T.35 SEI bytes and overrides whatever HDR10+ payload is baked into the compressed bitstream. We extract from FFmpeg's AV_PKT_DATA_DYNAMIC_HDR10_PLUS, serialise via av_dynamic_hdr_plus_to_t35, then attach per-frame:

CMSetAttachment(
    sampleBuffer,
    key: kCMSampleAttachmentKey_HDR10PlusPerFrameData,
    value: t35Bytes as CFData,
    attachmentMode: CMAttachmentMode(kCMAttachmentMode_ShouldPropagate)
)

The pairing across the async VT output handler (B-frame reorder makes "use the most recent value" unsafe) is done with a PTS-keyed pending dictionary, packet side data goes in on the demux thread, lookup happens in the decoder callback.

Dolby Atmos passthrough

AVSampleBufferAudioRenderer ignores Atmos metadata. AVPlayer doesn't. The trick is to demux the EAC3+JOC packets, wrap them in fMP4 with a dec3 box declaring JOC (numDepSub=1, depChanLoc=0x0100), serve the segments from an in-process HLS server on 127.0.0.1:<port>, and point a separate AVPlayer instance at the playlist. AVPlayer wraps the bitstream as Dolby MAT 2.0 over HDMI and the receiver lights its Atmos indicator.

A/V sync uses AVSampleBufferDisplayLayer's controlTimebase bound directly to AVPlayerItem.timebase via CMTimebaseSetSourceTimebase -once the bind establishes (~2-4 s buffer for HLS pre-roll), video and audio share the same hardware-aware clock without any periodic drift correction.

Display mode switching

AVDisplayCriteria via UIWindow.avDisplayManager (tvOS 17+) — set the TV mode before the first frame lands. We honour isDisplayCriteriaMatchingEnabled (the user's "Match Content" setting) and tonemap to SDR via a dedicated VTPixelTransferSession when it's off, since pushing PQ pixels into an SDR-locked panel just renders as black or oversaturated.

Architecture in a paragraph

AVIOReader (URLSession → avio_alloc_context) → libavformat demuxer → packet queue → either VTDecompressionSession (HW path) or avcodec_decode_* with sws_scale (AV1 SW fallback) → reorder buffer (4 frames, B-frame depth) → AVSampleBufferDisplayLayer. Audio splits at the demux: PCM-decodable codecs go through AVSampleBufferAudioRenderer; EAC3+JOC goes through the HLS+AVPlayer route described above.

On the AI angle

The project is built in pair-programming with Claude (Anthropic). Every commit was reviewed before landing and ships with a Co-Authored-By: Claude trailer so the AI involvement is permanently attributable rather than retconnable. Source is open precisely so the disclosure is verifiable - the engine repo is small enough to read in an evening if you want to check the HDR / Atmos paths before learning from them or installing.

Where I'd value a critical eye

  • The synchronizer / controlTimebase handoff during HLS pre-roll. There's a window where the layer is on the synchronizer, then we detach and reattach to a controlTimebase bound to AVPlayer's timebase. Spent a lot of time getting it stable, interested if anyone has done this differently
  • The dvcC byte packing - written by hand from the ISO BMFF Dolby Vision spec. If anyone's parsed enough DV files to call out a field-order surprise, that'd be useful
  • The HDR10+ pending-PTS dictionary cleanup on flush. Currently clears on flush(); might still leak on edge cases I haven't hit
  • General architecture review - the engine repo is intentionally small (~3k lines of Swift + minimal C interop). If you spot something structurally wrong, an issue or PR is welcome

Happy to answer anything technical in the thread.

u/superuser404notfound — 10 days ago
▲ 7 r/de_EDV

Hallo r/de_EDV,

ich hab in den letzten Monaten an einem nativen Apple-TV-Client für Jellyfin gebaut und nach einem ordentlichen internen Test-Run ist's jetzt im öffentlichen TestFlight-Beta. Open Source, GPL-3.0, kein Tracking, mit Jellyseerr-Integration direkt im Hauptmenü.

https://preview.redd.it/qqeishnbg2zg1.jpg?width=3912&format=pjpg&auto=webp&s=a2726723d3982b8255aecea262fd45867177e027

TestFlight: https://testflight.apple.com/join/nWeQzmBX

Code: https://github.com/superuser404notfound/Sodalite

Datenschutz: https://sodalite.superuser404.de/privacy (keine Datenerhebung)

Was ist Sodalight?

Ein schneller, light-weight Apple-TV-Client für Jellyfin. SwiftUI auf einer eigenen Video-Engine, die direkt mit FFmpeg, VideoToolbox und AVPlayer arbeitet, also dieselbe Focus-Engine, Transport-Bar und Info-Panel-Struktur wie die native Apple TV+ App. Startet schnell, scrollt flüssig, steht nicht im Weg.

Jellyseerr ist mir persönlich beim Couch-Gucken immer ein pain point gewesen. Ich will Trending-Content direkt vom Sofa requesten ohne aufs Handy oder ins Web-UI wechseln zu müssen. Deshalb sitzt Seerr bei Sodalite mit im Hauptkatalog, nicht in einer Tab-Ecke.

Highlights

  • Direct Play für H.264, HEVC, HEVC Main10, AV1
  • Echtes HDR10 und Dolby Vision mit automatischer Display-Mode-Umschaltung (Match Content)
  • Echtes Dolby Atmos via EAC3+JOC, als Dolby MAT 2.0 verpackt — das Atmos-Lämpchen am AVR geht also wirklich an
  • Resume-Position synchron über alle Geräte, Intro-Skip, Auto-Play-Next
  • Untertitel- und Tonspur-Wechsel im laufenden Video
  • Apple TV Top Shelf zeigt Continue Watching + Next Up über dem Dock
  • "Sodalite öffnen" via Siri Remote, iPhone oder HomePod — funktioniert in allen 26 UI-Sprachen, der Continue-Watching-Shortcut liegt zusätzlich in der iOS-Shortcuts-App
  • 26 UI-Sprachen (volle DE-Übersetzung inkl. Settings, Errors, Voice Commands)

Was es nicht hat

  • Keine Telemetrie, keine Analytics, keine Tracking-Domains, keine Third-Party-SDKs
  • Kein Upsell, kein "Bewerte uns"-Popup, keine Marketing-Newsletter-Abfrage
  • Kein Login-Zwang — du verbindest dich mit deinem Server, fertig
  • Schlanke Dependencies: AVFoundation, VideoToolbox, FFmpeg, und die Jellyfin/Jellyseerr-APIs. Mehr nicht
  • GPL-3.0 mit App Store Exception, vollständig auditierbar

Zur Transparenz: Sodalite entstand in Zusammenarbeit mit Claude Code

Sodalite ist in enger Pair-Programming-Sitzung mit Claude (Anthropic) entstanden. Architektur, Design-Entscheidungen und Code-Review jedes Commits sind von mir. Den Code lege ich offen ins Repo, damit's eben kein "trust me bro" ist. Wer wissen will wie ein bestimmtes Feature implementiert ist, schaut nach. Die Commit-History hat saubere Subjects und fokussierte Diffs, kein Auto-Generated-Müll.

Die Video-Engine ist als eigenes LGPL-3.0-Paket separiert (AetherEngine: https://github.com/superuser404notfound/AetherEngine) und damit unabhängig nutzbar und prüfbar.

Voraussetzungen

  • Apple TV 4K (egal welche Generation)
  • tvOS 26.0 oder neuer
  • Eigener Jellyfin-Server (10.9+ empfohlen)
  • Optional: Jellyseerr (2.0+) für den Request-Flow

Worum ich besonders Feedback bitten würde

  • HDR- und Dolby-Vision-Verhalten auf verschiedenen TVs (gerade wenn Match Content komische Sprünge macht)
  • Atmos-Passthrough über verschiedene AVRs
  • Edge Cases bei Server Discovery (mDNS aus, mehrere Subnetze, VPN)
  • Alles was crasht

Bug-Reports laufen über GitHub Issues mit Templates: https://github.com/superuser404notfound/Sodalite/issues - daneben gibt's einen Discussions-Tab für alles andere (Q&A, Ideen, Show-and-Tell). Bewusst kein Discord: Discussions bleibt öffentlich und durchsuchbar.

Frag gerne hier im Thread, freue mich auf euer feedback!

reddit.com
u/superuser404notfound — 10 days ago

Hey again r/jellyfin ! :)

Reposting after a rename. The original post went up as JellySeeTV, and the feedback was sharp and correct: that name reads like a mashup of two existing Jellyfin clients - Jellysee and JellyTV - and stepping into the namespace of projects that were there first, with a name that's basically theirs glued together, was a bad call. That's on me. No defending it.

The app is now called Sodalite. Same code, same TestFlight, same author. I deleted the old post rather than editing it in place, because the name was the thing people were objecting to and an EDIT block doesn't fix that.

https://preview.redd.it/dl72nb61sxyg1.jpg?width=3912&format=pjpg&auto=webp&s=234bc5484f783c7f4fcefdca5767afa05d6e811c

TestFlight: https://testflight.apple.com/join/nWeQzmBX

Source: https://github.com/superuser404notfound/Sodalite

What it is

A focused, fast Apple TV client for Jellyfin. SwiftUI on top of a custom video engine that talks directly to FFmpeg, VideoToolbox, and AVPlayer - same focus engine, transport bar, and info-panel patterns the Apple TV+ app uses. Cold-launches quickly, scrolls smoothly, gets out of your way.

The Jellyseerr piece is what I personally was missing. I want to browse trending content and request things from the couch without switching to a phone or a web UI. So that's a first-class part of the app, not a separate tab linking out.

Highlights

  • Resume across devices, intro skip, next-episode autoplay
  • Subtitle and audio-track switching mid-playback
  • Support for every format and container thanks to ffmpeg
  • Fully customizable (subtitles customization coming soon)
  • Apple TV Top Shelf shows Continue Watching + Next Up above the dock when you focus the Sodalite icon
  • 26 UI languages
  • Muli Profile Support
  • NO PAYWALL for anything

What you won't find in it

  • No telemetry, no analytics, no tracking domains, no third-party SDKs
  • No upsell tab, no "rate this app" pop-up, no marketing newsletter prompt
  • No login wall - you connect to your server, that's it
  • Lean dependency graph: AVFoundation, VideoToolbox, FFmpeg, and the Jellyfin/Jellyseerr APIs themselves

A note on how this was built

Sodalite is vibe-coded. I built it in close pair-programming with Claude (Anthropic). The architecture, the design decisions, and the review of every commit are mine. The code is open and in the repo precisely so it's not a "trust me bro" situation - if you want to see how a particular feature is structured before installing, look at it directly.

The video engine is split out into its own LGPL-3.0 package (AetherEngine: https://github.com/superuser404notfound/AetherEngine) so it's reusable and reviewable on its own.

Requirements

What I'd love feedback on

  • HDR and Dolby Vision behavior on different TVs
  • Atmos passthrough on various AVRs
  • Edge cases in server discovery
  • Anything that crashes

Bug reports: GitHub Issues are open with templates at https://github.com/superuser404notfound/Sodalite/issues - and there's a Discussions tab next to it for everything else (Q&A, ideas, show-and-tell). No Discord, deliberately: Discussions stays public and searchable.

Happy to answer technical questions in the thread - including questions about the rename if anyone has them.

reddit.com
u/superuser404notfound — 11 days ago

Hey r/jellyfin ! 😄

I built JellySeeTV, a native Apple TV client for Jellyfin with first-class Jellyseerr integration. After a few months of work and a chunk of internal testing, it's stable enough for a public TestFlight beta.

https://preview.redd.it/qu1e75telxxg1.jpg?width=3912&format=pjpg&auto=webp&s=381a8fcfe398780fbccf8f05ccd90710c60c6851

TestFlight: https://testflight.apple.com/join/eFKDaaXr

Source: https://github.com/superuser404notfound/JellySeeTV

What it is

A focused, fast Apple TV client. SwiftUI on top of a custom video engine that talks directly to FFmpeg, VideoToolbox, and AVPlayer — same focus engine, transport bar, and info-panel patterns the Apple TV+ app uses. Cold-launches quickly, scrolls smoothly, gets out of your way.

The Jellyseerr piece is what I personally was missing. I want to browse trending content and request things from the couch without switching to a phone or a web UI. So that's a first-class part of the app, not a separate tab linking out.

Highlights

  • Direct Play for almost every codec your Apple TV understands: H.264, HEVC, HEVC Main10, AV1
  • Real HDR10 and Dolby Vision with automatic display-mode switching (Match Content)
  • Real Dolby Atmos via EAC3+JOC, wrapped as Dolby MAT 2.0, so your AVR's Atmos light actually lights up
  • Resume across devices, intro skip, next-episode autoplay
  • Subtitle and audio-track switching mid-playback
  • 26 languages

What you won't find in it

  • No telemetry, no analytics, no tracking domains, no third-party SDKs
  • No upsell tab, no "rate this app" pop-up, no marketing newsletter prompt
  • No login wall — you connect to your server, that's it
  • Lean dependency graph: AVFoundation, VideoToolbox, FFmpeg, and the Jellyfin/Jellyseerr APIs themselves. That's it
  • GPL-3.0 with App Store Exception, fully auditable

A note on how this was built

JellySeeTV is vibe-coded. I built it in close pair-programming with Claude (Anthropic). The architecture, the design decisions, and the review of every commit are mine. The code is open and in the repo precisely so it's not a "trust me bro" situation — if you want to see how a particular feature is structured before installing, look at it directly.

The video engine is split out into its own LGPL-3.0 package (AetherEngine) so it's reusable and reviewable on its own. Both the engine and the app shell ship under copyleft (LGPL / GPL respectively) with an Apple Store / DRM Exception that keeps the App Store and TestFlight distribution paths legally clean.

Requirements

  • Apple TV 4K (any generation)
  • tvOS 26.0 or later
  • Your own Jellyfin server (10.9+ recommended)
  • Optional: Jellyseerr (2.0+) for the request flow

What I'd love feedback on

  • HDR and Dolby Vision behavior on different TVs
  • Atmos passthrough on various AVRs
  • Edge cases in server discovery
  • Anything that crashes

Bug reports: GitHub issues are open with templates at https://github.com/superuser404notfound/JellySeeTV/issues

Happy to answer technical questions in the thread.

reddit.com
u/superuser404notfound — 16 days ago