用于提取YouTube直播视频ID的Applescript

时间:2017-10-01 05:01:27

标签: macos url video youtube

我想开发一个Applescript,使用频道ID提取youtube直播视频ID。

目前,我正在手动完成,因为Youtube会不时更​​改直播视频ID。 举个例子,我正在练习跟随;

  1. 打开https://www.youtube.com/embed/live_stream?channel=UCu7cGbQEMgGk8TD0ZYucM5g

  2. 右键点击播放器,然后选择“复制视频网址”

  3. 此URL用于我为自动化Livestreamer编写的Applescript。 (此脚本如下所示。)

  4. 由于Youtube不时更改此URL,因此必须不时更改以下脚本。我的目的是使整个过程自动化。

    -- Shraddha TV and Radio Recorder --
    -- Developed by Anoma --
    set pathToShraddha to ((path to downloads folder as text) & "Shraddha:")
    set outputExtension to ""
    set ls to ""
    set sourceURL to ""
    set con to ""
    set windowInfo to ""
    set theTime to ""
    set endTime to ""
    
    display dialog "Shraddha TV or Radio" buttons {"TV", "Radio", "Cancel"} default button 1
    if result = {button returned:"TV"} then
      set outputExtension to ".ts"
      set sourceURL to "https://www.youtube.com/watch?v=1yv7JjMP4Dw"
      set ls to "livestreamer"
      set con to "480p -o"
    else if result = {button returned:"Radio"} then
      set outputExtension to ".mp3"
      set sourceURL to "http://92.222.236.128:8006"
      set ls to "ffmpeg -i"
      set con to "-c copy"
    else
      return
    end if
    
    set fn to (setFileName(outputExtension))
    
    display dialog "Record now or later?" buttons {"Now", "Later", "Cancel"} default button 1
    if result = {button returned:"Now"} then
     set endTime to text returned of (display dialog "Please set the time to end recording. (Leave 'hhmm' if you want to record continuously.) " with title "Timer" default answer "hhmm" buttons {"Cancel", "Set"} default button 2)
     set windowInfo to recordMedia(ls, sourceURL, con, (POSIX path of pathToShraddha as string), fn)
     finishTime(endTime, windowInfo)
    else if result = {button returned:"Later"} then
     -- get time to be set---
     set theTime to text returned of (display dialog "Please set the time to start recording." with title "Timer" default answer "hhmm" buttons {"Cancel", "Set"} default button 2)
     if ((theTime as string) is equal to "hhmm") then
        display dialog "Time is not set correctly"
        return
     end if
     set endTime to text returned of (display dialog "Please set the time to end recording. (Leave 'hhmm' if you want to record continuously.) " with title "Timer" default answer "hhmm" buttons {"Cancel", "Set"} default button 2)
     display dialog (getTimeInHoursAndMinutes())
     display dialog theTime
    
     set i to 0
     repeat while (getTimeInHoursAndMinutes()) is less than theTime
        if (i = 0) then
            set i to (i + 1)
            recordMedia("", "", "", "", "")
        end if
        delay 60
    end repeat
    finishTime(endTime, (recordMedia(ls, sourceURL, con, (POSIX path of pathToShraddha as string), fn)))
    else
     return
    end if
    
    -- This method generates the file name 
    on setFileName(outputExt)
    set fileName to do shell script "date +'%Y-%m-%d_%H-%M-%S'"
    set outputExt to the outputExt as string
    set fileName to ("STV_" & fileName as string) & outputExt
    return fileName as string
    end setFileName
    
    -- This method gives the current time in "hhmm" format (24hr) 
    on getTimeInHoursAndMinutes()
    set timeStr to time string of (current date)
    set hrStr to (characters 1 thru -10 of timeStr as string)
    if ((count hrStr) is less than 2) then
        set timeStr to ((0 & timeStr) as string)
    end if
    set ampm to (characters -2 thru -1 of timeStr as string)
    if ((ampm as string) is equal to "PM") then
        if ((hrStr as integer) is less than 12) then
            set hrStr to (((hrStr as integer) + 12) as string)
        end if
    else
        if ((hrStr as integer) = 12) then
            set hrStr to (0 as string)
        end if
        if ((count hrStr) is less than 2) then
            set hrStr to ((0 & hrStr) as string)
        end if
    end if
    set mStr to (characters 4 thru 5 of timeStr as string)
    set timeStr to (hrStr) & (mStr)
    return timeStr as string
    end getTimeInHoursAndMinutes
    
    -- This method Record the stream --
    on recordMedia(ls, sourceURL, con, pathToShraddhaString, fn)
    tell application "Terminal"
        set windowInfo to do script "caffeinate -i " & ls & space & sourceURL & space & con & space & pathToShraddhaString & fn
        activate of windowInfo
    end tell
    return windowInfo
    end recordMedia
    
    -- This method end recording --
    on finishTime(endTime, windowInfo)
    if ((endTime as string) is equal to "hhmm") then
    else
        repeat while (getTimeInHoursAndMinutes()) is less than endTime
            delay 60
        end repeat
        tell application "Terminal"
            -- reopen
            activate of windowInfo
            --tell application "System Events" to keystroke "q"
            tell application "System Events" to keystroke "c" using {control down}
        end tell
    end if
    end finishTime
    

    你能不能帮助我开发脚本,以便在每次运行脚本时自动提取Livestream URL?

    谢谢。

1 个答案:

答案 0 :(得分:0)

这是Capitainos @Superuser给出的答案。

它工作得很好。

Property LivestreamURL : {}
-- set youtube_channel to choose URL -- just remove comment tag to choose this option
set youtube_channel to "https://www.youtube.com/embed/live_stream?channel=UCu7cGbQEMgGk8TD0ZYucM5g"
tell application "Safari"
   launch  -- background OR use 'activate' if preferred    
   open location youtube_channel
end tell
-- wait for Safari to  load the webpage
if load_webpage(20) is false then return

tell application "Safari" to set end of LivestreamURL to do JavaScript "document.links[0].href" in document 1
   set this_ID to item 1 of LivestreamURL
   set channel_ID to (characters 51 thru -1 of youtube_channel) as string
   set video_ID to (characters 33 thru -1 of this_ID) as string

-- return LivestreamURL -- or;
return return & "Channel ID : " & channel_ID & linefeed & "Video ID     : " & video_ID & linefeed & linefeed

-- This is the Handler 'load_webpage'
on load_webpage(timeout_variable)
    delay 2
    repeat with i from 1 to the timeout_variable
        tell application "Safari"
            if (do JavaScript "document.readyState" in document 1) is "complete" then
                return true
            else if i is the timeout_variable then
                return false
            else
                delay 1
            end if
        end tell
    end repeat
    return false
end load_webpage