_FFReadHTML Dauer YouTube Videos u. _IsPressed -Problem

  • Also, ich überarbeite grad meinen Autoplay- Skript für YouTube. Bin noch Anfänger, deshalb bräuchte ich jetzt etwas Hilfe ^^

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>
    #include <FF.au3>
    #include <string.au3>

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

    $Button1 = GUICtrlCreateButton("Start", 128, 248, 89, 25, 0, $WS_GROUP)
    $Form1 = GUICreate("Auto-Starter YouTube", 450, 282, -1, -1)

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

    Local $title
    Local $Dauer

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

    HotKeySet ("{ESC}", "_Terminate")
    HotKeySet ("{Numpadadd}", "_Soundup")
    HotKeySet ("{Numpadsub}", "_Sounddown")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _Dauerausleser ()
    _Videostarter ()
    _HideGui ()
    Case $Button2
    _Terminate ()
    EndSwitch
    WEnd

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

    Func _Videostarter()
    AutoItSetOption ("WinTitleMatchMode", 2)
    $title = WinGetTitle ("YouTube - ")
    If @error Then
    Exit
    EndIf
    ControlSend ($title, "", "[CLASS:GeckoPluginWindow; INSTANCE:1]", "{Space}")
    Sleep (($Dauer)*1000)
    While 1
    If _IsPressed("13") Then
    ExitLoop
    Do
    Sleep(100)
    Until _IsPressed("13")
    Else
    ContinueLoop
    EndIf
    ControlSend ($title, "", "[CLASS:GeckoPluginWindow; INSTANCE:1]", "{Space}")
    Sleep (($Dauer)*1000)
    WEnd
    EndFunc

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

    Func _Dauerausleser()
    _FFConnect (Default, Default, 3000)
    $sHTML = _FFReadHTML("html")
    $sSuchmuster = ';rv.1.length_seconds=\d&amp;'
    $Dauer2 = StringRegExp($sHTML,$sSuchmuster,1)
    $Dauer = _StringBetween ($Dauer2, ';rv.1.length_seconds=', "&amp;")
    EndFunc

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

    Func _Terminate()
    Exit
    EndFunc

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

    Func _Soundup ()
    ControlSend ($title, "", "[CLASS:GeckoPluginWindow; INSTANCE:1]", "{Up}")
    EndFunc

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

    Func _Sounddown ()
    ControlSend ($title, "", "[CLASS:GeckoPluginWindow; INSTANCE:1]", "{Down}")
    EndFunc

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

    Func _HideGui ()
    GUISetState (@SW_Hide)
    GuiSetState (@SW_Lock)
    EndFunc

    [/autoit]

    Einmal funktioniert meine Pausierfunktion nicht so wie ich es will:
    Sie soll nachdem ich Pause gedrückt habe die momentane Zeit speichern (vllt mit TimerInit und TimerDiff?!) und wenn ich dann wieder Pause drücke die While-Schleife fortsetzen, aber nicht mit Sleep wieder von vorne anfangen, sondern die Rest-Zeit ablaufen lassen, sodass nach dem Videoende das Skript wieder sofort ControlClick sendet.

    Dann funktioniert meine Dauerauslese Funktion nicht. Vielleicht liegt das auch daran, dass ich selbst nicht die Zeile finde, in der die Dauer des Videos abgespeichert wird...

    Versuch die Probleme schon seit 2 Tagen zu lösen :pinch:

  • Das macht sie doch... die Func _Dauerausleser, nur halt nicht richtig

    [autoit]


    Func _Dauerausleser()
    _FFConnect (Default, Default, 3000)
    $sHTML = _FFReadHTML("html")
    $sSuchmuster = ';rv.1.length_seconds=\d&amp;'
    $Dauer2 = StringRegExp($sHTML,$sSuchmuster,1)
    $Dauer = _StringBetween ($Dauer2, ';rv.1.length_seconds=', "&amp;")
    EndFunc

    [/autoit]


    Mit _FFReadHTML bekomm ich den HTML Quellcode und in dem ist "irgendwo" die Dauer des Videos angegeben. Da habe ich ein bisschen rumgestöbert und dann gefunden, dass der Wert hinter ;rv.1.length_seconds= der Gesamtlänge des videos entspricht. Nur irgendwie klappt es nicht, von daher müsste der Fehler entweder dabei liegen, oder dass ich mit StringReg falsch umgegangen bin :whistling:

  • Mir fällt grad auf das das der Wert für "Gefällt nicht" ist...
    Ich glaub ich mach mich nochmal auf die Suche nach der Maximallänge

    [autoit]

    Func _Dauerausleser()
    _FFConnect (Default, Default, 3000)
    $sHTML = _FFReadHTML("html")
    $sSuchmuster = '&length_seconds=(?:999|[0-3]?\d)&feature=player_embedded&'
    $Dauer2 = StringRegExp($sHTML,$sSuchmuster,1)
    $Dauer = _StringBetween ($Dauer2, '&length_seconds=', "&feature=player_embedded&")
    EndFunc

    [/autoit]

    Das hier müsste jetzt klappen, hab mich auch mal ein bisschen mit RegExp beschäftigt..

    2 Mal editiert, zuletzt von Sh4dovv (15. Januar 2011 um 00:27)

  • So einen Player hab ich mir auch schon gemacht, nur will ich auch einen haben, bei dem ich das so wie jetzt mache ^^

  • Liegt wahrscheinlich daran, dass du MozRepl nicht aktiviert hast. Einfach bei FF -> Extras -> MozRepl -> Activate on Startup
    ODER
    Diese Meldung kann auch daraus resultieren, daß z.B. eine Firewall die Kommunikation blockiert.

  • Spoiler anzeigen
    [autoit]

    #include-once
    ;~ #include <FF.au3>

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

    ;Mod: TimeOut verringert

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

    ; #FUNCTION# ===================================================================
    ; Name ..........: _FF_YT
    ; Description ...: YouTube API for FF.au3
    ; AutoIt Version : V3.3.0.0
    ; Requirement(s).: FF.au3 > V0.5.3.x / MozRepl
    ; Syntax ........: _FF_YT(ByRef $Socket[, $sCommand = "playVideo"[, $vArg1 = ""[, $vArg2 = ""[, $sPlayerID = "movie_player"]]]])
    ; Parameter(s): .: $sCommand - Optional: (Default = "playVideo") :
    ; | loadWait / $vArg1 = TimeOut in ms (int), Default = 10000
    ; | playVideo
    ; | pauseVideo
    ; | stopVideo
    ; | clearVideo
    ; | getVideoBytesLoaded
    ; | getvideobytestotal
    ; | getVideoStartBytes
    ; | mute
    ; | unMute
    ; | isMuted
    ; | setVolume / $vArg1 = Volume (int) (min=0, max=100)
    ; | getVolume
    ; | seekTo / $vArg1 = Secs (int), $vArg2 = allowSeekAhead (boolean), Default = true
    ; | getPlayerState
    ; | getCurrentTime
    ; | getDuration
    ; | setSize / $vArg1 = height (int), $vArg2 = width (int) (min=50)
    ; | getVideoUrl
    ; | getVideoEmbedCode
    ; | loadVideoById / $vArg1 = id (string), $vArg2 = start (int)
    ; | cueVideoById / $vArg1 = id (string), $vArg2 = start (int)
    ; $vArg1 - Optional: (Default = "") :
    ; $vArg2 - Optional: (Default = "") :
    ; $sPlayerID - Optional: (Default = "movie_player") :
    ; Return Value ..: Success - Deppending on the function call
    ; Failure - Deppending on the function call and sets
    ; @ERROR - 1 = error while sending command to player or no player found
    ; | 2 = wrong value or datatype of $vArg1 or $vArg2
    ; | 3 = wrong or unsupported $sCommand
    ; | 4 = wrong datatype returned from API
    ; | 5 = TimeOut from "loadWait"
    ; Author(s) .....: Thorsten Willert, iLoveAU3 (loadVideoById, cueVideoById)
    ; Remarks .......: Currently not supported: setSize (Video), addEventListener, all events
    ; Date ..........: Tue Apr 28 22:20:44 CEST 2009 @889 /Internet Time/
    ; Link ..........: http://code.google.com/intl/de-DE/api…_reference.html
    ; Example .......: _FF_YT($Socket,"pauseVideo"), _FF_YT($Socket,"setSize",480,385)
    ; ==============================================================================
    Func _FF_YT($sCommand = "playVideo", $vArg1 = "", $vArg2 = "", $sPlayerID = "movie_player")
    Local $iRet

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

    Switch StringLower($sCommand)
    Case "loadwait"
    ;dummy
    Case "playvideo"
    $sCommand = "playVideo()"
    $iRet = 0
    Case "pausevideo"
    $sCommand = "pauseVideo()"
    $iRet = 0
    Case "stopvideo"
    $sCommand = "stopVideo()"
    $iRet = 0
    Case "clearvideo"
    $sCommand = "clearVideo()"
    $iRet = 0
    Case "getvideobytesloaded"
    $sCommand = "getVideoBytesLoaded()"
    $iRet = 1
    Case "getvideobytestotal"
    $sCommand = "getVideoBytesTotal()"
    $iRet = 1
    Case "getvideostartbytes"
    $sCommand = "getVideoStartBytes()"
    $iRet = 1
    Case "mute"
    $sCommand = "mute()"
    $iRet = 0
    Case "unmute"
    $sCommand = "unMute()"
    $iRet = 0
    Case "ismuted"
    $sCommand = "isMuted()"
    $iRet = 1
    Case "setvolume"
    $vArg1 = Number($vArg1)
    If IsInt($vArg1) And $vArg1 >= 0 And $vArg1 <= 100 Then
    $sCommand = "setVolume(" & $vArg1 & ")"
    Else
    SetError(2)
    Return -2
    EndIf
    $iRet = 0
    Case "getvolume"
    $sCommand = "getVolume()"
    $iRet = 1
    Case "seekto"
    $vArg1 = Number($vArg1)
    If $vArg2 = "" Or $vArg2 = Default Then $vArg2 = True
    If IsInt($vArg1) And IsBool($vArg2) Then
    $vArg2 = __FFB2S($vArg2)
    $sCommand = "seekTo(" & $vArg1 & "," & $vArg2 & ")"
    Else
    SetError(2)
    Return -2
    EndIf
    $iRet = 0
    Case "getplayerstate"
    $sCommand = "getPlayerState()"
    $iRet = 1
    Case "getcurrenttime"
    $sCommand = "getCurrentTime()"
    $iRet = 1
    Case "getduration"
    $sCommand = "getDuration()"
    $iRet = 1
    Case "setsize"
    $vArg1 = Number($vArg1)
    $vArg2 = Number($vArg2)
    If $vArg2 = 0 Or $vArg2 = Default Then $vArg2 = $vArg1
    If IsInt($vArg1) And IsInt($vArg2) And $vArg1 > 50 And $vArg2 > 50 Then
    $sCommand = "setSize(" & $vArg1 & "," & $vArg2 & ")"
    Else
    SetError(2)
    Return -2
    EndIf
    $iRet = 0
    Case "getvideourl"
    $sCommand = "getVideoUrl()"
    $iRet = 2
    Case "getvideoembedcode"
    $sCommand = "getVideoEmbedCode()"
    $iRet = 2
    Case "loadVideoById"
    $vArg1 = String($vArg1)
    $vArg2 = Number($vArg2)
    If $vArg2 = Default Or $vArg2 = "" Then $vArg2 = 0
    If IsString($vArg1) And IsNumber($vArg2) Then
    $sCommand = "loadVideoById('" & $vArg1 & "'," & $vArg2 & ")"
    Else
    SetError(2)
    Return -2
    EndIf
    Case "cueVideoById"
    $vArg1 = String($vArg1)
    $vArg2 = Number($vArg2)
    If $vArg2 = Default Or $vArg2 = "" Then $vArg2 = 0
    If IsString($vArg1) And IsNumber($vArg2) Then
    $sCommand = 'cueVideoById("' & $vArg1 & '",' & $vArg2 & ")"
    Else
    SetError(2)
    Return -2
    EndIf
    Case Else
    SetError(3)
    Return -2
    EndSwitch

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

    If $sCommand <> "loadwait" Then
    Local $vRetVal = _FFCmd(StringFormat("try{window.content.wrappedJSObject.document.getElementById('%s').%s;}catch(e){'_FF_YT_Error'}", $sPlayerID, $sCommand), 500)
    If Not @error And $vRetVal <> "_FF_YT_Error" Then
    Switch $iRet
    Case 0
    If $vRetVal = "" Then
    Return $vRetVal
    Else
    SetError(4)
    Return ""
    EndIf
    Case 1
    If IsNumber(Number($vRetVal)) Then
    Return $vRetVal
    Else
    SetError(4)
    Return -2
    EndIf
    Case 2
    If IsString($vRetVal) Then
    Return $vRetVal
    Else
    SetError(4)
    Return ""
    EndIf
    EndSwitch
    Else
    SetError(1)
    Return -2
    EndIf
    Else
    If $vArg1 = "" Or Not IsInt(Number($vArg1)) Then $vArg1 = 10000
    Local $TimeOutTimer = TimerInit()
    Local $sState
    Do
    $sState = _FF_YT("getPlayerState")
    If @error Then Return 0
    Sleep(500)
    If TimerDiff($TimeOutTimer) > $vArg1 Then
    SetError(5)
    Return 0
    EndIf
    Until $sState <= 3 Or $sState = "_FF_YT_Error"
    Return 1
    EndIf

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

    EndFunc ;==>_FF_YT

    [/autoit]

    Hier die Youtube-API für AutoIt :)

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

    Einmal editiert, zuletzt von hellboy3 (15. Januar 2011 um 01:13)

  • Danke dafür, :D
    aber wie funktioniert das API jetzt ? ^^

    Wäre noch besser gewesen mir mit dem _IsPressed weiterzuhelfen, weil ich will auch mal was schaffen und mir darauf einen einbilden :D

  • Ich hab euch mal schnell ein Beispiel gemacht

    Spoiler anzeigen
    [autoit]

    #include "_FF_YouTube_API.au3"
    #include "FF.au3"
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    Global $schalter = 0 , $iVolume = 20

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

    $Form1 = GUICreate("Youtube-API Beispiel", 351, 164, 442, 170,-1,$WS_EX_TOPMOST)
    $Button1 = GUICtrlCreateButton("vUp", 16, 50, 81, 33, 0)
    $Button2 = GUICtrlCreateButton("vDown", 104, 50, 73, 33, 0)
    $Button3 = GUICtrlCreateButton("Pause", 16, 112, 81, 33, 0)
    $Button4 = GUICtrlCreateButton("Stop", 104, 112, 73, 33, 0)
    $Label1 = GUICtrlCreateLabel("Time:", 200, 120, 43, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel("0.000", 256, 120, 51, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Label3 = GUICtrlCreateLabel($iVolume, 200, 60, 51, 20)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)

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

    $ff = _FFStart("http://www.youtube.com/watch?v=9rG6jgJAmh4","default", 1, False)
    _FF_YT("setVolume",$iVolume)

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

    While Sleep(30)
    If $schalter = 0 Then GUICtrlSetData($Label2,_FF_YT("getCurrentTime"))
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _FFQuit()
    Exit
    Case $Button1
    If $iVolume < 100 Then $iVolume += 5
    _FF_YT("setVolume",$iVolume)
    GUICtrlSetData($Label3,$iVolume)
    Case $Button2
    If $iVolume > 0 Then $iVolume -= 5
    _FF_YT("setVolume",$iVolume)
    GUICtrlSetData($Label3,$iVolume)
    Case $Button3
    If $schalter = 0 Then
    _FF_YT("pausevideo")
    GUICtrlSetData($Button3,"Play")
    $schalter = 1
    Else
    _FF_YT("playvideo")
    GUICtrlSetData($Button3,"Pause")
    $schalter = 0
    EndIf
    Case $Button4
    _FF_YT("stopvideo")
    EndSwitch
    WEnd

    [/autoit]


    Habe mal die 2 benötigten Includes (FF.au3 und Youtube-API.au3) + BspScript angehängt :)

    Edit: Voraussetzung für das ganze ist natürlich FF und Mozrepl

  • Konnte es jetzt erst testen, vielen Dank ! :thumbup:

    Edit: Hat sich doch erledigt mit der Pausierfunktion ^^

    LG Sh4dovv