{"id":18869534,"url":"https://github.com/markjay4k/autoshift","last_synced_at":"2026-02-14T07:30:17.556Z","repository":{"id":214912031,"uuid":"737658081","full_name":"markjay4k/autoshift","owner":"markjay4k","description":"Automatically transfer media files from Transmission to Jellyfin","archived":false,"fork":false,"pushed_at":"2024-03-09T17:04:04.000Z","size":53,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-30T23:33:54.055Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/markjay4k.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}},"created_at":"2024-01-01T00:33:27.000Z","updated_at":"2024-02-27T05:12:53.000Z","dependencies_parsed_at":"2024-01-03T05:31:12.538Z","dependency_job_id":"f1102164-beb7-4a03-a2a7-410691a7d9ee","html_url":"https://github.com/markjay4k/autoshift","commit_stats":null,"previous_names":["markjay4k/autoshift"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjay4k%2Fautoshift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjay4k%2Fautoshift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjay4k%2Fautoshift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markjay4k%2Fautoshift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/markjay4k","download_url":"https://codeload.github.com/markjay4k/autoshift/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239816513,"owners_count":19701753,"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","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":"2024-11-08T05:16:58.094Z","updated_at":"2026-02-14T07:30:17.508Z","avatar_url":"https://github.com/markjay4k.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AUTOSHIFT\n\nAutomatically transfers torrent media files from _Transmission_ to _Jellyfin_\nlibrary once seed threshold achieved.\n\n## WHAT IT DOES\n\nAutoshift routinely scans the _Transmission_ library to identify torrents ready\nto transfer. A torrent is ready when \n- Download is complete\n- Seed threshold is achieved\n\nOnce identified as _ready_, the media-type is determined by parsing with \n[`PTN`](https://github.com/divijbindlish/parse-torrent-name) to\ndetermine the appropriate _Jellyfin_ directory. Finally, the torrent is removed \nfrom _Transmission_ following the transfer.\n\n## LIMITATIONS\n\n- Autoshift uses `transmission_rpc` and only works with [_Transmission Bittorrent\nClient_](https://github.com/transmission/transmission).\n- It's highly recommended to put both _Transmission_ and _Jellyfin_ libraries on the\n    same filesystem, which makes torrent transfer super fast. For example, with ZFS, having \n    both libraries on the same dataset means the move is simply updating metadata, \n    rather than moving large audio/video files. If they are separate\n    filesystems, the entire files need to be copied and deleted which consumes\n    much more time, electrical power, and ware on your storage drives.\n\n## ASSUMPTIONS\n\n1. You have [Docker Engine and Compose](https://docs.docker.com/engine/install/) already \ninstalled.\n2. You have [_Transmission_](https://github.com/transmission/transmission) and \n[_Jellyfin_](https://github.com/jellyfin/jellyfin) installed (preferrably as Docker\n   containers).\n\n## INSTALL\n\n1. Clone autoshift\n    ```bash\n    git clone git@github.com:markjay4k/autoshift.git\n    cd autoshift\n    ```\n2. create a docker network called `torrents`\n\n    ```bash\n    docker network create torrents\n    ```\n3. create a `.env` file with the following environment variables\n\n    ```yaml\n    BASE_MEDIA=/path/to/ZFS_dataset   # both libraries stored here\n    TR_PATH=/path/to/transmission/downloads/directory\n    JF_MOVIES=/path/to/jellyfin/movies/directory\n    JF_SHOWS=/path/to/jellyfin/shows/directory\n    TR_HOST_IP=transmission.torrents\n    TR_HOST_PORT=9091\n    TR_USER=username #transmission username (optional)\n    TR_PASS=password #transmission password (optional)\n    LOG_LEVEL=DEBUG\n    CRON_SCHEDULE=0 */4 * * *\n    ```\n4. Choose an appropriate scan interval with the `CRON_SCHEDULE` variable. You\n   can refer to [Cron GURU](https://crontab.guru/examples.html) for simple\n   copy/paste options to use. The example provided is once every 4 hours.\n5. Start the container with Docker Compose\n    ```bash\n    docker compose up -d --build\n    ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkjay4k%2Fautoshift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkjay4k%2Fautoshift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkjay4k%2Fautoshift/lists"}