Linux за българи: Форуми

Хумор, сатира и забава => Кошче => Темата е започната от: go_fire в Mar 26, 2020, 19:24



Титла: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 26, 2020, 19:24
Значи говорим за стандартната (крадена от Интернет) конструкция на Докато:

Код
GeSHi (Bash):
  1. while read -r line; do command "$line"; done <file

Досега успешно съм я ползвал на други места. Единствената разлика е, че преди въпросното file всъщност е било $1, а сега името е твърдо установено.

Обаче след първата врътка, всяка следваща променлива $line започва да ѝ липсва първия знак от реда. Така реално си зациклям на втора врътка с грешка и не мога да продължа.

Някой има ли идея, защо се случва?

А, ако няма, ще съм благодарен и на идея, с какво да сменя Докато. Лесно е да се каже За, но не се сещам как да го накарам да работи за всеки ред от текстов документ.

Благодаря на отзовалите се, както и на тези, които просто са наминали!


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 26, 2020, 20:38
Значи говорим за стандартната (крадена от Интернет) конструкция на Докато:

Код
GeSHi (Bash):
  1. while read -r line; do command "$line"; done <file

Досега успешно съм я ползвал на други места. Единствената разлика е, че преди въпросното file всъщност е било $1, а сега името е твърдо установено.

Обаче след първата врътка, всяка следваща променлива $line започва да ѝ липсва първия знак от реда. Така реално си зациклям на втора врътка с грешка и не мога да продължа.

Някой има ли идея, защо се случва?

А, ако няма, ще съм благодарен и на идея, с какво да сменя Докато. Лесно е да се каже За, но не се сещам как да го накарам да работи за всеки ред от текстов документ.

Благодаря на отзовалите се, както и на тези, които просто са наминали!
При мен работи. command=echo Та да не би да е от командата? Смисъл - ако е echo пак ли ги реже?


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 26, 2020, 20:47
Е не, командата хич не е една, бая команди работят върху $line. Все пак си говорим за над сто реда, сложно, следователно чупливо нещо, което нявга беше възможно само с няколко буквички и цифрички. Но, че цикъла Докато го яде, съм сигурен, защото наслагах проверки навсякъде. И като най-после сложих следващия ред след Докато да е echo $var, истината цъфна.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: jet в Mar 27, 2020, 01:05
абе и при мен си работи без да реже (c echo)
Пробвай да смениш шибанга
#!/bin/bash
с
#!/bin/sh


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: remotexx в Mar 27, 2020, 05:54
...можеш ли да качиш примерен зип файл некаде че да тестваме - само с 2-3 реда - може да смениш/скриеш текста само не барай делимитерите и новите редове

неколко идеи
- що не пробваш с -u filename опцията, да не конзолата/шела да прекодира некой символи при пренасочването
- първия символ дето го яде да не енякой специален или е случайна буква
- тук пише: Only the characters found in $IFS are recognized as word delimiters.
http://linuxcommand.org/lc3_man_pages/readh.html

за проба с файлов дескриптор - долното дали ще работи правилно
Код
GeSHi (Bash):
  1. #!/bin/bash
  2. FILE=$1
  3. # read $FILE using the file descriptors
  4. exec 3<&0
  5. exec 0<$FILE
  6. while read line
  7. do
  8. # use $line variable to process line
  9. echo $line
  10. done
  11. exec 0<&3


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 27, 2020, 08:45
Джет, #! ми е важен да е bash, защото ползвам възможности специфични за басх, които ги няма в sh. Ремо, аз никога не съм си крил кода. Ще го дам целия. В този си вид той работи само за един ред, което прави повечето код излишен. Под него ще дам кратки обяснения за бързо влизане в ситуацията.

Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. unset y f l d ft
  4. declare -a yar
  5. declare -a far
  6.  
  7.  
  8. echo "Loading..."
  9.  
  10.  
  11. if [ oti -nt oti2 ]; then
  12.  
  13.    y=$(youtube-dl --get-id -a oti)
  14.    echo "$y" > "oti2"
  15.  
  16.  
  17.  
  18.    #https://askubuntu.com/questions/62492/how-can-i-change-the-date-modified-created-of-a-file
  19.    touch -d "$(date -R -r oti)" oti2
  20.  
  21.  
  22. fi
  23.  
  24. echo "Check..."
  25.  
  26. while read -r l;
  27. do
  28.    echo "$l e super";
  29.  
  30.    if [ -f *"$l.mkv" ]; then
  31.  
  32. echo "Matroska: OK"
  33.  
  34.    else
  35.  
  36. if [ -f *"$l.mp4" ]; then
  37.  
  38.    far[0]="*$l.mp4"
  39.  
  40.    if [ -f *"$l.m4a" ]; then
  41. far[5]="m4a"
  42.    else      
  43. far[5]="webm"
  44.  
  45.    fi
  46.  
  47.    echo "Convert..."
  48.  
  49.  
  50.    far[1]=$(echo ${far[0]})
  51.    far[4]=${far[1]:0:-3}
  52.  
  53.    far[2]=${far[4]}${far[5]}
  54.  
  55.    far[6]="mkv"
  56.    far[3]=${far[4]}${far[6]}
  57.  
  58.    ffmpeg -i "${far[1]}" -i "${far[2]}" -c:v copy -c:a copy -strict experimental "${far[3]}"
  59.    d=$(date -R -r "${far[1]}")
  60.    touch -d "$d" "${far[3]}"
  61.    rm "${far[1]}" "${far[2]}"
  62.  
  63. else
  64.  
  65.    ft="597/160/133"
  66.    if [ -f *"$l.m4a" ]; then
  67.  
  68. yar[1]="youtube-dl --download-archive ito -f "$ft" $l &"
  69.  
  70.    elif [ -f *"$l.webm" ]; then
  71.  
  72. yar[1]="youtube-dl --download-archive ito -f "$ft" $l &"
  73.  
  74. if [ -f *"$l.m4a."* ]; then
  75.    rm  *"$l.m4a."*
  76. fi
  77.  
  78.    else
  79.  
  80. ft="599/600/249/250/139/251/140"
  81.  
  82. yar[1]="youtube-dl -f "$ft" $l &"
  83.  
  84.  
  85. echo "tralala 3 $l"
  86.  
  87.    fi
  88.  
  89.    if [ -f "$l" ]; then
  90.  
  91. f=$(cat $l)
  92.  
  93.    else
  94.  
  95. f=$(youtube-dl --get-filename -f $ft $l)
  96.  
  97. echo "$f" > $l
  98. touch "$f.part"
  99.  
  100.    fi
  101.  
  102.  
  103.    yar[0]='for i in `seq 1 20`;do if [ -f "'$f'.part" ]; then '
  104.    yar[2]=' sleep 200 && pkill -9 youtube-dl; else rm $0 "'$l'" && ./for & exit ;fi ;done'
  105.  
  106.    echo ${yar[0]}${yar[1]}${yar[2]} > for2
  107.  
  108.    echo "Download..."
  109.  
  110.    sh for2 &
  111.    echo "bibi  $l"
  112.    exit
  113.  
  114. fi
  115.  
  116.    fi
  117.  
  118.  
  119. done < oti2
  120.  
  121. rm  oti2
  122.  
  123. echo "Done!"
  124.  
  125.  
  126. exit
  127.  

Както казах, това би било полезно единствено на някой, който иска да гледа клипчета с включено видео от тубата, но не разполага с кабелна връзка. Целта е да се случи същото, каквото правеше youtube-dl -f 17/36 почти толкова добре. Понеже реално 3gp не съществува вече в тубата, то няма как да се докара точно същото.

Понеже става въпрос за много бавни операции, то съм направил малко хакове. Информацията, която ми доставя youtube-dl я записвам във временни файлове. Това се случва на три места.

Първото. На тринадесети ред се подава списъка за теглене (реда y=$(youtube-dl --get-id -a oti)), който се записва във временен документ наречен oti2. Точно върху него правя упражнението while read. Защо така? Ами защото стандартен списък може да съдържа коментари, освен това може да се промени докато се чака изпълнение. Напомням, че си говорим за упражнение, което грубо трае до към тройно време на дължината на клиповете. Така, ако тегля клип от половин час, той ще е при мен грубо след малко под два часа. Ако правех същото на разделителна способност от 640x360 да речем, то той би бил при мен след 2 до 3 дни. Определено в това време могат да се сменят доста неща.

Второто обръщение към y-dl e на ред 95 (f=$(youtube-dl --get-filename -f $ft $l)). Него го правя, за да науча името на бъдещия клип, което записвам във временен  документ именуван с индификатора на клипа. Точно това е и съдържанието на oti2. Понеже заявка за името е отново много бавна операция, се старая да я извиквам възможно най-рядко. Понеже тегля два формата (по един за видео и аудио), то имам две такива обръщения. Можеше да е едно (и да правя подниз на низ, substring), но понеже аудиото може да е във формат webm или m4a (webm не винаги е наличен), то би станало още по-трошливо от сега.

Третата заявка към y-dl се сглобява и налива във временен документ наречен for2.

ВАЖНО! Ако ще пробвате нещото, сменете стойността 200 от ред 104 на примерно 5.

На добра връзка едно клипче от пет минути се тегли за около пет секунди.

При мен е сложено двеста, защото опитно съм установил, че y-dl умира на всеки две-три минути, но се случва и на повече. Затова съм му дал време за мислене малко над три минути. Това е нещо, което се случва само на бавни скорости. На бързи, y-dl не умира, но мен ме интересуват бавните.

Този for2 е фактически нещото, което се изпълнява в подобвивка (subshell). Причината за това е, защото bash няма goto. Втората причина е, че bash не е език за програмиране, а команден набор и няма вложени цикли. Ако нещо влезе в подобвивка на подобвивка, то просто бива убито. Всичко трябва да е на най-много две плоскости.

=*=

Начина да се опита работата на горния код е следния:

1. Намирате си три произволни клипчета от тубата. Няма нужда от повече, още второто няма да бъде изтеглено.

2. Правите си временен каталог. Това е за сигурност. Само луд би вярвал в способностите ми.

3. Правите вътре документ наречен oti (може и друго, но трябва да промените кода). Слагате адресите на трите клипчета като отделни редове. Y-dl не се интересува от празни редове и коментари в няколко варианта, включително безценните за мен # и ;.

4. Изпълнявате кода като му подавате въпросния oti.

5. Ако сте на бърза връзка, в никакъв случай не забравяте да промените онова 200 на например 5.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: jet в Mar 27, 2020, 13:23
Ремо не го разбра - той искаше файла с данните.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 27, 2020, 13:40
Ами ето един:

Цитат
https://www.youtube.com/watch?v=udGtY2bmTxs
https://www.youtube.com/watch?v=tq8iJgRImH8
https://www.youtube.com/watch?v=tjUBP9m3M5E

Това са първите три в:

https://www.youtube.com/feed/trending?disable_polymer=1

Съответно oti2 (върху който се цикли), би съдържал:

Цитат
udGtY2bmTxs
tq8iJgRImH8
tjUBP9m3M5E

Единственото друго вътре би било край на ред (проверено).

Всички индефикатори на тубата се състоят от единадесет на брой латински букви, цифри и тире. Никакви други знаци не съм виждал. Пробвах с множество примери, винаги първата се реже. И дори не е била тире. При последните няколко бяха „j“ „U“ и „8“.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: laskov в Mar 27, 2020, 14:00
Сложи по един фиктивен знак като първи. Може да е интервал, а може и едно голямо L в моя чест :)


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Mar 27, 2020, 15:32
Защо не извлечеш IDтата директно от адресите в списъка, а правиш запитване към youtube?


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 27, 2020, 18:07
Защо не извлечеш IDтата директно от адресите в списъка, а правиш запитване към youtube?

Защото списъка може да (и почти винаги) съдържа празни редове и коментари. За да свърша същото на bash, трябваше да имам поне още двадесет реда логика. А логиката на bash е много трошлвива.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Mar 27, 2020, 19:00
Какво искаш да направиш стъпка по стъпка?
Може да пробвам да сглобя нещо на Питоня


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 27, 2020, 23:44
При мен скрипта не върви, ма може да е от 100 неща. Ако имам време ще го погледна, но ако идеята ти е да сваляш най-кофти формата , има по лесни варианти :)

Цитат
       You  can  also  use  a  file  extension (currently 3gp, aac, flv, m4a, mp3, mp4, ogg, wav, webm are supported) to download the best quality format of a particular file extension
       served as a single file, e.g.  -f webm will download the best quality format with the webm extension served as a single file.

       You can also use special names to select particular edge case formats:

       · best: Select the best quality format represented by a single file with video and audio.

       · worst: Select the worst quality format represented by a single file with video and audio.

       · bestvideo: Select the best quality video-only format (e.g.  DASH video).  May not be available.

       · worstvideo: Select the worst quality video-only format.  May not be available.

       · bestaudio: Select the best quality audio only-format.  May not be available.

       · worstaudio: Select the worst quality audio only-format.  May not be available.


При мен е обратното разбира се. Аз търся най-хубавия:
Код
GeSHi (Bash):
  1. alias youtube-dl='youtube-dl -f '\''bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'\'''

Ако не ти е това идеята, моля обясни каква е :)


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Mar 28, 2020, 06:33
Ами аз се опитах да си го преведа, обаче синтаксиса на bash ми мътна работа все още. Така и не го научих.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 28, 2020, 07:29
Ами аз се опитах да си го преведа, обаче синтаксиса на bash ми мътна работа все още. Така и не го научих.
Аз що годе го чаткам, ма Гого е сътворил някаква странна манджа :)
Не мога да схвана изобщо логиката. Например това:

Код:
f=$(youtube-dl --get-filename -f $ft $l)
 
echo "$f" > $l
touch "$f.part"

казва дай ми Името на клипа от това ИД и после замени ИДто с името.. :) Дори не знам дали ще може да го направи баш.
ПП: Схванах го. Прави си фаелче с името на ИДто :)


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: remotexx в Mar 28, 2020, 08:10
Гога като се поосвободя малко ще го мъча, но дотук на прима Виста имам некой въпроси
1. Казваш да подадем името на файла като параметър, но не виждам кода да ползва параметри... script.bash param1 param1 etc.
2. Може би имаш предвид да пренасочим oti > script.bash

По въпроса за питона, ако пак ще си ги мерим... аз предлагам с# т.е. .net core
Щото питонджиите лъжат, също както и джаварите наремето, споменават само езика и крият якия фреймуърка зад него, който всъщност смятат да ползват  ???

Наслушал съм се на безсмислени спорове между пишман програмисти дето си мерят езиците, а всъщност си мерят фреймуърка и даже не се усещат че то на днешно време всички езици почти се изравниха.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: spec1a в Mar 28, 2020, 09:32
   Добър вариант според мен е да се ползва командата strace,
може да се види много добре какво точно се извиква,какви
файлове се отварят и т.н.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 28, 2020, 09:50
Уф, доста сте писали.

