Джет, #! ми е важен да е bash, защото ползвам възможности специфични за басх, които ги няма в sh. Ремо, аз никога не съм си крил кода. Ще го дам целия. В този си вид той работи само за един ред, което прави повечето код излишен. Под него ще дам кратки обяснения за бързо влизане в ситуацията.
GeSHi (Bash):
#!/bin/bash
unset y f l d ft
declare -a yar
declare -a far
echo "Loading..."
if [ oti -nt oti2 ]; then
y=$(youtube-dl --get-id -a oti)
echo "$y" > "oti2"
#https://askubuntu.com/questions/62492/how-can-i-change-the-date-modified-created-of-a-file
touch -d "$(date -R -r oti)" oti2
fi
echo "Check..."
while read -r l;
do
echo "$l e super";
if [ -f *"$l.mkv" ]; then
echo "Matroska: OK"
else
if [ -f *"$l.mp4" ]; then
far[0]="*$l.mp4"
if [ -f *"$l.m4a" ]; then
far[5]="m4a"
else
far[5]="webm"
fi
echo "Convert..."
far[1]=$(echo ${far[0]})
far[4]=${far[1]:0:-3}
far[2]=${far[4]}${far[5]}
far[6]="mkv"
far[3]=${far[4]}${far[6]}
ffmpeg -i "${far[1]}" -i "${far[2]}" -c:v copy -c:a copy -strict experimental "${far[3]}"
d=$(date -R -r "${far[1]}")
touch -d "$d" "${far[3]}"
rm "${far[1]}" "${far[2]}"
else
ft="597/160/133"
if [ -f *"$l.m4a" ]; then
yar[1]="youtube-dl --download-archive ito -f "$ft" $l &"
elif [ -f *"$l.webm" ]; then
yar[1]="youtube-dl --download-archive ito -f "$ft" $l &"
if [ -f *"$l.m4a."* ]; then
rm *"$l.m4a."*
fi
else
ft="599/600/249/250/139/251/140"
yar[1]="youtube-dl -f "$ft" $l &"
echo "tralala 3 $l"
fi
if [ -f "$l" ]; then
f=$(cat $l)
else
f=$(youtube-dl --get-filename -f $ft $l)
echo "$f" > $l
touch "$f.part"
fi
yar[0]='for i in `seq 1 20`;do if [ -f "'$f'.part" ]; then '
yar[2]=' sleep 200 && pkill -9 youtube-dl; else rm $0 "'$l'" && ./for & exit ;fi ;done'
echo ${yar[0]}${yar[1]}${yar[2]} > for2
echo "Download..."
sh for2 &
echo "bibi $l"
exit
fi
fi
done < oti2
rm oti2
echo "Done!"
exit
Както казах, това би било полезно единствено на някой, който иска да гледа клипчета с включено видео от тубата, но не разполага с кабелна връзка. Целта е да се случи същото, каквото правеше 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.