我试图:

  • 在 Python 脚本中使用 youtube-dl 定期下载视频
  • 通过 youtube 数据动态组织/命名视频,即 %(title)s
  • 提取音频/MP3 并将这些文件移动到名为“MP3”的子目录中

  • 我对 Python 还很陌生,而且我确信其中有一些杂乱无章的、不必要的代码;所以,我也愿意接受清理建议。

    我遇到了一个问题,当我输入播放列表 url(而不是单个 url)时,我只是获取播放列表名称而不是单个标题,我用来对文件进行排序的上传者数据。 (而且我不知道如何或是否可以在整个代码中使用 outmpl 选项/变量)

    我实际上将代码分成三个部分/模块。

    问题的基本示例是这样的 - 我输入:
    outmpl: 'F:\\Videos\\Online Videos\\Comics\\%(uploader)s\\%(playlist)s\\%(playlist_index)s_%(title)s.%(ext)s'
    

    这会将视频保存到:
    'F:\\Videos\\Online Videos\\Comics\\Comicstorian\\Annhililation\\01_Annihilation Beginnings Drax Earthfall - Complete Story.mp4' - and so on (for the rest of the videos)
    

    但是,我不知道将目录变量传递给我移动文件的模块。

    这是代码 - 三个模块/部分

    PyFile_Download_Exmple.py
    from __future__ import unicode_literals
    import youtube_dl
    import Move_MP3
    import ytdl_variables
    
    #Uses variables from ytdl_variables script and downloads the video
    
    with youtube_dl.YoutubeDL(ytdl_variables.ydl_opts) as ydl:
        ydl.download([ytdl_variables.video_url])
    
    #Calls script to create folder and move MP3 files
    Move_MP3
    

    ytdl_variables.py
    from __future__ import unicode_literals
    import youtube_dl
    
    global video_title, uploader, playlist, playlist_index, video_url, ydl_opts, ydl
    
    video_url = 'https://www.youtube.com/playlist?list=PL6FhCd_HO_ACJzTiLKfETgzLc1an_t05i'
    
    
    ydl_opts = {
        'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best',
        'outtmpl': 'F:\\Videos\\Online Videos\\Comics\\%(uploader)s\\%(playlist)s\\%(playlist_index)s_%(title)s.%(ext)s',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
        'download_archive': 'F:\\Videos\\Online Videos\\Archive.txt',
    }
    
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            #The next part creates a variable that returns info when provided the video_url variable >> http://stackoverflow.com/questions/23727943/how-to-get-information-from-youtube-dl-in-python
            '''
                Code here should get take the youtube playlist and spit out
                each url to move to the next step as vLinks variable, but
                I haven't figured out how to pass (title) etc. variables from
               each video in a playlist.
    
    
    
      link = individual video url from playlist
    
    The following puts actual info into variables for Python to use. These are made global above. I made a 'for' loop to repeat grabbing info for each video - but it doesn't work right now b/c I didn't define vLinks.
    '''
        for vLink in vLinks:
            info_dict = ydl.extract_info(link, download=False)
            video_title = info_dict.get('title', None)
            playlist_index = info_dict.get('playlist_index', None)
            playlist = info_dict.get('playlist', None)
            uploader = info_dict.get('uploader', None)
            print(video_title)
    
    #Checks if the video is in a playlist; if it's not, 'NA' will be the string returned: http://stackoverflow.com/questions/23086383/how-to-test-nonetype-in-python
    
    if playlist is None:
        playlist = 'NA'
    
    if playlist_index is None:
        playlist_index = 'NA'
    

    Move_MP3
    from __future__ import unicode_literals
    import ytdl_variables
    import shutil
    import os, os.path
    
    #Sets variables for renaming the files
    newfolder = 'F:\\Videos\\Online Videos\\Comics\\' + ytdl_variables.uploader + '\\' + ytdl_variables.playlist + '\\MP3\\'
    oa_savedir = 'F:\\Videos\\Online Videos\\Comics\\' + ytdl_variables.uploader + '\\' + ytdl_variables.playlist + '\\' + ytdl_variables.playlist_index + '_' + ytdl_variables.video_title + '.mp3'
    fa_savedir = 'F:\\Videos\\Online Videos\\Comics\\' + ytdl_variables.uploader + '\\' + ytdl_variables.playlist + '\\MP3\\' + ytdl_variables.playlist_index + '_' + ytdl_variables.video_title + '.mp3'
    
    #Function that creates file directory before moving file there - changed from http://stackoverflow.com/questions/23793987/python-write-file-to-directory-doesnt-exist
    def mkdir_p(path):
        if not os.path.exists(path):
            os.makedirs(path);
    
    #Function that checks whether the file already exists where I want to move it >> http://stackabuse.com/python-check-if-a-file-or-directory-exists/
    def chkfl_p(path):
        if not os.path.isfile(path):
            shutil.move(oa_savedir, fa_savedir);
    
    #Calls function to look for \MP3 directory and creates directory if it doesn't exist
    mkdir_p(newfolder)
    #Calls function to look for file and moves file if it isn't already there
    chkfl_p(fa_savedir)
    

    最佳答案

    我正在努力清理它,但我在另一个答案的一部分中发现了答案......

    要从播放列表 url 获取单个链接:

    ydl = youtube_dl.YoutubeDL({'outtmpl': '%(id)s%(ext)s', 'quiet':True,})
    video = ""
    
    with ydl:
        result = ydl.extract_info \
        (yt_url,
        download=False) #We just want to extract the info
    
        if 'entries' in result:
            # Can be a playlist or a list of videos
            video = result['entries']
    
            #loops entries to grab each video_url
            for i, item in enumerate(video):
                video = result['entries'][i]
    
    youtube_dl.YoutubeDL 似乎从 YouTube API 返回 JSON 数据
    yt_url 是视频或播放列表的变量。

    如果返回的数据有 "entries" 它是一个播放列表 - 然后我循环每个条目(用 i(ndex) 枚举条目) - 从那里我可以用 urls 或其他信息做我想做的事情。
    result['entries'][i]['webpage_url']     #url of video
    result['entries'][i]['title']           #title of video
    result['entries'][i]['uploader']        #username of uploader
    result['entries'][i]['playlist']        #name of the playlist
    result['entries'][i]['playlist_index']  #order number of video
    

    关于python - 如何在 python 脚本中使用 youtube-dl 从播放列表中检索单个视频 URL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43910501/

    10-13 01:57