{"id":28403672,"url":"https://github.com/mrsilver76/tunelift","last_synced_at":"2026-05-14T20:05:37.629Z","repository":{"id":292403740,"uuid":"980720580","full_name":"mrsilver76/tunelift","owner":"mrsilver76","description":"Windows command line tool to export iTunes audio playlists as standard or extended .m3u files. ","archived":false,"fork":false,"pushed_at":"2025-12-16T16:30:23.000Z","size":137,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-20T07:33:34.123Z","etag":null,"topics":["audio","command-line","export","itunes","mp3","playlist","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-09T15:43:26.000Z","updated_at":"2025-12-16T16:30:27.000Z","dependencies_parsed_at":"2025-05-09T19:42:06.023Z","dependency_job_id":"3acb21ca-fc6e-4086-88f5-5fc81b98694e","html_url":"https://github.com/mrsilver76/tunelift","commit_stats":null,"previous_names":["mrsilver76/tunelift"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/mrsilver76/tunelift","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Ftunelift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Ftunelift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Ftunelift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Ftunelift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrsilver76","download_url":"https://codeload.github.com/mrsilver76/tunelift/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrsilver76%2Ftunelift/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33041234,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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","export","itunes","mp3","playlist","windows"],"created_at":"2025-06-01T18:38:33.329Z","updated_at":"2026-05-14T20:05:37.616Z","avatar_url":"https://github.com/mrsilver76.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TuneLift\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/.NET-C%23-512BD4?logo=dotnet\u0026logoColor=white\" alt=\".NET/C#\"\u003e \n\u003cimg src=\"https://img.shields.io/github/license/mrsilver76/tunelift?logo=gnu\u0026logoColor=white\" alt=\"GPL License\"\u003e \u003cimg src=\"https://img.shields.io/github/downloads/mrsilver76/tunelift/total\" alt=\"total downloads\"\u003e\u003c/p\u003e\n\n_A Windows command line tool to export iTunes audio playlists as standard or extended `.m3u` files. It can also adjust file paths for compatibility with other computers, operating systems (like Linux), NAS devices and embedded systems._\n\n\u003e[!TIP]\n\u003eUsing Plex for music? [ListPorter](https://github.com/mrsilver76/listporter) makes it easy to import your resulting `.m3u` files to Plex Media Server.\n\n## 🧰 Features\n* 🔗 Connects directly to iTunes via the exposed COM interface, rather than parsing XML files.\n* 💾 Export playlists in basic or extended M3U formats.\n* 🧠 Export only smart (dynamic rule-based) playlists, regular (manual) playlists or all playlists.\n* 🚫 Exclude exporting any playlist whose name starts with specified text.\n* 🐧 Convert paths (forward slashes and LF endings) for Linux.\n* 🔁 Rewrite paths to make exported playlists portable.\n* 📁 Remove a common base path from file entries to make playlists relative.\n* 🧹 Delete existing exports before saving new ones.\n* ⏹️ Automatically close iTunes after export if TuneLift started it.\n\n## 📦 Download\n\nGet the latest version from https://github.com/mrsilver76/tunelift/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|`TuneLift-x.x.x.exe` ✅ **Most users want this**|\n|Other/Developers|Source code (zip / tar.gz)|\n\nThere is no installer. Just download the executable and run it either by double-clicking or from the command line. \n\nYou may need to install the [.NET 8.0 runtime](https://dotnet.microsoft.com/en-us/download/dotnet/8.0/runtime) first. \n\nThis program has been tested extensively on Windows 11, but should also work on Windows 10.\n\n## 🚀 Quick start guide\n\nBelow are a couple of command scenarios for using TuneLift:\n\n```\nTuneLift.exe /d \"c:\\temp\\playlists\" /c\n\nTuneLift.exe --delete \"c:\\temp\\playlists\" --close\n```\n* Export all playlists from iTunes and save them into `C:\\Temp\\Playlists`.\n* Delete any playlists already in the folder before starting.\n* Close iTunes after exporting (if it was started by TuneLift)\n\n```\nTuneLift.exe \"C:\\Users\\MrSilver\\Documents\\Playlists\" -ne -i \"run\" -ns\n\nTuneLift.exe \"C:\\Users\\MrSilver\\Documents\\Playlists\" --not-extended --ignore \"run\" --no-smart\n```\n* Export all playlists from iTunes and save them into the `My Documents\\Playlists` folder owned by `MrSilver`.\n* Use the basic (not extended) `m3u` file format.\n* Don't export any playlists with a title that starts with `run`.\n* Don't export smart (dynamic rule-based) playlists.\n\n```\nTuneLift.exe \\\\raspberry\\pi\\playlists -d -l -f \"C:/Users/MrSilver/Music/iTunes/iTunes Media/Music\" -r \"/home/pi/music\"\n\nTuneLift.exe \\\\raspberry\\pi\\playlists --delete --unix --find \"C:/Users/MrSilver/Music/iTunes/iTunes Media/Music\" --replace \"/home/pi/music\"\n```\n* Export all playlists from iTunes and save them into the shared network folder `\\\\raspberry\\pi\\playlists`.\n* Delete any playlists already in the folder before starting.\n* Write the playlist files with Unix paths and file endings.\n* Replace `C:\\Users\\MrSilver\\Music\\iTunes\\iTunes Media\\Music` with `/home/pi/music`.\n\n\u003e [!IMPORTANT]\n\u003e When using `--unix`, path slashes are converted before any `--find` and `--replace` operations. Make sure your `--find` string reflects the adjusted slash style. In the example above, backslashes are converted to `/`, so `--find` must also use forward slashes (`/`.\n\n## 💻 Command line options\n\n```\nTuneLift.exe [options] \u003cdestination folder\u003e\n```\n\nIf `\u003cdestination folder\u003e` doesn't exist then it will be created.\n\n`[options]` can be 0 or more of the following:\n\n### Playlist selection\n\n- **`/ns`, `-ns`, `--no-smart`**  \n  Skips smart (dynamic rule-based) playlists and exports only regular (manual) ones.\n\n- **`/np`, `-np`, `--no-playlist`**  \n  Skips regular (manual) playlists and only exports smart (dynamic rule-based) playlists.\n\n- **`/i \u003ctext\u003e`, `-i \u003ctext\u003e`, `--ignore \u003ctext\u003e`**  \n  Excludes playlists whose names start with `\u003ctext\u003e`. This is case-insensitive, so `--ignore temp` will ignore playlists with titles such as \"TEMPMIX\" and \"Temp - Chill\".\n\n### Output format\n\n- **`/8`, `-8`, `--append-8`**  \n  Exports playlists with the `.m3u8` extension instead of `.m3u`.\n\n\u003e [!NOTE]\n\u003e **Playlist files are always encoded in UTF-8.** This ensures broad compatibility with file paths and file names that contain non-ASCII characters (eg. accented letters, umlauts or non-Latin symbols). The `--append-8` flag simply changes the extension to `.m3u8`.\n\n- **`/ne`, `-ne`, `--not-extended`**  \n  Outputs basic `.m3u` files without extended metadata (track duration or title). This is useful when trying to use the playlists with simpler or legacy media players.\n\n- **`/u`, `-u`, `--unix`**  \n  Converts Windows-style paths (backslashes) to Unix-style (forward slashes) and uses LF line endings. This is useful when exporting playlist files that will be used on Unix based machines - such as NASes, media servers or embedded systems.\n\n\u003e [!TIP]\n\u003e If you plan to use `--unix` then you may need to manipulate the path so that it correctly points to the songs. See [Path rewriting](#path-rewriting).\n\n### Path rewriting\n\nIf the playlist will be used by other users, machines, or software, the original file paths may not work for them. For example, a path like `D:\\MyMusic` might not be accessible from a NAS or another computer. Even if the files are shared, the other system may require a different path, such as `\\\\mycomputer\\MyMusic`. To address this, you can use the options below to rewrite paths so they match the environment where the playlist will be used:\n\n\u003e [!TIP]\n\u003e If you're using [ListPorter](https://github.com/mrsilver76/listporter) to upload your playlists to Plex, you probably don't need to rewrite paths! This is because ListPorter uses fuzzy matching to associate tracks, even when the paths don’t match exactly.\n\n- **`/f \u003ctext\u003e`,`-f \u003ctext\u003e`, `--find \u003ctext\u003e`**  \n  Searches for a specific substring in each file path. This is intended for use with `--replace` to modify paths for different devices or OSes. Searches are case-insensitive and you can only find one substring.\n\n\u003e [!IMPORTANT]\n\u003e When also using `--unix`, backslashes in the path will be replaced with forward slashes **before the search and replace is performed**. As a result, searches containing `\\` will always fail unless they are manually replaced with `/`.\n\n- **`/r \u003ctext\u003e`, `-r \u003ctext\u003e`, `--replace \u003ctext\u003e`**  \n  Replaces 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.\n\n- **`/b \u003cpath\u003e`, `-b \u003cpath\u003e`, `--base-path \u003cpath\u003e`**   \n  Removes the specified base path from the beginning of each file path in the exported playlist. This is useful when you want the playlist entries to be relative to a certain directory. The comparison is case-insensitive.\n\n  If your music files are located at `C:\\Music\\Library\\Artist\\Song.mp3` and you set `--base-path C:\\Music\\Library\\`, the resulting path in the playlist will be `Artist\\Song.mp3`.\n\n\u003e [!NOTE]\n\u003e The base path is removed before any other rewriting actions (such as `--find`, `--replace`, or `--unix`) are applied.\n\n\u003e [!IMPORTANT]\n\u003e To avoid leaving a leading slash or backslash in the result, make sure your `--base-path` ends with the appropriate path separator (`\\` for Windows-style paths or `/` for Linux-style paths).\n\n### File management\n\n- **`/d`, `-d`, `--delete`**  \n  Deletes playlist files already in the destination folder before exporting new ones.\n\n### Other options\n\n- **`/c`, `-c`, `--close`**  \n  Automatically closes iTunes after the export completes, but only if TuneLift started it. iTunes will not be closed if it was already running beforehand.\n\n- **`/nc`, `-nc`, `--no-check`**  \n  Disables GitHub version checks for TuneLift.\n\n\u003e[!NOTE]\n\u003eVersion checks occur at most once every 7 days. TuneLift connects only to [this URL](https://api.github.com/repos/mrsilver76/tunelift/releases/latest) to retrieve version information. No data about you or your music library is shared with the author or GitHub - you can verify this yourself by reviewing `GitHubVersionChecker.cs`\n\n- **`/?`, `-h`, `--help`**  \n  Displays the full help text with all available options, credits and the location of the log files.\n\n## ❓ Frequently Asked Questions\n\nRunning TuneLift\n\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- [Does this work with the Apple Music app in the Windows Store?](FAQ.md#does-this-work-with-the-apple-music-app-in-the-windows-store)\n- [Will this automatically sync new playlists or changes from iTunes?](FAQ.md#will-this-automatically-sync-new-playlists-or-changes-from-itunes)\n\nExport Behavior\n\n- [What happens if a playlist already exists in the destination folder?](FAQ.md#what-happens-if-a-playlist-already-exists-in-the-destination-folder)\n- [Can I export playlists to a network drive or shared folder?](FAQ.md#can-i-export-playlists-to-a-network-drive-or-shared-folder)\n- [Are tracks copied or moved, or is only the playlist file exported?](FAQ.md#are-tracks-copied-or-moved-or-is-only-the-playlist-file-exported)\n\nPlaylist Types\n\n- [How are smart playlists handled differently from normal playlists?](FAQ.md#how-are-smart-playlists-handled-differently-from-normal-playlists)\n- [Should I generate standard m3u or extended m3u files?](FAQ.md#should-i-generate-standard-m3u-or-extended-m3u-files)\n\nEncoding and Path Handling\n\n- [Why do you encode basic m3u files with UTF-8?](FAQ.md#why-do-you-encode-basic-m3u-files-with-utf-8)\n- [Can I use this for non-English filenames or folders?](FAQ.md#can-i-use-this-for-non-english-filenames-or-folders)\n- [I'm using `--unix`, why isn't `--find` matching?](FAQ.md#im-using---unix-why-isnt---find-matching)\n\n## 🛟 Questions/problems?\n\nPlease raise an issue at https://github.com/mrsilver76/tunelift/issues.\n\n## 💡 Future development: open but unplanned\n\nTuneLift 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/tunelift/issues).\n\n## 📝 Attribution\n\n- Apple, iTunes, and macOS are trademarks of Apple Inc., registered in the U.S. and other countries. This tool is not affiliated with or endorsed by Apple Inc.\n- Forklift icon by nawicon - Flaticon (https://www.flaticon.com/free-icons/forklift)\n\n## Version history\n\n### 1.1.1 (06 October 2025)\n- Fixed a bug that exported the tracks in a playlist in the wrong order.\n- Updated GitHub version checker to latest version.\n- Updated logger to latest version.\n- Updated publish script to latest version.\n\n### 1.1.0 (26 August 2025)\n- Added `-nc` (`--no-check`) to disable GitHub version checks.\n- Added `-c` (`--close`) to close iTunes after export, but only when TuneLift launched it.\n- Fixed minor formatting issue when displaying the number of tracks exported.\n- Corrected conversion of .NET build numbers to semantic version strings.\n- Improved logger performance by keeping log files open instead of repeatedly opening and closing them.\n- Split utility functions into separate static classes for clearer structure and easier navigation.\n- Resolved all .NET code analysis warnings to standardise style, remove potential pitfalls, and tidy the codebase.\n- Relocated FAQs to a dedicated document for a cleaner, more readable README.\n\n### 1.0.0 (23 June 2025)\n- 🏁 Declared as the first stable release.\n- Cleaned up version number handling, ensuring consistency and correct handling of pre-releases.\n- Added `--base-path` option to remove leading paths in playlists to make them relative.\n- Added `-l`, `--linux` and `/l` as an alias for `--unix`\n- Cleaned up various pieces of code.\n- Improved `Publish.ps1` build script for final executable.\n\n### 0.9.1 (21 May 2025)\n- Changed `/l`, `-l` and `--linux` to `/u`, `-u` and `--unix` to align with [ListPorter](https://github.com/mrsilver76/listporter) command-line conventions.\n- Fixed an issue in the version checker that could cause excessive requests to GitHub under certain conditions.\n- Fixed an issue in the version checker caused by a mismatch between .NET assembly versioning and GitHub's semantic versioning.\n- Fixed a bug that prevented audiobooks from being included in playlists.\n- Fixed a bug where playlists with no audio content were still being written to disk.\n- Greatly improved documentation for better clarity and usability.\n\n\n### 0.9.0 (12 May 2025)\n- Initial release, a C# port from [iTunes Playlist Exporter](https://github.com/mrsilver76/itunes_playlist_exporter/).\n- Removed Plex importing functionality, now handled by a separate tool called [ListPorter](https://github.com/mrsilver76/listporter/).\n- Moved all options to command line, no editing of code required.\n- Added automatic version checking with update notifications.\n- Logger now writes output to a log file instead of just the console.\n- Added `--no-playlist` to skip regular playlists and export only smart ones.\n- Added `--append-8` to use `.m3u8` extension instead of `.m3u`.\n- Added `--delete` to remove `.m3u` files before exporting (for clean re-exports)\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrsilver76%2Ftunelift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrsilver76%2Ftunelift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrsilver76%2Ftunelift/lists"}