IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

barre de progression via Youtube-dl.exe


Sujet :

Python

  1. #21
    Invité
    Invité(e)
    Par défaut
    Bonjour tyrtamos,

    --------------------------------------------------------------------------------------------------------------------------------
    Maintenant, quand tu veux "le nombre de vidéo d'une liste youtube", tu veux:
    - les vidéos disponibles au téléchargement (différents format de la même vidéo) pour une adresse web youtube?
    - ou les différentes vidéos disponibles d'une playlist?
    --------------------------------------------------------------------------------------------------------------------------------

    je désire les différentes vidéos disponibles d'une playlist!
    Je télécharge uniquement au format -->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ydl_opts = {
    ....
    'format': 'best'
    ....
     
    }

  2. #22
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 495
    Billets dans le blog
    6
    Par défaut
    Avec l'url d'une playlist de youtube, voilà comment on peut trouver toutes les vidéos qu'il y a dedans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import youtube_dl
     
    ##############################################################################
    class MyLogger(object):
     
        def debug(self, msg):
            print(msg.strip())
     
        def warning(self, msg):
            print(msg.strip())
     
        def error(self, msg):
            print(msg.strip())
     
    ##############################################################################
     
    ydl_opts = {
        "logger": MyLogger()
        }
     
    # l'url d'une playlist
    url = "https://www.youtube.com/playlist?list=PLQVhT6gWFDmI6457hTmdzPYUE5C9jEenD"
     
    # télécharge les informations (mais pas les vidéos!) de la playlist
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        infos = ydl.extract_info(url, download=False)
     
    if "entries" in infos:
        for video in infos['entries']:
            print('Video #%d: %s' % (video['playlist_index'], video['title']))
    else:
        print("Ce n'est pas une playlist")
    Avec l'url donné (playlist de 30 pièces de théâtre), et après les recherches (qui durent quelques minutes), cela affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Video #1: les trois coups - Karambolage - ARTE
    Video #2: "La Facture" avec Jacqueline Maillan | Au Théâtre Ce soir | Archive INA
    Video #3: Les Amants Novices | Au Théâtre Ce soir  | Archive INA
    Video #4: Je préfère qu'on reste amis - Théâtre Complet - Michèle Bernier - Frédéric Diefenthal
    Video #5: "Ferraille et chiffons" avec P. Mondy, Amarande, J. Balutin | Au Théâtre Ce soir | Archive INA
    Video #6: "Beaufils et fils" avec Francis Lax et Georges Beller | Au Théâtre Ce soir | Archive INA
    Video #7: Au Théâtre Ce soir : "L'or Et La Paille" | Archive INA
    Video #8: "Le don d'Adèle" avec Maria Pacôme, Monique Tarbès | Au Théâtre Ce soir | Archive INA
    Video #9: "Attends-moi pour commencer" avec Michel Roux | Au Théâtre Ce soir | Archive INA
    Video #10: "L'Amant de Bornéo" avec Michel Roux | Au Théâtre Ce soir | Archive INA
    Video #11: Un fil à la patte - Pièce de Théâtre de Georges Feydeau sur France 2 (FEV 2011)
    Video #12: "Les petits oiseaux" avec Henri Tisot et Marthe Mercadier | Au Théâtre Ce soir | Archive INA
    Video #13: Le Nouveau Testament - Olivier Lejeune et Corinne Le Poulain
    Video #14: Anouilh   Colombe
    Video #15: "La Maîtresse De Bridge" avec Patrick Préjean | Au Théâtre Ce soir | Archive INA
    Video #16: "8 Femmes" | Au Théâtre Ce soir | Archive INA
    Video #17: "L'école des contribuables" avec Robert Manuel, Michel Roux | Au Théâtre Ce soir | Archive INA
    Video #18: "Miam-miam ou le dîner d'affaires" avec Jean Le Poulain | Au Théâtre Ce soir | Archive INA
    Video #19: "Peau De Vache" avec Sophie Desmarets  | Au Théâtre Ce soir | Archive INA
    Video #20: la soupiere Micheline Dax Rger Pierre theatre en entier en francais 1
    Video #21: La bonne adresse - Marc Camoletti - Théâtre
    Video #22: "Une Sacrée Famille" avec Pierre Arditi | Au Théâtre Ce soir | Archive INA
    Video #23: "Une femme presque fidèle" avec Dominique Paturel | Au Théâtre Ce soir | Archive INA
    Video #24: "Am Stram Gram" avec Francis Perrin | Au Théâtre Ce soir | Archive INA
    Video #25: Pyjama pour six -  Pièce de théâtre
    Video #26: Voyage de noces - Marc Camoletti - Théâtre
    Video #27: LE CLAN DES DIVORCEES (Le Palace - Paris - 2009)
    Video #28: On dinera au lit - Marc Camoletti - Théâtre
    Video #29: Au theatre ce soir   Quelle famille   DvDRiP fr Micheline Dax, Patrick Prejean
    Video #30: C'est encore mieux l'après midi J Villeret, P Mondy TVRip Fr DivX
    Maintenant, on va pouvoir télécharger une ou plusieurs vidéos, simplement en citant leur(s) numéro(s). Par exemple ici pour la vidéo #13.

    Il faut prendre un code plus complet pour le téléchargement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import youtube_dl
     
    ##############################################################################
    class MyLogger(object):
     
        def debug(self, msg):
            print(msg.strip())
     
        def warning(self, msg):
            print(msg.strip())
     
        def error(self, msg):
            print(msg.strip())
     
    ##############################################################################
    def my_hook(d):
     
        """
        # affiche le % de progression si utile
        try:
            print("{:.2f}".format(d['downloaded_bytes']/d['total_bytes']*100))
        except Exception as msgerr:
            print("Erreur:{}".format(str(msgerr)))
        """
     
        if d['status'] == 'finished':
            print(d['filename'])
            print('Fin du téléchargement')
     
    ##############################################################################
     
    ydl_opts = {
        "format": "bestvideo+bestaudio[ext=m4a]/bestvideo+bestaudio/best",
        "playlist_items": "13",
        "outtmpl": r"E:\Temp\videos_ytb\%(title)s_f%(format_id)s.%(ext)s",
        "nocheckcertificate": True,
        "nooverwrites": True,
        "write_all_thumbnails": True,
        "logger": MyLogger(),
        "progress_hooks": [my_hook]
        }
     
    # l'url de la playlist dont on veut télécharger la vidéo #13
    url = "https://www.youtube.com/playlist?list=PLQVhT6gWFDmI6457hTmdzPYUE5C9jEenD"
     
    # télécharge la video #13 de la playlist
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])
    Il existe plusieurs possibilités complémentaires pour télécharger plusieurs vidéos, en citant leurs numéros séparés par des virgules ou par plage.

  3. #23
    Invité
    Invité(e)
    Par défaut
    bonjour à tous,

    Merci pour le coup de main, j'ai avancé.
    A présent, je souhaite poser un événement sur une Entry du type menu contextuel (Copier/Coller) pour l'adresse URL.

    j'ai essayé ceci , mais la window ne s'ouvre pas - message suivant "Process finished with exit code 0"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    from tkinter import Tk, Entry
    from tkinter import *
    import tkinter
    from tkinter.filedialog import *
    root = Tk()
    root.config(bg='indigo')  #(bg='#F0F0F0')
    root.geometry('700x500+200+100')
     
    class Ent_M(tkinter.Entry):
        def __init__(self, parent, *args, **kwargs):
            tkinter.Entry.__init__(self, parent, *args, **kwargs)
            self.popup_menu = tkinter.Menu(self)
            self.popup_menu.add_command(label="Copier           ", command=self.Copy)
            self.popup_menu.add_command(label="Couper           ", command=self.Cut)
            self.popup_menu.add_command(label="Coller           ", command=self.Paste)
            self.bind('<Button-3>', self.popup2)
     
        def popup2(self, e):
            try:
                self.popup_menu.tk_popup(e.x_root, e.y_root, 0)
            finally:
                self.popup_menu.grab.release()
     
        def Copy(self):
            self.event_generate('<<Copy>>')
     
        def Paste(self):
            self.event_generate('<<Paste>>')
     
        def Cut(self):
            self.event_generate('<<Cut>>')
     
    ent = Ent_M(root, bg='white', fg='black', bd=6)
    ent.pack()
    je ne vois pas ou est le bug.
    merci

  4. #24
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par taratatasoleil Voir le message
    j'ai essayé ceci , mais la window ne s'ouvre pas - message suivant "Process finished with exit code 0"
    Si vous aviez écrit ce code là, vous seriez suffisamment expérimenté en POO et en programmation tkinter pour le mettre au point tout seul.

    Vous avez 2 solutions: prendre le temps d'apprendre à programmer en ouvrant un tuto. ou utiliser une application qui le fait déjà comme youtube-dlg.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #25
    Invité
    Invité(e)
    Par défaut
    j'ai suivis ce tuto

  6. #26
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Citation Envoyé par taratatasoleil Voir le message
    j'ai suivis ce tuto
    Vous plaisantez là.

    Un tuto, c'est pas un machin qu'on regarde comme la télé. Essentiellement parce qu'apprendre à programmer, c'est mettre les mains dans le cambouis et qu'apprendre c'est torturer les neurones de son cerveau pour qu'ils connectent et enregistrent des tas de concepts.

    Peut être qu'un jour nous aurons une technologie aussi avancée que celle qu'on voit dans Matrix où après 2 secondes de téléchargement du cerveau on devient pilote d'hélicoptère.

    Mais en 2020, c'est (hélas) de la lecture, des exercices pendant des jours, des semaines,...

    Et si vous ne voulez pas prendre le temps d'apprendre avec les moyens à votre disposition, ben, au fur et à mesure que vous allez avancer, vous allez rencontrer des difficultés insurmontables: vous abandonnerez votre projet et pire, vous risquez d'être dégouté de la programmation à force de tourner en rond.

    Après vous organisez/planifiez votre apprentissage comme vous voulez, mais ici, vous devez avoir essayé d'apprendre avec un vrai tuto. avant de poster et de demander de l'aide.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #27
    Invité
    Invité(e)
    Par défaut
    j'ai bricoler se code qui fonctionne (Bouton gauche sur widget Entry donne un menu contextuel avec l'option Coller)
    Il efface et colle la nouvelle valeur mais il y a une erreur que je ne saisis pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\master\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "C:/!TEST!/!/Projet/Menu Contextuel/Perso/test.py", line 42, in <lambda>
        Entry0.bind("<Button-1>", lambda event, obj=Entry0: onClick_G(event, obj))
      File "C:/!TEST!/!/Projet/Menu Contextuel/Perso/test.py", line 18, in onClick_G
        popup.tk_popup(event.x_root, event.y_root, 0)
      File "C:\Users\master\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2871, in tk_popup
        self.tk.call('tk_popup', self._w, x, y, entry)
    _tkinter.TclError: unknown option "-state"
    le script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    # ------------------------------------------------
    # Event sur Widget Entry via le bouton Dtr. souris
    # ------------------------------------------------
    from tkinter import *
    from tkinter import ttk
     
    def onClick_Dtr(event, obj):
        print("you clicked on", obj)
        obj.config(bg='PaleTurquoise1')
        # obj.config(background="#40c8db")
        obj.delete(0, END)
        print(event.widget, "has focus")
     
    def onClick_G(event, obj):
        obj.delete(0, END)
        # display the popup menu
        try:
            popup.tk_popup(event.x_root, event.y_root, 0)
        finally:
            # make sure to release the grab (Tk 8.0a1 only)
            popup.grab_release()
     
    def Paste():
     
        Entry0.event_generate('<<Paste>>')
     
    root = Tk()
    Entry0 = Entry(root, width=100, bd=2, text="test")
    Entry0.place(x=5, y=55)
    Entry0.pack()
    Entry0.insert(END, "Tkinter Popup Menus - popup = Menu(root, tearoff=0) - popup.add_command(label=" + "COPY" + ")")
     
     
    # create a menu
    popup = Menu(root, tearoff=0)
    popup.add_separator()
    popup.add_command(label="Coller     ", command=Paste)  # , command=next) etc..
    popup.add_separator()
     
     
    # Entry0.bind("<Button-1>", do_popup)
    Entry0.bind("<Button-1>", lambda event, obj=Entry0: onClick_G(event, obj))
    Entry0.bind("<3>", lambda event, obj=Entry0: onClick_Dtr(event, obj))
     
     
    print(dir(Entry))
    # afficher la description de la classe Entry :
    print(Entry.__doc__)
    # afficher la description de la fonction "select_range" :
    print(Entry.select_range.__doc__)
     
    root.mainloop()

  8. #28
    Invité
    Invité(e)
    Par défaut
    j'ai fais une routine pour comparer l'URL introduite dans un Entry pour vérifier si l'option choisie correspond à la sélection faite dans le liste box
    La routine fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    # --------------------------------------------------------------------------------------------
    # Recherche mot clef dans une chaine de caractère
    # --------------------------------------------------------------------------------------------
     
    # nom ="https://www.youtube.com/watch?v=nru50-aM-HY&list=PL6lxxT7IdTxHRKLXR_mLbRRSBKgWnDoq9"
    # nom ="https://www.youtube.com/user/olympic/videos"
    nom = "https://www.youtube.com/watch?v=qCnBkZLb-E4"
     
    def URL_Chaine():
        def equals(first, second):
            # Return true if the two ints are equal (Retourne VRAI si les deux entiers sont égaux)
            return first == second
     
        index = 0
        v_chaine = 0
        v_playlists = 0
        while index < len(nom):
     
            if nom[index:index + 6] == "videos":
                print("Mot clef recherché :", nom[index:index + 6], " - Commence en position", [index + 1], "jusqu'à la position", [index + 6])
                print("Cette URL est associée à une -Chaine-")
                v_chaine = 1
                print("v_chaine", v_chaine)
     
            if nom[index:index + 5] == "&list":
                print("Mot clef recherché :", nom[index:index + 6], " - Commence en position", [index + 1], "jusqu'à la position", [index + 6])
                print("Cette URL est associée à une -Playlists-")
                v_playlists = 1
                print("v_playlists", v_playlists)
     
            index = index + 1
     
        if equals(v_chaine, v_playlists):
            print("Cette URL est associée à une -Vidéo-")
            print("v_chaine", v_chaine)
            print("v_playlists", v_playlists)
     
    URL_Chaine()
    quel est l’événement sur Entry que je dois surveiller pour actionner la routine lorsque la variable est pas vide?
    merci

  9. #29
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonsoir,

    il y a un site qui documente assez bien Tkinter que je vous recommande bien qu'un peu vieux :

    https://effbot.org/zone/tkinter-entry-validate.htm
    https://effbot.org/tkinterbook/entry.htm

    pour résumer le site recommande finalement d'utiliser les paramètres validate et validatecommand

    un exemple donné ici : https://stackoverflow.com/a/4140988

  10. #30
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par taratatasoleil Voir le message
    quel est l’événement sur Entry que je dois surveiller pour actionner la routine lorsque la variable est pas vide?
    Le plus simple est d'avoir un Button "valider" sur lequel l'utilisateur clique lorsqu'il a terminé sa saisie.
    Sinon vous pouvez toujours vous inspirer de cette discussion. ou d'une documentation tkinter.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #31
    Invité
    Invité(e)
    Par défaut
    merci à tous,
    j'ai opter pour une analyse URL pour déterminer le domaine en passant par une list. exit le widget combobox.
    le projet est fini

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Indy FTP (idFTP) faire une barre de progress de transfert
    Par Harry dans le forum Web & réseau
    Réponses: 4
    Dernier message: 09/07/2004, 13h15
  2. [VB.NET] Pb avec le bouton Annuler d'1 barre de progression
    Par dada1982 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/06/2004, 09h56
  3. Réponses: 12
    Dernier message: 27/05/2004, 00h13
  4. [DEBUTANT] Barre de progression
    Par pupupu dans le forum MFC
    Réponses: 4
    Dernier message: 18/01/2004, 16h47
  5. [web] Barre de Progression ASCII
    Par Red Bull dans le forum Web
    Réponses: 13
    Dernier message: 05/06/2003, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo