salt/states/roles/maintain/ytdownloader/ytdownloader.py

100 lines
2.4 KiB
Python

#download files from youtube using rss feeds
import urllib.request
import xml.etree.ElementTree as ET
import requests
import csv
import os.path
import re
import shutil
from datetime import datetime
def getname(name,scheme):
#find matching [*]
locs=re.findall('(?<=\[)[^\[\]]+(?=\])',scheme)
digits=[]
for loc in locs:
mstr='(?<='+loc+')[0-9]+'
dig=re.findall(mstr,name)
if(len(dig)>0):
digits.append(dig[0])
schema=re.split('(\[[^\[\]]+\])',scheme)
nname=''
count=0
for bit in schema:
if(re.match('\[.*\]',bit)):
if(len(digits)>count):
nname+=digits[count].zfill(2)
count+=1
else:
nname+=bit
if(count == len(locs)):
return nname
else:
return name
def downloadfile(name,dest,url):
name=name+".mp4"
print('Saving to: '+name)
urllib.request.urlretrieve(url,name)
print('Moving to: '+dest+name)
shutil.move(name,dest+name)
print('Done')
def downloadfromfeed(feed):
url=feed[1]
dest=feed[2]
filt=feed[3]
scheme=feed[4]
lastdl=datetime.strptime(feed[5], '%Y-%m-%d %H:%M:%S')
response = urllib.request.urlopen(url)
data = response.read()
text = data.decode('utf-8')
root = ET.fromstring(text)
for child in root.findall('.//item'):
title=child.find('.//title')
date=datetime.strptime(child.find('.//pubDate').text, '%a, %d %b %Y %H:%M:%S %Z')
if(date>lastdl):
if(filt in title.text):
if(date>datetime.strptime(feed[5], '%Y-%m-%d %H:%M:%S')):
feed[5]=date.strftime('%Y-%m-%d %H:%M:%S')
enc=child.find('.//enclosure')
name=title.text
target=enc.attrib.get('url')
print('Downloading: '+name)
fname=getname(name,scheme)
downloadfile(fname,dest,target)
def downloadfeeds(feeds):
for feed in feeds:
downloadfromfeed(feed)
def readcsv(f,base):
data=[]
if(os.path.exists(f)):
with open(f) as csvfile:
reader=csv.reader(csvfile, delimiter='\t')
for row in reader:
data.append(row)
dnames=[row[0] for row in data]
with open(base) as basefile:
reader=csv.reader(basefile, delimiter='\t')
for row in reader:
if(row[0] not in dnames):
row.append('2000-01-01 01:01:01')
data.append(row)
dnames.append(row[0])
return data
def savecsv(data,f):
with open(f, 'w') as csvfile:
writer=csv.writer(csvfile, delimiter='\t')
writer.writerows(data)
os.chdir('/root/scripts/ytdownloader')
csvfile='feeds.csv'
csvbase='feedsbase.csv'
data=readcsv(csvfile,csvbase)
downloadfeeds(data)
print(data)
savecsv(data,csvfile)