diff --git a/core.py b/core.py new file mode 100644 index 0000000..7c31d28 --- /dev/null +++ b/core.py @@ -0,0 +1,34 @@ +from __future__ import unicode_literals +import youtube_dl +from feedgen.feed import FeedGenerator +import os +import sys +import argparse +import ydl + +#TODO: +# offer download video option +# create good README.md +# .gitignore +# LICENSE + +parser = argparse.ArgumentParser() +parser.add_argument("-i","--interface", help="Launch GUI (beta)",action="store_true") +parser.add_argument("-s","--simulate", help="Do not download videos, just do as if",action="store_true") +parser.add_argument("-q","--quiet", help="Very quiet option for youtube-dl",action="store_true") +parser.add_argument("-f","--feed", help="Create Podcast feed",action="store_true") +parser.add_argument("-video", help="Download videos instead of creating audio",action="store_true") +parser.add_argument("-d","--dir", help="Define download directory for files, default value:'~/Vidéos'", default="~/Vidéos") +parser.add_argument("-url", help="Define base url for podcasts, default value:'http://podcasts.lutix.org'", default="http://podcasts.lutix.org") +parser.add_argument("-yturl","--youtube_url", help="Define youtube url to fetch", default ="https://www.youtube.com/watch?v=xJO5GstqTSY&list=PLxzM9a5lhAumFRpcigmGY1QLDYxb4-P2B") +args = parser.parse_args() + + + +if __name__ == "__main__": + if not args.interface: + ydlo = ydl.ydl_object(args) + ydlo.print_infos() + ydlo.process_args() + else: + print('Waiting for interface to be loaded...') diff --git a/dist/ydl b/dist/core similarity index 97% rename from dist/ydl rename to dist/core index f22851a..d71649e 100755 Binary files a/dist/ydl and b/dist/core differ diff --git a/interface.py b/interface.py new file mode 100644 index 0000000..2b09a93 --- /dev/null +++ b/interface.py @@ -0,0 +1,25 @@ +import tkinter as tk + +class Application(tk.Frame): + def __init__(self, master=None): + super().__init__(master) + self.master = master + self.pack() + self.create_widgets() + + def create_widgets(self): + Frame1 = tk.Frame(self, borderwidth=2, relief="groove") + Frame1.pack(side="left", padx=330, pady=330) + nom = tk.Label(self, text = 'Votre nom :') + reponse = tk.Entry(self) + valeur = tk.Button(self, text =' Valider', command=self.repondre) + reponse.pack() + valeur.pack() + + def repondre(): + print("reponse") + +if __name__ == "__main__": + root = tk.Tk() + app = Application(master=root) + app.mainloop() diff --git a/ydl.py b/ydl.py index 405346e..5c5341f 100644 --- a/ydl.py +++ b/ydl.py @@ -3,131 +3,116 @@ import youtube_dl from feedgen.feed import FeedGenerator import os import sys -import argparse -import main -#TODO: -# offer download video option -# create good README.md -# .gitignore -# LICENSE +class ydl_object: + def __init__(self,args): + self.args = args + self.infos = self.fetch_info() +# print(self.args) -parser = argparse.ArgumentParser() -parser.add_argument("-s","--simulate", help="Do not download videos, just do as if",action="store_true") -parser.add_argument("-q","--quiet", help="Very quiet option for youtube-dl",action="store_true") -parser.add_argument("-f","--feed", help="Create Podcast feed",action="store_true") -parser.add_argument("-video", help="Download videos instead of creating audio",action="store_true") -parser.add_argument("-d","--dir", help="Define download directory for files, default value:'~/Vidéos'", default="~/Vidéos") -parser.add_argument("-url", help="Define base url for podcasts, default value:'http://podcasts.lutix.org'", default="http://podcasts.lutix.org") -parser.add_argument("-yturl","--youtube_url", help="Define youtube url to fetch", default ="https://www.youtube.com/watch?v=xJO5GstqTSY&list=PLxzM9a5lhAumFRpcigmGY1QLDYxb4-P2B") -args = parser.parse_args() + def fetch_info(self): + print('Fetching Youtube Link informations...') + return youtube_dl.YoutubeDL({'quiet':True,'ignoreerrors':True}).extract_info(self.args.youtube_url, False) -ydlo = main.ydl_object(args) - -def fetch_info(url_yt): - print('Fetching Youtube Link informations...') - infos = youtube_dl.YoutubeDL({'quiet':True,'ignoreerrors':True}).extract_info(url_yt, False) - print('...Done') - return infos - -def create_feed(results): - """ - #results keys - _type entries id title uploader uploader_id uploader_url extractor webpage_url webpage_url_basename extractor_key - """ - fg = FeedGenerator() - fg.load_extension('podcast') - fg.podcast.itunes_category('Podcasting') - - fg.title(results['title']) - fg.description('none') - fg.link(href=args.url,rel='self') - - for item in results['entries']: + def create_feed(self): """ - #results['entries'] keys - id uploader uploader_id uploader_url channel_id channel_url upload_date license creator title alt_title thumbnail description categories tags subtitles automatic_captions duration + replace results by info + #results keys + _type entries id title uploader uploader_id uploader_url extractor webpage_url webpage_url_basename extractor_key """ - fe = fg.add_entry() - fe.id(item['id']) - fe.title(item['title']) - fe.description(item['description']) - item_full_path = args.url +'/'+results['title']+'/'+item['title']+'.mp3' - fe.enclosure(item_full_path,str(item['duration']),'audio/mpeg') + fg = FeedGenerator() + fg.load_extension('podcast') + fg.podcast.itunes_category('Podcasting') - fg.rss_str(pretty=True) - # create folder of feed if it doesn't exists - os.makedirs(args.dir+'/'+results['title'], exist_ok=True) - fg.rss_file(args.dir+'/'+results['title']+'/podcast.xml') + fg.title(self.infos['title']) + fg.description('none') + fg.link(href=self.args.url,rel='self') - return True + for item in self.infos['entries']: + """ + #infos['entries'] keys + id uploader uploader_id uploader_url channel_id channel_url upload_date license creator title alt_title thumbnail description categories tags subtitles automatic_captions duration + """ + fe = fg.add_entry() + fe.id(item['id']) + fe.title(item['title']) + fe.description(item['description']) + item_full_path = self.args.url +'/'+self.infos['title']+'/'+item['title']+'.mp3' + fe.enclosure(item_full_path,str(item['duration']),'audio/mpeg') -def my_hook(d): - if d['status'] == 'finished': - print('Done downloading, now converting ...') + fg.rss_str(pretty=True) + # create folder of feed if it doesn't exists + os.makedirs(self.args.dir+'/'+self.infos['title'], exist_ok=True) + fg.rss_file(self.args.dir+'/'+self.infos['title']+'/podcast.xml') -def yt_download(ydl_opts): - with youtube_dl.YoutubeDL(ydl_opts) as ydl: - print('Downloading Videos...') - print('Depending on number of files, it can take a while...') - results = ydl.extract_info(args.youtube_url, not args.simulate) + return True + + def my_hook(self,d): + if d['status'] == 'finished': + print('Done downloading, now converting ...') + + def yt_download(self,ydl_opts): + with youtube_dl.YoutubeDL(ydl_opts) as ydl: + print('Downloading Videos...') + print('Depending on number of files, it can take a while...') + results = ydl.extract_info(self.args.youtube_url, not self.args.simulate) + print('Done') + + def create_opts(self,type): + if type=='audio': + ydl_opts = { + 'quiet':self.args.quiet, + 'format': 'bestaudio/best', + 'ignoreerrors': True, + 'postprocessors': [{ + 'key': 'FFmpegExtractAudio', + 'preferredcodec': 'mp3', + 'preferredquality': '192', + }], + 'progress_hooks': [self.my_hook], + } + elif type=='video': + ydl_opts= {} + + + # if youtube url is a list, then download archive + print('Fetching Url properties...') + if 'entries' in self.infos: + ydl_opts['download_archive']= self.args.dir+'/archive.txt' + ydl_opts['outtmpl']= self.args.dir+'/%(playlist_title)s/%(title)s.%(ext)s' + else: + ydl_opts['download_archive']= self.args.dir+'/archive.txt' + ydl_opts['outtmpl']= self.args.dir+'/%(title)s.%(ext)s' print('Done') -def create_opts(infos,type): - if type=='audio': - ydl_opts = { - 'quiet':args.quiet, - 'format': 'bestaudio/best', - 'ignoreerrors': True, - 'postprocessors': [{ - 'key': 'FFmpegExtractAudio', - 'preferredcodec': 'mp3', - 'preferredquality': '192', - }], - 'progress_hooks': [my_hook], - } - elif type=='video': - ydl_opts= {} + return ydl_opts - - # if youtube url is a list, then download archive - print('Fetching Url properties...') - if 'entries' in infos: - ydl_opts['download_archive']= args.dir+'/archive.txt' - ydl_opts['outtmpl']= args.dir+'/%(playlist_title)s/%(title)s.%(ext)s' - else: - ydl_opts['download_archive']= args.dir+'/archive.txt' - ydl_opts['outtmpl']= args.dir+'/%(title)s.%(ext)s' - print('Done') - - return ydl_opts - -if __name__ == "__main__": - print('Downloads folder name: {}'.format(args.dir)) - infos = ydlo.infos - - # if youtube url linked to a list - if 'entries' in infos: - print('') - print('List of episodes online:') - for k,i in enumerate(infos['entries']): - print('Episode {}: {}, Durée:{}'.format(k+1,i['title'],i['duration'])) - - if args.feed: + def print_infos(self): + print('Downloads folder name: {}'.format(self.args.dir)) + if 'entries' in self.infos: print('') - print('Feed creation...{}'.format("Done" if create_feed(infos) else "Error")) + print('List of episodes online:') + for k,i in enumerate(self.infos['entries']): + print('Episode {}: {}, Durée:{}'.format(k+1,i['title'],i['duration'])) + + def process_args(self): + if 'entries' in self.infos: + if self.args.feed: + print('') + print('Feed creation...{}'.format("Done" if self.create_feed() else "Error")) + else: + print('') + print('Warning: no podcast feed has been created, please add --feed argument.') else: - print('') - print('Warning: no podcast feed has been created, please add --feed argument.') - else: - if args.feed: - print('') - print('In spite of --feed argument, as you specified contradictory options, no feed can be created!') + if self.args.feed: + print('') + print('In spite of --feed argument, as you specified contradictory options, no feed can be created!') + + if self.args.simulate: + print('Downloads...Not requested!') + else: + self.yt_download(self.create_opts(type='audio' if not self.args.video else 'video')) - if args.simulate: - print('Downloads...Not requested!') - else: - yt_download(create_opts(infos, type='audio' if not args.video else 'video'))