Youtube videó letöltés és konvertálás Linuxon (szkript)

Az itt olvasható leírást követve, el tudunk készíteni egy youtube videó letöltő szkriptet, ami egyúttal mp3 formátumba is konvertálja a letöltött tartalmat. Remélhetőleg ez a leírás segítséget nyújt a bash szkriptek írásához szükséges alapok elsajátításában.

A szkript futtatásához szükségünk van 2 program telepítésére (youtube-dl, mencoder), ezeket a következő parancs kiadásával tudjuk a legegyszerűbben telepíteni:

sudo apt-get install youtube-dl mencoder

A szkriptünket a következő paranccsal és értékekkel tudjuk majd működésre bírni:

youtube.sh http://www.youtube.com/watch?v=XXXXXXXXXXX szerzo-cim

A youtube.sh a szkriptünk neve, az utána következő link a letöltendő videó címe, végül pedig egy név, amellyel szeretnénk elmenteni az állományunkat. Vágjunk is bele.
Első lépésként hozzunk létre egy üres fájlt a neve legyen youtube.sh:

touch youtube.sh

Nyissuk meg szerkesztésre a kedvenc szövegszerkesztőnkkel. Lehet grafikus felületen a gedit, kedit, vagy karakteres felületen az mcedit, nano… stb. Én a nano-t fogom használni.

nano youtube.sh

Mivel bash szkriptet írunk, a fájl elején meg kell adnunk ezt, mégpedig a következő sorral:

#!/bin/bash

Majd, hogy a későbbiekben könnyebben tudjunk dolgozni, állítsunk be egy könyvtárat, amibe szeretnénk dolgozni. Én egy saját könyvtárat hoztam létre a $HOME könyvtáramban.

download=$HOME/youtube

Ha nem alapértelmezett könyvtárról van szó, akkor érdemes ellenőrizni a létezését. (Igazából érdemes ellenőrizni minden esetben.) Egy feltételes utasítással ellenőrizzük a létezését, illetve nem létezését. A következő sorokban megvizsgáljuk, hogy a download változóban eltárolt könyvtár nem létezik-e, ha ez igaz, akkor létrehozzuk a könyvtárat.

if [ ! -e $download ]
    then
        mkdir $download
        echo "A "$download" könyvtár létrehozva" # The directory is created 
fi

Az előzőekben ismertetett módon leellenőrizzük az flv könyvtár létezését.

if [ ! -e $download/flv ]
    then
        mkdir $download/flv
        echo "A "$download"/flv könyvtár létrehozva" # The directory is created 
fi

Belépünk a munka könyvtárunkba.

cd $download

Egy üzenettel jelezzük, hogy éppen mit is csinál a szkriptünk.

echo "A letöltés megkezdése" # Start the download

majd letöltjük a fájlt. A $1 változó a szkriptünk meghívása mögött álló szöveget tartalmazza, ami a hivatkozást kell tartalmaznia. Pl.: youtube.sh http://www.youtube.com/watch?v=XXXXXXXXXXX

youtube-dl $1

Majd kiíratjuk, hogy sikeresen letöltöttük a videó fájlt:

echo "A video letöltve" # Video is downloaded

A következő paranccsal létrehozunk egy video változót, melyben eltároljuk a szkript meghívásánál megadott link egyenlőségjel mögötti karaktereit, ugyanis a youtube-dl ezzel a névvel fogja elmenteni a videót.

video=`echo $1 | awk -F= '{print $2 }'`

Itt egy új változóval ismerkedünk meg ez a $2 (nem azonos az awk mögötti $2-vel!). Ez a szkript meghívásakor másodikként megadott karaktersorozatot tartalmazza, amelyben az mp3 nevét kell megadnunk. Tehát a szkript helyes meghívása a következőképpen fog kinézni: youtube.sh http://www.youtube.com/watch?v=XXXXXXXXXXX szerzo-cim

A zene változó a következőt fogja tartalmazni: szerzo-cim.mp3

zene=`echo $2 | awk -F. '{print $1}'`.mp3

A változók beállítása után egy üzenettel jelezzük, hogy a konvertálást fogjuk elkezdeni:

echo "A konvertálás megkezdése" # Start the convert

Majd ténylegesen készítünk egy mp3 fájlt a videóból (az eredeti fájl megmarad):

mencoder $video.flv -of rawaudio -oac copy -ovc copy -o $zene

Ismételten jelezzük, hogy hol tart a szkriptünk:

echo "Az mp3 elkészült" # The mp3 is ready 