Remo, излъгал съм :( Заковал съм го.

4096, тъпото е, че това, което правя, y-dl го прави и сам. Мейк чудесно го е разбрал. Вземам наличния поток аудио с най-малък размер и същото за видеото. След това ги съединявам. Самия y-dl има такава възможност с --merge-output-format mkv. И отново го прави с ffmpeg. Но го прави единствено при подадени изрично параметрите, които Мейк е дал в мнението си.

Аз лично изобщо не съм убеден, че разработчиците y-dl наистина биха го направили при най-малките размери. При най-големите да. Например те знаят ли за съществуването на форматите 597, 599 и 600? Появиха се за малко този месец и пак изчезнаха. А тези формати почти заместват 3gp и почти могат да се ползват в реално време. Те знаят ли за 139, който е много рядко срещан и е само след като нещо е било предадено поточно до момента, когато тубата не реши да го прекодира? А той понякога е счупен. Но е по-кратък от 249. И изобщо 249 ли биха изтеглили или огромния 140? Защото 140 е m4a, а 249 e webm (в действителност opus, но името лъже). 249 е 50 КБ/с, а 140 е 128 КБ/с, което го прави троен по размер.

Освен това, в предни мнения казвах, че y-dl никога не са пробвали нещото си при бавни връзки или поне не са ги симулирали с шейпър. Y-dl увисва и спира да има признаци на живот на всеки няколко минути. Затова когато тегля нещо с него винаги ми се налага да го слагам в едноредов цикъл в конзолата от типа:

Код
GeSHi (Bash):
  1. for i in `seq 1 20`;do youtube-dl -f 599/600/249/250/139/251/140 https://www.youtube.com/watch?v=KMU0tzLwhbE  & sleep 200 && pkill -9 youtube-dl ;done

Синтаксиса на bash e много мощен с десетилетия допълван и способен на големи автомагии. Конзолата сама по себе си не е нещо по-различно от текстов редактор с вградено управление на файлове. Нещо като примитивен Емакс или Вим. За съжаление обаче, когато е измисляна концепцията, това е било на бързо и не са се съобразили, че при такава организация си поддтикван към грешки на всеки сантиметър. Не случайно казвах да се пробва нещото в изолирана среда (нов каталог). С Bash това е неизбежно във всеки един случай, ако ще Brian Kernighan да пише.

Ще ти обясня подробно, какво прави кода, но ще е в ново мнение. По-удобно ми е да го направя в Емакс, а не директно във форума.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Mar 28, 2020, 12:43
...

Не си мерим езиците. Аз съм любител програмист и програмирам за да си улесня живота. Досега не съм имал нужда от C#.
Впрочем, не намирам нищо лошо във библиотеки, които не идват с езика. Улесняват живота
И смятах да ползвам urllib, за да не се налага да се дърпат и инсталират още неща.

Цитат
Освен това, в предни мнения казвах, че y-dl никога не са пробвали нещото си при бавни връзки или поне не са ги симулирали с шейпър. Y-dl увисва и спира да има признаци на живот на всеки няколко минути.
Погледнах по-обстойно опциите, защото ползвам само няколко.
Тези нямат ли отношение към това, за което споменаваш? Сваляне при малка скорост и прекъсването след време.
Код:
  Download Options:
    -r, --limit-rate RATE            Maximum download rate in bytes per second (e.g. 50K or 4.2M)
    -R, --retries RETRIES            Number of retries (default is 10), or "infinite".
    --fragment-retries RETRIES       Number of retries for a fragment (default is 10), or "infinite" (DASH, hlsnative
                                     and ISM)

Видях и че има опция -F, с която могат да се вземат възможните видео формати:
Код:
$ youtube-dl -F https://www.youtube.com/watch?v=eURPTdaO3ck
[youtube] eURPTdaO3ck: Downloading webpage
[youtube] eURPTdaO3ck: Downloading video info webpage
[info] Available formats for eURPTdaO3ck:
format code  extension  resolution note
249          webm       audio only tiny   56k , opus @ 50k (48000Hz), 3.07MiB
250          webm       audio only tiny   71k , opus @ 70k (48000Hz), 4.06MiB
140          m4a        audio only tiny  128k , m4a_dash container, mp4a.40.2@128k (44100Hz), 7.94MiB
251          webm       audio only tiny  138k , opus @160k (48000Hz), 8.12MiB
160          mp4        256x144    144p   19k , avc1.4d400c, 30fps, video only, 635.95KiB
133          mp4        426x240    240p   34k , avc1.4d4015, 30fps, video only, 876.81KiB
278          webm       256x144    144p   60k , webm container, vp9, 30fps, video only, 1.53MiB
134          mp4        640x360    360p   78k , avc1.4d401e, 30fps, video only, 1.43MiB
242          webm       426x240    240p   89k , vp9, 30fps, video only, 2.40MiB
135          mp4        854x480    480p  153k , avc1.4d401f, 30fps, video only, 2.40MiB
243          webm       640x360    360p  169k , vp9, 30fps, video only, 4.37MiB
244          webm       854x480    480p  284k , vp9, 30fps, video only, 4.44MiB
136          mp4        1280x720   720p  285k , avc1.4d401f, 30fps, video only, 4.14MiB
137          mp4        1920x1080  1080p  482k , avc1.640028, 30fps, video only, 6.68MiB
247          webm       1280x720   720p  551k , vp9, 30fps, video only, 13.23MiB
248          webm       1920x1080  1080p  979k , vp9, 30fps, video only, 22.45MiB
18           mp4        640x360    360p  238k , avc1.42001E, mp4a.40.2@ 96k (44100Hz), 14.89MiB (best)

Може още да се ползва и тази опция, за да се пести време и трафик:
Код:
--youtube-skip-dash-manifest     Do not download the DASH manifests and related data on YouTube videos


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 28, 2020, 13:40
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. #  Това го знаеш покрай Смоко. Казва се на обвивката къде да търси
  4. #  интерпретатора. Без него ще се пробва със /bin/sh, но само ако има
  5. #  chmod +x. Другия вариант е да го подадеш директно на интерпретатора
  6. #  с например sh script
  7.  
  8. # Нещо, което винаги съм ненавиждал в обяснение на нов език. Никой,
  9. # никога не казва, как се отбелязват коментари. За тях може да е
  10. # подразбиращо, но за новак това е безценна информация, която не се
  11. # споделя. Bash има само едноредови коментари и всички те започват с
  12. # диез #. Ако ще пишеш коментари на няколко реда, всеки трябва да
  13. # започва с диез. Когато се пише нещо за конзола или обикновен текст,
  14. # конвенцията е да е ограничено до 70 знака на ред. Както виждаш, не
  15. # го спазвам и в реална ситуация, биха ми дърпали ушите.
  16.  
  17. unset y f l d ft
  18. declare -a yar
  19. declare -a far
  20.  
  21. #  Първия ред премахва стойностите на променливите, които се
  22. #  ползват. Това е със санитарна цел. Може да прескочи нещо от
  23. #  средата. С другите две изрично декларирам, че ще ползвам масиви. Не
  24. #  е задължително, може да стане в движение създаването им, но кой
  25. #  знае защо се води добра практика във всички езици през всички
  26. #  времена. Е то bash не е език, ама все пак. Най-вероятно спестява
  27. #  работа на професора.
  28.  
  29.  
  30. echo "Loading..."
  31.  
  32. # Почвам да давам съобщения в конзола, какво се случва, защото следват
  33. # бавни операции. Има по изключение само едно съобщение, което не е с
  34. # цел да ми казва, че следва нещо бавно. Ще стигнем и до него.
  35.  
  36. if [ oti -nt oti2 ]; then
  37.  
  38.    #  Навлизане в първото условие. Тук питам дали файл oti2
  39.    #  съществува и дали той е със същата дата на промяна, каквато има
  40.    #  oti. Вече обясних, че всички обръщения към y-dl са бавни
  41.    #  операции траещи по много минути (поне пет), затова гледам да ги
  42.    #  избягвам.
  43.  
  44.    # Oti e моя списък за теглене. Той може да съдържа празни редове
  45.    # за разграничение и коментари. Oti2 съдържа само и единствено
  46.    # индефикатори. Oti2 ще се промени, когато се промени и oti.
  47.  
  48.    # Това условие Ако е първата причина този код да не може да се
  49.    # изпълни от обикновен sh. Също е демонстрация, колко много е
  50.    # мислено по Bash през годините. Специално тази магия е само една
  51.    # от многото:
  52.    # http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html. След
  53.    # малко ще ползваме и масиви, също нещо непосилно за sh.
  54.  
  55.  
  56.    y=$(youtube-dl --get-id -a oti)
  57.    echo "$y" > "oti2"
  58.  
  59.    # Това е бавната операция по вземане на индефикаторите. Те се
  60.    # записват в променлива на средата, която веднага в следващия ред
  61.    # наливам във временния документ oti2. Налага ми се да записвам
  62.    # променливите във временни документи, защото непрекъснато скачам
  63.    # от едно пакетно изпълнение към друго. Това ще го разясня към
  64.    # края, защо е така, но съм го писал и в темата.
  65.  
  66.  
  67.    #https://askubuntu.com/questions/62492/how-can-i-change-the-date-modified-created-of-a-file
  68.    touch -d "$(date -R -r oti)" oti2
  69.  
  70.    # Touch е команда, която служи за промяна времената на
  71.    # документите. Тук я ползвам в оригиналното ѝ значение като казвам
  72.    # oti2 да придобие времето за промяна на oti. По този начин в
  73.    # условието на 17-и ред [ oti -nt oti2 ] разбирам дали oti е бил
  74.    # променен и се налага oti2 отново да бъде налят. Страничния ефект
  75.    # на touch е, че създава нови документи. Парадоксално, това е
  76.    # много по-използваната му функция.
  77.  
  78.    #Тук също ще създаде oti2, ако не съществува. Но би трябвало
  79.    #предния ред да го е създал. Ако нещо между тези две инструкции
  80.    #изтрие oti2, тук ще получим първата си катастрофа. Ето, какво
  81.    #значи да плаваш в непознати земи. В програмирането винаги е така.
  82.  
  83. fi
  84.  
  85. # Край на условието [ oti -nt oti2 ].
  86. # Ако условието не е изпълнено, то ще мина през това за под секунда.
  87.  
  88.  
  89. echo "Check..."
  90.  
  91. # Следва нова бавна операция и ново побутване на потребителя, стига да наблюдава случващото се.
  92.  
  93. while read -r l;
  94. do
  95.  
  96.    #  Тази магия значи, че ще се чете обикновен текст от документ и
  97.    #  всеки ред ще бъде присвояван на променливата $l (от line или на
  98.    #  български − ред). Както си забелязал, във философията на Юникс
  99.    #  е да се пести. Всичко което не може да се сведе до една буква,
  100.    #  се свежда до две, а ако не може до три. Трябва да сме ефективни
  101.    #  и да мислим за ресурсите. При бързи професори и изобилие от
  102.    #  памет лесно се забравя, но все пак трябва да се стараем.
  103.  
  104.    # До края на цикъла Докато ще се извършват действия върху тази
  105.    # променлива. Всяка врътка ще е върху следващия ред.
  106.  
  107.  
  108.  
  109.    echo "$l e super";
  110.    # Ето тук открих, че Докато между врътките ми яде буква. Слагането
  111.    # на съобщения в кода е лесният и удобен начин да се прави това,
  112.    # което споменатия от Спец. strace прави за транслиран код. Когато
  113.    # имаме интерактивно изпълнение сме благословени. Същото би
  114.    # трябвало да е и за Смоку. Макар там във версия три да влязоха
  115.    # едни езикови конструкции, които са много тежки. Идеята за
  116.    # структури от данни като масиви и вектори е безкрайно по-проста
  117.    # от структури като класове и обекти. Мен те ме отказаха от
  118.    # програмирането. Разбира се, ако си като да речем Ремо и пишеш
  119.    # някакви чудовищни системи като примерно Sales Forge, то без тях
  120.    # не може. Но, ако нещото е само няколко хиляди реда, то такива
  121.    # чудовищни структури от данни само пречат и внасят неразбиране,
  122.    # какво точно се прави. Затова за Смоку от версия три може и да не
  123.    # е вече вярно. Там съобщенията биха били безсмислени, ако се
  124.    # ползват обекти. Затова са измислени едни системи за изпитване,
  125.    # като са разделени на класове. Например най-популярните класове
  126.    # са точкови и непрекъснати.
  127.  
  128.  
  129.  
  130.  
  131.  
  132.    if [ -f *"$l.mkv" ]; then
  133. # Тук проверявам дали съществува обикновен документ наречен
  134. # *име.mkv. Звездичката и въпросителния знак (както със
  135. # сигурност знаеш) са специален клас знаци наречени
  136. # заместващи. Ydl именува изтеглените клипове с име, което
  137. # съдържа заглавието на клипа, както е в тубата, дефис,
  138. # идентификатора му и разширение. Това не може да се предугади
  139. # с --get-name, защото Ydl на свой ред сменя част от знаците в
  140. # заглавието, които смята за специални. Такъв например е
  141. # наклонена черта (/). Схемите за именуване на Ydl подлежат на
  142. # промяна, но подразбиращите се, ми харесват. Например, ако
  143. # теглиш всички налични формати, Ydl е достатъчно умен, за да
  144. # сложи в заглавията им и тази информация. Изобщо Ydl е един
  145. # много мощен и добре измислен инструмент от вида „швейцарско
  146. # ножче“.
  147.  
  148.  
  149.  
  150. echo "Matroska: OK"
  151. # Това е единственото безсмислено съобщение. Сложено е, защото
  152. # Bash не позволява да не се прави нищо при изпълнено условие
  153. # Ако. А нямаме обръщане на логиката (!), когато проверяваме
  154. # за наличие на документ. Логиката, която се развива надолу е
  155. # следната: първо се тегли звука, ако той е изтеглен, се тегли
  156. # картинката, ако са изтеглени и двете, тогава с ffmpg се
  157. # съединяват. Ако вече имаме направен mkv, то работата е
  158. # свършена и трябва да минем на следващия ред от oti2.
  159.  
  160.  
  161.  
  162.    else
  163.  
  164. if [ -f *"$l.mp4" ]; then
  165.    # Тук навлизаме в условието, ако не е свършена работата на
  166.    # обратно. Проверяваме дали картинката е потеглена. Винаги
  167.    # тегля mp4, за да не стават обърквания. И без това винаги
  168.    # е по-малък от webm при еднакви показатели. Тук системата
  169.    # за именуване на Ydl би била полезна, но все пак така се
  170.    # усложняват излишно нещата. Трябва човек да се придържа
  171.    # към по-простите решения, доколкото е възможно.
  172.  
  173.    far[0]="*$l.mp4"
  174.    # Тук се започва наливането на масива (този е едномерен,
  175.    # неименован пак за удобство). При изтеглен mp4, значи е
  176.    # време за съединяване. Първия елемент е името на
  177.    # въпросния mp4.
  178.  
  179.    if [ -f *"$l.m4a" ]; then
  180. far[5]="m4a"
  181. # Както казах звука може да е webm или m4a, затова
  182. # проверяваме, кое от двете се е свалило. За нас Ydl е
  183. # външен инструмент и няма друг начин да научим, какво
  184. # е изтеглил. Присвояваме на шести елемент това
  185. # име. Защо точно шести, след малко.
  186.  
  187.  
  188.    else      
  189. far[5]="webm"
  190.  
  191.    fi
  192.  
  193.    echo "Convert..."
  194.    # След като вече имаме имената на двата медийни документа,
  195.    # вече може да пристъпим към съединяването им. Тази задача
  196.    # за ffmpeg е бърза на професори от последните двадесет
  197.    # години. Но все пак е нашата крайна цел и е добре да я
  198.    # отбележим. Затова, въпреки, че задачата е бърза, а и
  199.    # ffmpeg e приказлив като жена, ние даваме съобщение за
  200.    # предстоящото ѝ изпълнение.
  201.  
  202.  
  203.    far[1]=$(echo ${far[0]})
  204.    far[4]=${far[1]:0:-3}
  205.    #  Първия ред е поради особености на Bash. Не можем да
  206.    #  използваме директно първия елемент, защото Bash няма да
  207.    #  ни преобразува звездичката. Има второ важно познание за
  208.    #  Bash, освен, че не е език за програмиране. А второто
  209.    #  произлиза от първото. То е, че не трябва да мислим Bash
  210.    #  за по-умен, от колкото е. Той е мъж, а не жена. Не може
  211.    #  да прави по две неща едновременно. Трябва да му се
  212.    #  подават ясни инструкции, еднозначни и по най-много едно
  213.    #  нещо наведнъж. В това си качество прилича на Асемблер.
  214.  
  215.    # Втория ред ни казва да направим подниз от низ. Странното
  216.    # заклинание значи, че махаме последните три букви
  217.    # (mp4). Тях ще сменим с нашите разширения. Тук става ясно
  218.    # защо този елемент е пети, а преди малко използвахме
  219.    # шести. Запазваме втори, трети и четвърти за истинските
  220.    # имена. Втория вече го съставихме на предния ред. Остават
  221.    # трети и четвърти. Вадене на подниз с този синтаксис в
  222.    # по-стари версии на Bash не беше възможно и тогава
  223.    # трябваше да ползваме малко математика. Да изчисляваме
  224.    # дължината на името и т.н.
  225.  
  226.  
  227.  
  228.    far[2]=${far[4]}${far[5]}
  229.  
  230.    far[6]="mkv"
  231.    far[3]=${far[4]}${far[6]}
  232.  
  233.    ffmpeg -i "${far[1]}" -i "${far[2]}" -c:v copy -c:a copy -strict experimental "${far[3]}"
  234.    #  НАЙ-накрая се стига и до самото съединяване, след като
  235.    #  сме си сглобили имената. Новото тук на по-горните
  236.    #  редове отнасящи се към трети и четвърти елемент. Тези
  237.    #  заклинания са просто сливане на низове.
  238.  
  239.  
  240.    d=$(date -R -r "${far[1]}")
  241.    touch -d "$d" "${far[3]}"
  242.    # Тук правим нещо, което вече сме правили. Сменяме датата
  243.    # на промяна на туко що произведения контейнер Матрьошка с
  244.    # датата на изтеглените потоци. Това е нещо, което и самия
  245.    # Ydl също прави. Слага датата на качване в тубата. Също е
  246.    # нещо, което през годините съществуване на Ydl много ме е
  247.    # дразнило, защото прави ls -rt безполезен. Но пък те
  248.    # знаят, какво правят. Така се запазва поредност. Затова
  249.    # го правя и аз. Ydl няма как да му се препише вина, ако
  250.    # клиповете не са качвани в поредност, а разбъркано според
  251.    # странични причини.
  252.  
  253.    # Тук по-горния ред е отново, защото Bash е мъж. Не може
  254.    # да прави две неща едновременно, затова ни се налага да
  255.    # ползваме променлива. Излишно е да казвам, че d е
  256.    # съкращение от „дата“(date).
  257.  
  258.    # Забравих да го спомена по-нагоре, но синтаксиса $( ) е
  259.    # нова форма на все още поддържания и по-кратък, но не
  260.    # толкова отличителен ``. Това значи, че създаваме нова
  261.    # обвивка, в която изпълняваме нещо и го връщаме на
  262.    # майчиния процес. Ако забелязваш управлението на масиви
  263.    # се извършва по същата технология, затова Bash се
  264.    # обърква. Стават детски процес на детски процес. Той не
  265.    # може да работи толкова надълбоко.
  266.  
  267.    rm "${far[1]}" "${far[2]}"
  268.    # Изтриваме вече ненужните звук и видео. Добрия погромист
  269.    # кърти, чисти и извозва боклука след себе си. Не остава
  270.    # отпадъци след като е свършил. Питай ме защо не ползвам
  271.    # Усхадуя! Тук имаме риск, ако не са се събрали добре
  272.    # документите по някаква причина, то да повторите бавния
  273.    # процес по тегленето. Но това е по-малко вероятно и
  274.    # по-добре да сте си поринали. Ако е писано пак да чакате
  275.    # с часове, ще чакате, няма де да ходите. Бърза е само
  276.    # работата за другите, които желаят резултатите. За този,
  277.    # който я прави е толкова, колкото е.
  278.  
  279. else
  280.    # Тук сме научили, че все още нямаме mp4, следователно
  281.    # трябва да си го потеглим. По принцип променливата за тип
  282.    # на документа за теглене ($ft) е ненужна, но ще я
  283.    # използваме пак, когато искаме да разберем, какво ще
  284.    # теглим. Тук може да сложим и друга променлива и след
  285.    # това вместо два пъти (или три според случая) да извикаме
  286.    # само веднъж --get-filename, но както коментирах, това би
  287.    # направило кода много сложен и още по-чуплив от сега.
  288.  
  289.    ft="597/160/133"
  290.    if [ -f *"$l.m4a" ]; then
  291. # Проверяваме имаме ли *идентификатор.m4a. Ако вече е
  292. # наличен, ще теглим mp4. Тук особеното е, че Ydl ни
  293. # позволява да създадем текстова база от данни с вече
  294. # изтеглени неща, да не се теглят отново. Използваме
  295. # тази чудесна възможност, едва след като ще теглим
  296. # картинката, защото тази база е проста и не ни дава
  297. # възможност да теглим нещо в различни формати. Което
  298. # може да се счита за нейно предимство. Това е
  299. # единственото в този код, което нямаше да ни достави
  300. # -f 17/36, докато съществуваше. Забравих да кажа, че
  301. # разделителя наклонена черта означава избор, като се
  302. # тегли първия наличен. Сиреч това е логическо
  303. # Ако. Логическото И е запетайка.
  304.  
  305. yar[1]="youtube-dl --download-archive ito -f "$ft" $l &"
  306. # Защо отново сглобяваме масиви, ще уточним след малко.
  307.  
  308.    elif [ -f *"$l.webm" ]; then
  309. # Казахме, че звука може да е webm, освен m4a. Ако
  310. # нямаме m4a не е задължително да не сме го изтеглили
  311. # в webm. Webm e с по-голям приоритет във възможните
  312. # формати, а нашата логика тече на обратно. Първо
  313. # проверихме за mkv, после за mp4 и накрая за
  314. # звука. Ако и това не мине, значи нямаме дори звук и
  315. # ще теглим и него.
  316.  
  317. yar[1]="youtube-dl --download-archive ito -f "$ft" $l &"
  318. # Имаме звук със сигурност, значи е време за
  319. # картинката. Тук имаме „суха“(DRY) ситуация с горната
  320. # проверка, но няма как. Може да се изнесе на
  321. # променлива и да не сме сухи, но усложняваме кода и
  322. # предизвикваме съдбата да влезе в ролята на
  323. # разгорещен негър. По-добре да сме сухи.
  324.  
  325. if [ -f *"$l.m4a."* ]; then
  326.    rm  *"$l.m4a."*
  327. fi
  328.  
  329. # Докато сме теглили е възможно да сме започнали с m4a, но вече да е наличен webm.
  330.  
  331. #Това е начина на работа на тубата. Първо предоставя
  332. #m4a, след време прекодира и във webm, но не се знае,
  333. #кога ще го направи. Твърде често се случва по време
  334. #на теглене. Тубата те надушва, че теглиш m4a и бърза
  335. #да ти даде webm. Ако го правиш достатъчно бавно, то
  336. #той ще те изпревари. А точно това се случва при бавна
  337. #връзка. Ако канала и видеото са непопулярни, то може
  338. #и никога да не се прекодират, но Гългъл надушат ли
  339. #те, веднага се правят на отзивчиви. Тогава имаш едно
  340. #пропиляно време и едни разхвърляни остатъци по диска
  341. #във формата на *.part и *.ytdl, a са възможни, и
  342. #други. Печалбата е, че ако клипа е достатъчно кратък,
  343. #то може да изпревариш тубата и да спестиш време,
  344. #защото m4a е по-малък по размер, ако не е формат
  345. #140. „Риск печели, риск губи“ с Кръстьо Вапцаров.
  346.  
  347.  
  348.  
  349.  
  350.    else
  351. # Тук стигаме, ако се окаже, че нямаме никой от
  352. # търсените формати. Значи трябва да теглим
  353. # звука. Защото винаги първо теглим звука, а това е
  354. # последното разклонение на логиката ни, когато сме
  355. # достигнали: Тогава.
  356.  
  357. ft="599/600/249/250/139/251/140"
  358.  
  359. yar[1]="youtube-dl -f "$ft" $l &"
  360.  
  361.  
  362. echo "tralala 3 $l"
  363. # Това съм си правил някакви изпитания, които са
  364. # изостанали. При крайния код не би съществувало.
  365.  
  366.    fi
  367.    # Изхода от конструкцията Ако.
  368.  
  369.  
  370.  
  371.    if [ -f "$l" ]; then
  372.  
  373. f=$(cat $l)
  374.  
  375.    else
  376.  
  377. f=$(youtube-dl --get-filename -f $ft $l)
  378.  
  379. echo "$f" > $l
  380. touch "$f.part"
  381.  
  382. # Тук използваме страничното действие на touch, ако
  383. # няма *.part да го създаде без съдържание. Ако
  384. # съществува, нищо няма да направи. Но на този етап
  385. # ние нямаме *.part, а наличието му е жизнено важно за
  386. # хака, който ще направим след няколко реда. Логиката
  387. # ни върви обратно. Целта е последна, начина за
  388. # достигане е пръв. Това е основата на всяко
  389. # порномиране.
  390.  
  391.    fi
  392.  
  393.    #  Тази особена конструкция Ако е отново хак с цел
  394.    #  намаляване загубата на време. Как ще се казва бъдещия
  395.    #  документ е отново една много бавна операция, вършена от
  396.    #  външна система, която може и да надвиши пет минути. За
  397.    #  целта минимизираме извикването Ydl. Отново ще запишем
  398.    #  тази информация във временен документ, защото съвсем
  399.    #  скоро ще стане ясно, че се лашкаме между обвивки и си
  400.    #  прехвърляме топката, а ние искаме между тези действия,
  401.    #  тази информация да е достъпна. Както е забелязал Мейк,
  402.    #  името на временния документ ще е идентификатора на
  403.    #  нужното ни видео. Това име ще го ползваме при
  404.    #  сглобяването след малко, за да спестим мъничко
  405.    #  време. Защо? След малко.
  406.  
  407.  
  408.  
  409.  
  410.  
  411.    yar[0]='for i in `seq 1 20`;do if [ -f "'$f'.part" ]; then '
  412.    yar[2]=' sleep 200 && pkill -9 youtube-dl; else rm $0 "'$l'" && ./for & exit ;fi ;done'
  413.  
  414.    # Завършваме сглобяването на масива. Става ясно, защо
  415.    # преди малко попълвахме втория му елемент, а не
  416.    # първия. Това, което правим е нов цикъл. В темата вече
  417.    # споменах, че за Bash e невъзможно да завърти цикъл в
  418.    # цикъл, защото това значи внучеста обвивка, което е
  419.    # невъзможно действие. Единствения друг начин е с goto, но
  420.    # то в Bash не е налично. Има привнесени решения по
  421.    # мрежата, но това усложнява кода, сиреч прави го още
  422.    # по-чуплив. Не е възможно да контролираш средата на
  423.    # изпълнение, затова всеки ред код е потенциална
  424.    # катастрофа. Трябва кода да е възможно най-малко.
  425.  
  426.    # Със заклинанието от първия ред, казваме, че ще въртим
  427.    # двадесет пъти. Помниш, че `` означава изпълнение в
  428.    # подобвивка. Сиреч този код ни казва дай ми: 1, 2, 3
  429.    # ... ,20.
  430.  
  431.    # Тук е и хака за спестяване на време. Възможно е да
  432.    # теглим кратко клипче (грубо под час, час и нещо). Тогава
  433.    # си вкарваме условие, че ако няма наличен
  434.    # *идентификатор.разширение.part, то значи е потеглен и не
  435.    # щем повече да въртим и чакаме по 3 мин. и 20 сек. на
  436.    # врътка.
  437.  
  438.    # Използваме факта, че Ydl по подразбиране си създава
  439.    # *.part за всичко, което тегли в същия каталог, в който
  440.    # се изпълнява. Като чудесен инструмент, той ни позволява
  441.    # настройка на това поведение. Може да налива направо в
  442.    # окончателния документ или пък временния документ да е с
  443.    # друго разположение, а не работния каталог. За нашия
  444.    # случай обаче подразбиращото поведение е
  445.    # предпочитано. Затова Ydl е чудесен. Винаги
  446.    # подразбиращото поведение е най-доброто, но ни дава да
  447.    # настоим всичко по наше предпочитание и нужда.
  448.  
  449.    # Както казах, налага ни се да убиваме Ydl, защото той
  450.    # блокира често и оставаме без нищо в ръцете. Ако
  451.    # скоростта ни беше бърза, то нямаше да се налага да
  452.    # въртим между започване, чакане, убиване, отново (хе-хе,
  453.    # нещо като REPL), но тогава нямаше и да се налага да
  454.    # пишем наш код, защото Ydl може да съединява потоци
  455.    # (стига да не са webm за звук), като сам извиква
  456.    # ffmpeg. FFmpeg има широко приложение в Ydl. Не е само за
  457.    # това. Без FFmpeg, Ydl не би успял да направи и 10% от
  458.    # нещата, които прави.
  459.  
  460.    # На втория ред, след като цикъла от врътки е приключил,
  461.    # връщаме топката във for (сиреч този код), за да прецени,
  462.    # какво е успяло да се изтегли.
  463.  
  464.    # Сигурно го знаеш, но специалната променлива $0 означава
  465.    # името на документа, който изпълняваме. Сиреч с rm $0
  466.    # изриваме боклука, който сме създали.
  467.  
  468.  
  469.    echo ${yar[0]}${yar[1]}${yar[2]} > for2
  470.  
  471.    # Наливаме съставения низ в нов временен документ наречен
  472.    # for2. Не го споменах преди, но съм сигурен, че
  473.    # знаеш. Все пак ще спомена. Знака по-голямо (great than
  474.    # или >) значи, че изхода от изпълнението на команда ще се
  475.    # запише в документ, а не на стандартния изход (демек
  476.    # обвивката). Ако са два, ще бъде добавяне. Ако не
  477.    # съществува, ще се създаде. Обаче ние не искаме да
  478.    # добавяме. Ако все още съществува по някаква причина (а
  479.    # не би трябвало), ние заличаваме съдържанието
  480.    # му. По-голямо е наш отчаян опит да контролираме
  481.    # неконтрилируема среда. Това е причината и за сетен път
  482.    # го казвам, всеки код, който прави какво да е, трябва да
  483.    # е максимално кратък и да се изпълнява максимално бързо,
  484.    # за да намаляваме доколкото е възможно рисковете на
  485.    # обкръжението ни, а те по никакъв начин не зависят от
  486.    # нас.
  487.  
  488.    echo "Download..."
  489.    # Следва най-бавната задача по потегляне на нещо, какво да
  490.    # е, та е редно да го съобщим на потребителя, въпреки, че
  491.    # самия Ydl е предостатъчно приказлив.
  492.  
  493.  
  494.  
  495.    sh for2 &
  496.    echo "bibi  $l"
  497.    exit
  498.  
  499.    # Изпълняваме туко що създадения от нас for2. За да
  500.    # избегнем усложняване в кода (съответно възможни
  501.    # катастрофи), не сме го чесали с chmod +x, а директно го
  502.    # подаваме на sh. Кода вътре е най-простия и краткия
  503.    # възможен, затова е по силите и на обикновения sh.
  504.  
  505.    # С exit спираме по-нататъшно изпълнение. На този етап то
  506.    # вече не е необходимо. Прехвърлили сме работата на
  507.    # друг. Онова „bibi“ e било проверка, какво ме проваля и
  508.    # не би съществувало в окончателния вариант на кода.
  509.  
  510.  
  511.  
  512.  
  513. fi
  514.  
  515.    fi
  516.  
  517.  
  518. done < oti2
  519. # Свършили са всички редове в oti2 и излизаме благополучно от
  520. # Докато. Идеята на по-малко е логично да е обратната на по-голямо,
  521. # което вече обсъдихме преди малко.
  522.  
  523.  
  524.  
  525. rm  oti2
  526. # Почистваме.
  527.  
  528. echo "Done!"
  529. #Казваме на потребителя да си отдъхне. Всъщност го лъжем. Той те първа
  530. #ще види, какви сме ги свършили и изобщо има ли резултат.
  531.  
  532.  
  533. exit
  534. # Казваме на обвивката да се самоубие без грешка. По принцип не е
  535. # необходимо. Bash така или иначе ще излезе от изпълнение след и
  536. # последния ред на документа, ама ей тъй за добре свършена
  537. # работа. Мърлявщината не е качество, което е за поощрение.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 28, 2020, 13:48

...


За този манифест съм го виждал, но понеже не знам, точно какво прави, не го ползвам. Броя за опити е когато служителя (server) те реже. Тук имаме увисване на клиента. Това с „нормата“ предполагам лъже услуги. Има такива, които се правят на умни като Pornhub, Soundcloud и други, които отначало ти пускат пълна скорост за няколко секунди от съединението, а после ти дават само, колкото да се изтеглят следващите няколко секунди. Идеята е да имаш намален трафик и при теб да е налично съвсем малко повече от това, което вече си видял.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: remotexx в Mar 28, 2020, 18:15
Гого не разбирам що го цепиш на по няколко реда и не ги ползваш, добър подход кофти имплементация
напр. (защо е кофти)
Код
GeSHi (Bash):
  1. y=$(youtube-dl --get-id -a oti)
  2. echo "$y" > "oti2"
  3. touch -d "$(date -R -r oti)" oti2
не е ли по-лесно така
Код
GeSHi (Bash):
  1. youtube-dl --get-id -a oti > oti2
  2. touch -d "$(date -R -r oti)" oti2

напр. (защо е добре)
Код
GeSHi (Bash):
  1. y=$(youtube-dl --get-id -a oti)
  2.  
  3. rc=$?;
  4. if [ $rc -ne 0 ]; then
  5.  echo "Error"
  6.  exit $rc
  7. fi
  8.  
  9. echo "$y" > "oti2"
  10. touch -d "$(date -R -r oti)" oti2

щото твойто не проверява за грешка, винаги създава oti2 (може и празен), и винаги му шляпва същата дата като oti - независмо дали е успяло да обработи целия oti или е гръмнало с грешка (още отначало или по средата) - напр. кофти URL нейде по средата (ред дето не е коментар нито празен и y2dl ще се опита да обработи и ще се провали)

напр. втория (средния) линк който си дал там (от трите за тестване) вече не съществува и ти проваля свалянето и на последния който е валиден щото фърля следната грешка дето няма кой да я сайдиса
Код
GeSHi (Bash):
  1. WARNING: Unable to extract video title
  2. WARNING: unable to extract description; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
  3. ERROR: This video is no longer available due to a copyright claim by Anze Kacafura.


При мен си работи правилно - олекотената версия
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. unset l
  4.  
  5. youtube-dl --get-id -a oti > oti2
  6. while read -r l;
  7. do
  8. echo "$l e super";
  9. done < oti2

Код
GeSHi (Bash):
  1. Fedora release 31 (Thirty One)
  2. GNU bash, version 5.0.11(1)-release (x86_64-redhat-linux-gnu)
  3.  
  4. [user@host0 oti]$ ./gogo.bash
  5. udGtY2bmTxs e super
  6. tjUBP9m3M5E e super
  7. udGtY2bmTxs e super

Некой забележки
1) ';' не е задължително - освен ако няма да слагаш по повече от един оператор на ред (и край на ред върши същата работа)
2) препоръчително е да се ползва "${l}" вместо "$l" ..кой знае къде из тия фермани има нещо което се прихваща като "$l" неправилно и ти яде символите...

