Class creation
This commit is contained in:
		
							parent
							
								
									b87310f7ca
								
							
						
					
					
						commit
						6e22039cfe
					
				
							
								
								
									
										34
									
								
								core.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								core.py
									
									
									
									
									
										Normal file
									
								
							@ -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...')
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								dist/ydl → dist/core
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dist/ydl → dist/core
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										25
									
								
								interface.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								interface.py
									
									
									
									
									
										Normal file
									
								
							@ -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()
 | 
			
		||||
							
								
								
									
										205
									
								
								ydl.py
									
									
									
									
									
								
							
							
						
						
									
										205
									
								
								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'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user