{"id":31831297,"url":"https://github.com/rbtr/pachinko","last_synced_at":"2025-10-11T21:49:15.818Z","repository":{"id":82393037,"uuid":"234772129","full_name":"rbtr/pachinko","owner":"rbtr","description":"modular pluggable media sorter","archived":false,"fork":false,"pushed_at":"2020-05-22T18:51:22.000Z","size":234,"stargazers_count":27,"open_issues_count":4,"forks_count":1,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-06-20T03:47:37.540Z","etag":null,"topics":["datastream","hacktoberfest","media-sorter","options-pachinko","pachinko","pipeline","plex","postprocessors","processor","subtypes","tmdb","trakt","tvdb"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rbtr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"github":"rbtr"}},"created_at":"2020-01-18T17:38:55.000Z","updated_at":"2023-12-10T17:17:29.000Z","dependencies_parsed_at":"2023-04-19T23:31:57.092Z","dependency_job_id":null,"html_url":"https://github.com/rbtr/pachinko","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/rbtr/pachinko","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbtr%2Fpachinko","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbtr%2Fpachinko/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbtr%2Fpachinko/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbtr%2Fpachinko/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rbtr","download_url":"https://codeload.github.com/rbtr/pachinko/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rbtr%2Fpachinko/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279008823,"owners_count":26084518,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-11T02:00:06.511Z","response_time":55,"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":["datastream","hacktoberfest","media-sorter","options-pachinko","pachinko","pipeline","plex","postprocessors","processor","subtypes","tmdb","trakt","tvdb"],"created_at":"2025-10-11T21:49:09.684Z","updated_at":"2025-10-11T21:49:15.810Z","avatar_url":"https://github.com/rbtr.png","language":"Go","readme":"\u003cimg align=\"right\" width=\"290px\" src=gopher.png\u003e\n\n```text\n             _   _     _       \n ___ ___ ___| |_|_|___| |_ ___ \n| . | .'|  _|   | |   | '_| . |\n|  _|__,|___|_|_|_|_|_|_,_|___|\n|_|\n\nmodular, plugin based media sorter  \ncreated by @rbtr  \n```\n---\n\n[![Build Status](https://cloud.drone.io/api/badges/rbtr/pachinko/status.svg)](https://cloud.drone.io/rbtr/pachinko)\n[![Go Report Card](https://goreportcard.com/badge/github.com/rbtr/pachinko)](https://goreportcard.com/report/github.com/rbtr/pachinko)\n[![Release](https://img.shields.io/github/release/rbtr/pachinko.svg)](https://github.com/rbtr/pachinko/releases/latest)\n[![Docker](https://img.shields.io/docker/pulls/rbtr/pachinko)](https://hub.docker.com/r/rbtr/pachinko)\n[![License](https://img.shields.io/github/license/rbtr/pachinko)](/LICENSE)\n\n\u003e #### Updates!\n\u003e pachinko is now part of the GitHub Sponsors program! If you enjoy it and want to support my work, please [check out my sponsor page](https://github.com/sponsors/rbtr) or click on the \"💖 Sponsor\" button up above!\n\n### what it is\npachinko is a media sorter. it integrates with the tvdb and the moviedb to, given a directory of reasonably named mix media, organize that media into a clean hierarchal directory structure ideal for use in media servers like plex, kodi/xbmc, etc.\n\nunlike some of the prior implementations of this idea, pachinko was designed from inception to be automation and container-friendly.  \nit has no heavy gui - configure it through the config file or via flags, then execute it and walk away.\n\nit is written in go so that it is approachable for anyone interested in contributing without sacrificing performance.  \nthe plugin-style architecture keeps the core codebase clear and efficient.\n\n### design\n\n#### plugins\npachinko has a plugin based pipeline design. the base plugin types are:\n- input - add data from a datasource to the stream\n- processor - modify the datastream in-flight\n- output - deal with the processed data by e.g. moving files from their original dir to their sorted path.\n\nthese base plugin types make pachinko flexible. composing a pipeline of many combination of plugins is possible.\n\nadditionally there are subtypes of `processor` plugins:\n- preprocessor - parse data already present in the datastream to classify, clean, or add information to the data before main processor plugins run. the preprocessors make modifications to the datastream based only on the data already present in the objects in the datastream.\n- (intra)processor - the main working processors, where external datasources may be queried to enrich the datastream and significant modifications made. \n- postprocessor - last chance to modify the datastream before it is sent to outputs, but after the rich data has been added. the postprocessors make final modifications that shouldn't be the responsibility of the intraprocessors but may depend on the data enrichments that those have added.\n\nthe subtypes exist mainly to allow ordering of plugin flow. \n\n#### datatypes\npachinko currently supports these data types: \n- tv and \n- movie video files\n\nother datatypes planned include: images (and whatever you would like to contribute!)\n\n#### inputs\npachinko currently supports these inputs: \n- local filesystem (`path`). \n\nother datastore types planned include : s3 (and whatever you would like to contribute!)\n\n#### outputs\npachinko currently supports these outputs:\n- local filesystem (`path_mover`)\n- stdout (`logger`)\n- [trakt collector (`trakt_collector`)](docs/plugins/outputs/trakt.md)\n\n#### processors\npachinko has the following optional processors:\n- tv identifier (pre-tv)\n- movie identifier (pre-movie)\n- tvdb (intra-tvdb)\n- tmdb (intra-tmdb)\n- tv path solver (post-tv_path_solver)\n- movie path solver (post-movie_path_solver)\n- file deleter (deleter)\n\n### how to run it\npachinko is distributed as a container and as a cross-platform binary.  \n\nthe container is recommended:\n```bash\n$ docker run -v /path/to/source:/src:z -v /path/to/dest:/dest:z -v /path/to/cfg:/cfg rbtr/pachinko:latest --config /cfg\n```\n\nto run the binary:\n```bash\n$ ./pachinko sort --config /path/to/config\n```\n\n### options\npachinko is configurable via file (yaml, toml), cli flags, or env vars.\n\nthe config file is recommended:\n```yaml\ndry-run: true\nlog-level: debug\ninputs: []\noutputs: []\nprocessors: {}\n```\n\nthe full, current list of options is available by running `./pachinko genconf` on the commandline.  \nthe core pachinko options are:\n\n| option | inputs | usage |\n| - | - | - |\n| conf | string | full path to config file - ignored in the config file | \n| dry-run | bool | dry-runs print only, pachkino will not make changes |\n| log-level | string | one of (trace,debug,info,warn,error) for logging verbosity |\n| log-format | string | one of (json,text) | \n\n\ninputs, outputs, and processors are lists of plugins objects and look generally like:\n\n```yaml\ninputs:\n- name: path\n  src-dir: /path/to/source\noutputs:\n- name: stdout\n```\n\nnote that each plugin may have its own independent config options; refer to that plugin's docs for details on configuring that specific plugin. here, the `path` input plugin has a `src-dir` parameter that we configure in the plugin list item.\n\nthe plugin list is processed in the written order and repeats are allowed. all loaded plugins are guaranteed to see each of the items in the datastream at least once. if the order that your datastream is processed by each plugin matters, make sure to load your plugins in the correct order!\n\n\n### testimonials\n\nhere's what users had to say when asked what they thought about `pachinko`:\n\n\u003e Ew. _Pachinko_? Why would you name it _pachinko_? _Pachinko_ just makes me think of flashing lights and cigarette smoke. - a Japanese user\n\n### license\n\n`pachinko` is licensed under MPL-2 which generally means you can use it however you like with few exceptions.  \n\nread the full license terms [here](https://www.mozilla.org/en-US/MPL/2.0/FAQ/).  \n\n---\n\ncreated by @rbtr  \ninspired by the functionality and frustrating user experience of: [sorttv by cliffe](https://sourceforge.net/projects/sorttv/), filebot, tinymediamanager, and others  \nand the excellent architecture patterns of telegraf, caddy, coredns, and others\n","funding_links":["https://github.com/sponsors/rbtr"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frbtr%2Fpachinko","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frbtr%2Fpachinko","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frbtr%2Fpachinko/lists"}