46 lines
No EOL
1.3 KiB
Python
46 lines
No EOL
1.3 KiB
Python
# Use this as RSS Guard post-processing script.
|
|
#
|
|
# Example command line usage:
|
|
# curl 'PATH_TO_SOME_YOUTUBE_CHANNEL_RSS_FEED' | python 'youtube-limit-length.py'
|
|
|
|
import sys
|
|
import xml.etree.ElementTree as ET
|
|
import requests
|
|
import json
|
|
import isodate
|
|
|
|
sys.stdin.reconfigure(encoding="utf-8")
|
|
input_data = sys.stdin.read()
|
|
|
|
api_key = "YOUR_API_KEY_HERE"
|
|
min_required_length = 90 # In seconds.
|
|
|
|
youtube_query = (
|
|
"https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=VIDEO-ID&key="
|
|
+ api_key
|
|
)
|
|
ns = {
|
|
"atom": "http://www.w3.org/2005/Atom",
|
|
"yt": "http://www.youtube.com/xml/schemas/2015",
|
|
}
|
|
|
|
tree = ET.fromstring(input_data)
|
|
entries = tree.findall("atom:entry", ns)
|
|
|
|
for entry in entries:
|
|
video_id = entry.find("yt:videoId", ns).text
|
|
youtube_query_specific = youtube_query.replace("VIDEO-ID", video_id)
|
|
api_response = requests.get(youtube_query_specific).text
|
|
response_json = json.loads(api_response)
|
|
|
|
try:
|
|
length_encoded = str(response_json["items"][0]["contentDetails"]["duration"])
|
|
except:
|
|
continue
|
|
|
|
length = isodate.parse_duration(length_encoded)
|
|
|
|
if length.seconds < min_required_length:
|
|
tree.remove(entry)
|
|
|
|
sys.stdout.buffer.write(ET.tostring(tree, encoding='utf-8', method='xml')) |