https://stackoverflow.com/questions/8748831/when-do-we-need-curly-braces-around-shell-variables
https://unix.stackexchange.com/questions/4899/var-vs-var-and-to-quote-or-not-to-quote

П.П. и друг(ия) път като знеш колко е нефелен сайта моля ограничавай се до 80 (че и по малко) символи на ред, особено на коментарите, че сега трябва да превъртам, 3 дена път с камили, надолу да стигна хоризонталния скролер да превъртам надясно (екран по екран), после пак нагоре до коментара, после пак надолу до скорлера и т.н. докато чета ферман на един ред и после отиваме до началото на следащия ред/коментар и пак се почва сагата отначало  :P
П.П.П. Знам че има Shift+ScrollWheel ама ми умаля пръста - особ. при връщане от 1024 символ обратно в началото на следващия ред, особено като си помисля че той може и да е 2048 символа и ..да ти се отще (да превърташ)
Еххх ако мишките имаха километраж ...сигур щяхме да си ги мерим на километри  ;D


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 28, 2020, 19:03
Благодаря, Ремо! Естествено, че си прав. Пресъздаването ми в код е кофти, защото и аз като 4096 не съм програмист и нямам нужния опит. Естествено, че твоя вариант е по-добър от моя, но няма кой да се сети. Руснаците на това моето му казват говно-код.

