首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于从播放列表下载youtube文件的Shell脚本

用于从播放列表下载youtube文件的Shell脚本
EN

Stack Overflow用户
提问于 2012-01-19 13:34:15
回答 5查看 32.1K关注 0票数 21

我正在尝试编写一个bash脚本,它将从播放列表中下载所有youtube视频,并根据youtube视频本身的标题将它们保存为特定的文件名。到目前为止,我有两段独立的代码,可以做我想做的事情,但我不知道如何将它们组合在一起作为一个单元来运行。

这段代码查找给定页面上所有youtube视频的标题:

代码语言:javascript
复制
curl -s "$1" | grep '<span class="title video-title "' | cut -d\> -f2 | cut -d\< -f1

这段代码将文件下载到youtube video id指定的文件名(例如,youtube.com/watch?v=CsBVaJelurE&feature=relmfu指定的文件名将是CsBVaJelurE.flv)

代码语言:javascript
复制
curl -s "$1" | grep "watch?" | cut -d\" -f4| while read video; 
do youtube-dl "http://www.youtube.com$video";
done

我想要一个脚本,将输出的youtube .flv文件到一个文件名给出的视频标题(在这种情况下BASH课程2.flv),而不是简单的视频id名称。提前感谢大家的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-20 02:32:27

好的,在进一步研究和更新我的youtube-dl版本后,发现这个功能现在直接内置到程序中,不再需要shell脚本来解决youtube上的播放列表下载问题。完整的文档可以在这里找到:(http://rg3.github.com/youtube-dl/documentation.html),但我最初问题的简单解决方案如下:

1) youtube-dl将自动处理播放列表链接,不需要单独向它提供其中包含的视频的URL(这样就不需要使用grep搜索"watch?“查找唯一的视频id

2)现在包含了一个选项,可使用各种选项格式化文件名,包括:

上传日期id:序列将替换为视频identifier.

  • url:,序列将替换为视频video.

  • upload_date:。

:序列将替换为上传video.

  • upload_date:的人的昵称。序列将替换为YYYYMMDD format.

  • title:中的上传日期。序列将替换为文字视频标题。

  • ext:序列将替换为相应的扩展名(如flv或mp4)。

  • :当创建file.

  • autonumber:时,该序列将被Unix纪元替换。该序列将被一个五位数字替换,该数字将随着每次下载而增加,从零开始。

此输出选项的语法如下(其中NAME是上面显示的任一选项):

代码语言:javascript
复制
youtube-dl -o '%(NAME)s' http://www.youtube.com/your_video_or_playlist_url

例如,为了回答我最初的问题,语法如下:

代码语言:javascript
复制
youtube-dl -o '%(title)s.%(ext)s' http://www.youtube.com/playlist?list=PL2284887FAE36E6D8&feature=plcp

再次感谢那些回答我问题的人,非常感谢你们的帮助。

票数 25
EN

Stack Overflow用户

发布于 2012-01-19 18:50:35

如果你想使用来自youtube页面的标题作为文件名,你可以使用youtube-dl-t选项。如果您想要使用“视频列表”页面中的标题,并且您确定每个<span class="title video-title"标题都有一个watch? URL,那么您可以使用如下内容:

代码语言:javascript
复制
#!/bin/bash

TMPFILE=/tmp/downloader-$$

onexit() {
  rm -f $TMPFILE
}

trap onexit EXIT

curl -s "$1" -o $TMPFILE

i=0
grep '<span class="title video-title "' $TMPFILE | cut -d\> -f2 | cut -d\< -f1 | while read title; do
  titles[$i]=$title
  ((i++))
done

i=0
grep "watch?" $TMPFILE | cut -d\" -f4 | while read url; do
  urls[$i]="http://www.youtube.com$url"
  ((i++))
done

i=0; while (( i < ${#urls[@]} )); do
  youtube-dl -o "${titles[$i]}.%(ext)" "${urls[$i]}"
  ((i++))
done

我没有测试它,因为我没有“视频列表”页面示例。

票数 1
EN

Stack Overflow用户

发布于 2013-10-27 18:32:36

以下是来自youtube的工作和娱乐方法

youtube-downloader.sh youtube-video-url.sh

代码语言:javascript
复制
#!/bin/bash
decode() {
    to_decode='s:%([0-9A-Fa-f][0-9A-Fa-f]):\\x\1:g'
    printf "%b" `echo $1 | sed 's:&:\n:g' | grep "^$2" | cut -f2 -d'=' | sed -r $to_decode`
}
data=`wget http://www.youtube.com/get_video_info?video_id=$1\&hl=pt_BR -q -O-`
url_encoded_fmt_stream_map=`decode $data 'url_encoded_fmt_stream_map' | cut -f1 -d','`
signature=`decode $url_encoded_fmt_stream_map 'sig'`
url=`decode $url_encoded_fmt_stream_map 'url'`
test $2 && name=$2 || name=`decode $data 'title' | sed 's:+: :g;s:/:-:g'`
test "$name" = "-" && name=/dev/stdout || name="$name.vid"
wget "${url}&signature=${signature}" -O "$name"






#!/usr/bin/env /bin/bash
function youtube-video-url {
    local field=
    local data=
    local split="s:&:\n:g"
    local decode_str='s:%([0-9A-Fa-f][0-9A-Fa-f]):\\x\1:g'
    local yt_url="http://www.youtube.com/get_video_info?video_id=$1"
    local grabber=`command -v curl`
    local args="-sL"
    if [ ! "$grabber" ]; then
        grabber=`command -v wget`
        args="-qO-"
    fi
    if [ ! "$grabber" ]; then
        echo 'No downloader available.' >&2
        test x"${BASH_SOURCE[0]}" = x"$0" && exit 1 || return 1
    fi
    function decode {
        data="`echo $1`"
        field="$2"
        if [ ! "$field" ]; then
            field="$1"
            data="`cat /dev/stdin`"
        fi
        data=`echo $data | sed $split | grep "^$field" | cut -f2 -d'=' | sed -r $decode_str`
        printf "%b" $data
    }
    local map=`$grabber $args $yt_url | decode 'url_encoded_fmt_stream_map' | cut -f1 -d','`
    echo `decode $map 'url'`\&signature=`decode $map 'sig'`
}
[ $SHLVL != 1 ] && export -f youtube-video-url

bash youtube-player.sh saalGKY7ifU

代码语言:javascript
复制
#!/bin/bash
decode() {
    to_decode='s:%([0-9A-Fa-f][0-9A-Fa-f]):\\x\1:g'
    printf "%b" `echo $1 | sed 's:&:\n:g' | grep "^$2" | cut -f2 -d'=' | sed -r $to_decode`
}


data=`wget http://www.youtube.com/get_video_info?video_id=$1\&hl=pt_BR -q -O-`


url_encoded_fmt_stream_map=` decode $data 'url_encoded_fmt_stream_map' | cut -f1 -d','`

signature=` decode $url_encoded_fmt_stream_map 'sig'`

url=`decode $url_encoded_fmt_stream_map 'url'`
test $2 && name=$2 || name=`decode $data 'title' | sed 's:+: :g;s:/:-:g'`


test "$name" = "-" && name=/dev/stdout || name="$name.mp4"

# // wget "${url}&signature=${signature}" -O "$name"

mplayer -zoom -fs "${url}&signature=${signature}"

它使用您可能已经安装的decode和bash。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8921496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档