| title | YouTube |
|---|---|
| description | Read YouTube data and manage subscriptions and playlists with gog. |
gog youtube (alias gog yt) reads public YouTube data with an API key or
uses account OAuth for private reads and mutations.
For public channel, video, activity, playlist, comment, and search reads, enable YouTube Data API v3 and store an API key:
gog config set youtube_api_key YOUR_API_KEY
gog yt videos list --chart mostPopular --region US --max 5Account reads use the default youtube.readonly scope:
gog auth add you@gmail.com --services youtube
gog yt activities list --mine --account you@gmail.comSubscription and playlist mutations require the explicit
youtube.force-ssl extra scope:
gog auth add you@gmail.com --services youtube \
--extra-scopes https://www.googleapis.com/auth/youtube.force-ssl \
--force-consentThe account must already have a YouTube channel. If the API returns
youtubeSignupRequired, initialize the channel once at
youtube.com and retry.
List the playlists owned by a channel or by the authenticated user:
gog yt playlists list --channel-id UC_x5XG1OV2P6uZZ5FSM9Ttw
gog yt playlists list --mine --account you@gmail.comList the videos inside a playlist with playlists items list. Public playlists
work with an API key; private playlists and the special LL (liked videos)
playlist need account OAuth. Use --all to page through large playlists:
gog yt playlists items list --playlist-id PLAYLIST_ID --all
gog yt playlists items list --playlist-id LL --account you@gmail.com --allRead your liked (or disliked) videos directly with videos list --my-rating.
This is a per-user read, so it always uses account OAuth:
gog yt videos list --my-rating like --account you@gmail.com --max 50
gog yt videos list --my-rating dislike --account you@gmail.com --jsonBoth reads work with the default youtube.readonly scope; no extra scope is
required.
videos list keeps its compact historical default: snippet,
contentDetails, and statistics. Request every field available for arbitrary
videos with --parts all, or pass an exact comma-separated list:
gog yt videos list --id VIDEO_ID --parts all --json
gog yt videos list --id YOUR_VIDEO_ID --parts snippet,fileDetails --account you@gmail.com --jsonall excludes the owner-only fileDetails, processingDetails, and
suggestions parts. Explicit lists are passed through unchanged so authenticated
owners can request those fields for their own uploads. Do not combine all with
other part names.
List one page or fetch every page:
gog yt subscriptions list --max 50 --account you@gmail.com
gog yt subscriptions list --all --account you@gmail.com --jsonSubscribe with a channel ID:
gog yt subscriptions subscribe \
--channel-id UC_x5XG1OV2P6uZZ5FSM9Ttw \
--account you@gmail.comUnsubscribe using either the subscription ID returned by subscriptions list
or a channel ID. Channel-ID removal performs the subscription lookup for you:
gog yt subscriptions unsubscribe --id SUBSCRIPTION_ID \
--account you@gmail.com --force
gog yt subscriptions unsubscribe --channel-id UC_x5XG1OV2P6uZZ5FSM9Ttw \
--account you@gmail.com --forceNew playlists default to private. Set --privacy unlisted or
--privacy public only when broader visibility is intended.
gog yt playlists create --title "Research" \
--description "Videos to review" \
--account you@gmail.com --json
gog yt playlists add --playlist-id PLAYLIST_ID --video-id VIDEO_ID \
--position 0 --account you@gmail.comRemove a known playlist item directly, or let gog find the item by playlist
and video ID:
gog yt playlists remove --item-id PLAYLIST_ITEM_ID \
--account you@gmail.com --force
gog yt playlists remove --playlist-id PLAYLIST_ID --video-id VIDEO_ID \
--account you@gmail.com --forceDelete a playlist:
gog yt playlists delete PLAYLIST_ID --account you@gmail.com --forceEvery subscription and playlist mutation supports --dry-run. Dry runs do not
create an API service or make a network request:
gog yt playlists add --playlist-id PLAYLIST_ID --video-id VIDEO_ID \
--account you@gmail.com --dry-run --jsonUnsubscribe, playlist-item removal, and playlist deletion prompt before the
mutation. Use --force only after checking the target, or combine
--no-input --force in deliberate automation.
Use --json for structured output or --plain for stable TSV. Human progress,
prompts, and warnings remain on stderr.
See the generated references for
youtube subscriptions and
youtube playlists for every flag.