YouTube Video Downloader + Converter

  • Hallo Autoit Community,

    Ich präsentiere hier meinen YouTube Video Downloader + Converter

    Zum Convertieren wird ffmpeg.exe verwendet.

    Hier der Code:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <ComboConstants.au3>
    #include <StaticConstants.au3>
    #include <EditConstants.au3>
    #include <Inet.au3>
    #include <String.au3>
    Opt("TrayMenuMode", 1)
    Global $sSource
    $HD = False

    [/autoit] [autoit][/autoit] [autoit]

    FileInstall(@scriptdir & "\ffmpeg.exe", @TempDir & "\ffmpeg.exe")

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("YouTube Video-Downloader", 365, 255)

    [/autoit] [autoit][/autoit] [autoit]

    $DWNINPUT = Guictrlcreateinput("", 10, 23, 345, 18, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    guictrlsetbkcolor(-1,0xffffff)
    GUICtrlCreateLabel("YouTube Link:", 10, 6.5, 268, 15)
    $START = GUICtrlCreateButton("&Start", 205, 145 , 150, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $ABB = GUICtrlCreateButton("&Abbrechen", 205, 180 , 150, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $EINFG = GUICtrlCreateButton("Link Einfügen", 10, 47.5, 150, 25, 0)
    $ITDEL = GUICtrlCreateButton("Link Löschen", 205, 47.5, 150, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $change = guictrlcreatebutton("Speicherort ändern", 205 ,110,150,25)
    guictrlcreatelabel("Speicherort:",12.5,82.5)
    if @OSVersion = "WIN_VISTA" or "WIN_7" Then
    $saveplace=guictrlcreateinput("C:\Users\"&@username&"\Videos", 80, 80, 275, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    elseif @osversion = "WIN_XP" Then
    $saveplace=guictrlcreateinput(@MyDocumentsDir&"\Eigene Videos", 112, 80, 240, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
    Else
    guidelete()
    msgbox(16,"Warnung","Nicht unterstütztes Betriebssystem: "&@osversion&@crlf&"YouTube Video-Downloader unterstützt nur"&@crlf&"Windows XP , Vista und 7")
    exit
    endif
    $AUDRADIO = GUICtrlCreateRadio("Audio", 12, 110 )
    $AUDCOMBO = GUICtrlCreateCombo(".mp3", 80, 110 , 100,Default,$CBS_DROPDOWNLIST)
    GUICtrlSetState($AUDCOMBO, $GUI_DISABLE)
    GUICtrlSetFont(-1, 10)
    $VIDRADIO = GUICtrlCreateRadio("Video", 12, 145)
    GUICtrlSetState(-1, $GUI_CHECKED)
    $VIDCOMBO = GUICtrlCreateCombo(".wmv", 80, 145, 100, Default,$CBS_DROPDOWNLIST)
    GUICtrlSetFont(-1, 10)
    GUICtrlSetData(-1, ".avi|.mpg|.mp4")
    $HDVIDRADIO = GUICtrlCreateRadio("HD Video", 12, 180)
    $HDVIDCOMBO = GUICtrlCreateCombo(".mp4", 80, 180, 100, Default,$CBS_DROPDOWNLIST)
    GUICtrlSetState($HDVIDCOMBO, $GUI_DISABLE)
    GUICtrlSetState($HDVIDRADIO, $GUI_DISABLE)
    GUICtrlSetFont(-1, 10)
    $progress=GUICtrlCreateProgress(10, 211, 345, 16)
    $proggi=GUICtrlCreateProgress(10, 230, 345, 16)
    $label1=GUICtrlCreateLabel("Bereit",10, 211, 345, 16,BitOR($SS_CENTER,$SS_CENTERIMAGE))
    GUICtrlSetBkColor(-1,-2)
    guictrlsetfont(-1,9)
    $label2=GUICtrlCreateLabel("zum Download",10, 230, 345, 16,BitOR($SS_CENTER,$SS_CENTERIMAGE))
    GUICtrlSetBkColor(-1,-2)
    guictrlsetfont(-1,9)
    GUISetState(@SW_SHOW)
    While 1
    $NMSG = GUIGetMsg()
    Switch $NMSG
    Case $EINFG
    $LNK = ClipGet()
    If StringLeft($LNK, 31) = "http://www.youtube.com/watch?v=" Then
    GUICtrlSetData($DWNINPUT, $LNK)
    $Source= _INETGETSOURCE($LNK)
    if Stringinstr($Source,"37%7Chttp") then
    TrayTip("Video in HD verfügbar","Dieses Video ist in Full-HD Qualität verfügbar",5,1)
    GUICtrlSetState($HDVIDRADIO, $GUI_ENABLE)
    elseif StringInStr($Source,"22%7Chttp") then
    TrayTip("Video in HD verfügbar","Dieses Video ist in HD-Ready Qualität verfügbar",5,1)
    GUICtrlSetState($HDVIDRADIO, $GUI_ENABLE)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    if StringInStr($Source,"18%7Chttp") and Guictrlread($VIDRADIO) = 1 then
    guictrlsetdata($vidcombo,".mp4")
    TrayTip("Automatische Einstellung","Um die Beste Qualität zu erreichen wurde das Format auf .mp4 gestellt."&@crlf&"Wenn sie das nicht möchten, oder das .mp4 Format nicht abspielen können, wählen sie bitte ein anderes Format",5,1)
    EndIf
    GUICtrlsetdata($DWNINPUT,$LNK)
    GUICtrlSetState($itdel, $GUI_Enable)
    GUICtrlSetState($START, $GUI_ENABLE)

    [/autoit] [autoit][/autoit] [autoit]

    Else
    msgbox(16,"Fehler","Kein gültiger YouTube Link")
    endif
    case $ITDEL
    guictrlsetdata($DWNINPUT,"")
    GUICtrlSetState($start,$GUI_DISABLE)
    GUICtrlSetState($itdel, $GUI_Disable)
    $LNK = ""
    case $change

    [/autoit] [autoit][/autoit] [autoit]

    $where = FileSelectFolder("Speicherort für die Videos auswählen:", "", 7)
    if @error Then

    [/autoit] [autoit][/autoit] [autoit]

    elseif $where = "Netzwerk" then
    elseif $where = "Papierkorb" then
    elseif $where = "Arbeitsplatz" then
    elseif $where = "Systemsteuerung" then

    [/autoit] [autoit][/autoit] [autoit]

    else
    guictrlsetdata($saveplace,$where)
    endif

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Case $GUI_EVENT_CLOSE
    FileDelete(@TempDir & "\ffmpeg.exe")
    Exit
    Case $AUDRADIO
    GUICtrlSetState($VIDCOMBO, $GUI_DISABLE)
    GUICtrlSetState($HDVIDCOMBO, $GUI_DISABLE)
    GUICtrlSetState($AUDCOMBO, $GUI_ENABLE)
    Case $VIDRADIO
    GUICtrlSetState($AUDCOMBO, $GUI_DISABLE)
    GUICtrlSetState($VIDCOMBO, $GUI_ENABLE)
    GUICtrlSetState($HDVIDCOMBO, $GUI_DISABLE)
    if StringInStr($sSource,"18%7Chttp") then
    guictrlsetdata($vidcombo,".mp4")
    TrayTip("Automatische Einstellung","Um die Beste Qualität zu erreichen wurde das Format auf .mp4 gestellt."&@crlf&"Wenn sie das nicht möchten, oder das .mp4 Format nicht abspielen können, wählen sie bitte ein anderes Format",5,1)
    EndIf
    Case $HDVIDRADIO
    GUICtrlSetState($AUDCOMBO, $GUI_DISABLE)
    GUICtrlSetState($VIDCOMBO, $GUI_DISABLE)
    GUICtrlSetState($HDVIDCOMBO, $GUI_ENABLE)
    Case $START
    GUICtrlSetState($EINFG, $GUI_DISABLE)
    GUICtrlSetState($ITDEL, $GUI_DISABLE)
    If GUICtrlRead($VIDRADIO) = 1 Then
    $FORMAT = GUICtrlRead($VIDCOMBO)
    ElseIf GUICtrlRead($AUDRADIO) = 1 Then
    $FORMAT = GUICtrlRead($AUDCOMBO)
    ElseIf GUICtrlRead($HDVIDRADIO) = 1 Then
    $FORMAT = GUICtrlRead($HDVIDCOMBO)
    $HD = True
    EndIf
    If $FORMAT = ".mp3" Then
    $FORMATNAME = "Musik"
    ElseIf $FORMAT = ".wmv" Or ".avi" Or ".mpg" Or ".mp4" Then
    $FORMATNAME = "Video"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $Title = _stringbetween($Source,'<meta name="title" content="','">')
    $videoname = _REPLACE_SPECIAL_CHARS($Title[0])
    $ID = _stringbetween($Source,"'VIDEO_ID': '","',")
    $T = _stringbetween($Source,'"t": "','",')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    if $formatname = "Video" Then

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    if $HD = True then
    if not StringInStr($Source,"37%7Chttp") Then
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=22&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".mp4"
    Else
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=37&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".mp4"
    EndIf
    ElseIf $HD = False then
    if stringinstr($Source,"37%7Chttp") then
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=18&video_id=' & $D[0] & '&t=' & $T[0]
    $endung = ".mp4"
    Else
    if not StringInStr($Source,"35%7Chttp") Then
    if not stringinstr($Source,"18%7Chttp") Then
    if not stringinstr($Source,"34%7Chttp") Then
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=5&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".flv"
    EndIf
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=34&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".flv"
    EndIf
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=18&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".mp4"
    Elseif StringInStr($Source,"35%7Chttp") Then
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=35&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".flv"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Elseif $formatname = "Musik" then
    if not stringinstr($Source,"18%7Chttp") Then
    if not stringinstr($Source,"34%7Chttp") Then
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=5&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".flv"
    EndIf
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=34&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".flv"
    EndIf
    $sDownloadLink = 'http://www.youtube.com/get_video?fmt=18&video_id=' & $ID[0] & '&t=' & $T[0]
    $endung = ".mp4"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlsetstate($START,$GUI_DISABLE)
    GUICtrlSetState($ABB,$GUI_ENABLE)
    $SAVE = @TempDir&"\"&$videoname&$endung
    $punk= guictrlread($saveplace)&"\"&$videoname
    guictrlsetdata($label1,"Download 0%")
    guictrlsetdata($label2,"Gesamt 0%")
    _DOWNLOAD($SAVE,$sDownloadLink)
    sleep(500)
    _CONVERT($SAVE, $punk, $PROGRESS)
    sleep(500)
    filedelete($SAVE)
    $HD = False
    Guictrlsetstate($HDVIDRADIO,$GUI_DISABLE)
    Guictrlsetstate($HDVIDCOMBO,$GUI_DISABLE)
    Guictrlsetstate($ABB,$GUI_DISABLE)
    MsgBox(32, "YouTube Loader", "Download abgeschlossen")
    guictrlsetdata($proggi,0)
    guictrlsetdata($progress,0)
    guictrlsetdata($label1, "Bereit")
    guictrlsetdata($label2, "zum Download")
    guictrlsetdata($DWNINPUT,"")
    GUICtrlSetState($EINFG, $GUI_ENABLE)

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _DOWNLOAD($PUNKT,$SITE)
    $ORISIZE = InetGetSize($SITE)
    $ihdl=InetGet($site, $punkt, 1, 1)
    Do
    $MSG = GUIGetMsg()
    If $MSG = $ABB Then
    InetGet("abort")
    FileDelete($PUNKT)
    $HD = False
    guictrlsetdata($label1, "Bereit")
    guictrlsetdata($label2, "zum Download")
    guictrlsetdata($proggi,0)
    guictrlsetdata($progress,0)
    guictrlsetdata($DWNINPUT,"")
    GUICtrlSetState($EINFG, $GUI_ENABLE)
    exitloop
    ElseIf $MSG = $GUI_EVENT_CLOSE Then
    InetGet("abort")
    FileDelete($PUNKT)
    FileDelete(@TempDir & "\ffmpeg.exe")
    Exit
    EndIf
    $SIZE1=InetGetInfo($ihdl, 0)
    $PROZENT = (100 * $SIZE1) / $ORISIZE
    guictrlsetdata($progress,Floor($PROZENT))
    guictrlsetdata($proggi,Floor($PROZENT/4*3))
    guictrlsetdata($label1, "Download "&Floor($PROZENT)&"%")
    guictrlsetdata($label2, "Gesamt "&Floor($PROZENT/4*3)&"%")
    sleep(100)
    Until $SIZE1 = $ORISIZE
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CONVERT($INFILE, $outdir, $PROG)
    $sFFmpeg = ""
    $ersatz1 = @tempdir&"\"&_REPLACE_SPECIAL_CHARS2($videoname)&$endung
    filemove($infile,$ersatz1)

    [/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($VIDRADIO) = 1 Then
    $ersatz2 = guictrlread($saveplace)&"\"&_REPLACE_SPECIAL_CHARS2($videoname)& GUICtrlRead($VIDCOMBO)
    if GUICtrlRead($VIDCOMBO) = ".mp4" and $endung = ".mp4" then
    $hFFmpeg=Run(@TempDir &"\ffmpeg.exe",@TempDir ,@SW_HIDE,0x4)
    Filemove($save,$outdir & GUICtrlRead($VIDCOMBO))
    Else
    if GUICtrlRead($VIDCOMBO) = ".mp4" Then
    $hFFmpeg=Run(@TempDir &"\ffmpeg.exe -i " & $ersatz1 & " -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -y " & $ersatz2 ,@TempDir ,@SW_HIDE,0x4)
    Elseif GUICtrlRead($VIDCOMBO) = ".mpg" Then
    $hFFmpeg=Run(@TempDir &"\ffmpeg.exe -i " & $ersatz1 & " -acodec libmp3lame -ab 128k -ac 2 -y " & $ersatz2 ,@TempDir,@SW_HIDE,0x4)
    Elseif GUICtrlRead($VIDCOMBO) = ".avi" Then
    $hFFmpeg=Run(@TempDir &"\ffmpeg.exe -i " & $ersatz1 & " -acodec libmp3lame -ab 128k -ac 2 -y " & $ersatz2 ,@TempDir,@SW_HIDE,0x4)
    Elseif GUICtrlRead($VIDCOMBO) = ".wmv" Then
    $hFFmpeg=Run(@TempDir &"\ffmpeg.exe -i " & $ersatz1 & " -acodec wmav2 -ab 128k -ac 2 -vcodec msmpeg4v2 -y " & $ersatz2 ,@TempDir ,@SW_HIDE,0x4)
    EndIf
    EndIf
    ElseIf GUICtrlRead($AUDRADIO) = 1 Then
    $ersatz2 = guictrlread($saveplace)&"\"&_REPLACE_SPECIAL_CHARS2($videoname)&GUICtrlRead($AUDCOMBO)
    $hFFmpeg=Run(@TempDir &"\ffmpeg.exe -i " & $ersatz1& " -acodec libmp3lame -ab 128k -ac 2 -y " & $ersatz2 ,@TempDir ,@SW_HIDE,0x4)
    ElseIf GUICtrlRead($HDVIDRADIO) = 1 Then
    $ersatz2 = guictrlread($saveplace)&"\"&_REPLACE_SPECIAL_CHARS2($videoname)& GUICtrlRead($HDVIDCOMBO)
    $hFFmpeg=Run(@TempDir &"\ffmpeg.exe",@TempDir ,@SW_HIDE,0x4)
    Filemove($save,$outdir & GUICtrlRead($HDVIDCOMBO))
    EndIf

    guictrlsetdata($progress,0)
    guictrlsetdata($label1,"Konvertierung 0%")
    While 1
    $sFFmpeg &= StderrRead($hFFmpeg)
    If @error Or StringInStr($sFFmpeg,"Duration") Then ExitLoop
    WEnd
    $sFFmpeg = StringLeft(StringTrimLeft($sFFmpeg, StringInStr($sFFmpeg, "Duration:") + 9), 8)
    $iTicks = _TimeToTicks(StringLeft($sFFmpeg, 2), StringMid($sFFmpeg, 4, 2), StringMid($sFFmpeg, 7, 2))
    While 1
    $sFFmpeg = StderrRead($hFFmpeg)
    If @error Then ExitLoop
    If StringInStr($sFFmpeg,"time=") Then
    $sFFmpeg=StringTrimLeft($sFFmpeg, StringInStr($sFFmpeg, "time=") + 4)
    $prozent=(StringLeft($sFFmpeg, StringInStr($sFFmpeg, ".")-1) *100000)/$iTicks
    GUICtrlSetData($progress,Floor($prozent))
    guictrlsetdata($proggi,Floor($prozent/4+75))
    guictrlsetdata($label1, "Konvertierung "&Floor($PROZENT)&"%")
    guictrlsetdata($label2, "Gesamt "&Floor($PROZENT/4)+75&"%")
    EndIf
    WEnd
    filemove($ersatz2,guictrlread($saveplace)&"\"&$videoname&StringRight($ersatz2,4))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _REPLACE_SPECIAL_CHARS($STR)
    $STR = StringReplace($STR, "ä", "ä")
    $STR = StringReplace($STR, "Ä", "Ä")
    $STR = StringReplace($STR, "ö", "ö")
    $STR = StringReplace($STR, "Ö", "Ö")
    $STR = StringReplace($STR, "ü", "ü")
    $STR = StringReplace($STR, "Ãœ", "Ü")
    $STR = StringReplace($STR, "Ãx", "ß")
    $STR = StringReplace($STR, "ß", "ß")
    $STR = StringReplace($STR, "ç", "ç")
    $STR = StringReplace($STR, "Ç", "Ç")
    $STR = StringReplace($STR, "/" , " ")
    $STR = StringReplace($STR, "\" , " ")
    $STR = StringReplace($STR, ":" , " ")
    $STR = StringReplace($STR, "*" , " ")
    $STR = StringReplace($STR, "?" , " ")
    $STR = StringReplace($STR, "!" , " ")
    $STR = StringReplace($STR, '"' , " ")
    $STR = StringReplace($STR, "<" , " ")
    $STR = StringReplace($STR, ">" , " ")
    $STR = StringReplace($STR, "|" , " ")
    $STR = StringReplace($STR, "%3D","=")
    $STR = StringReplace($STR, "%26","&")
    $STR = StringReplace($STR, "%25","%")
    $STR = StringStripWS($STR, 7)
    Return $STR
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _REPLACE_SPECIAL_CHARS2($srt)
    $srt = StringReplace($srt, " ", "_")
    Return $srt
    EndFunc

    [/autoit]

    Und hier der Download der ffmpeg.exe:

    http://file.square7.ch/ffmpeg.exe

    LG Automan

  • Hi,
    leider bekomme ich bei jeder Youtube-Datei folgende Fehlermeldung :S

    Zitat

    C:\test01.au3 (145) : ==> Subscript used with non-Array variable.:
    $videoname = _REPLACE_SPECIAL_CHARS($Title[0])
    $videoname = _REPLACE_SPECIAL_CHARS($Title^ ERROR

  • Hi,
    leider bekomme ich bei jeder Youtube-Datei folgende Fehlermeldung :S

    YouTube hat den Seitenaufbau verändert, dadurch werden Titel, eigentliche URL etc. nicht mehr gefunden. Seit 1. April sind alle bisher getesten Downloader, die mit AutoIt gescripted sind tod.

    mfg (Auto)Bert

  • Hallo bbm1995,

    Entwarnung, mein Downloader läuft wieder (ohne eine Zeile im Skript geändert zu haben), daher gehe ich davon aus, dass die anderen auch wieder funktionieren,

    mfg (Auto)Bert

  • Hallo bbm1995,


    HowTo:

    • JaYT-DwiMP3-P starten
    • auf Tab Downloader wechseln
    • Rechtsklick auf zu downloadende Linkadresse danach Linkadresse kopieren auswählen JaYT-DwiMP3-P ermittelt darauf hin den echten Download-Link (für alle gewünschten Lieder wiederholen)
    • In JaYT-DwiMP3-P Button Go klicken, das wars die Dateien werden als MP4 heruntergeladen und anschliessend mit FFMPEG je nach gewählen Einstellungen in MP3 und/oder MPEG gewandelt die ausgewähleten Typen werden danach in den ausgewählten Ordner laut Einstellungen verschoben
    • Unter Datei|Einstellungen kann man die gewünschten Musikformate auswählen und den Ordner in dem gespeichert werden soll bestimmen. Achtung wird bei Programmstart automatisch übernommen.
    • Mit F6 könnt ihr JaYT-DwiMP3-P verstecken und auch wieder anzeigen lassen

    mfg (Auto)Bert