Днес се сетих, защо нещото не е сработило при Мейк ми. Не съм уточнил, че така написано, е задължително да има две неща. Едното е oti (списък), а другото for (този код). По принцип е трябвало (а сигурно съм го и мислел) да заменя имената им с $1 и $0, но съм ги нахакал твърдо и така, ако едното липсва, кода не работи.

По двете препоръки. Първата, точката и запетаята е задължителна, защото всичко, което набирам в yar накрая ще е само един ред във for2. Това реално е нещото, което ползвам и до сега. Просто исках да го автоматизирам.

По втората. Много съм тъп и не разбрах защо {l}. Ще ходя да се образовам по връзките, дето си дал, че да разбера, каква свинщина съм свършил.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 28, 2020, 19:06
По послеписа. Просто го хвани и го сложи в текстов редактор. Тъпото е, че още в първия, та втория ли коментар казвам, че това трябва да се прави, но не съм го направил :(

ЛАМЕР У-У-У-У-У-У-У-У-У!!!

п.п. Наистина не знаех, че форума ще го направи :( Много съм тъп.

п.п.п. А бе, още от деветдесетте имаше програмки, дето ти мереха километража. А в ГНУ/Линукс такава програмка мисля, че е десетина реда.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 28, 2020, 19:12
Аз в действителност не гледам набиращите популярност. Просто ги използвах за пример. Например последното, което теглих е предаването на Диков от снощи. А то обикновено няма повече от хиляда гледания. Сега те първа ще го слушам. И преди съм казвал, че тегля обикновено само звук, защото това ми позволява да съм почти в реално време. Няма го вече 3gp за картинка. Този код тук е за специалните случаи (много редки), когато държа да има и картинка и евентуално ще си го и запазя това клипче, а няма да го трия веднага.

п.п. МНОГО БЛАГОДАРЯ за включванията ти и на всички останали!


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: remotexx в Mar 28, 2020, 19:52
Гога, извинявай че ти дадох отг. в стил Сисадмин (от близкото минало) " Не знам - при мен работи". То изначално е ясно, че за супер потребителя работи (винаги), а обикновените потребители "да го духат" или да се спасяват сами - стар принцип останал още от римско време:

http://bezistena.blog.bg/history/2019/03/30/da-go-duhat-bednite-kategorichni-sa-rimskite-senatori.1651155

и понеже сме на тема Ю тубата - https://www.youtube.com/watch?v=79V5YIqkHyc

но така на прима виста и без валиден тест, мога само да нахвърлям някой идеи да тестваш (за заобикаляне на проблема)
1. Не каза при тебе моя олекотения вариант дали работи - ако работи може да продължиш да си търсиш грешката по ферманите, ако ли не... виж другите идеи

2. Ако е некой бъг що не пробваш клaсическия вариант - през IFS (ако е нещо от whitespace)
 https://www.cyberciti.biz/faq/unix-howto-read-line-by-line-from-file/
https://bash.cyberciti.biz/guide/$IFS

3. for loop - понеже ИДтата са ти по една дума (на ред) долното би трябвало да сработи та барем разберем while/read ли е виновен или НЕ
Код
GeSHi (Bash):
  1. for word in $(cat ./oti); do echo $word; done


П.П. пробвай по-лесните варианти и кажи при теб кое сработва и кое не...
няма как ще трябва да те ползвам(е) като remote debugger понеже нямаме repeatable test case  :o


П.П.П. Копиране/поставяне в текстов файл е добра идея ...ако си на десктоп, ма с тея телефони, кой ти сяда вече на десктопа ...голямо превъртане падна ..докато не се сетих да си направя опростен вариант - който обаче за моя изненада при мен сработи правилно?! youtube-dl обновен ли ти е до последно?


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: remotexx в Mar 28, 2020, 20:16
и някой др. подводни капани - напр. ако последния ред не всършва с НовРед и пр. (макар че тогава ще ти изяде последния ред - целия, а не по 1 символ на ред)

като цяло е доста образоващо за ролята и обхавата на IFS - кога рябва да се запазва и въстановява и кога е само в контекста на текущия цикъл (while)

Виж отг. на codeforester  answered Jan 14 '17 at 3:30
https://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash




Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Mar 28, 2020, 20:38
Така...

Не ми става ясно, какъв документ while -r l; чете и откъде се взима ( как му е посочен )

Иначе си поиграх малко и до четенето на oti, свалянето на IDтата и уеднаквяването на mtime се докара.
Защо предпочитам Питоня вместо баш... Можеш да вършиш няколко неща едновременно ( паралелно ), като например да напускаш наведнъж да се вземат няколко IDта.

Ето и нещото, допреди да запецна поради горната причина.
Код:
#!/usr/bin/env python3
# This software is under the MIT License: https://opensource.org/licenses/MIT
#


import concurrent.futures as cf
import os
import os.path
import subprocess as sp

def get_dw_link(oti_path):
    with open(oti_path) as oti:
        for line in oti:
            # Просто проверява, ако реда започва като линк за гледане на видео от Youtube
            # и игнорира всичко останало
            if line.startswith('https://www.youtube.com/watch?v='):
                yield line.split()[0]


def get_id(url):
    try:
        # Тук може да се сложи timeout като аргумент в секунди
        # Може да бъде и израз 10*60 става 10 минути. Или пък 10*60+15
        resp = sp.run(['youtube-dl', '--get-id', url],
                    capture_output=True,
                    text=True)
       
        if resp.returncode == 0:
            return resp.stdout
        else:
            print(f'Getting ID failed! Skipped: "{url}". Return code: {resp.returncode}')
           
    except sp.TimeoutExpired:
        print(f'Timeout! Subprocess: {" ".join(resp.args)}. Skipped!')
       
                                     
def get_ids():
    with open('oti2', 'w') as oti2:
        with cf.ThreadPoolExecutor() as executor:
            ids = [executor.submit(get_id, url) for url in get_dw_link('oti')]
           
            for video_id in cf.as_completed(ids):
                if video_id.result():
                    oti2.write(video_id.result())
       


mt_oti = os.stat('oti').st_mtime

# Ако не съществува или mtime му е различен от този на oti
if not os.path.exists('oti2') or os.stat('oti2').st_mtime != mt_oti:
    get_ids()
   
    at_oti2 = os.stat('oti2').st_atime
   
    # За да се промени mtime на файла трябва да се зададат и двете atime и mtime. Не питай защо. Не зная.
    os.utime('oti2', (at_oti2, mt_oti))
   
else:
    pass
   
### Вторият ред е шегичка


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 28, 2020, 21:11
Remo, a защо като си на телефон не ползваш мобилните версии на форума и портала? Макар точно в този случай да е безполезно :'( :'( :'(

https://www.linux-bg.org/forum/index.php?topic=48741.15;wap2


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Mar 28, 2020, 21:26
Впрочем, може на oti2 да му се вдигне i флага, за да не може да се променя случайно нещо по него


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: remotexx в Mar 29, 2020, 02:04
Така...

Не ми става ясно, какъв документ while -r l; чете и откъде се взима ( как му е посочен )

Поне от кратката версия не можа ли да се ориентираш - махнал съм всичко излишно - след края на while ... do .. done командата продължава още и има пренасочване на вход от файл и се вижда откъде ги взема - от входа (който му е пренасочен да се изчете от файла)
Код
GeSHi (Bash):
  1. while read -r l;
  2. do
  3. echo "$l e super";
  4. done < oti2

сега стана ли ти ясно къде отива т.е. се пренасочва файлът  oti2

може би на един ред ще е по-ясно
Код
GeSHi (Bash):
  1. while read -r l; do echo "$l e super"; done < oti2


П.П. Гого не позлвам(е) мобилната версия щото па там има проблем със събмитването - не работи
..инак само за четене става, ама пък линка е много кофти (не запомнящ се, не намиращ се/трудно намиращ се по сайта) - не можаха ли да го направят като хората - m.lugbg.org или lugbg.org/m/.... или по последната мода от User-Agent да се ориентира и там.. каквото му е поискал браузъра т.е. моята Опера винаги му казва - Виж ся пич - аз съм мобилен браузър, обаче сайта му казва, ай като си толко оторен мобилен пич -на ти ся декстоп версията, оправяй са...


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 29, 2020, 02:28
Гого, усетих се за създаването на файлове и другите неща (даже 1во трябваше да си ъпдейтна версията на youtube-dl, че там е игра на котка и мишка с тубата и за това не ми работеше скрипта). Също като ми гръмна 2рия линк го махнах, но така и не можах да намеря какво ти реже името. Миналата вечер пробвах всичко , но така и не сработи. Самия read, като премахнеш всички твои сътворения по средата си работи , както Ремо е показал.
Мога да ти предложа да спреш, да си играеш със скрипта и да ползваш опциите на самата програма:

Цитат
youtube-dl -f '\''worstvideo[ext=mp4]+worstaudio[ext=m4a]/worst[ext=mp4]/worst'\''' -a oti

Това можеш да си го въртиш колкото искаш (синтаксиса е интуитивен). Сменяй си формата и качеството, както искаш. Може да пробваш и опциите които 4096bit ти даде.

Ето и резултата:

Цитат
makeme:$ youtube-dl -f '\''worstvideo[ext=mp4]+worstaudio[ext=m4a]/worst[ext=mp4]/worst'\''' -a oti
[youtube] udGtY2bmTxs: Downloading webpage
[download] Destination: Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.f160.mp4
[download] 100% of 808.96KiB in 00:00
[download] Destination: Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.f140.m4a
[download] 100% of 2.82MiB in 00:00
[ffmpeg] Merging formats into "Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.mp4"
Deleting original file Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.f160.mp4 (pass -k to keep)
Deleting original file Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.f140.m4a (pass -k to keep)
[youtube] tjUBP9m3M5E: Downloading webpage
[download] Destination: EMILIANO - Bolnitsa _ ЕМИЛИАНО - Болница-tjUBP9m3M5E.f160.mp4
[download] 100% of 1.93MiB in 00:00
[download] Destination: EMILIANO - Bolnitsa _ ЕМИЛИАНО - Болница-tjUBP9m3M5E.f140.m4a
[download] 100% of 4.48MiB in 00:00
[ffmpeg] Merging formats into "EMILIANO - Bolnitsa _ ЕМИЛИАНО - Болница-tjUBP9m3M5E.mp4"
Deleting original file EMILIANO - Bolnitsa _ ЕМИЛИАНО - Болница-tjUBP9m3M5E.f160.mp4 (pass -k to keep)
Deleting original file EMILIANO - Bolnitsa _ ЕМИЛИАНО - Болница-tjUBP9m3M5E.f140.m4a (pass -k to keep)
makeme:$ ll
total 11M
drwxrwxr-x  2 makeme makeme 4,0K мар 29 06:52  .
drwxrwxr-x 17 makeme makeme 4,0K мар 27 23:21  ..
-rw-rw-r--  1 makeme makeme 6,5M мар 18 14:54 'EMILIANO - Bolnitsa _ ЕМИЛИАНО - Болница-tjUBP9m3M5E.mp4'
-rwxrwxr-x  1 makeme makeme    0 мар 29 02:39  for
-rw-rw-r--  1 makeme makeme  265 мар 29 02:46  for2
-rwxrwxr-x  1 makeme makeme 1,9K мар 28 07:06  gogo_script
-rwxrwxr-x  1 makeme makeme  433 мар 28 07:09  gogo_script_read
-rw-rw-r--  1 makeme makeme   20 мар 28 07:04  ito
-rw-rw-r--  1 makeme makeme   88 мар 28 00:37  oti
-rw-rw-r--  1 makeme makeme   24 мар 28 00:37  oti2
-rw-rw-r--  1 makeme makeme 3,7M мар 22 12:12 'Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.mp4'
*Ужасно качество, ма ти май това искаш :)

Също така имай предвид, че заявката  youtube-dl --get-id -a oti сама по себе си с 2 линка вътре хаби 200к + . При положение че трафикът ти е кофти, не го хаби излишно. Просто слагаш прекалено много овърхед, при наличието на малък ресурс, при положение, че програмата има всичко вградено.

Все пак относно рязането, моето мнение е същото като на Ремо. Някъде при прехвърлянето на променливите и спаменето на процеси и програми се яде, но трудно ще се хване. Иначе read си работи. Като го тествах скрипта, по спомен пробвах и IFS= но не стана при мен.

ПП: Ако искаш най простия синтаксис :

Цитат
makeme:$ youtube-dl -f worst -a oti
[youtube] udGtY2bmTxs: Downloading webpage
[download] Destination: Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.mp4
[download] 100% of 9.34MiB in 00:00
[youtube] tjUBP9m3M5E: Downloading webpage
[download] Destination: EMILIANO - Bolnitsa _ ЕМИЛИАНО - Болница-tjUBP9m3M5E.mp4
[download] 100% of 16.87MiB in 00:01
makeme:$ ll
total 27M
drwxrwxr-x  2 makeme makeme 4,0K мар 29 02:31  .
drwxrwxr-x 17 makeme makeme 4,0K мар 27 23:21  ..
-rw-rw-r--  1 makeme makeme  17M мар 18 14:55 'EMILIANO - Bolnitsa _ ЕМИЛИАНО - Болница-tjUBP9m3M5E.mp4'
-rw-rw-r--  1 makeme makeme  265 мар 28 07:35  for2
-rwxrwxr-x  1 makeme makeme 1,9K мар 28 07:06  gogo_script
-rwxrwxr-x  1 makeme makeme  433 мар 28 07:09  gogo_script_read
-rw-rw-r--  1 makeme makeme   20 мар 28 07:04  ito
-rw-rw-r--  1 makeme makeme   88 мар 28 00:37  oti
-rw-rw-r--  1 makeme makeme   24 мар 28 00:37  oti2
-rw-rw-r--  1 makeme makeme 9,4M мар 22 12:12 'Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.mp4'
makeme:$

Дори оти2 не ти трябва ;)

ПП2: Сега се сетих че ти искаше да си гъвкав и да можеш да добавяш неща във файловете, пък скрипта да лупи. Та ето ти го на скрипт:

Код
GeSHi (Bash):
  1. #/bin/bash
  2. while true; do
  3.        youtube-dl -i -f '\''worstvideo[ext=mp4]+worstaudio[ext=m4a]/worst[ext=mp4]/worst'\''' -a oti
  4.        sleep 2
  5. done

Така ще си лупи и ще си проверявя. В момента в който добавиш линк (echo "https://www.youtube.com/watch?v=aaTRHqErehk" >> oti) ще почне да го сваля  (след sleep секунди де :) ). -i ще продължава ако има счупени линкове (проверката , дето Ремо ти предложи)