A video változó értékét beállítjuk az általunk megadott névre. A következőt fogja tartalmazni: szerzo-cim.flv

video=`echo $zene | awk -F. '{print $1}'`.flv 

Majd átnevezzük az flv fájlunkat:

mv *.flv $video 

Végül áthelyezzük a videót az flv könyvtárba:

mv $video $download/flv/ 

Lezárásképpen jelezhetjük, hogy a szkriptünk lefutott:

echo "A program sikeresen lefutott!" # The script ran succesfully

A szkriptet ízlésünknek megfelelően lehet módosítani. Például, ha nincs szükségünk az flv videóra, akkor törölhetjük is, illetve akár mindkét fájlt más könyvtárakba is helyezhetjük, minden csak rajtunk múlik.
A szkript tovább fejlesztése várható. Igyekszem hamarosan grafikus felületet készíteni hozzá, illetve flv-ből avi-t készíteni.

A szkript egyben:

#!/bin/bash
#######################################################
##           Youtube downloader and converter
##      Create by blaselinux: (blaselinux KUKAC gmail.com)
##              Licence GNU GPL v3 or later.
##       http://www.gnu.org/licenses/gpl.html
##              http://gnu.hu/gplv3.html
#######################################################

# Set the download variable to the working directory
download=$HOME/youtube

# Check the working directory; exist or not, if not the script make it
if [ ! -e $download ]
    then
        mkdir $download
        echo "A "$download" könyvtár létrehozva" # The directory is created
fi

if [ ! -e $download/flv ]
    then
        mkdir $download/flv
        echo "A "$download"/flv könyvtár létrehozva" # The directory is created
fi

# Go to the working directory
cd $download

echo "A letöltés megkezdése" # Start the download

# Download the video
youtube-dl $1

echo "A video letöltve" # The video is downloaded

# Set the video variable
video=`echo $1 | awk -F= '{print $2 }'`

# Set the zene variable
zene=`echo $2 | awk -F. '{print $1}'`.mp3

echo "A konvertálás megkezdése" # Start the convert

# Convert the flv file to mp3
mencoder $video.flv -of rawaudio -oac copy -ovc copy -o $zene

echo "Az mp3 elkészült" # The mp3 is ready

video=`echo $zene | awk -F. '{print $1}'`.flv

# Rename the flv file
mv *.flv $video

# Move the flv file to the flv directory
mv $video $download/flv/

echo "A program sikeresen lefutott!" # The script ran succesfully

Az elkészítés után ne felejtsünk el futtatási jogot adni az állományra:

chmod +x youtube.sh

A kész szkript letölthető innen.

