Python script to scan YouTube channel playlists and detect unlisted videos
Project description
YouTube Channel Scanner
Python script to scan YouTube channel playlists and detect unlisted videos.
Description
This script analyzes a YouTube channel by:
- Retrieving all public videos from the channel
- Listing all public playlists
- Extracting videos from each playlist
- Comparing both lists to identify videos present in playlists but missing from public videos (= potentially unlisted)
Installation
Requirements
- Python 3.7+
- yt-dlp
Installing yt-dlp
pip install yt-dlp
Or with pipx:
pipx install yt-dlp
Usage
Basic command
python youtube_scanner.py "https://www.youtube.com/@ChannelName"
Available options
| Option | Description |
|---|---|
-o, --output |
Output JSON filename (default: youtube_scan_YYYY-MM-DD_HHMMSS.json) |
--playlists-only |
Scan playlists only (faster, skips public videos) |
--detailed |
Fetch detailed metadata for each unlisted video (slower but accurate dates) |
Examples
Full scan:
python youtube_scanner.py "https://www.youtube.com/@IronKingLoL"
Quick scan (playlists only):
python youtube_scanner.py "https://www.youtube.com/@IronKingLoL" --playlists-only
With accurate dates (slower):
python youtube_scanner.py "@IronKingLoL" --detailed
With custom filename:
python youtube_scanner.py "https://www.youtube.com/@IronKingLoL" -o ironking_scan.json
Supported URL formats
https://www.youtube.com/@usernamehttps://www.youtube.com/c/ChannelNamehttps://www.youtube.com/channel/UCxxxxx
Output files
The script generates two files:
1. JSON file (youtube_scan_YYYY-MM-DD_HHMMSS.json)
Contains all structured data:
{
"channel_url": "https://www.youtube.com/@example",
"scan_date": "2025-11-29T14:30:52.123456",
"public_videos": [],
"playlist_videos": [],
"playlists": [],
"potentially_unlisted": [
{
"id": "dQw4w9WgXcQ",
"title": "Video title",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"availability": "unlisted",
"upload_date": "2024-03-15",
"found_in_playlist": "Playlist name"
}
]
}
2. Text file (youtube_scan_YYYY-MM-DD_HHMMSS_links.txt)
Simple list of links with dates:
# Potentially unlisted videos
[2025-03-16] https://www.youtube.com/watch?v=xxxxx - Video title
[2025-02-11] https://www.youtube.com/watch?v=yyyyy - Another video
# All playlist videos
[2025-03-16] https://www.youtube.com/watch?v=xxxxx - Video title
...
How it works
Unlisted videos on YouTube:
- Are not visible on the channel page
- Are not indexed by YouTube search
- But can be added to public playlists
This script exploits this behavior: if a video appears in a channel's playlist but not in its public videos, it's likely unlisted.
Limitations
- Private videos: Inaccessible (different from "unlisted")
- Private playlists: Not scanned
- Possible false positives: A video can be in a playlist without belonging to the channel
- Deleted videos: Sometimes appear in playlists but are no longer accessible
- Rate limiting: YouTube may throttle requests if too frequent
- Approximate dates: By default, dates are approximate (extracted from "X months ago"). Use
--detailedfor exact dates (slower) - Availability field: May show as "NA" in fast mode; use
--detailedto get accurate availability status
Troubleshooting
"yt-dlp is not installed"
pip install yt-dlp
Timeout on large channels
The script has a 5-minute timeout per command. For very large channels, use --playlists-only to reduce scan time.
No unlisted videos found
This is normal if:
- The channel has no unlisted videos in its playlists
- All playlists are private
- The channel has no playlists
Author
Thomas Lamarche - Initial work - OloZ17
License
MIT License - Free to use and modify.
Contributing
Contributions are welcome! Feel free to open an issue or pull request.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yt_scanner-0.1.2.tar.gz.
File metadata
- Download URL: yt_scanner-0.1.2.tar.gz
- Upload date:
- Size: 7.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac447c92c179089d6bd29616fa96711cf905e1b6f86983b90b9274fef0e1bb52
|
|
| MD5 |
4355583fefd18ba8df75bdb4e41867a2
|
|
| BLAKE2b-256 |
46698d604a84689dbfda0517cbdf40fb9e6fd80225934db5a2c049dea9642b48
|
File details
Details for the file yt_scanner-0.1.2-py3-none-any.whl.
File metadata
- Download URL: yt_scanner-0.1.2-py3-none-any.whl
- Upload date:
- Size: 7.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a20de6bc8d2b8f3d264181583be4a0a561fdaa47ad7d93a6922467eb688eadc0
|
|
| MD5 |
7110671a0b988fa62805a9ca34f9e0ea
|
|
| BLAKE2b-256 |
25460c540cedd2b6c22855f5354b1a6f6838bffd53e81d6cd40020e4c3a476c3
|