Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-12-31T22:23:30+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Indicateur de téléchargement youtube-dl, message #1370672016-12-31T22:23:30+01:00Breizh/@Breizhhttps://zestedesavoir.com/forums/sujet/7679/indicateur-de-telechargement-youtube-dl/?page=1#p137067<p>Et voilà, un code Python qui fonctionne. Il prends en paramètre n’importe quel URL supportée par Youtube-DL, il peut en prendre plusieurs. Les playlists YouTube sont gérées spécialement pour faire fonctionner la barre de progression nommée playlist. Ce script peut être amélioré de différentes façons, mais il me suffit, et je n’ai pas l’intention d’y toucher à nouveau, c’est juste à titre d’exemple.</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="ch">#!/usr/bin/python</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">unicode_literals</span>
<span class="kn">from</span> <span class="nn">yad</span> <span class="kn">import</span> <span class="n">YAD</span>
<span class="kn">import</span> <span class="nn">youtube_dl</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">urllib.request</span>
<span class="kn">import</span> <span class="nn">urllib.error</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="c1"># arguments : sys.argv = [ 'commande', 'arg1', … ]</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o"><</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">os</span><span class="o">.</span><span class="n">system</span><span class="p">(</span><span class="s1">'notify-send "Youtube-DL" "Veuillez entrer au moins une URL"'</span><span class="p">)</span>
<span class="nb">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">yad</span> <span class="o">=</span> <span class="n">YAD</span><span class="p">()</span>
<span class="n">progress</span> <span class="o">=</span> <span class="n">yad</span><span class="o">.</span><span class="n">MultiProgress</span><span class="p">(</span><span class="n">bar</span><span class="o">=</span><span class="p">((</span><span class="s2">"Fichier"</span><span class="p">,</span><span class="s2">"NORM"</span><span class="p">),(</span><span class="s2">"Playlist"</span><span class="p">,</span><span class="s2">"NORM"</span><span class="p">),(</span><span class="s2">"URL traitées"</span><span class="p">,</span><span class="s2">"NORM"</span><span class="p">)),</span><span class="n">autoclose</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">crawl</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
<span class="n">sTUBE</span> <span class="o">=</span> <span class="s1">''</span>
<span class="n">cPL</span> <span class="o">=</span> <span class="s1">''</span>
<span class="n">amp</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">final_url</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="s1">'list='</span> <span class="ow">in</span> <span class="n">url</span><span class="p">:</span>
<span class="n">eq</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s1">'='</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">cPL</span> <span class="o">=</span> <span class="n">url</span><span class="p">[</span><span class="n">eq</span><span class="p">:]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">None</span> <span class="c1"># URL invalide</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">yTUBE</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">sTUBE</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">yTUBE</span><span class="p">)</span>
<span class="k">except</span> <span class="n">urllib</span><span class="o">.</span><span class="n">error</span><span class="o">.</span><span class="n">URLError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">reason</span><span class="p">)</span>
<span class="n">tmp_mat</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">r'watch\?v=\S+?list='</span> <span class="o">+</span> <span class="n">cPL</span><span class="p">)</span>
<span class="n">mat</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">tmp_mat</span><span class="p">,</span> <span class="n">sTUBE</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mat</span><span class="p">:</span>
<span class="k">for</span> <span class="n">PL</span> <span class="ow">in</span> <span class="n">mat</span><span class="p">:</span>
<span class="n">yPL</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">PL</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">'&'</span> <span class="ow">in</span> <span class="n">yPL</span><span class="p">:</span>
<span class="n">yPL_amp</span> <span class="o">=</span> <span class="n">yPL</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">'&'</span><span class="p">)</span>
<span class="n">final_url</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'http://www.youtube.com/'</span> <span class="o">+</span> <span class="n">yPL</span><span class="p">[:</span><span class="n">yPL_amp</span><span class="p">])</span>
<span class="n">all_url</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">final_url</span><span class="p">))</span>
<span class="k">return</span> <span class="n">all_url</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">None</span> <span class="c1"># pas de vidéo</span>
<span class="k">def</span> <span class="nf">hook</span><span class="p">(</span><span class="n">infos</span><span class="p">):</span>
<span class="k">if</span> <span class="n">infos</span><span class="p">[</span><span class="s1">'status'</span><span class="p">]</span><span class="o">==</span><span class="s1">'downloading'</span> <span class="ow">and</span> <span class="n">infos</span><span class="p">[</span><span class="s1">'total_bytes'</span><span class="p">]</span><span class="o">!=</span><span class="bp">None</span><span class="p">:</span>
<span class="n">perc</span><span class="o">=</span><span class="n">infos</span><span class="p">[</span><span class="s1">'downloaded_bytes'</span><span class="p">]</span><span class="o">*</span><span class="mi">100</span><span class="o">/</span><span class="n">infos</span><span class="p">[</span><span class="s1">'total_bytes'</span><span class="p">]</span>
<span class="n">progress</span><span class="p">(</span><span class="n">perc</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="n">msg</span><span class="o">=</span><span class="n">infos</span><span class="p">[</span><span class="s1">'filename'</span><span class="p">]</span><span class="o">+</span><span class="s2">" ("</span><span class="o">+</span><span class="s2">"{:.2f}%"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">perc</span><span class="p">)</span><span class="o">+</span><span class="s2">" @ "</span><span class="o">+</span><span class="n">bytes_format</span><span class="p">(</span><span class="n">infos</span><span class="p">[</span><span class="s1">'speed'</span><span class="p">])</span><span class="o">+</span><span class="s2">")"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">bytes_format</span><span class="p">(</span><span class="nb">bytes</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">bytes</span> <span class="o"><</span> <span class="mi">1024</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">"{:.2f}B/s"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">bytes</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">bytes</span> <span class="o">>=</span> <span class="mi">1024</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">"{:.2f}KiB/s"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">bytes</span><span class="o">/</span><span class="mi">1024</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">bytes</span> <span class="o">>=</span> <span class="mi">1024</span><span class="o">**</span><span class="mi">2</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">"{:.2f}MiB/s"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">bytes</span><span class="o">/</span><span class="mi">1024</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">"{:.2f}GiB/s"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">bytes</span><span class="o">/</span><span class="mi">1024</span><span class="o">**</span><span class="mi">3</span><span class="p">)</span>
<span class="n">total_index</span><span class="o">=</span><span class="mi">0</span>
<span class="n">ydl_opts</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'format'</span><span class="p">:</span><span class="s1">'bestvideo[height<=?1100]+bestaudio/best'</span><span class="p">,</span> <span class="c1"># 1100 pour avoir du 1080p, y compris en cas d'erreur d'encodage</span>
<span class="s1">'outtmpl'</span><span class="p">:</span><span class="s1">'</span><span class="si">%(title)s</span><span class="s1">.</span><span class="si">%(ext)s</span><span class="s1">'</span><span class="p">,</span> <span class="c1"># titre.extension</span>
<span class="s1">'progress_hooks'</span><span class="p">:</span> <span class="p">[</span><span class="n">hook</span><span class="p">],</span> <span class="c1"># appelle la fonction de mise à jour de la première barre de progression</span>
<span class="p">}</span>
<span class="k">for</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">playlist</span><span class="o">=</span><span class="n">crawl</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">playlist</span><span class="p">)</span>
<span class="k">if</span> <span class="n">playlist</span><span class="o">==</span><span class="bp">None</span><span class="p">:</span>
<span class="n">playlist</span><span class="o">=</span><span class="p">[</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="n">total_index</span><span class="o">+</span><span class="mi">1</span><span class="p">]]</span>
<span class="k">print</span><span class="p">(</span><span class="n">playlist</span><span class="p">)</span>
<span class="n">playlist_index</span><span class="o">=</span><span class="mi">0</span>
<span class="n">progress</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="k">for</span> <span class="n">video</span> <span class="ow">in</span> <span class="n">playlist</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">video</span><span class="p">)</span>
<span class="n">progress</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
<span class="k">with</span> <span class="n">youtube_dl</span><span class="o">.</span><span class="n">YoutubeDL</span><span class="p">(</span><span class="n">ydl_opts</span><span class="p">)</span> <span class="k">as</span> <span class="n">ydl</span><span class="p">:</span>
<span class="n">ydl</span><span class="o">.</span><span class="n">download</span><span class="p">([</span><span class="n">video</span><span class="p">])</span>
<span class="n">playlist_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">progress</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
<span class="n">progress</span><span class="p">(</span><span class="n">playlist_index</span><span class="o">*</span><span class="mi">100</span><span class="o">/</span><span class="nb">len</span><span class="p">(</span><span class="n">playlist</span><span class="p">),</span><span class="mi">2</span><span class="p">)</span>
<span class="n">total_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">progress</span><span class="p">(</span><span class="n">total_index</span><span class="o">*</span><span class="mi">100</span><span class="o">/</span><span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]),</span><span class="mi">3</span><span class="p">)</span>
<span class="nb">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>Indicateur de téléchargement youtube-dl, message #1370512016-12-31T16:21:46+01:00Breizh/@Breizhhttps://zestedesavoir.com/forums/sujet/7679/indicateur-de-telechargement-youtube-dl/?page=1#p137051<p>Bon, en fait, il faut forcément un script à part. Tout simplement parce que ce script ne fonctionne pas, je suis obligé de mettre <code>--auto-close</code>, sinon il faut fermer la fenêtre après chaque téléchargement, mais youtube-dl télécharge parfois deux fichier (l’audio et la vidéo) pour les fusionner ensuite, or <code>--auto-close</code> ferme à 100%, ce qui fait planter le script, puisque qu’une fois la vidéo à 100%, il se ferme, alors que l’audio n’a pas été téléchargé.</p>
<p>Edit : YAD et Youtube-DL étant disponibles en Python, je vais m’attaquer à un script Python, tout bien réfléchi. Ce sera probablement plus simple.</p>Indicateur de téléchargement youtube-dl, message #1370252016-12-31T11:34:05+01:00Breizh/@Breizhhttps://zestedesavoir.com/forums/sujet/7679/indicateur-de-telechargement-youtube-dl/?page=1#p137025<p>Bonjour !</p>
<p>Je me suis fais un petit script pour télécharger des vidéos, avec une fenêtre de progression. Pour cela, j’utilise <code>yad</code> (Yet Another Dialog, un fork de Zenity, plus complet) et un script Python qui récupère les URLs des vidéos d’une playlist YouTube.</p>
<p>Voilà le script :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="ch">#!/bin/bash</span>
<span class="k">for</span> url in <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span>
<span class="k">do</span>
<span class="nv">playlist</span><span class="o">=</span><span class="k">$(</span><span class="nv">$HOME</span>/Softs/youParse.py <span class="nv">$url</span><span class="k">)</span>
<span class="k">if</span> <span class="o">[[</span> <span class="nv">$playlist</span> <span class="o">=</span> <span class="s2">"Incorrect Playlist."</span> <span class="o">]]</span>
<span class="k">then</span>
<span class="nv">playlist</span><span class="o">=</span><span class="s2">"</span><span class="nv">$url</span><span class="s2">"</span>
<span class="k">fi</span>
<span class="nv">compteur</span><span class="o">=</span>0
<span class="nv">total</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="nv">$playlist</span> <span class="p">|</span> wc -w<span class="k">)</span>
<span class="k">for</span> item in <span class="nv">$playlist</span>
<span class="k">do</span>
<span class="nv">compteur</span><span class="o">=</span><span class="k">$((</span> <span class="nv">$compteur</span> <span class="o">+</span> <span class="m">1</span> <span class="k">))</span>
<span class="nv">text</span><span class="o">=</span><span class="k">$(</span>youtube-dl -e <span class="nv">$item</span><span class="k">)</span>
youtube-dl --newline <span class="nv">$item</span> <span class="p">|</span>
grep --line-buffered -oP <span class="s1">'^\[download\].*?\K([0-9.]+\%)'</span> <span class="p">|</span>
yad --progress <span class="se">\</span>
--title<span class="o">=</span><span class="s2">"Téléchargement"</span> <span class="se">\</span>
--text<span class="o">=</span><span class="s2">"Téléchargement </span><span class="nv">$compteur</span><span class="s2"> sur </span><span class="nv">$total</span><span class="s2">\n</span><span class="nv">$text</span><span class="s2">"</span> <span class="se">\</span>
--percentage<span class="o">=</span><span class="m">0</span> --auto-kill --no-buttons --no-escape
<span class="k">done</span>
<span class="k">done</span>
</pre></div>
</td></tr></table></div>
<p>J’aimerais afficher une seconde barre de progression (avec <code>--multi-progress</code>de <code>yad</code>), même si à mon avis, en Bash, ça risque d’être difficile.</p>
<p>Cette seconde barre afficherait la progression totale (par rapport au nombre d’arguments passés), ou la progression de la playlist (ce qui est actuellement plus ou moins fait).</p>
<p>Pour cela, il faut que la sortie soit la suivante :</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8</pre></div></td><td class="code"><div class="codehilite"><pre><span></span>2:20%
1:1.0%
1:2.0%
1:…
1:100.0%
2:40%
1:1.0%
…
</pre></div>
</td></tr></table></div>
<p>Il faut donc ajouter <code>X:</code> devant la progression de youtube-dl, et parser les changement de vidéo de youtube-dl ( <code>[download] Downloading video 1 of 12</code>, il me semble).</p>
<p>Je pense devoir faire un second script qui affichera ce qu’il faut sur la sortie standard, ou une fonction, mais je n’ai aucune idée de comment gérer, et si c’est possible.</p>
<p>Auriez-vous des idées ?</p>
<p>Breizh.</p>