{"id":23925545,"url":"https://github.com/jenslys/autovod","last_synced_at":"2025-09-20T11:32:22.940Z","repository":{"id":47499970,"uuid":"389194996","full_name":"jenslys/autovod","owner":"jenslys","description":"Automatically upload Twitch.tv / Kick.com streams in realtime to Youtube or a Rclone supported provider","archived":false,"fork":false,"pushed_at":"2024-07-16T20:18:24.000Z","size":96,"stargazers_count":100,"open_issues_count":10,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-05T20:14:35.477Z","etag":null,"topics":["docker","kick","kick-com","kickcom","rclone","shell","streamlink","twitch","twitch-vods","video","youtube","youtube-api","youtubeuploader"],"latest_commit_sha":null,"homepage":"","language":"Shell","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/jenslys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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}},"created_at":"2021-07-24T20:27:48.000Z","updated_at":"2024-12-20T07:55:12.000Z","dependencies_parsed_at":"2024-07-16T23:42:24.782Z","dependency_job_id":"76ac9144-b268-4915-88a2-6ea278309ff0","html_url":"https://github.com/jenslys/autovod","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenslys%2Fautovod","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenslys%2Fautovod/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenslys%2Fautovod/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenslys%2Fautovod/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jenslys","download_url":"https://codeload.github.com/jenslys/autovod/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":233660124,"owners_count":18710025,"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":["docker","kick","kick-com","kickcom","rclone","shell","streamlink","twitch","twitch-vods","video","youtube","youtube-api","youtubeuploader"],"created_at":"2025-01-05T20:14:42.034Z","updated_at":"2025-09-20T11:32:22.923Z","avatar_url":"https://github.com/jenslys.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AutoVOD\n\n![Releases](https://img.shields.io/github/v/release/jenslys/AutoVOD.svg)\n\nThis script automates downloading and uploading [Twitch.TV](https://twitch.tv), [Kick.com](https://kick.com) or [YouTube Live](https://youtube.com/live) streams to a selected upload provider. \u003cbr\u003e\n\n\u003e [!IMPORTANT]\n\u003e This does not download and upload the **official Twitch/Kick/YouTube VOD** after the stream is finished, but rather uses [streamlink](https://streamlink.github.io/) to record and upload the stream in realtime. So features like [separating different audio track for the VOD](https://help.twitch.tv/s/article/soundtrack-audio-configuration?language=en_US) are not supported. If that is something you are looking for, you should check out [Twitch's manual export to YouTube feature](https://help.twitch.tv/s/article/video-on-demand?language=en_US#:~:text=your%20Video%20Producer.-,Export,-Your%20Twitch%20account).\n\nCurrent available upload options:\n\n- **Youtube** (Needs no transcoding, so no file is stored on the disc.)\n  - **Direct Upload**\n  - **Re-stream**\n- **Rclone** - _Should_ work with supported all [providers](https://rclone.org/#providers)\n  - **Direct upload** (Needs transcoding, so the stream is **temporally stored** on the disc before uploading)\n- **Local**\n  - **Local file** (Downloads the stream locally to your machine)\n\n## Installation\n\n### Automatic Installation\n\n\u003e **Note**\n\u003e Only supports APT or DNF. If you are using a different package manager, you will have to install the required packages manually.\n\n```bash\nsh -c \"$(curl -fsSL https://raw.githubusercontent.com/jenslys/autovod/master/install.sh)\"\n```\n\n### Manual Installation\n\n\u003cdetails\u003e\n\u003csummary\u003eRequired packages\u003c/summary\u003e\n\n#### PM2\n\n```bash\napt-get install npm\nnpm install pm2 -g\npm2 startup\n```\n\n#### Streamlink\n\n```bash\napt-get install python3-pip tar\npip3 install --upgrade streamlink\n```\n\n#### JQ\n\n```bash\napt-get install jq\n```\n\n#### YoutubeUploader\n\nIf you want to upload to YouTube\n\n\u003cdetails\u003e\n\u003csummary\u003eInstructions\u003c/summary\u003e\n\u003cbr\u003e\n\n```bash\nwget https://github.com/porjo/youtubeuploader/releases/download/23.03/youtubeuploader_23.03_Linux_x86_64.tar.gz\ntar -xvf youtubeuploader_23.03_Linux_x86_64.tar.gz \u0026\u0026 rm youtubeuploader_23.03_Linux_x86_64.tar.gz\nmv youtubeuploader /usr/local/bin/youtubeuploader\n```\n\n\u003c/details\u003e\n\n#### Rclone\n\nIf you want to upload to an any of the Rclone [providers](https://rclone.org/#providers)\n\n\u003cdetails\u003e\n\u003csummary\u003eInstructions\u003c/summary\u003e\n\u003cbr\u003e\n\n```bash\napt-get install rclone\n```\n\n\u003c/details\u003e\n\n#### FFMPEG\n\nIf you want to enable the re-encoding or re-streaming feature\n\n\u003cdetails\u003e\n\u003csummary\u003eInstructions\u003c/summary\u003e\n\u003cbr\u003e\n\n```bash\napt-get install ffmpeg\n```\n\n\u003c/details\u003e\n\n#### AutoVOD\n\n```bash\ngit clone https://github.com/jenslys/autovod.git\ncd autovod\n```\n\n#### Sample video\n\n```bash\nwget -c -O sample.mp4 https://download.samplelib.com/mp4/sample-5s.mp4\n```\n\n\u003c/details\u003e\n\n## Setup\n\n### Youtube setup\n\n\u003cdetails\u003e\n\u003csummary\u003eInstructions\u003c/summary\u003e\n\u003cbr\u003e\n\nSet up your credentials to allow YouTubeUploader to upload videos to YouTube.\n\n1. Create an account on [Google Developers Console](https://console.developers.google.com)\n1. Create a new project\n1. Enable the [YouTube Data API (APIs \u0026 Auth -\u003e Library)](https://console.cloud.google.com/apis/library/youtube.googleapis.com)\n1. Go to the [Consent Screen](https://console.cloud.google.com/apis/credentials/consent) section, setup an external application, fill in your information and add the user/s that are going to be using the app (Channel/s you are uploading videos to). Enable the **\".../auth/youtube.upload\"** scope. Then save.\n1. Go to the [Credentials](https://console.cloud.google.com/apis/api/youtube.googleapis.com/credentials) section, click \"Create credentials\" and select \"OAuth client ID\", select Application Type 'Web Application'. Add a 'Authorised redirect URI' of `http://localhost:8080/oauth2callback`\n1. Once created click the download (JSON) button in the list and save it as `client_secrets.json`\n1. Getting token from YouTube:\n\n   1. Due to [recent changes](https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html#disallowed-oob) to the Google TOS, if you are running this utility for the first time and want to run it on a Headless server, you have to first run `youtubeuploader` on your local machine (Somewhere with a web browser)\n\n      ```bash\n      youtubeuploader -filename sample.mp4\n      ```\n\n   1. and then simply copy/move `request.token` and `client_secrets.json` to the remote host. Make sure these are placed inside the `autovod` folder.\n\n\u003e **Note**\n\u003e To be able to upload videos as either \"Unlisted or Public\" and upload multiple videos a day, you will have to request an [API audit](https://support.google.com/youtube/contact/yt_api_form) from YouTube. Without an audit your videos will be locked as private and you are limited to how many videos you can upload before you reach a quota.\n\n\u003cdetails\u003e\n\u003csummary\u003eTips on passing the audit\u003c/summary\u003e\n\u003cbr\u003e\n\nI have applied for the audit twice (for two separate projects).\n\n- First time, I was applying because I wanted to archive a particular streamer's streams to YouTube.\n- Second time, I was applying because I needed a higher quota for the testing and development of AutoVOD.\n\nBoth times I was accepted fairly easily.\n\nSince this tool isn't very complex, I typed almost the same thing on all fields, along the lines of:\n\n\u003e \"I am going to upload a certain twitch user VODS to YouTube and need a higher quote because the streamer streams multiple times a week for x amount of hours. The tool is internal, so the only person that is authenticating through it is me. This is using Youtube Data API to upload to videos.\"\n\nI also linked/referenced this GitHub page (Don't know if that helped my case).\n\nThe field that wants you to upload a screen recording of the program; I just screen recorded myself doing the `youtubeuplaoder --filename sample.mp4` command. Since that is how we get the token from youtube. You could also record the process starting AutoVOD.\n\n\u003e **Note**\n\u003e It took around 20 days from submission to them accepting the audit.\n\nI am leaving open the GitHub issue regarding this, in case people want to discuss or share their experience: [#32](https://github.com/jenslys/autovod/issues/32)\n\n\u003c/details\u003e\n\n\u003c/details\u003e\n\n### Rclone setup\n\n\u003cdetails\u003e\n\u003csummary\u003eInstructions\u003c/summary\u003e\n\n#### Refer to your provider on how to configure Rclone\n\nhttps://rclone.org/#providers\n\n\u003c/details\u003e\n\n## Usage\n\n### Config file\n\nWe will create a dedicated config file for each steamer, in case are monitoring multiple streamers with different settings.\n\n#### Create config file\n\n\u003e Note: Case sensitive, make sure to type the capitalization for the username the same on all inputs and files.\n\n```bash\ncp default.config StreamerNameHere.config\n```\n\n#### Edit the config\n\nEdit your newly created config\n\n```bash\nnano StreamerNameHere.config\n```\n\n##### Optional additional setup steps\n\n\u003cdetails\u003e\n\u003csummary\u003eStream metadata\u003c/summary\u003e\n\n**This currently only works if you are using Twitch.TV**\n\nIf you want to add stream metadata to your video, you will need to deploy an api wrapper for the Twitch API. You can find the instructions on how to do that [here](https://github.com/jenslys/twitch-api-wrapper). Once you have the wrapper deployed, you will need to add the url in the API_URL field in the config file and enable the API_CALLS field.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eDisable ads\u003c/summary\u003e\n\n##### Fetching the OAuth token from\n\nFollow the instructions [here](https://streamlink.github.io/cli/plugins/twitch.html#authentication) to get your OAuth token.\n\nThen add the OAuth token: `--twitch-api-header=Authorization=OAuth YOURCODEHERE` to the `STREAMLINK_OPTIONS` field in the config file.\n\n##### Other options\n\nOther options can be found [here](https://streamlink.github.io/cli.html#twitch)\n\n\u003c/details\u003e\n\n### Start AutoVOD\n\n```bash\n# Name the PM2 process and pass the streamer name to the script\npm2 start AutoVOD.sh --name \u003cStreamerName\u003e -- \u003cStreamerName\u003e\npm2 save\n```\n\nNotes:\n- If exactly one `*.config` (excluding `default.config`) exists in the folder, you can omit the streamer name and just run `pm2 start AutoVOD.sh --name \u003cAnyName\u003e`. The script will auto-select that config.\n- You can also pass the name via `-n`, e.g. `pm2 start AutoVOD.sh --name \u003cStreamerName\u003e -- -n \u003cStreamerName\u003e`.\n\n#### Check status\n\n```bash\npm2 status\n```\n\n#### Check logs\n\n```bash\npm2 logs\n```\n\n## Using docker\n\nThis script can be used inside a docker container. To build a container, first execute all [Setup-Steps](#setup), then build the image:\n\n```bash\ndocker build --build-arg USERNAME=\u003cStreamer Name Here\u003e -t autovod .\n```\n\nYou can now run this container\n\n```bash\ndocker run -d autovod \u003cStreamer Name Here\u003e\n```\n\nOr you can run both commands in one line\n\n```bash\n./buildRunDocker.sh \u003cStreamer Name Here\u003e\n```\n\n## FAQ\n\n\u003cdetails\u003e\n\u003csummary\u003eI am getting \"[Error 32] Broken pipe\"\u003c/summary\u003e\n\u003cbr\u003e\n\nThere are multiple reasons this error can occur, check the following\n\n#### YouTube\n\n- That you have not reached your [YouTube quota limit](https://developers.google.com/youtube/v3/guides/quota_and_compliance_audits#:~:text=Projects%20that%20enable%20the%20YouTube,majority%20of%20our%20API%20users.)\n- That your YouTube credential files have not expired\n- You can check these by running `youtubeuploader --filename sample.mp4`\n  then checking the output.\n\n#### Rclone\n\n- You have configured `rclone` correctly\n- You have inserted the correct variables inside the config.\n\n#### Server resource exhaustion\n\n- Uploading VODs require a lot of bandwidth, check if the upload fails because your provider is limiting or cutting of the upload.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eMy tokens keep getting revoked\u003c/summary\u003e\n\u003cbr\u003e\n\n- Visit the [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent) and click on the publish button to change from the testing status to the published status.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eMy video keeps getting marked as private\u003c/summary\u003e\n\u003cbr\u003e\n\n- To be able to upload videos as either \"Unlisted or Public\" and upload multiple videos a day, you will have to request an [API audit](https://support.google.com/youtube/contact/yt_api_form) from YouTube. Without an audit your videos will be locked as private and you are limited to how many videos you can upload before you reach a quota.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eI cant upload videos longer then 15 minutes\u003c/summary\u003e\n\u003cbr\u003e\n\n- You will need to [verify](http://youtube.com/verify) your phone number on youtube to upload videos longer then 15 min\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eOne or more required files are missing\u003c/summary\u003e\n\u003cbr\u003e\n\nThe following files are required for the script to work:\n\n- `nameOfStreamer.config`\n- `request.token` (Only if uploading to YouTube)\n- `client_secrets.json` (Only if uploading to YouTube)\n\nIt should look something like this:\n\n![Screenshot](https://cdn.lystad.io/autovod_folder.jpeg)\n\n\u003c/details\u003e\n\n## Credit\n\n- Original script by [arnicel](https://github.com/arnicel/autoTwitchToYouTube)\n- YoutubeUploader by [porjo](https://github.com/porjo/youtubeuploader)\n- Streamlink by [streamlink](https://github.com/streamlink/streamlink)\n- Icon by [xyaia](https://macosicons.com/#/u/xyaia)\n\n## License\n\nLicensed under the [MIT License](LICENSE.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenslys%2Fautovod","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjenslys%2Fautovod","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenslys%2Fautovod/lists"}