2017-09-23 108 views
0

StackOverflow!youtube-dl只取URL的第一个字母?

我遇到了一些与youtube-dl有关的问题。最近我有这个工作,但我做了一些改变,现在拒绝工作。这里是我的代码:

import youtube_dl 
import os 

class InvalidURL(Exception): 
    pass 

class SongExists(Exception): 
    pass 

def download(url): 
    try: 
     options = { 
      'format': 'bestaudio/best', 
      'quiet': False, 
      'extractaudio': True, # only keep the audio 
      'audioformat': "wav", # convert to wav 
      'outtmpl': '%(id)s.wav', # name the file the ID of the video 
      'noplaylist': True, # only download single song, not playlist 
     } 
     with youtube_dl.YoutubeDL(options) as ydl: 
      r = ydl.extract_info(url ,download=False) 
      if os.path.isfile(str(r["id"])): 
       raise SongExists('This song has already been requested.') 
      print("Downloading", r["title"]) 
      print(str(url)) 
      ydl.download(url) 
      print("Downloaded", r["title"]) 
      return r["title"], r["id"] 
    except youtube_dl.utils.DownloadError: 
     raise InvalidURL('This URL is invalid.') 

if __name__ == "__main__": 
    download("https://www.youtube.com/watch?v=nvHyII4Dq-A") 

据我所见,看来我的脚本正在从我的URL中取出第一个字母。有谁知道为什么?作为“Side-quest”,有没有人知道如何进行搜索而不是URL?

这里是我的输出:

[youtube] nvHyII4Dq-A: Downloading webpage 
[youtube] nvHyII4Dq-A: Downloading video info webpage 
[youtube] nvHyII4Dq-A: Extracting video information 
WARNING: unable to extract uploader nickname 
[youtube] nvHyII4Dq-A: Downloading MPD manifest 
Downloading MagnusTheMagnus - Area 
https://www.youtube.com/watch?v=nvHyII4Dq-A 
ERROR: 'h' is not a valid URL. Set --default-search "ytsearch" (or run youtube-dl "ytsearch:h") to search YouTube 
Traceback (most recent call last): 
    File "C:\Users\tyler\AppData\Local\Programs\Python\Python36-32\lib\site-packages\youtube_dl\YoutubeDL.py", line 776, in extract_info 
    ie_result = ie.extract(url) 
    File "C:\Users\tyler\AppData\Local\Programs\Python\Python36-32\lib\site-packages\youtube_dl\extractor\common.py", line 433, in extract 
    ie_result = self._real_extract(url) 
    File "C:\Users\tyler\AppData\Local\Programs\Python\Python36-32\lib\site-packages\youtube_dl\extractor\generic.py", line 1993, in _real_extract 
    % (url, url), expected=True) 
youtube_dl.utils.ExtractorError: 'h' is not a valid URL. Set --default-search "ytsearch" (or run youtube-dl "ytsearch:h") to search YouTube 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:/Users/tyler/PycharmProjects/PythonSpeakerThing/downloader.py", line 26, in download 
    ydl.download(url) 
    File "C:\Users\tyler\AppData\Local\Programs\Python\Python36-32\lib\site-packages\youtube_dl\YoutubeDL.py", line 1958, in download 
    url, force_generic_extractor=self.params.get('force_generic_extractor', False)) 
    File "C:\Users\tyler\AppData\Local\Programs\Python\Python36-32\lib\site-packages\youtube_dl\YoutubeDL.py", line 799, in extract_info 
    self.report_error(compat_str(e), e.format_traceback()) 
    File "C:\Users\tyler\AppData\Local\Programs\Python\Python36-32\lib\site-packages\youtube_dl\YoutubeDL.py", line 604, in report_error 
    self.trouble(error_message, tb) 
    File "C:\Users\tyler\AppData\Local\Programs\Python\Python36-32\lib\site-packages\youtube_dl\YoutubeDL.py", line 574, in trouble 
    raise DownloadError(message, exc_info) 
youtube_dl.utils.DownloadError: ERROR: 'h' is not a valid URL. Set --default-search "ytsearch" (or run youtube-dl "ytsearch:h") to search YouTube 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:/Users/tyler/PycharmProjects/PythonSpeakerThing/downloader.py", line 33, in <module> 
    download("https://www.youtube.com/watch?v=nvHyII4Dq-A") 
    File "C:/Users/tyler/PycharmProjects/PythonSpeakerThing/downloader.py", line 30, in download 
    raise InvalidURL('This URL is invalid.') 
__main__.InvalidURL: This URL is invalid. 

回答

3

由于documentedydl.download功能需要的URL列表。因此,而不是

ydl.download(url) 

要拨打

ydl.download([url]) 

运行搜索,首先,通过运行youtube-dl --extractor-descriptions | grep search查找关键字。例如,Soundcloud搜索的关键字是scsearch,YouTube默认搜索的关键字是ytsearch

然后,只需传递关键字和搜索词,以冒号(:)作为URL分隔。

例如,一个URL为ytsearch:fluffy bunnies会在默认搜索条件下找到YouTube上蓬松兔子的顶级视频。

相关问题