{"id":28394834,"url":"https://github.com/mrsilver76/listporter","last_synced_at":"2026-04-14T03:32:14.998Z","repository":{"id":293686508,"uuid":"982932812","full_name":"mrsilver76/listporter","owner":"mrsilver76","description":"A cross-platform command-line tool (Windows, Linux, macOS) for importing standard or extended .m3u audio playlists into Plex Media Server. Supports fuzzy path matching, path rewriting, and optional mirroring. Works with playlists exported by iTunes, MusicBee, MediaMonkey, foobar2000, Swinsian, Rhythmbox, Strawberry and more.","archived":false,"fork":false,"pushed_at":"2026-03-16T18:15:24.000Z","size":333,"stargazers_count":48,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-17T05:09:06.065Z","etag":null,"topics":["audio","command-line","import","importer","linux","macos","mp3","playlist","plex","plex-media-server","plexamp","upload","windows"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mrsilver76.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-13T16:07:54.000Z","updated_at":"2026-03-16T18:14:16.000Z","dependencies_parsed_at":"2025-06-13T19:28:01.640Z","dependency_job_id":"699016fe-5f41-402d-ae39-87eab65451b0","html_url":"https://github.com/mrsilver76/listporter","commit_stats":null,"previous_names":["mrsilver76/plex-playlist-uploader","mrsilver76/listporter"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/mrsilver76/listporter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Flistporter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Flistporter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Flistporter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Flistporter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrsilver76","download_url":"https://codeload.github.com/mrsilver76/listporter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Flistporter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31781292,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T02:24:21.117Z","status":"ssl_error","status_checked_at":"2026-04-14T02:24:20.627Z","response_time":153,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","command-line","import","importer","linux","macos","mp3","playlist","plex","plex-media-server","plexamp","upload","windows"],"created_at":"2025-05-31T19:00:51.865Z","updated_at":"2026-04-14T03:32:14.991Z","avatar_url":"https://github.com/mrsilver76.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ListPorter\n\n\u003cp\u003e\u003cimg src=\"https://img.shields.io/badge/Windows-supported-0078D6?logo=windows\u0026logoColor=white\" alt=\"Windows\"\u003e \u003cimg src=\"https://img.shields.io/badge/Linux-supported-FCC624?logo=linux\u0026logoColor=black\" alt=\"Linux\"\u003e \u003cimg src=\"https://img.shields.io/badge/macOS-supported-000000?logo=apple\u0026logoColor=white\" alt=\"macOS\"\u003e \u003cimg src=\"https://img.shields.io/badge/.NET-C%23-512BD4?logo=dotnet\u0026logoColor=white\" alt=\".NET/C#\"\u003e \n\u003cimg src=\"https://img.shields.io/github/license/mrsilver76/listporter?logo=gnu\u0026logoColor=white\" alt=\"GPL License\"\u003e \u003cimg src=\"https://img.shields.io/github/stars/mrsilver76/listporter\" alt=\"total stars\"\u003e\u003c/p\u003e\n\n_A cross-platform command-line tool (Windows, Linux, macOS) for importing standard or extended `.m3u` audio playlists into [Plex Media Server](https://www.plex.tv/media-server-downloads/). Supports fuzzy path matching, path rewriting, and optional mirroring._\n\nListPorter works with playlists exported by common music players and library managers, including [iTunes](https://support.apple.com/HT210384), [MusicBee](https://getmusicbee.com/), [MediaMonkey](https://www.mediamonkey.com/), [foobar2000](https://www.foobar2000.org/), [Swinsian](https://swinsian.com/), [Rhythmbox](https://wiki.gnome.org/Apps/Rhythmbox) and [Strawberry](https://www.strawberrymusicplayer.org/).\n\n\u003e [!TIP]\n\u003e **iTunes on Windows does not provide a practical way to bulk export playlists.**\u003cbr\u003e\n\u003e [TuneLift](https://github.com/mrsilver76/tunelift) is a Windows-only companion tool that exports all iTunes playlists to standard `.m3u` files for use with ListPorter.\n\n## 🧰 Features\n* 💻 Runs on Windows 10 \u0026 11, Linux (x64, ARM64, ARM32) and macOS (Intel \u0026 Apple Silicon).\n* 📂 Imports standard or extended M3U audio playlists to Plex.\n* 🌐 Works with any Plex server platform (Windows, Linux, NAS, macOS) via the Plex API.\n* ⏳ Triggers a Plex library update/scan before import to include new tracks.\n* ✅ Skips importing playlists that haven’t changed.\n* 🪞 Mirrors Plex playlists to match imported M3U files.\n* 🎯 Fuzzy matching logic (using last three path parts) to improve playlist-to-Plex matching.\n* 🔁 Force playlist paths to use `/` or `\\` to match your Plex server’s file format.\n* 🛠️ Rewrite playlist paths using find \u0026 replace rules to match your Plex library.\n* 🧭 Prepend a base path to support relative paths in playlists.\n* 🧹 Deletes all Plex playlists before import.\n* 🔗 Preserves playlist IDs to maintain compatibility with external players (e.g. Sonos)\n* 📘 Logs activity to timestamped text files.\n\n## 📦 Download\n\nGet the latest version from https://github.com/mrsilver76/listporter/releases.\n\nEach release includes the following files (`x.x.x` denotes the version number):\n\n|Platform|Download|\n|:--------|:-----------|\n|Microsoft Windows 10 \u0026 11|`ListPorter-x.x.x-win-x64.exe` ✅ **Most users should choose this**|\n|Linux (64-bit Intel/AMD)|`ListPorter-x.x.x-linux-x64`|\n|Linux (64-bit ARM), e.g. Pi 4 and newer|`ListPorter-x.x.x-linux-arm64`|\n|Linux (32-bit ARM), e.g. Pi 3 and older|`ListPorter-x.x.x-linux-arm`|\n|Synology DSM|`ListPorter-x.x.x-linux-x64` 🐳 Run via Docker / Container Manager|\n|macOS (Apple Silicon)|`ListPorter-x.x.x-osx-arm64`|\n|macOS (Intel)|`ListPorter-x.x.x-osx-x64`|\n|Other/Developers|Source code (zip / tar.gz)|\n\n\u003e [!TIP]\n\u003e There is no installer for native platforms. Just download the appropriate file and run it from the command line. If you're using Docker (e.g. on Synology), setup will differ - see notes below.\n\n### macOS users\n\n- Download the appropriate binary for your platform (see table above).\n- Install the [.NET 8.0 runtime](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime). Slightly more technical information can be found [here](https://learn.microsoft.com/en-gb/dotnet/core/install/macos).\n- ⚠️ Do not install the SDK, ASP.NET Core Runtime, or Desktop Runtime.\n- Make the downloaded file executable: `chmod +x ListPorter-x.x.x-\u003cyour-platform\u003e`\n- If you get `zsh: killed` when running the executable then:\n  - Apply an ad-hoc code signature: `codesign --force --deep --sign - ListPorter-x.x.x-\u003cyour-platform\u003e`\n  - Remove the quarantine attribute: `xattr -d com.apple.quarantine ListPorter-x.x.x-\u003cyour-platform\u003e`\n\n### Linux users\n\n- Download the appropriate binary for your platform (see table above).\n- Install the [.NET 8.0 runtime](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime). Slightly more technical pages can be found [here](https://learn.microsoft.com/en-gb/dotnet/core/install/linux).\n- ⚠️ Do not install the SDK, ASP.NET Core Runtime, or Desktop Runtime.\n- Make the downloaded file executable: `chmod +x ListPorter-x.x.x-\u003cyour-platform\u003e`\n\n### Synology DSM users\n\n- Only Plus-series models (e.g. DS918+, DS920+) support Docker/Container Manager. Value and J-series models cannot run ListPorter this way.\n- For DSM 7.2+, use Container Manager; older versions use the Docker package.\n- Install the [.NET 8.0 Linux runtime](https://learn.microsoft.com/en-gb/dotnet/core/install/linux?WT.mc_id=dotnet-35129-website) inside the container or use a [.NET container image](https://learn.microsoft.com/en-gb/dotnet/core/docker/introduction#net-images).\n- ⚠️ Do not install the SDK, ASP.NET Core Runtime, or Desktop Runtime.\n- Use the `ListPorter-x.x.x-linux-x64` binary inside the container.\n- Mount your playlist folder into the container with read access and ensure network access to Plex.\n\n### Platform testing notes\n\n* Tested extensively: Windows 11  \n* Tested moderately: Linux (64-bit ARM, Raspberry Pi 5 only)  \n* Not tested: Windows 10, Linux (x64), Linux (32-bit ARM), Synology DSM (via Container Manager), macOS (x64 \u0026 Apple Silicon)\n\n\u003e[!NOTE]\n\u003eDocker, Synology DSM, and macOS environments have not been tested, and no platform-specific guidance is available as these setups are outside the developer’s experience. While ListPorter should work fine on them, support will be limited to questions directly related to the tool itself.\n\n## 🚀 Quick start guide\n\n**This is the simplest and most common way to use ListPorter.** It works across platforms, refreshes the library before starting and uses fuzzy matching to automatically align playlist paths with your Plex library.\n\n\u003e[!TIP]\n\u003eTo ensure Plex contains only the playlists in your import folder (i.e. remove any that aren’t there), add the `--mirror` (`-m`) option.\n\n```\nListPorter -s 127.0.0.1 -t ABCDEFG -l 8 -i \"C:\\Playlists\" -k\n\nListPorter --server 127.0.0.1 --token ABCDEFG --library 8 --import \"C:\\Playlists\" --update\n```\n\nThe example below shows a more advanced scenario suitable when fuzzy matching isn’t enough. It demonstrates how to explicitly rewrite paths and convert formats when importing playlists created on one platform (e.g. Windows) into a Plex server running on another (e.g. Linux).\nNote that `--find` (`-f`) uses forward slashes because `--linux` (`-l`) converts backslashes to forward slashes.\n\n\u003e[!CAUTION]\n\u003eThis example deletes existing Plex playlists before import. Only use `--delete` (`-d`) if you're sure you want to replace everything..\n\n```\nListPorter -s pimachine -t ABCDEFG -l 10 -i \"C:\\Playlists\" -x -l -f \"C:/Users/MrSilver/Music/iTunes/iTunes Media/Music\" -r \"/home/pi/music\" -d\n\nListPorter --server pimachine --token ABCDEFG --library 10 --import \"C:\\Playlists\" --exact-only --linux --find \"C:/Users/MrSilver/Music/iTunes/iTunes Media/Music\" --replace \"/home/pi/music\" --delete\n```\n\n## 💻 Command line options\n\nListPorter is a command-line tool. Run it from a terminal or command prompt, supplying all options and arguments directly on the command line. Logs with detailed information are also written and you can find the log file location using `--help` (`-h`).\n\n```\nListPorter -s \u003caddress\u003e[:\u003cport\u003e] -t \u003ctoken\u003e -l \u003clibrary\u003e -i \u003cpath\u003e [options]\n```\n\n### Mandatory arguments\n\n- **`-s \u003caddress\u003e[:\u003cport\u003e]`, `--server \u003caddress\u003e[:\u003cport\u003e]`**   \n  Plex server address, optionally including the port (e.g. `localhost:32400`). If you do not supply a port then the default (`32400`) will be used.\n\n  You can also prefix with `https://` or `http://` to specify the connection type (default is `http`).\n\n\u003e[!NOTE]\n\u003eIf Plex is configured to require secure connections (under Settings \u003e Remote Access) then plain `http://` connections will fail, so use `https://` instead.\n\n- **`-t \u003ctoken\u003e`, `--token \u003ctoken\u003e`**   \n  Plex authentication token. Required to interact with your Plex server. To find out your token, see [Plex's guide](https://support.plex.tv/articles/204059436-finding-an-authentication-token-x-plex-token/).\n\n\u003e[!NOTE]\n\u003eIf you want to upload playlists for a specific [Plex Home user](https://support.plex.tv/articles/203815766-what-is-plex-home/), **you must use the access token associated with that user**, not the admin account. Refer to [this FAQ entry](FAQ.md#can-i-import-a-playlist-directly-to-a-specific-plex-home-user-instead-of-the-mainadmin-account) for detailed steps on obtaining a Plex Home user token.\n\n\u003e[!CAUTION]\n\u003eYou should never share your Plex token with anyone!\n\n- **`-l \u003clibrary\u003e`, `--library \u003clibrary\u003e`**   \n  Plex library ID that contains your music. This must be a _Music_ library. To find your library ID, go into the Plex web client, hover the mouse over the library you want and look at the URL. It will end with `source=xx` where `xx` is the library ID.\n\n- **`-i \u003cpath\u003e`, `--import \u003cpath\u003e`**   \n  Path to a single .m3u file or a directory containing multiple .m3u files.\n\n### Optional arguments\n  \n#### Playlist sync options\n\nThese options will remove playlists from your Plex server under specific conditions. Only playlists that are manual (not smart/dynamic), contain audio tracks only and belong entirely to the music library specified by `--library` will ever be deleted. No other content (such as music files, metadata or non-matching playlists) is modified or removed..\n\n- **`-d`, `--delete`**   \n  Deletes all existing playlists in the specified Plex music library before importing any new ones.\n\n- **`-m`, `--mirror`**   \n  Mirrors Plex playlists to match the imported `.m3u` files. Any Plex playlists not represented in the imported list will be removed. \n\n\u003e [!CAUTION]\n\u003e Be careful when using `--mirror` with a single file: this will cause all other playlists in the library to be removed, keeping only the one you provided.\n\n#### Path rewriting options\n\nListPorter tries to match each file path in your playlist with the paths Plex has stored. It first attempts an exact match. If that fails, it automatically uses fuzzy matching, based on the assumption that music files are organised with a structure of `artist/album/track` or `artist\\album\\track`. It compares only the last three parts of each path, ignoring drive letters, shares, or deeper folder structures.\n\nThis approach works well when root paths differ or when file systems vary across devices, as long as the layout near the file itself is consistent. However, if files have been renamed or stored with a different folder hierarchy, exact or fuzzy matching may fail.\n\n**Fuzzy matching is automatically disabled when using `-f` (`--find`) or `-b` (`--base-path`), as these options explicitly rewrite how paths are interpreted.** Other options, including `-w` (`--windows`) and `-u` (`--unix`) do not disable fuzzy matching because separator differences between Windows and Unix are handled automatically.\n\nThese options don’t modify the playlist files themselves - they only affect how paths are interpreted during import.\n\n- **`-u`, `--unix`, `--linux`**   \nForce playlist paths to use forward slashes (`/`), often required for Plex servers running on Linux, macOS, or NAS. This does not affect any path set using `--base-path`.\n\n- **`-w`, `--windows`**   \nForce playlist paths to use backslashes (`\\`), as used by Plex servers on Windows. This does not affect any path set using `--base-path`.\n\n- **`-f \u003ctext\u003e`, `--find \u003ctext\u003e`**   \nSearches for a substring in each song's file path. Intended for use with `--replace` to rewrite paths. Matching is case-insensitive and only one `--find` string is supported per run. Paths set using `--base-path` will not be searched.\n\n\u003e [!IMPORTANT]\n\u003e If you're also using `--unix` or `--windows`, the slash conversion happens before the search-and-replace step. Be sure your `--find` value uses the correct slash style for matching.\n\n- **`-r \u003ctext\u003e`, `--replace \u003ctext\u003e`**   \nReplaces matched text from `--find` with this new value. If `--find` is used and there is no `--replace` value, then it will be assumed to be blank and the matching string will be removed. Paths set using `--base-path` will not be affected.\n\n- **`-b \u003cpath\u003e`, `--base-path \u003cpath\u003e`**   \nSpecifies a base path to prepend to all playlist entries. This is useful when your .m3u playlists contain relative paths (e.g. `./music/track.mp3`). If a track’s path starts with `./` or `.\\` then the leading dot will be removed before applying the base path.\n  \n  The base path is applied after all other rewriting options (such as `--find`/`--replace` or `--unix`/`--windows`) and will affect all playlists in the current run.\n\n- **`-x`, `--exact-only`**   \nDisables fuzzy matching and any automatic path adjustments. Only exact, case-insensitive matches will be used to link playlist files to Plex tracks. Use this if you want full control and are relying entirely on exact paths or other file rewriting options listed above.\n\n### Other options\n\n- **`-k`, `--update`**  \n  Instructs Plex to update or scan the specified library before ListPorter starts importing playlists. This ensures any new songs you’ve added to your Plex library are recognized and indexed *before importing*. Without this, your playlists might reference new tracks Plex hasn’t scanned yet, which can cause errors during import.\n\n\u003e[!NOTE]  \n\u003e- ListPorter waits for the Plex library scan to finish before importing playlists. The time this takes depends on your library size and number of changes. There will also be a short 5-10 second delay between Plex finishing the scan and ListPorter continuing.\n\u003e- Non-admin (Plex Home) users cannot trigger a library scan. This is a restriction enforced by Plex, not ListPorter.\n\n- **`-nc`, `--no-check`**  \n  Disables GitHub version checks for GroupMachine.\n\n\u003e[!NOTE]\n\u003eVersion checks occur at most once every 7 days. ListPorter connects only to [this URL](https://api.github.com/repos/mrsilver76/listporter/releases/latest) to retrieve version information. No data about you, your music library or your Plex server is shared with the author or GitHub - you can verify this yourself by reviewing `GitHubVersionChecker.cs`\n\n- **`-v`, `--verbose`**  \n  Outputs additional information to the log files to aid in debugging.\n  \n- **`/?`, `-h`, `--help`**  \n  Displays the full help text with all available options, credits and the location of the log files.\n\n## 🧩 How playlists are matched on Plex\n\nThe program will only recognise and process playlists on your Plex server that meet all of the following criteria:\n\n1. All items in the playlist must be audio - playlists containing video or mixed content are ignored.\n2. The playlist is manual, not a smart/dynamic playlist.\n3. All audio tracks in the playlist belong to the library ID provided via `--library`.\n\nThese rules apply to all playlist-related operations, including `--mirror` and `--delete`.\n\n\u003e[!NOTE]\n\u003eThe program will only report the number of playlists that meet these criteria, not the total number of playlists on your Plex server. If a playlist doesn’t appear or isn’t deleted/modified as expected, it likely does not meet one or more of these conditions.\n\n## ❓ Frequently Asked Questions\n\nGetting started and running the tool\n\n- [I'm struggling to understand how to run or configure ListPorter. What should I do?](FAQ.md#im-struggling-to-understand-how-to-run-or-configure-listporter-what-should-i-do)\n- [Can I just double-click on this program from Windows Explorer and it run?](FAQ.md#can-i-just-double-click-on-this-program-from-windows-explorer-and-it-run)\n- [Can I run this on a headless Linux server or NAS?](FAQ.md#can-i-run-this-on-a-headless-linux-server-or-nas)\n\nConfiguration and command line options\n\n- [Can I import playlists directly to a specific Plex Home user instead of the main/admin account?](FAQ.md#can-i-import-a-playlist-directly-to-a-specific-plex-home-user-instead-of-the-mainadmin-account)\n- [What does the `--mirror` option do exactly?](FAQ.md#what-does-the---mirror-option-do-exactly)\n- [I'm using `--windows` or `--unix`. Why isn't `--find` matching?](FAQ.md#im-using---windows-or---unix-why-isnt---find-matching)\n\nLogging and debugging\n\n- [Where are the logs stored? What do they show?](FAQ.md#where-are-the-logs-stored-what-do-they-show)\n- [I'm getting an error about fuzzy maching conflicts](FAQ.md#im-getting-an-error-about-fuzzy-matching-conflicts)\n- [Why do I see a warning that some items failed to match the Plex database?](FAQ.md#why-do-i-see-a-warning-that-some-items-failed-to-match-the-plex-database)\n\nPlex interaction and playlist behavior\n\n- [Does this overwrite existing playlists in Plex?](FAQ.md#does-this-overwrite-existing-playlists-in-plex)\n- [Why does the tool clear the contents of existing playlists instead of deleting and recreating them?](FAQ.md#why-does-the-tool-clear-the-contents-of-existing-playlists-instead-of-deleting-and-recreating-them)\n\n## 🛟 Questions/problems?\n\nPlease raise an issue at https://github.com/mrsilver76/listporter/issues.\n\n## 💡 Future development: open but unplanned\n\nListPorter currently meets the needs it was designed for, and no major new features are planned at this time. However, the project remains open to community suggestions and improvements. If you have ideas or see ways to enhance the tool, please feel free to submit a [feature request](https://github.com/mrsilver76/listporter/issues).\n\n## 📝 Attribution\n\n- Plex is a registered trademark of Plex, Inc. This tool is not affiliated with or endorsed by Plex, Inc.\n- Music \u0026 multimedia icon by paonkz - Flaticon (https://www.flaticon.com/free-icons/music-and-multimedia)\n- With thanks to https://www.plexopedia.com/plex-media-server/api/ for Plex API documentation.\n\n## 🕰️ Version history\n\n### 1.1.2 (16 March 2026)\n- Fixed a bug where paths in playlists with accented or special characters could fail to match to content already in Plex due to UTF8 normalisation differences.\n- Fixed a bug where using `--unix` or `--windows` without `--find` or `--base-path` would incorrectly disable fuzzy matching.\n- Fixed a bug where some command line options weren't being correctly noted in the console/terminal output.\n- Updated the publish script to use `--no-self-contained` as identifed by dotnet/sdk#51888.\n- Updated copyright.\n\n### 1.1.1 (06 October 2025)\n- Output now confirms which Plex account or managed user the playlists will be uploaded to, based on the token provided.\n- Fixed bug where logs were not being saved in the correct location.\n- Fixed bug where Plex token was being incorrectly saved in the logs.\n\n\n### 1.1.0 (24 September 2025)\n- Added `-k` (`--update`) to force Plex to scan the library prior to importing.\n- Logger now includes OS information to help with troubleshooting across platforms.\n- All fuzzy match clashes during the database build are now logged, not just the first.\n- When fuzzy match clashes occur, ListPorter now exits with an error and a link to the FAQ.\n- Supplying an invalid Plex library ID now returns a clear error, instead of crashing.\n- `.m3u` track paths incorrectly prefixed with `file://` or `file-relative://` are now cleaned automatically.\n- Legacy log folders named \"Plex Playlist Uploader\" and \"PlexPU\" are no longer deleted.\n- Added `-nc` (`--no-check`) to disable GitHub version checking.\n- Added header displaying key settings and command line options used.\n- Updated GitHub version checking code and publish Powershell script.\n- Cleaned up various pieces of code (analyzer suggestions regarding naming, simplifications, and style)\n- FAQs have been moved to a separate page to reduce clutter in the main README.\n\n### 1.0.0 (27 June 2025)\n- 🏁 Declared as the first stable release.\n- Added fuzzy matching logic to improve playlist-to-Plex track matching when exact paths don’t align.\n- Added support for secure connections (HTTPS) when communicating with Plex servers.\n- Added `--base-path` (`-b)` option to prepend a base path for playlists using relative paths.\n- Added `--linux` as an alias for `--unix`.\n- Improved `--help` formatting for better readability on 80-character terminals.\n- Added contextual tips for import errors to assist troubleshooting without needing logs.\n- Reduced API page size to 1000 to prevent Plex from generating warning entries.\n- Path matching and rewriting issues are now surfaced to users (max 5 per playlist).\n- Replaced `Publish.bat` with a streamlined `Publish.ps1` script for building executables.\n- Added `linux-arm` builds for compatibility with Raspberry Pi 3 devices.\n- Added additional logging to aid in debugging.\n- Added statistics showing playlists skipped, created, updated and deleted.\n- Fixed bug where a folder with no m3u or m3u8 files would not generate an appropriate error.\n- Made output less spammy whilst loading and parsing m3u files. \n- Added GNU GPL v2 license notice to source files for clarity.\n\n### 0.9.3 (24 May 2025)\n- Fixed version checker incorrectly reporting updates available when already on the latest version.\n\n### 0.9.2 (24 May 2025)\n- Updated track discovery to use a more comprehensive Plex API endpoint, resolving issues where some valid items (like orphaned tracks) were previously omitted. Thanks to u/AnalogWalrus and u/spikeygg for spotting and helping to debug.\n- Improved performance by over 30% through fewer API calls and reduced track lookups during playlist processing.\n- Added hostname and port number of Plex server during connection test.\n- Cleaned up version number handling, ensuring consistency and correct handling of pre-releases.\n- Improved verbose mode to help in debugging issues.\n- Added details about `--verbose` to `--help`.\n- Cleaned up various pieces of code.\n\n### 0.9.1 (19 May 2025)\n- Renamed to \"ListPorter\" to avoid any potential issue with the Plex legal team.\n- Fixed bug that meant that the Plex token and machine ID could end up in the logs.\n- Log folders generated by 0.9.0 are removed, as they can contain token data.\n- Tracks marked as deleted (but not removed) are now considered for playlists.\n- Fixed logs to report more useful information.\n- Fixed copyright and minor number formatting.\n- Added error catching for some file operations.\n- Changed incorrect scary messaging when there are empty playlists.\n- Fixed terrible error messages when unable to connect to Plex server.\n- Added links to Plex support articles for common connection issues.\n- Added 10 second notification to avoid people thinking that the program had locked up.\n- Updated `Publish.bat` to include missing osx-x64 (macOS on Intel) build.\n\n### 0.9.0 (16 May 2025)\n- Initial release, a C# port from [iTunes Playlist Exporter](https://github.com/mrsilver76/itunes_playlist_exporter).\n- Now cross-platform, with support for Windows, Linux (x64 and ARM) and macOS.\n- Removed iTunes exporting functionality, now handled by a separate tool called [TuneLift](https://github.com/mrsilver76/tunelift).\n- Added automatic version checking with update notifications.\n- Playlists are only updated if they have changed, eliminating the need to delete and re-import everything.\n- Added `--mirror` option to remove playlists from Plex that no longer exist in the input directory.\n- Modified playlists retain their original playlist ID, so external players like Sonos can continue to reference them.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrsilver76%2Flistporter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrsilver76%2Flistporter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrsilver76%2Flistporter/lists"}