You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.7 KiB
Plaintext
69 lines
1.7 KiB
Plaintext
12 years ago
|
#!/usr/bin/env python
|
||
|
|
||
|
import datetime
|
||
|
import feedparser
|
||
|
import json
|
||
|
import os
|
||
|
from urlparse import urlparse
|
||
|
|
||
|
def readConfigFile():
|
||
|
"""Read the config file ~/.youtube-rss and return a dictionary"""
|
||
|
path = os.path.expanduser("~/.youtube-rss")
|
||
|
configFile = open(path)
|
||
|
contents = configFile.read()
|
||
|
configFile.close()
|
||
|
return json.loads(contents)
|
||
|
|
||
|
def saveConfigFile(dictonary):
|
||
|
"""Take a dictonary and save it to the config file as json"""
|
||
|
newContents = json.dumps(dictonary, sort_keys=True, indent=4)
|
||
|
path = os.path.expanduser("~/.youtube-rss")
|
||
|
configFile = open(path, "w")
|
||
|
configFile.write(newContents)
|
||
|
configFile.close()
|
||
|
|
||
|
def getVideoIdFromUrl(url):
|
||
|
urlparts = urlparse(url)
|
||
|
args = urlparts.query.split("&")
|
||
|
for arg in args:
|
||
|
pair = arg.split("=")
|
||
|
if pair[0] == "v":
|
||
|
return pair[1]
|
||
|
|
||
|
return None
|
||
|
|
||
|
def downloadVid(vidId, path):
|
||
|
if path[-1] != '/':
|
||
|
path = "%s/" % path
|
||
|
|
||
|
now = datetime.datetime.now()
|
||
|
|
||
|
sysCall = "youtube-dl -o \"%s%s_%%(stitle)s.%%(ext)s\" \"http://www.youtube.com/watch?v=%s\"" % \
|
||
|
(path, now.strftime("%Y-%m-%d"), vidId)
|
||
|
|
||
|
os.system(sysCall)
|
||
|
|
||
|
def checkForNew(channel):
|
||
|
feed = feedparser.parse(channel['link'])
|
||
|
for entry in feed.entries:
|
||
|
vidId = getVideoIdFromUrl(entry.link)
|
||
|
if vidId not in channel['watched']:
|
||
|
fullpath = os.path.expanduser(channel['destination'])
|
||
|
downloadVid(vidId, fullpath)
|
||
|
channel['watched'].append(vidId)
|
||
|
|
||
|
return channel
|
||
|
|
||
|
def main():
|
||
|
"""Downloads all the links"""
|
||
|
config = readConfigFile()
|
||
|
newconfig = []
|
||
|
for channel in config:
|
||
|
newconfig.append(checkForNew(channel))
|
||
|
|
||
|
saveConfigFile(newconfig)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|
||
|
|