{"id":33918543,"url":"https://github.com/thingsiplay/lpled","last_synced_at":"2026-04-05T11:31:49.028Z","repository":{"id":320738078,"uuid":"1083184304","full_name":"thingsiplay/lpled","owner":"thingsiplay","description":"LPL Editor - RetroArch playlist filter and stream editor","archived":false,"fork":false,"pushed_at":"2025-10-25T14:30:44.000Z","size":79,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-13T14:33:23.441Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thingsiplay.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-10-25T14:09:50.000Z","updated_at":"2025-10-25T18:35:23.000Z","dependencies_parsed_at":"2025-10-25T16:25:14.572Z","dependency_job_id":"5103f3d9-5a01-4d28-a30e-18bfa3d6fb68","html_url":"https://github.com/thingsiplay/lpled","commit_stats":null,"previous_names":["thingsiplay/lpled"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/thingsiplay/lpled","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thingsiplay%2Flpled","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thingsiplay%2Flpled/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thingsiplay%2Flpled/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thingsiplay%2Flpled/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thingsiplay","download_url":"https://codeload.github.com/thingsiplay/lpled/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thingsiplay%2Flpled/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31434624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T08:13:15.228Z","status":"ssl_error","status_checked_at":"2026-04-05T08:13:11.839Z","response_time":75,"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":[],"created_at":"2025-12-12T08:25:19.239Z","updated_at":"2026-04-05T11:31:48.955Z","avatar_url":"https://github.com/thingsiplay.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LPL Editor\n\nRetroArch playlist filter and stream editor.\n\n- Author: [Tuncay D.](https://github.com/thingsiplay)\n- Source: [Github](https://github.com/thingsiplay/lpled)\n- Package: [Crates.io](https://crates.io/crates/lpled)\n- License: [MIT](LICENSE)\n\n## What is LPL Editor?\n\n\"LPL Editor\" (or `lpled` for short) is a command line application written in\nRust to view, combine, filter, edit and remix \"RetroArch Playlist\" files. Add\noptions and patterns to filter content or customize output, inspired by tools\nlike `grep` and `jq`. This is **not** a ROM or media files manager. Games need\nto be imported into Playlists through RetroArch first.\n\n```bash\n$ lpled --label \"Cotton\" \"tests/data/history.lpl\"\n{\n  \"version\": \"1.5\",\n  \"default_core_path\": \"\",\n  \"default_core_name\": \"\",\n  \"base_content_directory\": \"/home/tuncay/Emulation/Roms\",\n  \"label_display_mode\": 0,\n  \"right_thumbnail_mode\": 0,\n  \"left_thumbnail_mode\": 0,\n  \"thumbnail_match_mode\": 0,\n  \"sort_mode\": 2,\n  \"items\": [\n    {\n      \"path\": \"/home/tuncay/Emulation/Roms/arcade/arcade_stv/cotton2.zip\",\n      \"label\": \"Cotton 2 (JUET 970902 V1.000)\",\n      \"core_path\": \"/home/tuncay/.config/retroarch/cores/kronos_libretro.so\",\n      \"core_name\": \"Sega - Saturn/ST-V (Kronos)\",\n      \"crc32\": \"9E20EDA6|crc\",\n      \"db_name\": \"MAME.lpl\"\n    },\n    {\n      \"path\": \"/home/tuncay/Emulation/Roms/pcenginecd/pcenginecd_redump/Fantastic Night Dreams - Cotton (USA).chd\",\n      \"label\": \"Fantastic Night Dreams - Cotton (USA)\",\n      \"core_path\": \"/home/tuncay/.config/retroarch/cores/mednafen_pce_libretro.so\",\n      \"core_name\": \"NEC - PC Engine / SuperGrafx / CD (Beetle PCE)\",\n      \"crc32\": \"00000000|crc\",\n      \"db_name\": \"\"\n    }\n  ]\n}\n```\n\n```bash\n$ lpled -F '{label}\\n\\t{core_name}' --label \"Cotton\" \"tests/data/history.lpl\"\nCotton 2 (JUET 970902 V1.000)\n        Sega - Saturn/ST-V (Kronos)\nFantastic Night Dreams - Cotton (USA)\n        NEC - PC Engine / SuperGrafx / CD (Beetle PCE)\n```\n\n### Features\n\n- merge multiple playlists\n- search filters with regex support\n- sort game entries\n- remove duplicate game entries\n- check for missing ROM files\n- respect default core for \"DETECT\" values\n- output data in color or custom format\n- fuzzy finder selection menu\n- play game directly with RetroArch\n- and more...\n\n### What is a RetroArch Playlist?\n\nLibretro Docs:\n\n- [ROMS, Playlists, and\n  Thumbnails](https://docs.libretro.com/guides/roms-playlists-thumbnails/) /\n  [JSON Playlist\n  format](https://docs.libretro.com/guides/roms-playlists-thumbnails/#json-playlist-format)\n- [Importing Content](https://docs.libretro.com/guides/import-content/)\n\n[RetroArch](https://www.retroarch.com/) brings many emulators adapted as\n\"core\" plugins together and manages user configuration in a cohesive\nenvironment. Games are organized into \"RetroArch Playlists\". Playlists show up\nin the user interface as clickable game entries and contain information such as\nlocation of ROM files and their associated cores. These files are regular text\ndata encoded in JSON format with file extension \".lpl\". Each data field consist\nof a `\"key\": \"value\"` pair. In example `\"label\"` would be the name of the key\nand `\"Fantastic Night Dreams - Cotton (USA)\"` it's associated value.\n\n## Installation\n\n### Download (simple)\n\nGet pre-compiled binaries:\n\n1. Go to [Releases Page](https://github.com/thingsiplay/lpled/releases)\n2. Download the archive file for your operating system\n3. Extract and run `lpled`\n\n### Compile from source (advanced)\n\nCompile process downloads lot of library dependencies.\n\n#### Pre-requisites\n\n- **Rustup** (`rustc` and `cargo`):\n  [Download](https://www.rust-lang.org/tools/install) -\u003e Install Rust compiler\n  and toolchain\n- On Windows only: **Microsoft Visual Studio Build Tools** (`msvc`):\n  [Download](https://visualstudio.microsoft.com/visual-cpp-build-tools/) -\u003e\n  Install with \"_Desktop development with C++_\" option enabled (MS account login\n  is not required)\n\n#### Build\n\n##### Option 1: Automatic compile and install from Crates io\n\n```bash\ncargo install lpled\n```\n\n##### Option 2: Manually compile from Github\n\n```bash\ngit clone https://github.com/thingsiplay/lpled\ncd lpled\ncargo build --release\ncd target/release\n```\n\n##### Option 3: Cross compilation\n\nFirst install the required tools for the build script. A Linux environment is\nexpected:\n\n- **Cross** (`cross`) |\n  [cross](https://github.com/cross-rs/cross?tab=readme-ov-file) -\u003e cross\n  compile to other platforms\n- **Podman** `podman` | [podman](https://podman.io/) -\u003e container system used\n  by Cross on Linux\n- **Zip** (`zip`) -\u003e needed to create the Zip package for Windows\n\n```bash\npacman -S podman zip  # use your distros package manager in place of `pacman -S`\ncargo install cross\n```\n\nLook into the `build.sh` Bash script and adapt it for your needs, especially\nthe `TARGETS` variable. List available targets with:\n\n```bash\nrustc --print target-list\n```\n\nRun script to build all targets and create packages for distribution:\n\n```bash\nbash build.sh\n```\n\n## Usage\n\n```bash\nUsage: lpled [OPTIONS] [FILE]...\n```\n\nLet's break down following command to its components:\n\n```bash\nlpled -f --write \"output.lpl\" \"playlist.lpl\"\n```\n\n```text\n               option name\n               (expects argument)\n                   |\nprogram name       |    argument to option\n  |                |         |\n-----           -------   ------------\nlpled    -f     --write   \"output.lpl\"      \"playlist.lpl\"\n         --     ----------------------      --------------\n          |                                      |\n          |                              input filename\n      flag option\n      (without argument)\n```\n\n### Standard operations\n\nWhen loading files, standard operations are executed and applied to modify\ndata. Original file on disk is not modified by default.\n\n1. Load list of files. Additionally read data or paths from stdin.\n2. Apply default values to each game entry: replace `\"DETECT\"` in `core_name`\n   and `core_path` with their defaults, fill empty `label` from filename at\n   `path` and fill empty `crc32` with `\"00000000|crc\"`\n3. Add key `origin` to each game entry temporary. By default this will be\n   removed before output.\n4. Multiple files are merged into single data.\n5. Non printable characters are escaped for safe screen output. Note: By\n   default files written to disk are not affected.\n6. Final playlist data is printed to stdout.\n\nDefault behaviours can be changed with options.\n\n### Examples\n\nNote: The `#`-line is a comment explaining the command.\n\n```bash\n# Show list of all available options.\nlpled --help\n\n# Multiple input files are merged.\nlpled \"tests/data/fzero.lpl\" \"tests/data/mario.lpl\"\n\n# Add coloring to the data output.\nlpled --color \"tests/data/mario.lpl\"\n\n# Filter entries by Regular Expression.\nlpled --find-label \"^Co..on\" \"tests/data/history.lpl\"\n\n# Sort by multiple key factors.\nlpled --sort \"db_name\" --sort \"label\" \"tests/data/history.lpl\"\n\n# Save any changes to data as a new file.\nlpled --write \"mario_out.lpl\" \"tests/data/mario.lpl\"\n\n# Output in custom template format.\nlpled --template '{path}' \"tests/data/mario.lpl\"\n\n# Pick menu to select a game entry interactively.\nlpled --pick \"label\" \"tests/data/mario.lpl\"\n\n# Run and play top most game with RetroArch command.\nlpled --launch \"retroarch\" \"tests/data/neogeo.lpl\"\n```\n\nSee more usage examples at [EXAMPLES.md](EXAMPLES.md).\n\n## What are Templates?\n\nOutput can be freely formatted and structured on the fly. Format instructions\nare given by option `--template FORMAT` (or `-F` for short). To access an\nassociated value, put name of key between curly braces `{` and `}`, such as\n`\"{label}\"`, which loops over each game entry automatically and prints content\nto screen. Newline `\"\\n\"` and `\"\\t\"` can be added for additional formatting.\nOther text is output literally.\n\n```bash\n$ lpled --template '{path}' --label \"Cotton\" \"tests/data/history.lpl\"\n/home/tuncay/Emulation/Roms/arcade/arcade_stv/cotton2.zip\n/home/tuncay/Emulation/Roms/pcenginecd/pcenginecd_redump/Fantastic Night Dreams - Cotton (USA).chd\n```\n\nLearn more about this at [TEMPLATE.md](TEMPLATE.md).\n\n## Additional notes, workarounds and quirks\n\n### Non printable characters in JSON\n\nThere are characters that can't be displayed in RetroArch or in your terminal\noutput. Upon reading the files those characters are encoded as a special\nUnicode sequence in form of `\"\\u00xx\"`. This is not common at all, but I got a\na few files that include such characters. This special encoding makes it more\nrobust to display them on the terminal. However on file output for saving on\ndisk, the data is unchanged and no special encoding is done.\n\n## Current state, future plans and contributions\n\nBuilds are developed and mainly tested on a Linux machine. The Windows build\nneeds some more testing with real data from real Windows users.\n\nAt the current moment, I am not much interested into adding more features. I\nwould consider new features only if either I am interested myself or if its a\nbig deal to others. And only if the implementation isn't too complicated, does\nnot break existing usage or test cases. Exceptions can be made.\n\nIf you find a bug, need documentation or have any kind of problems using this\ntool, please report.\n\n## See also\n\n- [ROMs, Playlists, and\n  Thumbnails](https://docs.libretro.com/guides/roms-playlists-thumbnails/) at\n  Libretro Docs: Official Libretro documentation explaining basics of what\n  playlists are and how to work with them in RetroArch.\n- [RetroArch Playlist\n  Editor](https://www.marcrobledo.com/retroarch-playlist-editor/) by Marc\n  Robledo: A pretty neat third party application in the browser with a graphical\n  user interface. It is simple, it is easy to use, and it can edit entries.\n  Highly recommended to check out.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthingsiplay%2Flpled","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthingsiplay%2Flpled","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthingsiplay%2Flpled/lists"}