• Hi com,
    ich bin grad am scripten und habe ein nebenergebnis, dass bestimmt mal jemand gebrauchen kann
    die youtube suche ohne webbrowser (basierend auf _StringBetween)
    es wird ein suchbegriff eingegeben, die anzahl an ergebnissen (1-20) und ob playlisten auch aufgelistet werden sollen
    hier mal der code: (ein beispiel ist dabei ;))

    YouTube Suche
    [autoit]

    ; Suchergebnisse youtube herausfinden
    #Include <Array.au3>
    #Include <INet.au3>
    $sSeach = InputBox("YouTube Suche", "Suchbegriff hier eingeben => " & @CRLF & "Col0: Titel - Col1: URL")
    $array = _YouTubeSeach($sSeach, 20, False)
    If Not @error Then
    _ArrayDisplay($array, "Suchergebnisse@youtube.com")
    Else
    MsgBox(16, "Fehler", "Ein unbekannter Fehler ist aufgetreten!")
    EndIf
    ; #FUNCTION# ==========================================================================================
    ; Function Name..: _YouTubeSeach($sSeach, $iCount = 10, $vPList = False)
    ; Description....: Suche bei YouTube ohne Webbrowser (PlayListen können ausgeschlossen werden!)
    ; Parameter(s)...: $sSeach - Suchbegriff
    ; (optional) $iCOunt - Ergebnisrückgabe (aus technischen gründen -> max 20)
    ; (optional) $vPList - Playlists auch anzeigen? (True/False)
    ; Return Value(s): Erfolg - Array mit der Anzahl aller Einträgen (2D Array | Col0 - Titel | Col1 - URL)
    ; Fehler - 0 und setzt @error
    ; | 1 - $sSeach ist leer
    ; | 2 - $iCount ist über dem Limit oder zu niedrig
    ; | 3 - Fehler beim umsetzen
    ; | 4 - $yPList ist nicht True/False
    ; Author(s)......: black_skorpi
    ; Example(s).....: Yes
    ;======================================================================================================
    Func _YouTubeSeach($sSeach, $iCount = 10, $vPList = False)
    If $sSeach = "" Then Return SetError(1, 0, 0)
    ; Umgebauter _StringBetween, also nicht ganz meins ;) aber schon ziemlich :P
    $sSeach = StringReplace($sSeach, ",", "%2C")
    $sSeach = StringReplace($sSeach, "+", "%2B")
    $sSeach = StringReplace($sSeach, "#", "%23")
    $sSeach = StringReplace($sSeach, "/", "%2F")
    $sSeach = StringReplace($sSeach, ":", "%3A")
    $sSeach = StringReplace($sSeach, ";", "%3B")
    $sSeach = StringReplace($sSeach, "€", "%40")
    $sSeach = StringReplace($sSeach, "$", "%24")
    $sSeach = StringReplace($sSeach, "%", "%25")
    $sSeach = StringReplace($sSeach, "&", "%26")
    $sSeach = StringReplace($sSeach, "=", "%3D")
    $sSeach = StringReplace($sSeach, "?", "%3F")
    $sSeach = StringReplace($sSeach, " ", "+")
    If $iCount < 1 And $iCount > 20 Then Return SetError(2, 0, 0)
    ; Das geht villt auch schneller aber egal ;)
    $sSource = _INetGetSource("http://www.youtube.com/results?search_query=" & $sSeach & "&aq=f")
    Local $s_pattern_escape = "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)", $sIfvPL = ""
    ; Titel suchen
    Local $sSeachStart = '" class="yt-uix-hovercard-target" title="', $sSeachEnd = '" rel="nofollow">'
    $sStartSeach = StringRegExpReplace($sSeachStart, $s_pattern_escape, "\\$1")
    $sEndSeach = StringRegExpReplace($sSeachEnd, $s_pattern_escape, "\\$1")
    Local $aYouTubeTitle = StringRegExp($sSource, "(?s)" & "(?i)" & $sStartSeach & "(.*?)" & $sEndSeach, 3)
    If @error Then Return SetError(3, 0, 0)
    $aYouTubeTitle = _ArrayCombinations($aYouTubeTitle, 1)
    For $i = 1 To $aYouTubeTitle[0] / 2
    $aYouTubeTitle[$i] = $aYouTubeTitle[$i * 2]
    Next
    ; URL suchen
    Local $sSeachStart = '" href="', $sSeachEnd = '" class="yt-uix-hovercard-target" title="'
    If $vPList = False Then $sSeachStart &= '/watch?v='
    $sStartSeach = StringRegExpReplace($sSeachStart, $s_pattern_escape, "\\$1")
    $sEndSeach = StringRegExpReplace($sSeachEnd, $s_pattern_escape, "\\$1")
    Local $aYouTubeURL = StringRegExp($sSource, "(?s)" & "(?i)" & $sStartSeach & "(.*?)" & $sEndSeach, 3)
    If @error Then Return SetError(3, 0, 0)
    $aYouTubeURL = _ArrayCombinations($aYouTubeURL, 1)
    For $i = 1 To $aYouTubeURL[0] / 2
    $aYouTubeURL[$i] = $aYouTubeURL[$i * 2]
    Next
    ; Array mit einträgen erstellen
    If $vPList = False Then $sIfvPL = "/watch?v="
    Dim $aYouTubeErg[$iCount + 1][2]
    For $i = 1 To $iCount
    $aYouTubeErg[$i][0] = $aYouTubeTitle[$i]
    $aYouTubeErg[$i][1] = "http://www.youtube.com" & $sIfvPL & $aYouTubeURL[$i]
    Next
    $aYouTubeErg[0][0] = $iCount
    $aYouTubeErg[0][1] = $iCount
    Return $aYouTubeErg
    EndFunc ;==>_YouTubeSeach

    [/autoit]

    aus technischen gründen können nicht mehr als 20 ergebnisse gezeigt werden (werdet ihr sehen wenn irh es versucht(es kommen die nächsten ergebnisse doppelt!)
    ein kurzes feedback wär cool :rolleyes:

  • Joa,
    erfüllt seinen Zweck.
    Ich hab nur das Youtube Suche Add on bei FF installiert, also hält sich der praktische nutzen eher gering.

    Idee:
    Bei doppelklick auf ein Listen Element könnte man die Url öffnen.

    mfg Ubuntu

  • Welche Funktionen hast du denn noch geplant?
    _YouTubeDownload um herunterzuladen; _YouTubeGetChannelVideos um alle Videos eines Channels auszulesen; _YouTubeVideoGetInformation um Titel, Länge, Mögliche Qualitäten etc. auszulesen.
    Diese Funktionen fände ich noch sinnvoll.[MSIE_newline_end ]

  • das ist garnicht so schwer umzusetzen, das kommt bestimmt noch... ich wollte noch gerne das video in ein objekt packen, das wird aber sehr schwer... ich werd mal sehen, was sich noch so machen lässt... länge und aktuelle zeit hab ich schon mal geguckt, ob das geht, allerdings ist der sourcecode 1400 zeilen lang und schwer durchzuarbeiten (dafür habe ich nicht genug zeit) guck dir mal _FF_YouTube_API.au3 an, so kann man es amchen, allerdings funktioniert es wegen der neuerung nicht mehr...

  • Spoiler anzeigen
    [autoit]

    $Title = _StringBetween($sCode, 'title" content="', '">')
    $Length = _StringBetween($sCode, '"length_seconds": ', ',')
    $ID = _StringBetween($sCode, 'http://www.youtube.com/watch?v=', '" />')
    $Quality = _StringBetween($sCode, '&fmt_list=', '%')
    $VideoID = StringRegExp($sCode, "&t=(.*?)&", 3)
    $DLLink = "http://youtube.com/get_video?video_id=" & $ID[0] & "&fmt=" & $Quality[0] & "&t=" & $VideoID[0]

    [/autoit]


    Das hab ich in meinem YouTube Downloader stehen, falls es dir etwas nützt... $sCode ist die Variable für _InetGetSource($YouTubeLink )

  • schlimmes omen xD youtube seite komplett umgestellt, und ich find die suchergebnisurls nicht mehr, wird wohl ein bisschen dauern, dann editier ich es aber ;) ich bin schon an der sache dran, für die, die diese kleine udf brauchen :P

    Edit1:
    erfolgreich umgeändert, wurde nur eine kleinigkeit geändert, habs erst aber nicht gefunden ^^
    ein bisschen efizienter ist es jetzt auch, an dem problem mit den suchergebnissen arbeite ich noch (nach wie vor nur 20 stk, sonst kommen doppelte)