ПП3: Надявам се да прочетеш всичко това, и да кажеш дали ти е свършило работа :)


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Mar 29, 2020, 04:07
Така...

Не ми става ясно, какъв документ while -r l; чете и откъде се взима ( как му е посочен )

Поне от кратката версия не можа ли да се ориентираш - махнал съм всичко излишно - след края на while ... do .. done командата продължава още и има пренасочване на вход от файл и се вижда откъде ги взема - от входа (който му е пренасочен да се изчете от файла)
Код
GeSHi (Bash):
  1. while read -r l;
  2. do
  3. echo "$l e super";
  4. done < oti2

сега стана ли ти ясно къде отива т.е. се пренасочва файлът  oti2

може би на един ред ще е по-ясно
Код
GeSHi (Bash):
  1. while read -r l; do echo "$l e super"; done < oti2


;D
Сега стана ясно. Не очаквах да е на дъното на цикъла


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 29, 2020, 08:35
Мейк, безкрайно ти благодаря, че си направил всичко това за мен!!!

Но, вчера, докато разяснявах на 4096, какво прави този код (и го направих некадърно), му написах следното:


4096, тъпото е, че това, което правя, y-dl го прави и сам. Мейк чудесно го е разбрал. Вземам наличния поток аудио с най-малък размер и същото за видеото. След това ги съединявам. Самия y-dl има такава възможност с --merge-output-format mkv. И отново го прави с ffmpeg. Но го прави единствено при подадени изрично параметрите, които Мейк е дал в мнението си.

Аз лично изобщо не съм убеден, че разработчиците y-dl наистина биха го направили при най-малките размери. При най-големите да. Например те знаят ли за съществуването на форматите 597, 599 и 600? Появиха се за малко този месец и пак изчезнаха. А тези формати почти заместват 3gp и почти могат да се ползват в реално време. Те знаят ли за 139, който е много рядко срещан и е само след като нещо е било предадено поточно до момента, когато тубата не реши да го прекодира? А той понякога е счупен. Но е по-кратък от 249. И изобщо 249 ли биха изтеглили или огромния 140? Защото 140 е m4a, а 249 e webm (в действителност opus, но името лъже). 249 е 50 КБ/с, а 140 е 128 КБ/с, което го прави троен по размер.

Освен това, в предни мнения казвах, че y-dl никога не са пробвали нещото си при бавни връзки или поне не са ги симулирали с шейпър. Y-dl увисва и спира да има признаци на живот на всеки няколко минути...

Бях сигурен, че щом разработчиците на програмата изобщо не са я изпробвали на бавни връзки, че няма начин да се погрижат за нуждите на хората, които са с такива. И твоят експеримент го доказва.

Ето, какво казва Ydl за тези двете песни:

Код
GeSHi (Bash):
  1. youtube-dl -F udGtY2bmTxs tjUBP9m3M5E
  2. [youtube] udGtY2bmTxs: Downloading webpage
  3. [info] Available formats for udGtY2bmTxs:
  4. format code  extension  resolution note
  5. 599          m4a        audio only tiny   32k , mp4a.40.5 (22050Hz), 687.77KiB
  6. 600          webm       audio only tiny   37k , opus  (48000Hz), 774.91KiB
  7. 249          webm       audio only tiny   55k , opus @ 50k (48000Hz), 1.11MiB
  8. 250          webm       audio only tiny   72k , opus @ 70k (48000Hz), 1.47MiB
  9. 140          m4a        audio only tiny  130k , m4a_dash container, mp4a.40.2@128k (44100Hz), 2.82MiB
  10. 251          webm       audio only tiny  145k , opus @160k (48000Hz), 2.92MiB
  11. 597          mp4        82x144     144p   13k , avc1.4d400a, 13fps, video only, 262.47KiB
  12. 598          webm       144x256    144p   37k , vp9, 13fps, video only, 673.58KiB
  13. 160          mp4        82x144     144p   38k , avc1.4d500b, 25fps, video only, 808.96KiB
  14. 133          mp4        136x240    144p   81k , avc1.4d400c, 25fps, video only, 1.70MiB
  15. 278          webm       144x256    144p   97k , webm container, vp9, 25fps, video only, 2.04MiB
  16. 134          mp4        202x360    240p  201k , avc1.4d400d, 25fps, video only, 4.22MiB
  17. 242          webm       240x426    240p  224k , vp9, 25fps, video only, 4.61MiB
  18. 135          mp4        270x480    240p  369k , avc1.4d4015, 25fps, video only, 7.77MiB
  19. 243          webm       360x640    360p  413k , vp9, 25fps, video only, 8.41MiB
  20. 136          mp4        406x720    360p  736k , avc1.4d401e, 25fps, video only, 15.21MiB
  21. 244          webm       480x854    480p  765k , vp9, 25fps, video only, 15.16MiB
  22. 137          mp4        608x1080   480p 1377k , avc1.64001f, 25fps, video only, 27.10MiB
  23. 247          webm       720x1280   720p 1528k , vp9, 25fps, video only, 29.13MiB
  24. 248          webm       1080x1920  1080p 2682k , vp9, 25fps, video only, 51.56MiB
  25. 18           mp4        202x360    240p  428k , avc1.42001E, mp4a.40.2@ 96k (44100Hz), 9.34MiB (best)
  26. [youtube] tjUBP9m3M5E: Downloading webpage
  27. [info] Available formats for tjUBP9m3M5E:
  28. format code  extension  resolution note
  29. 600          webm       audio only tiny   41k , opus  (48000Hz), 1.19MiB
  30. 249          webm       audio only tiny   59k , opus @ 50k (48000Hz), 1.75MiB
  31. 250          webm       audio only tiny   77k , opus @ 70k (48000Hz), 2.31MiB
  32. 140          m4a        audio only tiny  132k , m4a_dash container, mp4a.40.2@128k (44100Hz), 4.48MiB
  33. 251          webm       audio only tiny  152k , opus @160k (48000Hz), 4.52MiB
  34. 160          mp4        256x144    144p   93k , avc1.4d400c, 25fps, video only, 1.93MiB
  35. 278          webm       256x144    144p   97k , webm container, vp9, 25fps, video only, 3.11MiB
  36. 133          mp4        426x240    240p  207k , avc1.4d4015, 25fps, video only, 4.05MiB
  37. 242          webm       426x240    240p  223k , vp9, 25fps, video only, 5.69MiB
  38. 243          webm       640x360    360p  410k , vp9, 25fps, video only, 10.24MiB
  39. 134          mp4        640x360    360p  442k , avc1.4d401e, 25fps, video only, 7.49MiB
  40. 135          mp4        854x480    480p  713k , avc1.4d401e, 25fps, video only, 13.88MiB
  41. 244          webm       854x480    480p  758k , vp9, 25fps, video only, 17.25MiB
  42. 136          mp4        1280x720   720p 1060k , avc1.4d401f, 25fps, video only, 24.99MiB
  43. 247          webm       1280x720   720p 1515k , vp9, 25fps, video only, 32.05MiB
  44. 248          webm       1920x1080  1080p 2646k , vp9, 25fps, video only, 55.58MiB
  45. 137          mp4        1920x1080  1080p 4224k , avc1.640028, 25fps, video only, 62.79MiB
  46. 271          webm       2560x1440  1440p 7886k , vp9, 25fps, video only, 126.18MiB
  47. 313          webm       3840x2160  2160p 17275k , vp9, 25fps, video only, 347.38MiB
  48. 18           mp4        640x360    360p  487k , avc1.42001E, mp4a.40.2@ 96k (44100Hz), 16.87MiB (best)
  49.  

Ако тези избори отговаряха на името си, щяха да ми изтеглят 600 и 597, като за първата имаме дори още по-идеалния 599. Това са най-малките по размер формати. И щеше да е прекрасно, защото щеше да стане за време почти равно на дължината на клипчетата.

Вместо това ми тегли ужасяващия 140, който само той се тегли за двойно повече време от продъжителността на клипа. Двойно е само в случаите на добро разположение на планетите. Тая година видяхме, че е зле. Забележи, че в моя списък, отвратителния 140 седи на възможно най-последното място и е в списъка само като резервен вариант. Ако пък съвсем нищо няма, дай ми него. 160 е горе-долу. Почти никъде няма почти нищо по-добро. В редките случаи, като тегля картинка, почти винаги е наличен само той.

Така, че, ако трябваше да избирам да ползвам псевдо възможностите на Ydl да удовлетворява нуждите на хора с бавни връзки или на ръка да проверя наличните формати, да изтегля, каквото има, не забравям на всеки няколко минути да прекратявам процеса и да го пускам пак, да сглобя на ръка заявката към ffmpeg, то категорично избирам второто, защото ще стане далеч по-бързо.

Казваш, че качеството е отвратително? Добро е. Много е добро даже. Явно никога не си виждал 3gp.

п.п. Трябва да взема да ги изслушам тези двете песни, като съм ги дал за пример. Но имам проблем. Константин Трендафилов не може да пее и рядко го изтрайвам. Още, когато изкара „Кекс“ се чудих, този човек, защо пропя? Да не би да е щото малко преди това стана гадже на оная дебела, отвратителна кифла?! А пък този Емилио не съм го чувал, но името подозрително ми прилича на чалгар. Не мога да си насиля слуха с това. Азис става, има глас и идиотски песни. Ама всичко останало е брак.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 29, 2020, 09:10
Между другото, ако няма да запазвам клипчето (което правя рядко), дори не опирам до ffmpeg. Това е така, защото, mpv е достатъчно умен, ако види в същия каталог а mp4 нещо със същото заглавие, но разширение m4a да ги пусне паралелно. Е ако съм изтеглил webm, го преименувам на m4a. Разработчика на mpv няма как да се съобразява с факта, че от Гългъл злоупотребяват с имената на разширенията. То по тази причина в Юникс изобщо няма разширения.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 29, 2020, 09:17
Гого, мился че пак не схвана командата :) Това, което цитира го прочетох и за това ти дадох лесен и сложен (гъвкав) вариант на командата. Това е гъвкавия и ти го дадох зада го разбереш и да си го моднеш според своите нужди (моите са други :) )

