youtube-dl: запустить функцию PowerShell через --exec - PullRequest
0 голосов
/ 08 июля 2019

Я создал скрипт PowerShell для загрузки видео с использованием youtube-dl. Когда видео успешно загружено, я хочу скопировать его .info.json файл и добавить его в файл сценария, который я использую в качестве базы данных. youtube-dl предоставляет параметр --exec, который позволяет запустить команду при успешной загрузке видео. Это мой сценарий:

Write-Host "Checking for updates to youtube-dl . . . "
.\youtube-dl.exe -U
Write-Host "Searching for and downloading videos . . . "
$PSDefaultParameterValues['Out-File:Encoding'] = 'UTF8'
if (![System.IO.File]::Exists('.\database.js')) {
    Set-Content -Path .\database.js -Value "const database = [
]"
}
$stopWatch = [system.diagnostics.stopwatch]::startNew()
.\youtube-dl.exe --config-location config.txt --write-info-json --exec "Write-MetadataToDatabase {}" # Call the Write-MetadataToDatabase function, passing the location of the video .info.json file as {}
$elapsed = $stopWatch.Elapsed.ToString("hh\:mm\:ss")
Write-Host "Finished downloading. Took $elapsed."
Read-Host -Prompt "Done, press Enter to exit"

function Write-MetadataToDatabase {
    Param($Path)
    $content = [System.IO.File]::ReadAllText($Path, [System.Text.Encoding]::UTF8) | ConvertFrom-Json
    $content.PSObject.Properties.Remove('formats')
    $content = $content | ConvertTo-Json -compress

    $stream = [IO.File]::OpenWrite('.\database.js')
    $stream.SetLength($stream.Length - 4)
    $stream.Close()
    $stream.Dispose()

    $content + ",
]" | Add-Content .\database.js -Encoding UTF8
    $i++
    Write-Host "Appended video metadata to database file"
}

Как запустить мою функцию, передав местоположение файла .info.json видео, если видео успешно загружено?

Редактировать Я выяснил, как получить местоположение файла .info.json. Передача {} в качестве параметра для --exec возвращает местоположение видео, которое совпадает с местоположением файлов метаданных. Я до сих пор не могу понять, как успешно вызвать мою функцию.

1 Ответ

0 голосов
/ 08 июля 2019

Я не смог заставить работать параметр --Exec, но вот подход, который должен помочь вам начать.

$files = "https://www.youtube.com/watch?v=avWtg18HMbQ"
forEach ($file in $files){
    & '.\youtube-dl.exe' "$($file) --write-info-json -i -f bestvideo+bestaudio/best"
    $elapsed = $stopWatch.Elapsed.ToString("hh\:mm\:ss")

    Write-Host "Finished downloading. Took $elapsed."

    #find most recent file
    $thisJSONFile = Get-ChildItem *.json | Sort-Object -Descending Created | Select-Object -First 1 | Get-Content | ConvertFrom-Json



    Write-Output "The most recent file was $($thisJSONFile._filename) which had $($thisJSONFile.view_count) views"

    #do other things with properties of $thisJSONFile here
}

Что даст этот вывод

The most recent file was [No Damage_Ichimonji] SEVEN ASHINA SPEARS Shikibu Toshikatsu Yamauchi Mini-Boss Fight _ Sekiro-DdMUG3PvWII.mp4 which had 16 views

Вы можете добавить свою собственную логику в конец блока скрипта, чтобы делать что угодно с файлами .JSON, которыескачал, надеюсь это поможет.

...