19 hozzászólás


  1. steindani: “Remélhetőleg ez a leírás segítséget nyújt a bash szkriptek írásához szükséges alapok elsajátításában.”
    Ezért készült el. Örülök, hogy van más lehetőség is. Azonban ha olvastad a szkript nem csupán letölti a videót, hanem mp3-ba is konvertálja.
    A linket különben köszönöm, nem ismertem ezt az oldalt. ;)


  2. maszogep: Remélhetőleg ez a leírás segítséget nyújt a bash szkriptek írásához szükséges alapok elsajátításában.

    Utoljára írtam le a célt a hozzászólásban, a továbbiakban figyelmen kívül fogom hagyni a hasonló “építő” jellegű hozzászólásokat. ;)

    Üdv


  3. maszogep: Nincs harag, csak 2 hozzászólás érkezett és mindkettő azzal foglalkozott, hogy miként lehet megoldani máshogy a címben szereplő problémát.


  4. Miért pont mp3-ba, és nem avi-ba alakítja a videót?

    Úgy nem lehet megcsinálni, hogy terminálban indítom, és akkor kéri be a youtube-os címet és azt a nevet, amivel elmenteném?


  5. petipetya: Azért mp3-ba, mert egyik nap éppen ilyenbe szerette volna konvertálni a youtube videót akinek frissen telepítettem az ubuntut. Ennek hatására kezdtem el csinálni ezt.

    De mint már többször említettem és már mások is írták nem akarom én ezzel megváltani a világot, hiszen léteznek már erre a “problémára” programok, amik sokkal többet tudnak, mint az általam készített.

    Azért készült el ez a bejegyzés, mivel egy kész szkript soronkénti magyarázatával elég sokat lehet tanulni (szerintem) és jobb, ha valamivel értelmesebb problémán keresztül mutatom ezt be, mint a “Hello world” X. változata.

    Az általad felvázolt problémát meg lehet oldani, ha “tanulmányoztad” a fenti leírást, akkor magadtól rájössz, hogy miket kell benne módosítani. De egy kicsit segítek az elindulásban:

    Ha aviba szeretnéd konvertálni mp3 helyett, akkor a következőt kell csinálnod:
    Ezt:

    mencoder $video.flv -of rawaudio -oac copy -ovc copy -o $zene

    le kell cserélni erre:

    mencoder -oac copy -ovc lavc -o $zene.avi $video.flv

    . Természetesen a zene változót akkor így add meg:

    zene=`echo $2 | awk -F. '{print $1}'`.avi

    A második problémádhoz pedig a read $változó kontextust ajánlom felhasználni a programban, de ezt már rád bízom.


  6. Szia!

    Köszönöm az eddigi útmutatást. Igen, tudom hogy vannak grafikus programok és firefox kiegészítő is erre, de szeretnék minél kevesebb erőforrást felhasználni.

    Eddig egy script-et “írtam” magamnak, melyben 4db takarítási parancs van, melyet egymás után lefuttat a gép – a tudásom kb. ennyi. :)

    Ezért kérdem, hogy mit jelent ez?
    “A második problémádhoz pedig a read $változó kontextust ajánlom felhasználni a programban, de ezt már rád bízom.”


  7. petipetya: Ez alapján kellene megcsinálni:

    #!/bin/bash
    echo Please, enter your name
    read NAME
    echo "Hi $NAME!"

    Szóval ahol te szeretnéd beolvashatód, valahogy így:

    echo "Add meg a videó hivatkozását:"
    read forras
    echo "Add meg az avi, vagy mp3 nevét:"
    read nev

    A későbbiekben a megfelelő helyen akkor ezekre a változókra kell hivatkoznod. Tehát ahol $1 változó tartalmát dolgozza fel a szkript, ott $forras -t kell használnod, ahol pedig $2 -őt, ott $nev -et. Remélem érthető.


  8. Nem sikerült. :( Kell neki encoder, aminek nem tudom a nevét, és valami youtube.dl-t is hiányol.

    Itt a terminál tartalma:

    Add meg a videó hivatkozását:
    http://www.youtube.com/watch?v=ZAvccvyhna0
    Add meg az avi, vagy mp3 nevét:
    zsaruk
    A letöltés megkezdése
    /home/asus/youtube.sh: line 37: youtube-dl: parancs nem található
    A video letöltve
    A konvertálás megkezdése
    /home/asus/youtube.sh: line 50: mencoder: parancs nem található
    Az mp3 elkészült
    mv: stat “*.flv” sikertelen: Nincs ilyen fájl vagy könyvtár
    mv: stat “zsaruk.avi.flv” sikertelen: Nincs ilyen fájl vagy könyvtár
    A program sikeresen lefutott!

    És itt a szkript tartalma:
    #!/bin/bash
    #######################################################
    ## Youtube downloader and converter
    ## Create by blaselinux: (blaselinux KUKAC gmail.com)
    ## Licence GNU GPL v3 or later.
    ## http://www.gnu.org/licenses/gpl.html
    ## http://gnu.hu/gplv3.html
    #######################################################

    # Set the download variable to the working directory
    download=$HOME/youtube

    echo “Add meg a videó hivatkozását:”
    read forras
    echo “Add meg az avi, vagy mp3 nevét:”
    read nev

    # Check the working directory; exist or not, if not the script make it
    if [ ! -e $download ]
    then
    mkdir $download
    echo “A “$download” könyvtár létrehozva” # The directory is created
    fi

    if [ ! -e $download/flv ]
    then
    mkdir $download/flv
    echo “A “$download”/flv könyvtár létrehozva” # The directory is created
    fi

    # Go to the working directory
    cd $download

    echo “A letöltés megkezdése” # Start the download

    # Download the video
    youtube-dl $forras

    echo “A video letöltve” # The video is downloaded

    # Set the video variable
    video=`echo $forras | awk -F= ‘{print $nev }’`

    # Set the zene variable
    zene=`echo $nev | awk -F. ‘{print $forras}’`.avi

    echo “A konvertálás megkezdése” # Start the convert

    # Convert the flv file to avi
    mencoder -oac copy -ovc lavc -o $zene.avi $video.flv

    echo “Az mp3 elkészült” # The mp3 is ready

    video=`echo $zene | awk -F. ‘{print $forras}’`.flv

    # Rename the flv file
    mv *.flv $video

    # Move the flv file to the flv directory
    mv $video $download/flv/

    echo “A program sikeresen lefutott!” # The script ran succesfully


  9. petipetya: Kihagytad valószínűleg a szkript leírásának második bejegyzését:
    A szkript futtatásához szükségünk van 2 program telepítésére (youtube-dl, mencoder), ezeket a következő parancs kiadásával tudjuk a legegyszerűbben telepíteni:

    sudo apt-get install youtube-dl mencoder


  10. Hálás köszönet az újabb skript leírásért! És még mindig arra biztatnálak hogy ha csinálsz még, azt is oszd meg velünk.


  11. akira: Köszönöm szépen. Igyekszem majd még írni párat és közölni az oldalon.
    Hamarosan lehet módosítok pár dolgot a szkriptben, mivel páran írtak, hogy jó lenne bővíteni. Ha időm és kedvem engedi, akkor elkészítem ezt is és közlöm veletek, remélem az is hasznos lesz.

    Üdv
    blaselinux


  12. petipetya: Sikerült elkészítenem az egyik módosítást amit kértél, vagyis a szkript képes kiolvasni az eredeti youtube videó címét és ha az előzetesen nem lett megadva, úgy kiolvassa. Íme a kód:

    if [ $# == 1 ]
        then
    	wget $1
    	nev=`cat watch* | grep "" | awk -F">" '{print $2}' | awk -F"< " '{print $1}'`
    	echo "A nev valtozó sed előtti tartalma: $nev"
    	nev=`echo $nev | sed 's/ /_/g'`
    	echo "A nev valtozó tartalma: $nev"
    	rm watch*
        elif [ $# == 2 ]
    	then
    	    nev=$2
    	else
    	    echo -e "\n A program helyes futtatásához a következő paramtéreket kell megadni \n"
    	    echo -e " youtube.sh [letöltési link] [a video neve]"
    	    echo -e " A [video neve] elhagyható, ekkor a youtube videó eredeti nevét kapja a fájlunk. \n"
    	    exit
    fi</pre><p><strong>Működésének magyarázata:</strong><br /> A $# változó a bemeneti paraméterek számát tartalmazza.<br /> Először leellenőrizzük, hogy ez az érték ($#) 1-e. Ha igen, akkor a wget-el letöltjük a html oldalt, majd onnan kiolvassuk a címet és eltároljuk annak tartalmát a nev változóban.<br /> Ha nem 1, akkor a különbenha (elif) paranccsal megvizsgáljuk, hogy ez az érték 2-e. Ha igen, akkor csak átadjuk a nev változónak a második paraméterként megadott értéket, ha nem akkor a szkript helyes alkalmazásának rövid helpjét kapjuk válaszul és befejezzük a program futását.<br /> Ezt a kód részletet a cd $download parancs kiadása után szúrjuk be és figyeljünk arra, hogy érdemes ezentúl a $2 helyett a $nev változót használni, tehát a következőt kell még módosítani:<br /> ezt:</p><pre lang="bash">zene=`echo $2 | awk -F. '{print $1}'`.mp3</pre><p>erre:</p><pre lang="bash">zene=`echo $nev | awk -F. '{print $1}'`.mp3</pre><p>


  13. blaselinux: Két felesleges echo benn maradt az új kódrészben, a javított verzió ez:

    if [ $# == 1 ]
        then
    	wget $1
    	nev=`cat watch* | grep "" | awk -F">" '{print $2}' | awk -F"< " '{print $1}'`
    	nev=`echo $nev | sed 's/ /_/g'`
    	rm watch*
        elif [ $# == 2 ]
    	then
    	    nev=$2
    	else
    	    echo -e "\n A program helyes futtatásához a következő paramtéreket kell megadni \n"
    	    echo -e " youtube.sh [letöltési link] [a video neve]"
    	    echo -e " A [video neve] elhagyható, ekkor a youtube videó eredeti nevét kapja a fájlunk. \n"
    	    exit
    fi</pre><p>


  14. Az igazi azért az lenne, ha olyan lenne a szkript, hogy utánanéz, van-e HQ, vagy HD minőségű verzió is a letölthető állományból. van egy Firefox kiegészítés, ami lehetővé tesz HQ és HD letöltéseket, csak azért. :)


  15. berciXcore: Nem először írom, hogy a cél nem feltétlenül a youtube videó letöltése volt (bár ezt a feladatot is képes ellátni), hanem egy szkript leírása és annak magyarázata.
    Tessék elolvasni rendesen a leírást! Köszönöm.

    Üdv


  16. Köszönöm a cikkedet, tanultam belőle ! :-)

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.