Цитат
Цитат
youtube-dl -f '\''worstvideo[ext=mp4]+worstaudio[ext=m4a]/worst[ext=mp4]/worst'\''' -a oti

Това можеш да си го въртиш колкото искаш (синтаксиса е интуитивен).


което е 140 :) Смени го на webm и ще стане това, което искаш. Отделно ако го няма, ще свали следващото, Отделно ако формата накрая не може да стане mp4, ще ти го конвертира в това което може (матрьошка обикновено). По добра автоматизация не виждам :)

ПП: Същото важи и за видеото

ПП2: Мисля че това е което ти трябва точно:

Цитат
youtube-dl -i -f '\''worstvideo+worstaudio/worst'\''' -a oti
Цитат
[youtube] udGtY2bmTxs: Downloading webpage
[download] Destination: Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.f597.mp4
[download] 100% of 262.47KiB in 00:00
[download] Destination: Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.f599.m4a

Това е най-кофтито което има и ще го свали и ще го събере във каквото може. 597 и 599 както го искаше :) замени го само в луупа и си готов. Сигурен съм че няма да намериш по-кофти :D


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 29, 2020, 10:19
Нави ме. Ще направя изпитания с последното. Най-вероятно ще сработи.

Но все пак, забележи, че не работи точно както трябва. Там дето му подаде да търси за m4a, в списъка имаше m4a с три пъти по-малък размер. Но явно, когато не му казваш изрично, какво да търси, успява някак.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 29, 2020, 10:25
Нави ме. Ще направя изпитания с последното. Най-вероятно ще сработи.

Но все пак, забележи, че не работи точно както трябва. Там дето му подаде да търси за m4a, в списъка имаше m4a с три пъти по-малък размер. Но явно, когато не му казваш изрично, какво да търси, успява някак.
Имай предвид че при мен 597 и 599 вече ги няма. Да не помислиш че се е скапала командата :)

Цитат
$ /home/makeme/.local/bin/youtube-dl -F udGtY2bmTxs
[youtube] udGtY2bmTxs: Downloading webpage
[info] Available formats for udGtY2bmTxs:
format code  extension  resolution note
249          webm       audio only tiny   55k , opus @ 50k (48000Hz), 1.11MiB
250          webm       audio only tiny   72k , opus @ 70k (48000Hz), 1.47MiB
140          m4a        audio only tiny  130k , m4a_dash container, mp4a.40.2@128k (44100Hz), 2.82MiB
251          webm       audio only tiny  145k , opus @160k (48000Hz), 2.92MiB
160          mp4        82x144     144p   38k , avc1.4d500b, 25fps, video only, 808.96KiB
133          mp4        136x240    144p   81k , avc1.4d400c, 25fps, video only, 1.70MiB
278          webm       144x256    144p   97k , webm container, vp9, 25fps, video only, 2.04MiB
134          mp4        202x360    240p  201k , avc1.4d400d, 25fps, video only, 4.22MiB
242          webm       240x426    240p  224k , vp9, 25fps, video only, 4.61MiB
135          mp4        270x480    240p  369k , avc1.4d4015, 25fps, video only, 7.77MiB
243          webm       360x640    360p  413k , vp9, 25fps, video only, 8.41MiB
136          mp4        406x720    360p  736k , avc1.4d401e, 25fps, video only, 15.21MiB
244          webm       480x854    480p  765k , vp9, 25fps, video only, 15.16MiB
137          mp4        608x1080   480p 1377k , avc1.64001f, 25fps, video only, 27.10MiB
247          webm       720x1280   720p 1528k , vp9, 25fps, video only, 29.13MiB
248          webm       1080x1920  1080p 2682k , vp9, 25fps, video only, 51.56MiB
18           mp4        202x360    240p  428k , avc1.42001E, mp4a.40.2@ 96k (44100Hz), 9.34MiB (best)

Иначе за м4а имай предвид че другите опции го карат да търси какво може да събере в мп4. Някъде горе беше писал че го предпочиташ и за това е тая голямата команда дето ти дадох. Това разбира се противоречи с логиката за най-малкото и тн.

ПП: Принципно при теб може да ти трябва и само worstvideo+worstaudio, но мисля че така, ако липсват, няма да ти свали нищо. За това и ма worst после за да свали най кофтито което може. Кавичките и другите знаци без слаша между опциите също мисля че можеш да разкараш. Те са ми от алиасите (аз така си слагам командите с опции).


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 29, 2020, 10:37
Предпочитам го защото обикновено, най-малкия по размер звук ми идва в webm (249), рядко има нещо по-добро. А така или иначе vp8 е по-голям от mpeg 4 при еднакви други условия, та още по-рядко има webm, по-добър от 160. А ако и двете ще са в webm, то ще трябва да си играя с вградените възможности за именуване, защото по подразбиране би свалило едното, а на другото да твърди, че е вече свалено. Та затова. Иначе винаги гоня размер. По-добър размер, по-скорошно слушане (или евентуално гледане).


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Mar 30, 2020, 02:30
Тъй, долното нещо не използва oti2 въпреки, че все пак го създава и прави проверка, ако съществува, да не се случва нищо.
Вместо това дърпа от Youtube данните за всяко видео от линковете в oti в JSON формат посредством youtube-dl и използва тези данни така:
Взима заглавието на видеото ( без разширението ), за всяко аудио и видео, формата и размера на файл, определя кой файл за всяко видео и аудио е най-малък и най-голям ( за всеки случай и второто ) и събира всичко това за всеки линк в oti накуп в някакаква структура.

След това сваля форматите на най-малките видео+аудио.

Всичко това е моя интерпретация на това, което разбрах, че искаш - както разбрах, възможно най-малък трафик. Ако искаш точно определен файлов формат да свалиш, може да се промени.

Засега работи. Хубаво е, че единият трите линка към Youtube, които даде като пример за oti, вече не е наличен, та промених някои неща.
Тествай и кажи, дали е наред.

Така и не разбрах малко по-надолу, как правиш имената. Щото не стигнах до там, но ще променя и това. Също и датата на новите mkv.

Искам само да разбера, дали работи при теб.

Код:
#!/usr/bin/env python3
#
#

from collections import namedtuple
import concurrent.futures as cf
from glob import glob
import json
import os
from pathlib import Path
import subprocess as sp
import sys
import time


def get_dw_link(oti_path):
    with open(oti_path) as oti:
        for line in oti:
            # Просто проверява, ако реда започва като линк за гледане на видео от Youtube
            # и игнорира всичко останало
            if line.startswith('https://www.youtube.com/watch?v='):
                yield line.split()[0]
               

def get_data(url):
    try:
        # Тук може да се сложи timeout като аргумент в секунди
        # Може да бъде и израз 10*60 става 10 минути. Или пък 10*60+15
       
        # Сваля данни за видеото в JSON формат
        resp = sp.run(f'youtube-dl -j {url}'.split(), capture_output=True) # timeout=timeout
       
        if resp.returncode == 0:
            data = json.loads(resp.stdout)
           
            video_data = {'video_id': data['display_id'],
                        'filename': Path(data['_filename']).stem,
                        'audio': dict(),
                        'video': dict()}
           
            audio = []
            video = []
            for media in data['formats']:
                _format = namedtuple('Format', ['format', 'filesize',])

                if media['filesize'] and 'audio only' in media['format']:
                    audio.append(_format(media['format_id'], media['filesize']))
                elif media['filesize']:
                    video.append(_format(media['format_id'], media['filesize']))
               
            audio.sort(key=lambda data: data.filesize)
            video.sort(key=lambda data: data.filesize)
           
            video_data['audio'] = audio
            video_data['video'] = video
           
            video_data['audio_min'] = min(audio, key=lambda data: data.filesize)
            video_data['video_min'] = min(video, key=lambda data: data.filesize)
           
            return video_data
       
        else:
            msg = f'\nGetting video data FAILED! Skipped: "{url}". Return code: {resp.returncode}\n'
           
            for line in resp.stderr.decode().split('\n'):
                if line.startswith('ERROR: '):
                    msg = f'{msg}{line}\n'
           
            msgs.append(msg)
           
    except sp.TimeoutExpired:
        print(f'\nTimeout! Subprocess: {" ".join(resp.args)}. Skipped!\n')
       
                                     
def get_ids():
    all_data = []
   
    with open('oti2', 'w') as oti2:
        with cf.ThreadPoolExecutor() as executor:
            videos_data = [executor.submit(get_data, url) for url in get_dw_link('oti')]
           
            for result in cf.as_completed(videos_data):
                data = result.result()
               
                if data:
                    all_data.append(data)
                    oti2.write(f'{data["video_id"]}\n')
     
    return all_data


###
# Премахваме файла, ако преди това скрипта е прекъснал и не го е премахнал сам
msgs = []

if os.path.exists('oti2'):
    os.remove('oti2')

mt_oti = os.stat('oti').st_mtime # Съхраняваме mtime на oti

# Ако не съществува или mtime му е различен от този на oti
if not os.path.exists('oti2') or os.stat('oti2').st_mtime != mt_oti:
    videos = get_ids()
       
    at_oti2 = os.stat('oti2').st_atime
   
    # За да се промени mtime на файла трябва да се зададат и двете atime и mtime. Не питай защо. Не зная.
    os.utime('oti2', (at_oti2, mt_oti))

# Сваляне на видеата от списъка в oti
for video in videos:
    # Търсим, ако има файл, който завършва на {id}.mkv
    pattern = f'*{video["video_id"]}.mkv'
   
    if glob(pattern):
        pass
        # print(f'ID: {{video["video_id"]} - Matroska OK!')
   
    else:
        command = f'youtube-dl -f {video["video_min"].format}+{video["audio_min"].format} -c {video["video_id"]}'.split()
       
        while not glob(pattern):
            try:
                proc = sp.run(command, check=True) # timeout=timeout
                print(f'\n')
           
                time.sleep(2) # Това по принцип не е необходимо
                 
            except sp.CalledProcessError:
               
                if proc.returncode < 0:
                    sys.exit(f'Subprocess stoped by a signal!')
                else:
                    continue
               

os.remove('oti2')

for msg in msgs:
    print(msg)     


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 30, 2020, 09:34
Благодаря! Ще го пробвам. Едни изпълнения от снощи взеха да убиват надеждите ми, че ще е възможно да тегля в бъдеще време. Снощи си свалях някакви неща за слушане, като оставих едно дълго (близо час) да се сваля докато спя. На сутринта имах точно 6,7% от него.

Но си има предистория. Споменавал съм за един хубав формат под номер 139. Той се появява само, когато е имало поточно предаване и стои наличен, докато тубата не реши да прекодира нещото. При популярно видеа и канали го прави в рамките на не повече от час или два, а за не толкова посещаваните, някога във времето, като е възможно и никога. Попадал съм на такива след години. Например може да се види в канала на вестник „Банкеръ“.

Също споменах, че този месец се появиха едни формати 597, 599 и 600. Те ту се появяват, ту изчезват. Много са добри, защото карат с 15 кадъра в секунда за видео и около 30 КХц за аудио. Това ги прави почти идеални за мобилна връзка, където един умен клиент би могъл да ги ползва почти в реално време за предаване.

Снощи връзката ми спадна от 7 КБ, на около 3. Това не е нещо ново. Става почти всяка вечер. Предполагам вечер клетките са по-натоварени и затова ми пуска по-малко връзка. След два-три часа се оправя. Това обаче не ми позволява да гледам по време на сваляне, като дам няколко минути аванс, защото при 50 КБ/с (249), времето за сваляне става почти двойно.

Но аз съм подготвен за такива ситуации и си имам свалени неща за слушане. Подкасти, влогове, такива неща. Но забелязах друго. От Гългъл са започнали смяна на алгоритмите. Когато достъпиш 249 след около пет минути ти праща за малко 600. След още няколко минути го скрива. Това на практика означава, че цикленето се затормозява. Започва един формат, сменя го, връща се на стария. Това все още се преживява, защото са различни (единия е ogg, другия m4a).

И стигаме до случката от снощи. Това, което оставих да се тегли за през нощта (защото е близо час продължителност) имаше наличен само 140. Не е често, но тази гадна ситуация съществува. Но все пак за една нощ щеше да успее. Обаче се е случило същото. Някъде на разсъмване, за малко е подал хубав формат (най-вероятно 600, съдейки по отличния размер). И двете са в m4a. M4a поради някаква причина се тегли на части. Прилича на теглене на списък за изпълнение (m3u8). Това е много гнусна интерпретация на понятието „списък за изпълнение“, но за съжаление съществува широко извън тубата. В резултат на това е изтрило изтегленото от последните часове и е започнало на ново. След няколко врътки, хубавия формат се е скрил и е дошъл отново 140. И упражнението се е повторило.

Какво предполагам, че се случва? Гългъл провеждат изпитания за нов мобилен клиент. Той, когато надуши, че връзката му е слаба, ще прескача на тези по-добри варианти, за да продължи да свири. После ще се връща към ужасния 140. Така ще прескача, колкото е необходимо. Засега само по веднъж се включва. Снощи изтеглих десетина клипчета за слушане днес и навсякъде беше по веднъж.

Обаче предположението ми е, че в бъдеще няма да е само по веднъж, защото веднъ не върши работа за просвирване в реално време. А те не гонят мен, гонят МИЛИАРД и кусур индийци. Така цикличното сваляне ще стане невъзможно, защото прехвърлянето между форматите непрекъснато ще изтрива вече сваленото.

Разбира се новия клиент ще е за Андроид. Не вярвам да го има за ГНУ/Линукс. И да го има, не бих го ползвал. Не желая да предоставям информация на Гългъл, кой съм и от какво точно се интересувам.

Засега съм открил, че Гългъл все още е доста глупав и при ползване на един и същ компютър от няколко човека не успява да разпознае предпочитанията им. Радвам се за което. Така ги приема за един човек с широки интереси, които рядко се съвместяват. Това определено бърка алгоритмите му и съм щастлив.

п.п. Мейк твърдеше, че качеството е отвратително, но това не е така. Звука не може да бъде отличен от нормално ухо. Музикант сигурно би видял разликата, но не би ползвал тубата. Пък и аз не я ползвам за музика. Картината не е пикселизирана, просто има загуба на детайли. Това е като да гледаш без очила. Разбираш, какво гледаш, просто не всяка подробност виждаш. Но е напълно достатъчно, когато има връзка между звука и картината (което е съвсем, съвсем рядко) да разбереш това, което не би разбрал само от слушане. А дори в този случай е малко.




Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 30, 2020, 16:03
Една странична случка. Вчера си направих труда да проверя, защо песен в тройката на набиращите популярност е изчезнала. Оказа се, че цитирам някоя си Мария Найденова, песента на „кака Дени“ е свалена за авторски права. Явно „кака Дени“ не си е платила. Същата „кака Дени“ е най-известна с това, че в извънредно тъпата песен „Майко, майко“ на Boreau, има посветен ред на нея. В него се казва:

Цитат
„Като съм звезда, не мога да ходя с рейса“
– Гле~й с~я, не съм пълен с въздух като Lay's-a.

