you-get 如何从 playlist 中下载单独的视频?

2018-11-10 13:57:39 +08:00
 MiLoucius

b 站很多视频都是一个 playlist 的,you-get 解析 b 站的 url 只解析到 av 号,而忽略了后面的?p=**

所以,you-get 只能解析到 playlist 中的第一个视频。

e.g. 这里解析 playlist 的

>you-get -i https://www.bilibili.com/video/av35557055?p=3
>you-get: This page contains a playlist. (use --playlist to download all videos.)
>site:                Bilibili
>title:                [ 1080 60 帧]  9 兔 8 蛋回归初舞台,IZONE 初 1 位! 181108 M!Countdown 女团 LIVE 现场合集 #3. >IZONE - La Vie en Rose
>streams:             # Available quality and codecs
>    [ DEFAULT ] _________________________________
>    - format:        hdflv
>      container:     flv
>      size:          116.2 MiB (121878947 bytes)
>    # download-with: you-get --format=hdflv [URL]

虽然 title 是对的,但从 size 可以看出依然是 playlist 中的第一个视频的。

可以看到有提示的参数使用:

This page contains a playlist. (use --playlist to download all videos.)

利用提示的--playlist参数,是将整个 playlist 下载的,但我只想下载第三个视频,这个该怎么办? ( github 的 wiki 里根本没有提到--playlist 参数还有什么骚操作)

7667 次点击
所在节点    Python
6 条回复
expy
2018-11-10 14:04:14 +08:00
https://github.com/iawia002/annie
这个软件能识别 p 参数。
V2tizen
2018-11-10 14:08:25 +08:00
我上次是改了下 bilibili.py 里面的代码就可以下了,不过好像没法合并(雾),手动 ffmpeg 合并的
MiLoucius
2018-11-10 14:25:10 +08:00
@expy 猴,我去试试。谢谢了
MiLoucius
2018-11-10 14:26:44 +08:00
@V2tizen 刚才借用油猴的脚本,还行,就是步骤有点多。现在打算试试 @expy 推荐的 annie
airdge
2018-11-10 16:43:45 +08:00
带?p 的 但只匹配了 id/?p=page
改成 https://www.bilibili.com/video/av35557055/?p=3 试下

class BiliVideo(BiliBase):
name = u'哔哩哔哩 (Bilibili)'

def get_vid_title(self):
av_id = match1(self.url, '(?:/av|aid=)(\d+)')
page_index = '1'
if "#page=" in self.url or "?p=" in self.url or 'index_' in self.url:
page_index = match1(self.url, '(?:#page|\?p)=(\d+)', 'index_(\d+)\.')
if page_index == '1':
self.url = 'https://www.bilibili.com/av{}/'.format(av_id)
else:
self.url = 'https://www.bilibili.com/av{}/?p={}'.format(av_id, page_index)
MiLoucius
2018-11-11 13:17:27 +08:00
@airdge 经你这么提醒,去看了下代码,发现是 b 站的 url 格式变了

源代码:
```python
frag = urllib.parse.urlparse(self.url).fragment
# http://www.bilibili.com/video/av3141144/index_2.html#page=3
if frag:
hit = re.search(r'page=(\d+)', frag)
if hit is not None:
page = hit.group(1)
aid = re.search(r'av(\d+)', self.url).group(1)
self.url = 'http://www.bilibili.com/video/av{}/index_{}.html'.format(aid, page)
```

代码中解析的是`/index_{}.html`,而现在 b 站显示的是`p={}`
特意去试了下,旧的 url 格式还是可以用的

所以,要下载 playlist 中的单独的视频,只需把`p={}`换成`/index_{}.html`就 OK 了(不要忘记了.html )

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/506431

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX