我正在尝试编写一个bash脚本,它将从播放列表中下载所有youtube视频,并根据youtube视频本身的标题将它们保存为特定的文件名。到目前为止,我有两段独立的代码,可以做我想做的事情,但我不知道如何将它们组合在一起作为一个单元来运行。
这段代码查找给定页面上所有youtube视频的标题:
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)
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名称。提前感谢大家的帮助。
发布于 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.
:序列将替换为上传video.
此输出选项的语法如下(其中NAME是上面显示的任一选项):
youtube-dl -o '%(NAME)s' http://www.youtube.com/your_video_or_playlist_url
例如,为了回答我最初的问题,语法如下:
youtube-dl -o '%(title)s.%(ext)s' http://www.youtube.com/playlist?list=PL2284887FAE36E6D8&feature=plcp
再次感谢那些回答我问题的人,非常感谢你们的帮助。
发布于 2012-01-19 18:50:35
如果你想使用来自youtube页面的标题作为文件名,你可以使用youtube-dl
的-t
选项。如果您想要使用“视频列表”页面中的标题,并且您确定每个<span class="title video-title"
标题都有一个watch?
URL,那么您可以使用如下内容:
#!/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
我没有测试它,因为我没有“视频列表”页面示例。
发布于 2013-10-27 18:32:36
以下是来自youtube的工作和娱乐方法
youtube-downloader.sh youtube-video-url.sh
#!/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
#!/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。
https://stackoverflow.com/questions/8921496
复制相似问题