За нямащите деца уточнявам, че Lay's е марка чипс. Чипса е изключително чупливо нещо и за да може да се пренася в по-големи количества (например кашон), то пакетите се пълнят до две трети от обема си с въздух. Това има страничен, рекламен ефект, защото пакетите изглеждат по-големи. И в реалния живот е така. Като си поемеш много въздух, се изпъчваш хубавичко да те видят, но така обикновено става видна и простотията ти.

За пак с хората без деца в пубертета уточнявам, че „кака Дени“ е певица (силно казано). Тя е звезда от Youtube на младото поколение, опитваща се да повтори успеха на Криско, 100 кила и др., като например последните трима спечелили Бай Брадър. Не успя да прескочи от Youtube в телевизията и успеха ѝ позавехна след няколко „песни“. В последните две години ми изпадна от поглед, но вчера разгледах канала ѝ. Очевидно е решила да се пробва на друго поприще. Има песен с Галин (този е чалгаджия, имащ дуети с всякакви скандални личности като Сузанита), а свалената песен от името личи, че е кавър на турска.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: Acho в Mar 30, 2020, 16:13
Еми те чалгиите са така, работата е "ако стане" "ако мине". Ако на някой се хареса песента - ОК. Ако не се хареса - "би маа му" и песен. Следваща ще се прави.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 30, 2020, 22:53
Гого, на гугъл в момента не може да се разчита на консистентност, понеже имат проблем с трафика. Не знам дали следиш, но от началото на кризата в европа, а сега гледам и световно правят промени
https://abcnews.go.com/Technology/netflix-youtube-throttle-streaming-quality-europe-coronavirus-forces/story?id=69754458
Знам че няма да отвориш линка, но накратко - всички компании имат проблеми с  трафика и правят промени (ограничават качеството и тнт).
*Първоначално преомените важяха само за европа


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 31, 2020, 06:59
Ми не. Абц ми се отвори без проблем. Онова на Ремо не ми се отваряше, защото съм с изключен js и бисквитки, иронично поради трафик и да не ги подпомагам допълнително в шпионажа. Но това си се отвори без проблем. Бяха достигнали до мен няколко новини за проблеми с трафика, но в тях се говореше крайните клиенти. Били потребявали много повече, а мрежите били стари. Но не знаех, че и доставчиците на съдържание изпитват трудности. Последно чух, че Тръмп се обърнал към Netflix принудително да ограничат качеството.

Вчера правих изпитания на worstvideo+worstaudio/worst. Ами, както и предполагах, разработчиците на Ydl не са се справили, кой знае, колко добре. Да кажем в три четвърти от случаите се справя, но по принцип алгоритъма не е добър.

Например, там където има 278 и 160, винаги избира 278. Това е vp9, другото е mpeg4. Ами то винаги се е знаело (и аз го знам от преди да ми пука за трафика), че vp8/9 са по-големи по размер при равни други условия. Гългъл също го знаят и за целта са понижили битовия поток от 113 на 97 та горе-долу да са съпоставими. Ама пак е грубо 20% по-голям. Няма как да докараш VP с подобно качество да е на подобен размер, колкото и да си Гългъл.

Забележи, че това е вярно абсолютно навсякъде. Например за размерите дето теб те интересуват (1080p) са свалили битовия поток почти наполовина.

Така, че това worstvideo просто не върши работа. Смешното е, че научих нещо от него. Има някакъв нов формат (или поне не съм му обърнал внимание) 378. Той е мъничко по-голям от 160, но все пак по-голям. При време три минути добавя половин да речем. Нещо такова.

Интересното е, че това е AV1. Естествено Ydl си казва, я какъв приятен формат, само с 15% Е по-голям от mp4, дай да прекарам човека и да го сваля, като няма нищо по-голямо. Понеже изпитанията провеждам с кратки клипчета по минута, две (най-кратките, които намирам), това никак не ми се отрази видимо във времето.

Обаче проблема следваше след това. В стария Дебиан това няма, с какво да се отвори. То хубаво мога да дам на mpv --no-video, ама що съм го теглил? В новия Дебиан Бъстър има някаква библиотечка libaom0  (от паяжината разбрах доста лоша), която се инсталира без проблем, но mpv отказва да я ползва. Нещо повече дори vlc от Deb-multimedia явно е достатъчно стара версия, че не поддържа AV1. За не следящите сагата AV1 уточнявам, че VLC развиват собствена библиотека за AV1.

Та така. Ydl е отлична програма, но опре ли до нуждите на хора с бавни връзки, са си оставили ръцете. Не ги обвинявам. Те просто никога не са имали същия проблем, за да го решават.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: remotexx в Mar 31, 2020, 08:17
Очакваше се и Гугъл да последва Нетфликс, а сега хората дето си накупиха 8К телевизори какво ще гледат? Ами тия с 4К? Включително и Гогата с неговия Full HD/1080p, като те ограничиха всичко на SD/480p
Интересно имаше 1-2 ... няколкоо 4К канала, какво се случи с тях, спряха ли ги или ги прекръстиха на SD или 0.48 К ха-ха-ха

Гого аз не разбрах нещо, мислех че на моменти ти пускат по добро качество, а според мейкми пускат по лошо... Би ли уточнил моля... вероятно аз съм се подвел че по големите номера означават по добро качество.

И за финал .net core версия искаш ли?
А ако много държиш да е на баш, що да не преместим темата в конкурса за баш майстора, а?


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 31, 2020, 08:44
Като те сърби, давай ;)

Мислех, че за програматорите вирус „Корона“ не важи и си работят :P

Проблема е терминологичен. Според света (вкл. Мейк) по-добро е това с по-добро качество. Според мен по-добро е това с по-малък размер, което възможно най-скоро ще мога да слушам/гледам и ще го чакам най-малко да се сваля.

Например, ако форматите 599/600 бяха налични навсякъде и по всяко време, щях да мога да ги пускам директно с mpv --ytdl-raw-options=f=599/600, без да ми се налага изобщо да ги тегля.  С доста разпространения 249 (има го на почти всяко видео) това е на ръба да се случи. Ако имах стабилни 7КБ, а не нещо лашкащо се между 5 и 8, а едва усреднено да е 7, то щеше да е възможно.

Конвенциите за именуване в тубата имат наследство и затова съвсем ясни. Например 17 означаваше 170i, а 36, 360i. Следователно след 17, следващ дойде 18 (реално най-стария формат), който е 360p. Mp4 720p го направиха 22. Първия webm (360p) го кръстиха 43.

И някъде в този момент им дойде до акъла, че трудно ще могат да поддържат две цифри, ако продължат да трупат формати. А те продължиха.

И тогава решиха да сложат трета цифра. Така всичко с 1** е mo4/m4a, всичко с 2** е vp8,9/ogg, а очевидно 3** вече са av1. Отначало 24* бяха webm, защото на старите 4* бяха закачили една двойка отпред, а mp4 бяха 13*. Ама и това бързо се промени. Например има 249, който отговаря на 139, но решиха да вкарат два пъти по-дискртизирани, които станаха 250 и съответно 140. А накрая добавиха и 251. Ще има 252 и 253, когато решат да стигнат до качеството на mp3 с 192 и 360 КБ/с. А за FLAC ще почакаме.

Нарастването на цифрите означава нарастване на качеството. Обаче понеже все още са налични и старите кодове, то конвенцията не е пълна.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 31, 2020, 09:57
Гого аз не разбрах нещо, мислех че на моменти ти пускат по добро качество, а според мейкми пускат по лошо... Би ли уточнил моля... вероятно аз съм се подвел че по големите номера означават по добро качество.
Проблемът е че в случая не може да се лепне етикет "по-добро" или "по-лошо". Принципно за тубата и нетфликс, може, но не и за изискванията на Гого :) .От там идва и объркването ти.
Тези формати, които Гого желае почти не се използват и се появяват, и изчезват постоянно. За това и той твърди, че ydl не работи. Аз колкото и пъти да го тествах, си работеше (сигурно вече над 100). Просто той докато свали едно клипче може да се появят и изчезнат. При мен тъй като ги свалям моментално, ако проверя най-малкия формат преди и след свалянето, то винаги ydl си е свършил работата. Заради това същото нещо му предлагам да си ползва него, защото дори и скрипт да му напишеш, крайният резултат ще е същия.


ПП: Сега се сетих- Гого, дръж си версията на ydl последна, че е доказано че от версия до версия, не се държи по един и същи начин (както споменах горе за котката и мишката). Моята е тази - 2020.03.24 . Старата която не работеше, беше на 4 месеца :)


ПП2: Ето за какво говоря:
Цитат
-rw-rw-r--  1 makeme makeme 1,9M мар 22 11:09 'Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.mkv'
-rw-rw-r--  1 makeme makeme 972K мар 22 12:12 'Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.mp4'
Едното го пуснах преди да напиша поста, а другото след като го написах.

При проверка се вижда че за час изчезнаха 597 и 599):
Цитат
$ youtube-dl -F https://www.youtube.com/watch?v=udGtY2bmTxs
[youtube] udGtY2bmTxs: Downloading webpage
[info] Available formats for udGtY2bmTxs:
format code  extension  resolution note
249          webm       audio only tiny   55k , opus @ 50k (48000Hz), 1.11MiB
250          webm       audio only tiny   72k , opus @ 70k (48000Hz), 1.47MiB
140          m4a        audio only tiny  130k , m4a_dash container, mp4a.40.2@128k (44100Hz), 2.82MiB
251          webm       audio only tiny  145k , opus @160k (48000Hz), 2.92MiB
160          mp4        82x144     144p   38k , avc1.4d500b, 25fps, video only, 808.96KiB
133          mp4        136x240    144p   81k , avc1.4d400c, 25fps, video only, 1.70MiB
278          webm       144x256    144p   97k , webm container, vp9, 25fps, video only, 2.04MiB
134          mp4        202x360    240p  201k , avc1.4d400d, 25fps, video only, 4.22MiB
242          webm       240x426    240p  224k , vp9, 25fps, video only, 4.61MiB
135          mp4        270x480    240p  369k , avc1.4d4015, 25fps, video only, 7.77MiB
243          webm       360x640    360p  413k , vp9, 25fps, video only, 8.41MiB
136          mp4        406x720    360p  736k , avc1.4d401e, 25fps, video only, 15.21MiB
244          webm       480x854    480p  765k , vp9, 25fps, video only, 15.16MiB
137          mp4        608x1080   480p 1377k , avc1.64001f, 25fps, video only, 27.10MiB
247          webm       720x1280   720p 1528k , vp9, 25fps, video only, 29.13MiB
248          webm       1080x1920  1080p 2682k , vp9, 25fps, video only, 51.56MiB
18           mp4        202x360    240p  428k , avc1.42001E, mp4a.40.2@ 96k (44100Hz), 9.34MiB (best)
Та от всичките писания и аз научих нещо ;)

ПП3:
Например, там където има 278 и 160, винаги избира 278.
Както виждаш от примера - това не е вярно. Ето ти аутпута:
Цитат
[ffmpeg] Merging formats into "Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.mkv"
Deleting original file Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.f160.mp4 (pass -k to keep)
Deleting original file Papi Hans - Стой си вкъщи [Official Video]-udGtY2bmTxs.f249.webm (pass -k to keep)


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 31, 2020, 10:23
Държа си я нова версия, защото ползвам тубата постоянно:

Код
GeSHi (Bash):
  1. youtube-dl --version
  2. 2020.03.24
  3.  

597 за видео, 599, 600 за аудио са чисто нови формати от този месец. Опитно открих, че ти ги пуска веднъж на час, когато поискаш 249. 160 и 278 за видео, 140 и 249 за аудио ги има за почти всеки клип. 249 е до три пъти по-малък от 140, а 160 е почти с една трета по-малък от 278. С worstaudio винаги предпочита 249 пред 140 и това е правилна стратегия. За съжаление с worstvideo винаги взема 278 пред 160. А вече предпочита и още по-новия 378 пред 160. Съобразно името това може и да е вярно. 278 може би наистина е с една идея с по-лошо качество от 160 (поради по-ниското кодиране в битове на секунда), но едва ли има човек, който сваля с по-лошото качество заради самото качество. Сваля го заради размера. И точно в това youtube-dl се дъни лошо.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 31, 2020, 10:28
За съжаление с worstvideo винаги взема 278 пред 160.
Горе ти дадох пример, че това не е вярно, което казваш. Махни и /worst накрая, че при твоята връзка може да го бърка нещо и остави само worstvideo+worstaudio. Не можеш да ме убедиш че не работи след като го тествах повече пъти от колкото съм го ползвал тоя ydl през живота си :)


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 31, 2020, 11:01
Съгласен. Днес ще продължа изпитанията без worst. Обаче тъпия му Константин Трендафилов ми се вижда ненадежден случай. Клипчето му е снимано с телефон и се откроява рязка разлика между 160 и 278. Това е в случая (както подозирам) Ydl да вземат под внимание разделителната способност, а не размера и да вземат първата, която открият. По това клипче разбирам, че webm ги закачат за височината, а mp4 за ширината. Странно решение. Гългълска му работа.

Както обещах днес ще взема още клипове и ще правя още проби за да имам сигурен резултат, а не теоретичен. Но все пак при worstvideo+worstaidio/worst би трябвало да значи дай ми най-лошото видео, като с него искам и най-лошото аудио, но ако няма, дай ми най-лошото възможно аудио. Защото наклонената черта в Ydl значи логическо ИЛИ.

Наистина ще направя днес изпитания, за да не са напразни приказки, а да проверя, има ли промяна без /worst, навсякъде ли е или само в някои случаи.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: makeme в Mar 31, 2020, 11:17
Да, логиката е такава. Проблемът при теб мисля обаче, че може и да не се реши, тъй като от тестовете ония ден, засякох че тя самата заявка към тубата "дай възможностите" хаби доста трафик (от твоя гледна точка). Та не знам това, което получаваш като резултат дали е актуално или дали въобще не е бъгнато. Примерно пращаш заявката и тя ти върви (по мои изчисления) 2-3 мин. Да ама за тея минути, нещо се е променило и списъка или е неверен или частично е неверен (не знам точно как работи заявката).

Иначе за моето 1080п, аз си ползвам командата която по-горе дадох понеже за мен е най-доброто (цена/качество :) ). Ако прочетеш man-a ще видиш че по подразбиране работи така bestvideo+bestaudio/best. Само че на мен ми трябват мп4ки за телевизора и не виждам кой знае каква разлика в качеството. За това и използвам онези опции, които по-нагоре ги бях дал. От там се залъгах че и ти това желаеш и ти я сглобих "уж кат за тебе". Накрая осъзнах обаче, че ти искаш просто най-малкото по размер (макар и да упрекваш разработчиците, че трябва да гледат качеството) и реално стигаме до worstvideo+worstaidio . Ако това не ти свърши работа, не мисля че друго ще ти свърши.

Ако все пак не ти свърши работа, бих ти предложил, ако имаш достъп до някой сървър да си ги сваляш там и после, да си ги дърпаш с rsync. Ако вземат да се каръптват по пътя към теб, можеш да ползваш опцията му -W.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 31, 2020, 13:57
Понеже вчера говорех за този бавно развиващия Boreau, то днес реших да пробвам с негови песни. Избора е добър, защото песните му са кратки, а и записва от 11 години, та има стари, има нови качени. Тубата ми предложи някакви и започнах.

