Bash 用于从播放列表下载youtube文件的Shell脚本
我正在尝试编写一个bash脚本,该脚本将从播放列表下载所有youtube视频,并根据youtube视频本身的标题将它们保存到特定的文件名中。到目前为止,我有两段独立的代码可以实现我想要的功能,但我不知道如何将它们组合在一起作为一个单元运行 这段代码查找给定页面上所有youtube视频的标题:Bash 用于从播放列表下载youtube文件的Shell脚本,bash,shell,download,cut,youtube-dl,Bash,Shell,Download,Cut,Youtube Dl,我正在尝试编写一个bash脚本,该脚本将从播放列表下载所有youtube视频,并根据youtube视频本身的标题将它们保存到特定的文件名中。到目前为止,我有两段独立的代码可以实现我想要的功能,但我不知道如何将它们组合在一起作为一个单元运行 这段代码查找给定页面上所有youtube视频的标题: curl -s "$1" | grep '<span class="title video-title "' | cut -d\> -f2 | cut -d\< -f1 我想要一个脚本,
curl -s "$1" | grep '<span class="title video-title "' | cut -d\> -f2 | cut -d\< -f1
我想要一个脚本,它可以将youtube.flv文件输出到视频标题(在本例中是BASH lesson 2.flv)给定的文件名,而不仅仅是视频id名称。提前感谢您的帮助。如果您想使用youtube页面的标题作为文件名,可以使用
youtube dl
的-t
选项。如果您想使用“视频列表”页面中的标题,并且在阅读标题时确保每个-f2 | cut-d\<-f1 |都有一个watch?
URL;做
标题[$i]=$title
((i++)
完成
i=0
grep“watch?”$TMPFILE | cut-d\“-f4 |同时读取url;执行
URL[$i]=”http://www.youtube.com$url“
((i++)
完成
i=0;而((i<${#url[@]}));do
youtube dl-o“${titles[$i]}.%(ext)”“${url[$i]}”
((i++)
完成
我没有测试它,因为我没有“视频列表”页面示例。好的,在进一步研究和更新我的youtube dl版本后,结果表明,该功能现在直接内置到程序中,不需要shell脚本来解决youtube上的播放列表下载问题。完整文档可在此处找到:()但我最初问题的简单解决办法如下:
youtube-dl -o '%(title)s.%(ext)s' http://www.youtube.com/playlist?list=PL2284887FAE36E6D8&feature=plcp
1) youtube dl将自动处理播放列表链接,不需要单独向其提供其中包含的视频URL(这就不需要使用grep搜索“watch?”来查找唯一的视频id)
2) 现在提供了一个选项,可使用多种选项格式化文件名,包括:
- id:序列将替换为视频标识符
- url:序列将被视频url替换
- 上传者:序列将被上传视频的人的昵称替换
- 上载日期:序列将替换为YYYYMMDD格式的上载日期
- 标题:序列将替换为文字视频标题
- ext:序列将被相应的扩展名替换(如 flv或mp4)
- 历元:创建时,序列将被Unix历元替换 档案
- 自动编号:序列将替换为一个 将随着每次下载而增加,从零开始
youtube-dl -o '%(title)s.%(ext)s' http://www.youtube.com/playlist?list=PL2284887FAE36E6D8&feature=plcp
再次感谢那些回答我问题的人,非常感谢您的帮助。#!/bin/bash
#!/bin/bash
# Coded by Biki Teron
# String replace command in linux
echo "Enter youtube url:"
read url1
wget -c -O index.html $url1
################################### Linux string replace ##################################################
sed -e 's/%3A%2F%2F/:\/\//g' index.html > youtube.txt
sed -i 's/%2F/\//g' youtube.txt
sed -i 's/%3F/?/g' youtube.txt
sed -i 's/%3D/=/g' youtube.txt
sed -i 's/%26/\&/g' youtube.txt
sed -i 's/%252/%2/g' youtube.txt
sed -i 's/sig/&signature/g' youtube.txt
## command to get filename
nawk '/<title>/,/<\/title>/' youtube.txt > filename.txt ## Print the line between containing <title> and <\/title> .
sed -i 's/.*content="//g' filename.txt
sed -i 's/">.*//g' filename.txt
sed -i 's/.*<title>//g' filename.txt
sed -i 's/<.*//g' filename.txt
######################################## Coding to get all itag list ########################################
nawk '/"fmt_list":/,//' youtube.txt > fmt.html ## Print the line containing "fmt_list": .
sed -i 's/.*"fmt_list"://g' fmt.html
sed -i 's/, "platform":.*//g' fmt.html
sed -i 's/, "title":.*//g' fmt.html
# String replace command in linux to get correct itag format
sed -i 's/\\\/1920x1080\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/1920x1080\/99\/0\/0 by blank .
sed -i 's/\\\/1920x1080\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/1920x1080\/9\/0\/115 by blank.
sed -i 's/\\\/1280x720\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/1280x720\/99\/0\/0 by blank.
sed -i 's/\\\/1280x720\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/1280x720\/9\/0\/115 by blank.
sed -i 's/\\\/854x480\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/854x480\/99\/0\/0 by blank.
sed -i 's/\\\/854x480\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/854x480\/9\/0\/115 by blank.
sed -i 's/\\\/640x360\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/640x360\/99\/0\/0 by blank.
sed -i 's/\\\/640x360\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/640x360\/9\/0\/115 by blank.
sed -i 's/\\\/640x360\\\/9\\\/0\\\/115//g' fmt.html ## Replace \/640x360\/9\/0\/115 by blank.
sed -i 's/\\\/320x240\\\/7\\\/0\\\/0//g' fmt.html ## Replace \/320x240\/7\/0\/0 by blank.
sed -i 's/\\\/320x240\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/320x240\/99\/0\/0 by blank.
sed -i 's/\\\/176x144\\\/99\\\/0\\\/0//g' fmt.html ## Replace \/176x144\/99\/0\/0 by blank.
# Command to cut a part of a file between any two strings
nawk '/"url_encoded_fmt_stream_map":/,//' youtube.txt > url.txt
sed -i 's/.*url_encoded_fmt_stream_map"://g' url.txt
#Display video resolution information
echo ""
echo "Video resolution:"
echo "[46=1080(.webm)]--[37=1080(.mp4)]--[35=480(.flv)]--[36=180(.3gpp)]"
echo "[45=720 (.webm)]--[22=720 (.mp4)]--[34=360(.flv)]--[17=144(.3gpp)]"
echo "[44=480 (.webm)]--[18=360 (.mp4)]--[5=240 (.flv)]"
echo "[43=360 (.webm)]"
echo ""
echo "itag list= "`cat fmt.html`
echo "Enter itag number: "
read fmt
####################################### Coding to get required resolution #################################################
## cut itag=?
sed -e "s/.*,itag=$fmt//g" url.txt > "$fmt"_1.txt
sed -e 's/\u0026quality.*//g' "$fmt"_1.txt > "$fmt".txt
sed -i 's/.*u0026url=//g' "$fmt".txt ## Ignore all lines before \u0026url= but print all lines after \u0026url=.
sed -e 's/\u0026type.*//g' "$fmt".txt > "$fmt"url.txt ## Ignore all lines after \u0026type but print all lines before \u0026type.
sed -i 's/\\/\&/g' "$fmt"url.txt ## replace \ by &
sed -e 's/.*\u0026sig//g' "$fmt".txt > "$fmt"sig.txt ## Ignore all lines before \u0026sig but print all lines after \u0026sig.
sed -i 's/\\/\&ptk=machinima/g' "$fmt"sig.txt ## replace \ by &
echo `cat "$fmt"url.txt``cat "$fmt"sig.txt` > "$fmt"url.txt ## Add string at the end of a line
echo `cat "$fmt"url.txt` > link.txt ## url and signature content to 44url.txt
rm "$fmt"sig.txt
rm "$fmt"_1.txt
rm "$fmt".txt
rm "$fmt"url.txt
rm youtube.txt
########################################### Coding for filename with correct extension #####################################
if [ $fmt -eq 46 ]
then
echo `cat filename.txt`.webm > filename.txt
elif [ $fmt -eq 45 ]
then
echo `cat filename.txt`.webm > filename.txt
elif [ $fmt -eq 44 ]
then
echo `cat filename.txt`.webm > filename.txt
elif [ $fmt -eq 43 ]
then
echo `cat filename.txt`.webm > filename.txt
elif [ $fmt -eq 37 ]
then
echo `cat filename.txt`.mp4 > filename.txt
elif [ $fmt -eq 22 ]
then
echo `cat filename.txt`.mp4 > filename.txt
elif [ $fmt -eq 18 ]
then
echo `cat filename.txt`.mp4 > filename.txt
elif [ $fmt -eq 35 ]
then
echo `cat filename.txt`.flv > filename.txt
elif [ $fmt -eq 34 ]
then
echo `cat filename.txt`.flv > filename.txt
elif [ $fmt -eq 5 ]
then
echo `cat filename.txt`.flv > filename.txt
elif [ $fmt -eq 36 ]
then
echo `cat filename.txt`.3gpp > filename.txt
else
echo `cat filename.txt`.3gpp > filename.txt
fi
rm fmt.html
rm url.txt
filename=`cat filename.txt`
linkdownload=`cat link.txt`
wget -c -O "$filename" $linkdownload
echo "Download Finished!"
read
#由比基泰隆编码
#linux中的字符串替换命令
echo“输入youtube url:”
读取url1
wget-c-O index.html$url1
###################################Linux字符串替换##################################################
sed-e的/%3A%2F%2F/:\/\//g'index.html>youtube.txt
sed-i的/%2F/\//g'youtube.txt
sed-i's/%3F/?/g'youtube.txt
sed-i's/%3D/=/g'youtube.txt
sed-i's/%26/\&/g'youtube.txt
sed-i's/%252/%2/g'youtube.txt
sed-i's/sig/&signature/g'youtube.txt
##获取文件名的命令
nawk'//,//'youtube.txt>filename.txt##打印包含和之间的行。
sed-i's/*content=“//g”filename.txt
sed-i的/“>.//g”filename.txt
sed-i's/*//g'filename.txt
sed-i的/以下方法可以在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,您可能已经安装了它们。我使用这个bash脚本从给定的youtube播放列表下载给定的歌曲集
#!/bin/bash
downloadDirectory = <directory where you want your videos to be saved>
playlistURL = <URL of the playlist>
for i in {<keyword 1>,<keyword 2>,...,<keyword n>}; do
youtube-dl -o ${downloadDirectory}"/youtube-dl/%(title)s.%(ext)s" ${playlistURL} --match-title $i
done
!/bin/bash
下载目录=
播放列表URL=
因为我在{,,…,};做什么
youtube dl-o${downloadDirectory}”/youtube dl/%(title)s.%(ext)s“${playlayurl}——匹配title$i
完成
注:“关键字i”是该播放列表中给定视频的标题(全部或部分;如果是部分,则应为该播放列表所独有)
编辑:你可以通过pip安装youtube dl安装youtube dl这是目前最好的youtube下载脚本:因为所有这些脚本都在抓取页面上传递,它需要在网站结构上保持最新。它可以在文件名中包含视频标题。很好,请致电Niklas分发脚本的dl链接;这里有一个专门的链接,包含更多信息、文档和开发人员数据:。人们应该下载,这是一个很棒的脚本显然我不是唯一一个有这个想法的人感谢praetorian的回答,-t选项暂时有效,但您提供的脚本中有一些错误,我需要检查一下iles本身根本不下载,但我还没有时间测试您的脚本并了解原因。如果我发现任何问题,我将更新此线程。我正在下载youtube视频中学习bash脚本这是基于最新的youtube算法的。它将显示所有可用的视频分辨率。您可以下载.webm、.mp4、.flv、.3gpfile格式。抱歉,这与原始问题无关,-1。这肯定是最好的答案。感谢分享。看起来不再支持“缝合”。请改用“标题”;我更新了您的答案。
#!/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}"
#!/bin/bash
downloadDirectory = <directory where you want your videos to be saved>
playlistURL = <URL of the playlist>
for i in {<keyword 1>,<keyword 2>,...,<keyword n>}; do
youtube-dl -o ${downloadDirectory}"/youtube-dl/%(title)s.%(ext)s" ${playlistURL} --match-title $i
done