{"id":16862408,"url":"https://github.com/dave/youtube","last_synced_at":"2026-01-12T00:15:00.997Z","repository":{"id":280862702,"uuid":"943395505","full_name":"dave/youtube","owner":"dave","description":null,"archived":false,"fork":false,"pushed_at":"2025-04-03T08:45:41.000Z","size":249,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-03T09:33:23.992Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","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/dave.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}},"created_at":"2025-03-05T16:32:00.000Z","updated_at":"2025-04-03T08:45:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"d1ba1474-bc7a-425e-a8d1-7009e8687ae3","html_url":"https://github.com/dave/youtube","commit_stats":null,"previous_names":["dave/youtube2","dave/youtube"],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dave%2Fyoutube","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dave%2Fyoutube/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dave%2Fyoutube/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dave%2Fyoutube/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dave","download_url":"https://codeload.github.com/dave/youtube/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248363565,"owners_count":21091384,"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-10-13T14:35:24.442Z","updated_at":"2026-01-12T00:14:55.972Z","avatar_url":"https://github.com/dave.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Wilderness Prime YouTube Uploader\n\n*This tool is not intended for general use.*\n\nThis tool uploads videos to YouTube:\n\n- Titles and descriptions are generated by data and Go templates in a Google Sheet.\n- Videos are uploaded from a Dropbox or Google Drive folder.\n- Changes can be previewed before uploading, with diffs shown in the Google Sheet.\n- Thumbnails are generated automatically.\n- Uploads are resumed if the tool is interrupted.\n\nI use this tool to upload all videos to the [Wilderness Prime YouTube channel](https://www.youtube.com/wildernessprime).\n\n# Google Sheet containing data and templates\n\nhttps://docs.google.com/spreadsheets/d/1e2gK0GgWN4PxeZcazUvxtlhYGzg2lZsZEkphqu9Jplc/edit?usp=sharing\n\n# Oracle VM\n\nOracle gives out free VMs, so that's what I've been using to run the tool. \n\n[This is how to configure it](oracle.md)\n\n## Oracle VM notes\n\n```ssh -i ~/.ssh/oracle-ssh-key.key ubuntu@132.226.215.4```\n\n- **New tmux session**: `tmux new -s mysession`\n- **Detach**: `Ctrl + B`, then `D`\n- **Reconnect** later: `tmux attach -t mysession`\n\n# Keys\n\nThis tool uses three keys, which you will need to copy into `~/.config/wildernessprime/`.\n\n## google-service-account-token.json\nThis is the service account key for authenticating with Google Sheets and Google Drive.\n\nCreate here: https://console.cloud.google.com/iam-admin/serviceaccounts/details/104677990570467761179/keys?inv=1\u0026invt=AbqgZw\u0026project=wildernessprime\u0026supportedpurview=project\n\n## youtube-oauth2-client-secret.json\nThis is the OAuth2 client secret for authenticating with YouTube.\n\nCreate here: https://console.cloud.google.com/auth/clients?inv=1\u0026invt=AbqgZQ\u0026project=wildernessprime\n\nRefresh token `youtube-oauth2-refresh-token.json` is created automatically by the oauth login script the first time it runs (this won't work in an SSH terminal so you'll need to first run on your desktop and copy the refresh token by hand onto the server). If the Youtube API misbehaves, try deleting this file to force the oauth2 login flow to re-run.\n\n## dropbox-oauth-client-id.txt, dropbox-oauth-client-secret.txt\nThese are needed by the Dropbox API to start the oauth2 login flow. To create them, you need to create a Dropbox app:\n\nhttps://www.dropbox.com/developers/apps/create\n\nAdd permissions:\n- files.metadata.write\n- files.metadata.read\n- files.content.write\n- files.content.read\n- sharing.read\n\nCopy the two keys:\n- App key = client-id\n- App secret = client-secret\n\nWhen the app first runs it will prompt you to log in and copy+paste an authorization code. It will them create two more files:\n\n- dropbox-oauth-access-token.txt\n- dropbox-oauth-refresh-token.txt\n\nThese are used to authenticate with the Dropbox API. If the Dropbox API misbehaves, try deleting these two files to force the oauth2 login flow to re-run.\n\n# Google service account\n\nShare sheet and drive folder with: youtubescript@wildernessprime.iam.gserviceaccount.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdave%2Fyoutube","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdave%2Fyoutube","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdave%2Fyoutube/lists"}