WjOxsKHY-6w:

242          webm       426x240    240p   39k , vp9, 15fps, video only, 435.60KiB
278          webm       256x144    144p   46k , webm container, vp9, 15fps, video only, 312.18KiB

Са първите две от списъка с видео. Избра 242. Звук избра 249, но точно там беше пръв. Нямаше друго преди него в списъка. По нито един критерии не отговаря за „най-лошото“ видео. Просто е първо в списъка.

3bE6ryJU640:

242          webm       426x240    240p    9k , vp9, 15fps, video only, 146.87KiB
243          webm       640x360    360p   16k , vp9, 15fps, video only, 256.82KiB
278          webm       256x144    144p   17k , webm container, vp9, 15fps, video only, 226.70KiB

Няма 160. 242 е добре.


UuDkjkyRa1M:
j6AukuckLq0:
cu0-Cob7SO0:
efabPdPgSws:
ft4ohRC1pSY:
nk0EYhwm-60:
SXBH8_yT23A:

160          mp4        256x144    144p   29k , avc1.4d400b, 15fps, video only, 269.14KiB
278          webm       256x144    144p   59k , webm container, vp9, 15fps, video only, 682.27KiB

160          mp4        256x144    144p   84k , avc1.4d400c, 25fps, video only, 1022.46KiB
278          webm       256x144    144p   95k , webm container, vp9, 25fps, video only, 1.98MiB

160          mp4        256x144    144p  107k , avc1.4d400c, 25fps, video only, 1.55MiB
278          webm       256x144    144p  146k , webm container, vp9, 25fps, video only, 2.41MiB

160          mp4        256x144    144p   29k , avc1.4d400b, 15fps, video only, 275.54KiB
278          webm       256x144    144p   59k , webm container, vp9, 15fps, video only, 696.12KiB

160          mp4        256x140    144p  110k , avc1.42c00c, 15fps, video only, 1.58MiB
278          webm       256x140    144p  128k , webm container, vp9, 15fps, video only, 1.62MiB
133          mp4        426x234    240p  260k , avc1.4d4015, 30fps, video only, 3.56MiB

160          mp4        256x144    144p   35k , avc1.4d400c, 30fps, video only, 438.64KiB
133          mp4        426x240    240p   77k , avc1.4d4015, 30fps, video only, 740.52KiB
242          webm       426x240    240p   85k , vp9, 30fps, video only, 1001.48KiB
278          webm       256x144    144p   86k , webm container, vp9, 30fps, video only, 987.61KiB

160          mp4        256x144    144p   51k , avc1.4d400c, 25fps, video only, 603.92KiB
133          mp4        426x240    240p   95k , avc1.4d4015, 25fps, video only, 1.10MiB
278          webm       256x144    144p   97k , webm container, vp9, 25fps, video only, 1.38MiB
242          webm       426x240    240p  115k , vp9, 25fps, video only, 1.32MiB


Избра 249/160. Има 278 в списъка, но е след 160.


Други клипове:
Xs0OM6DRrbM:
r0NqK4rVEpU:
6I71vtR73cw:
gxj7Gsje8Jo:
kLSSb5jiH3g:
zjXVcu46LAg:


278          webm       256x144    144p   97k , webm container, vp9, 25fps, video only, 2.07MiB
160          mp4        256x144    144p  110k , avc1.4d400c, 25fps, video only, 1.79MiB

278          webm       256x144    144p   98k , webm container, vp9, 25fps, video only, 2.26MiB
160          mp4        256x144    144p  110k , avc1.4d400c, 25fps, video only, 1.69MiB
242          webm       426x240    240p  213k , vp9, 25fps, video only, 3.91MiB
133          mp4        426x240    240p  244k , avc1.4d4015, 25fps, video only, 3.07MiB

278          webm       256x144    144p   98k , webm container, vp9, 24fps, video only, 1.80MiB
160          mp4        256x144    144p  112k , avc1.4d400c, 24fps, video only, 1.91MiB

278          webm       256x144    144p   54k , webm container, vp9, 15fps, video only, 933.96KiB
242          webm       426x240    240p   57k , vp9, 15fps, video only, 937.40KiB
160          mp4        256x144    144p  114k , avc1.42c00c, 15fps, video only, 1.63MiB

278          webm       192x144    144p   79k , webm container, vp9, 24fps, video only, 1.91MiB
160          mp4        192x144    144p   86k , avc1.4d400b, 24fps, video only, 2.43MiB
133          mp4        320x240    240p  186k , avc1.4d400d, 24fps, video only, 5.30MiB
242          webm       320x240    240p  190k , vp9, 24fps, video only, 3.31MiB

278          webm       256x144    144p   95k , webm container, vp9, 25fps, video only, 1.93MiB
160          mp4        256x144    144p  110k , avc1.4d400c, 25fps, video only, 1.98MiB
242          webm       426x240    240p  221k , vp9, 25fps, video only, 3.79MiB
133          mp4        426x240    240p  319k , avc1.4d4015, 25fps, video only, 4.04MiB




Вече неизненадващо избира 278. Явно това е алгоритъма. Просто взима първото от списъка. 249 също е първо в случая.

Изненадващото без първите две  е, че все пак стратегията на Гългъл е проработила и webm наистина е по-малък от mp4. Но това го виждам рядко.

ph7d643jpwM:

160          mp4        256x144    144p   35k , avc1.4d400c, 30fps, video only, 407.54KiB
133          mp4        426x240    240p   82k , avc1.4d4015, 30fps, video only, 862.62KiB
278          webm       256x144    144p   83k , webm container, vp9, 30fps, video only, 832.10KiB
242          webm       426x240    240p  109k , vp9, 30fps, video only, 1.08MiB

Избира 160. Пръв е в списъка и е правилен.

Разглеждайки всички примери разбирам, че тубата ги подрежда по битове на секунда, но това, когато си говорим за VP8/9 и MPEG 4 рядко значи по-малък размер.

Омръзна ми от отровната музика и лирика на този. Макар „Ай малко“ („Чаай малко“ е друга песен) с код WjOxsKHY-6w да ме впечатли. Има почти нормални послания, ако изключим първото. Но пък музиката някаква наркоманска.


=*=

Като цяло експеримента с worstaudio+worstvideo е напълно успешен. Понеже вчера не водех точна статистика, не знам дали съм попадал само на клипове с 278 преди 160. Но пък със сигурност 278 беше по-голям от 160. При тези тук повечето пъти 278 е след 160 в списъка, а единствения случай дето 278 не е наистина по-малък, сигурно и аз щях да го изпусна при нормални обстоятелства и щях да сваля 160.

Това определено е по-гъвкаво от моя вариант.

Моето с изброяване на форматите конкретно си работи. Само, че подтикнат от теб ще изпробвам вместо: 599/600/249/250/139/251/140,597/160 да дам 599/600/249/250/139/251/140+597/160, защото иначе --merge-output-format mkv не работи (както е описано в help, че не трябва да работи), а точно това е оптимизацията, която печеля с твоя вариант. Досега трябваше да пускам ffmpeg ръчно. Но, ако плюса работи и за изброени формати, то това отпада.

доп.
===
Пробвах и ми каза, че първо трябва да сложа формата на видеото,  после на аудиото, но обеща да ги събере в mkv. Трябва да пробвам с изброявания дали става. Обаче дали е по-бързо, отколкото да дам worstaudio+worstvideo не знам за сега. Онези горе не ми ги бавеше много, ама всичките са по около две минути. Когато тегля нещо истинско, дето е половин или час, ще разбера.

п.п. До man се допитвам рядко, защото всичко важно го има в --help.  В man са вече завъртяните подробности, като това, че можеш да дадеш плюс.

п.п.п. Не мога да си платя сметка за достъп до Интернет, но мислиш, че мога да си позволя да наема сървър :) Благодаря за пожеланието, дано някога е възможно. Но с тая депресия, няма да е скоро. Не, че нямаше и такива времена, но отминаха в предното десетилетие.

ОТНОВО ГОЛЯМО БЛАГОДАРЯ!


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: jet в Mar 31, 2020, 15:24
Във Видин на чаршията няма ли някакъв безплатен WiFi.
Нали сега се фукат, че с европейски кинти по центровете на градовете щяло да има безплатен интернет.
Слагаш едно Распбъри в раницата със списък на файловете за сваляне и докато изпиеш едно кафе си напълнил кошницата.


Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: go_fire в Mar 31, 2020, 15:38
Има то, нищо няма. Обичам да казвам, тоя град е останал в тринадесети век. В края на четиринадесети пада под турско. Значи два века преди това без четири години. А и Малинка е още нещо, което не мога да си позволя.

Не знам по америчките градове как е, ама тук има всеобща забрана за излизане за нещо различно от това да ходиш до магазина, аптеката и да си разходиш кучето. Аз куче нямам. А и градовете също са под обсада. Никой не може да ги посещава или напуска.

Макар, че сме в РБългария и карантината реално изтрая две седмици. Тази седмица хората си щъкат, закусвалните работят, много магазини също, полицията се е покрила и я няма никаква. Аз обаче си поддържам изолацията. И не щото ме е страх от зараза. Ако има да мра, тая зараза ще влезе през прозореца и пак ще ме убие. Просто това си ми е стила на живот. Страня от хората и си седя вкъщи. За мен нищо не се е променило.



Титла: Re: [BASH] While яде първия знак, на вас случвало ли се е?
Публикувано от: 4096bits в Apr 05, 2020, 09:48
Намерих време да направя дребните промени.
Всичко вече е в един loop, който на тридесет секунди поглежда в oti. Това време може да се промени разбира се. Най-накрая на скрипта е.
Търси и трие свалените файлове ( форматите, не готовия mkv ), ако youtube-dl не го е направил по някаква причина. Не търси за .part.
Променя датата на сваления файл според датата на качване в Youtube.

Сега се сещам, че се получава малко тъпо, понеже, ако трябва да се трие файл, трябва да се изтрие първо линка му в oti, щото иначе ще започна да го сваля отново.
Може да се добави опция --download-archive FILE към командата за сваляне, за да не сваля повтарящи се файлове, но ще се наложат и някои други промени.

Код:
#!/usr/bin/env python3
#
#

from collections import namedtuple
import concurrent.futures as cf
from datetime import datetime
from glob import glob
import json
import os
from pathlib import Path
import subprocess as sp
import sys
import time


def get_dw_link(oti_path):
    with open(oti_path) as oti:
        for line in oti:
            # Просто проверява, ако реда започва като линк за гледане на видео от Youtube
            # и игнорира всичко останало
            if line.startswith('https://www.youtube.com/watch?v='):
                yield line.split()[0]
               

def get_data(url):
    try:
        # Тук може да се сложи timeout като аргумент в секунди
        # Може да бъде и израз 10*60 става 10 минути. Или пък 10*60+15
       
        # Сваля данни за видеото в JSON формат
        resp = sp.run(f'youtube-dl.exe -j {url}'.split(), capture_output=True) # timeout=timeout
       
        if resp.returncode == 0:
            data = json.loads(resp.stdout)
            video_data = {'video_id': data['display_id'],
                        'filename': Path(data['_filename']).stem,
                        'upload_date': data['upload_date'],
                        'audio': dict(),
                        'video': dict()}
           
            audio = []
            video = []
            for media in data['formats']:
                _format = namedtuple('Format', ['format', 'ext', 'filesize',])

                if media['filesize'] and 'audio only' in media['format']:
                    audio.append(_format(media['format_id'], media['ext'], media['filesize']))
                elif media['filesize']:
                    video.append(_format(media['format_id'], media['ext'], media['filesize']))
               
               
            audio.sort(key=lambda data: data.filesize)
            video.sort(key=lambda data: data.filesize)
           
            video_data['audio'] = audio
            video_data['video'] = video
           
            video_data['audio_min'] = min(audio, key=lambda data: data.filesize)
            video_data['video_min'] = min(video, key=lambda data: data.filesize)
           
            return video_data
       
        else:
            msg = f'\nGetting video data FAILED! Skipped: "{url}". Return code: {resp.returncode}\n'
           
            for line in resp.stderr.decode().split('\n'):
                if line.startswith('ERROR: '):
                    msg = f'{msg}{line}\n'
           
            msgs.append(msg)
           
    except sp.TimeoutExpired:
        print(f'\nTimeout! Subprocess: {" ".join(resp.args)}. Skipped!\n')
       
                                     
def get_ids():
    all_data = []
   
    with open('oti2', 'w') as oti2:
        with cf.ThreadPoolExecutor() as executor:
            videos_data = [executor.submit(get_data, url) for url in get_dw_link('oti')]
           
            for result in cf.as_completed(videos_data):
                data = result.result()
               
                if data:
                    all_data.append(data)
                    oti2.write(f'{data["video_id"]}\n')
     
    return all_data


while True:
    try:
        ###
        msgs = []

        # Премахваме файла, ако преди това скрипта е прекъснал и не го е премахнал сам
        if os.path.exists('oti2'):
            os.remove('oti2')

        mt_oti = os.stat('oti').st_mtime # Съхраняваме mtime на oti

        # Ако не съществува или mtime му е различен от този на oti
        if not os.path.exists('oti2') or os.stat('oti2').st_mtime != mt_oti:
            videos = get_ids()
               
            at_oti2 = os.stat('oti2').st_atime
           
            # За да се промени mtime на файла трябва да се зададат и двете atime и mtime. Не питай защо. Не зная.
            os.utime('oti2', (at_oti2, mt_oti))

        # Сваляне на видеата от списъка в oti
        for video in videos:
            # Търсим, ако има файл, който завършва на {id}.mkv
            pattern = f'*{video["video_id"]}.mkv'
           
            if glob(pattern):
                pass
                # print(f'ID: {{video["video_id"]} - Matroska OK!')
           
            else:
                command = f'youtube-dl.exe -f {video["video_min"].format}+{video["audio_min"].format} -c {video["video_id"]}'.split()
               
                while not glob(pattern):
                    try:
                        proc = sp.run(command, check=True) # timeout=timeout
                       
                        # Променяне на датата на файла според датата на качване в Youtube
                        dt = datetime.strptime(video['upload_date'], '%Y%m%d')
                        unix_time = datetime.timestamp(dt)
                       
                        if os.path.exists(pattern): # още една проверка за всеки случай
                            os.utime(f'{video["filename"]}.mkv', (unix_time, unix_time))
                           
                        # Изтриване на свалените файлове, ако youtube-dl не ги е изтрил
                        dled_audio = f'*{video["video_id"]}.{video["audio_min"].ext}'
                        dled_video = f'*{video["video_id"]}.{video["video_min"].ext}'
                       
                        if os.path.exists(dled_audio):
                            os.remove(dled_audio)
                       
                        if os.path.exists(dled_video):
                            os.remove(dled_video)
                       
                        print(f'\n')

                        time.sleep(2) # Това по принцип не е необходимо
                       
                    except sp.CalledProcessError:
                       
                        if proc.returncode < 0:
                            sys.exit(f'Subprocess stoped by a signal!')
                        else:
                            continue
                       

        os.remove('oti2')

        for msg in msgs:
            print(msg)
           
        time.sleep(30) # чака секунди, преди да провери отново oti
        msgs = []
       
    except KeyboardInterrupt:
        print(f'\nKeyboard interrupt! Terminated by the user!\n')
        sys.exit()