feat: add Emby/Jellyfin support via adapter pattern + per-item apply/restore#3
feat: add Emby/Jellyfin support via adapter pattern + per-item apply/restore#3JPT62089 wants to merge 21 commits into
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace direct PlexServer instantiation and deleted download_poster() usage in apply.py, restore.py, and regenerate.py with the create_server() factory and server.download_poster() adapter method. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Emby's POST /Items/{id}/Images/Primary expects base64-encoded image data,
not raw bytes. Raw bytes cause a 500 error.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
This is a massive and awesome PR; gonna review it over the next couple of days and set up small Jellyfin and Emby servers to confirm it works properly. |
|
Oh boy, I loved this idea so much I have more ideas that I wanna do... Not limited to just googly for April 1st 🤣 As I am sure it's fully obvious, my PR was 100% vibe coded... But I did do a bunch of testing with my Emby server. I did not spin up a jellyfin server to test there, though. Nor did I validate it did not break plex. Hope it all works well for you! |
I can test this on a jellyfin server if I have time. For clarification this PR should add the googly eye feature to jellyfin? |
Should™ |
Summary
MediaServerprotocol) so googlarr works with Plex, Emby, and Jellyfin. One backend per instance, configured viaconfig.yml.requests— library listing, item enumeration, season detection, poster download/upload (base64-encoded as Emby requires).What changed
googlarr/server/base.py(Protocol),plex.py(PlexAdapter),emby.py(EmbyAdapter),__init__.py(factory)googlarr/config.pyserver.type/url/token/librariesinstead ofplex.*googlarr/db.pysync_library_items()uses adapter instead of plexapi directlygooglarr/prank.pyapply_pranks/restore_originalstakeserverparam, callserver.upload_poster()googlarr/main.pycreate_server(config)factorygooglarr/web.pyPOST /api/items/<id>/applyand/restoregooglarr/web_ui.htmlapply.py,restore.py,regenerate.pyupdated to use adapterserver.typefield (plex,emby,jellyfin) replacesplex.*blockConfig change
Test plan
🤖 Generated with Claude Code