How I Brought PotPlayer's Playlist Features to macOS Using TypeScript

#typescript#open-source#macos#javascript#iina
A clean, dark-themed media player interface blending with TypeScript code

The Missing Piece in the Apple Ecosystem

Many developers who have migrated from Windows to macOS know the feeling: the hardware is great, the UNIX terminal is useful, but there is usually that one specific app you leave behind that doesn’t quite have an exact Mac equivalent.

For me, it was PotPlayer.

When I was on Windows, PotPlayer was my daily driver for media. Whether I was watching a TV series or working through a programming course with multiple nested folders, it handled it well. It could organize local videos, stream online content, and calculate the total duration of an entire course playlist. It kept things organized.

When I moved to Mac, I started looking for a replacement. The closest contender was IINA, a modern media player built on the MPV core. It looked clean and played everything, but it didn’t have the playlist management I was used to. It lacked nested local video support and online playlist management, which made navigating my courses a bit tedious.

The JavaScript Pivot

While looking for workarounds, I noticed something interesting: IINA had recently added a plugin system. What caught my attention was that these plugins could be written using JavaScript and TypeScript.

As a frontend and full-stack engineer, this was a great realization. We often think of JS/TS as tools strictly for the browser or Node.js. But here was a chance to use JavaScript to interface with native macOS APIs and the underlying MPV core. It showed the flexibility of the language in a different context.

Since the feature I needed didn’t exist yet, I decided to build it.

Building IINA Playlist Pro

I opened my editor and started working on IINA Playlist Pro. The goal was straightforward: recreate the playlist convenience I had on Windows, but natively inside IINA.

I wrote the logic to handle nested folders, manage online streaming lists, and calculate total course durations directly within IINA’s UI. It solved my media workflow issue, so I published it to GitHub as a personal utility.

Over time, the repository started getting some stars. Recently, a user opened an issue requesting a specific feature. Seeing that this small tool was actively making things easier for other people was a rewarding feeling. I implemented the feedback and pushed the update. Today, IINA Playlist Pro is listed in the IINA community plugins directory and the main repository.

Exploring the Ecosystem

Publishing this plugin also led me to check out what other developers were building for IINA and MPV.

One plugin that stood out to me was Anime4K. It uses GLSL shaders to upscale and improve the quality of animations in real-time as the video plays. I tried it out of curiosity, and the visual improvement was noticeable. A developer originally made it for MPV, and someone else in the community ported it to IINA.

This short project was a nice reminder of why software engineering is enjoyable: looking at a problem, realizing you have the tools to fix it, and sharing that solution with the community.