Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.
Hi everyone, I’m happy to announce a massive update to the project. v2.0 is out!

Before diving into the details, check out the new video in the README. It demonstrates the setup process, from configuring the server on a modern Mac to running the client on a PowerMac G4, finally showcasing transcoded modern media playing on Tiger: 👉 https://codeberg.org/jjmarcos/retrostream-py

What’s new in v2.0?

  • Jellyfin Support: You can now connect to Jellyfin servers as well as Plex.
  • New Server GUI: For the server side (the modern machine), there is now a proper GUI to manage settings, view logs, and start/stop the service without touching the command line.
  • Extended HW Acceleration: Transcoding now supports VAAPI (Linux), D3D11VA (Windows), and VideoToolbox (macOS), in addition to CUDA/QSV.
  • Smarter Transcoding: Better and more complex automatic fallback chains (if hardware encoding fails, it gracefully falls back to the next available engine) and hardware-accelerated scaling.
  • New Players: Added support for mpv and ffplay alongside MPlayer.
Compatibility
As always, the focus is on getting modern media onto vintage screens.
  • Clients: Mac OS X, Windows 98 SE, Windows XP, Linux.
  • Server: macOS (Intel/Silicon), Linux, Windows 10/11.
Downloads
Standalone binaries are available for several platforms (no Python installation required).
You can grab the v2.0 zip files here: https://codeberg.org/jjmarcos/retrostream-py/releases

Please have a look at the extensive documentation 😉

Let me know if you run into any issues!
 
Just a quick update to let you know RetroStream v2.5 is available now.

The big focus for this release was optimizing for legacy hardware, audio track selection and handling large libraries better. Here are the highlights:

  • MPEG-1 & Audio Optimization: Added MPEG-1 video encoding with automatic MP2 audio selection (Stereo/44.1kHz). This prevents your retro CPU from wasting cycles on real-time resampling (48kHz to 44.1kHz) during playback.
  • Custom Resolutions: You can now manually input resolutions (e.g., 320x240 or just x240) with auto-aspect ratio calculation, great to match your display.
  • Audio Track Selection: Added support for selecting specific audio tracks (languages/commentary) directly from the UI.
  • Major Performance Boost: Re-architected the library engine to use asynchronous lazy loading. Large libraries (tested up to 10k items) load much faster now, and metadata is only fetched when you click an item.
  • Fixes: Solved a subtitle transcoding crash caused by special characters/apostrophes in filenames.

Head over to Codeberg to download the v2.5 binaries:
https://codeberg.org/jjmarcos/retrostream-py/releases

I have also updated the repository with detailed instructions:
https://codeberg.org/jjmarcos/retrostream-py

If you want to understand the general workflow, check out the demo video from v2.0 (the core usage remains the same):

 
Hello,
First of all a big thank you for this projects for sure can put a more use into these old machines and other old ones.
I am very very new to everything server wise and jellyfin.
I just bought a synology ds220+ and set up a jellyfin server.
Can retro server play from it or I still need to install the server in other machine? And if so how I link it to jellyfin in the nas ?
 
Olá @skinniezinho !

First of all, I don't have a Synology to try any of this out personally, but I can certainly give you some direction on the architecture so you can decide which route fits your setup best.

Since the Synology runs Linux, you technically can use it to run the RetroStream server directly. This approach would require installing the full server stack on the NAS itself, which includes ffmpeg, ffprobe, Python 3, and a web server like Apache or NGINX. You will also need to know exactly where those binaries are located (running 'which ffmpeg' usually tells you) so you can point the configuration to them. The script explicitly allows you to configure these paths and the web root directory in the server.ini file.
This approach is very convenient because everything runs on the same box, but keep in mind that while the Celeron J4025 in your DS220+ is capable of decoding modern formats, encoding them into MPEG-2/MPEG-1 for the retro client might push the CPU and it's not going to be the fastest transcoding machine in town.

Alternatively, you can use a separate modern Mac (or Linux machine) to act as the "middleman" running the RetroStream Server, the ffmpeg tools, and the web server. If you choose this path, you will have to mount the NAS share that holds your movies on that modern Mac. This introduces a specific challenge regarding file paths because Jellyfin on the NAS sees your movie at a Linux path like /volume1/movies/Batman.mkv, while your modern Mac sees the mounted path as /Volumes/movies/Batman.mkv. Since the RetroStream server needs to locate the exact file path provided by Jellyfin to start the transcoding process, this mismatch will cause it to fail.

To solve this path mismatch on a Mac middleman, there is a trick mentioned in the project documentation (README-build_server.conf) involving /etc/synthetic.conf. This allows you to create a virtual link at the root of your Mac so that /volume1/ points to your actual mount point, making the paths look identical to both machines.
I believe another option could be using the "Path Substitution" feature inside the Jellyfin dashboard, I haven't tested this approach but it could also work.

Hope this helps you figure out the best setup!
 
Last edited:
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.