B站视频下载,使用下来,感觉比较好用的就Windows Store的UWP应用
哔哩哔哩
和Python平台的工具you-get了。
you-get
需要Python环境,UWP版的哔哩哔哩需要从Windows store下载。
本文章写的是从 UWP版的哔哩哔哩中缓存下来的视频重命名等处理。
试用了下,可以实现功能,看了下源码,是很简单的文本字符串处理、文件重命名、文件移动、遍历文件夹功能。
正好最近在学习PowerShell,所以就试用PowerShell重写了此功能。
GitHub: https://github.com/shuimqcn/bilibili_video_rename_tool/blob/master/app.ps1
...
下载好的一个视频目录结构:
F:\Bilibili_Cache\200857352>tree /F
卷 新加卷 的文件夹 PATH 列表
卷序列号为 54A8-0707
F:.
│ 200857352.dvi
│ cover.jpg
│ desktop.ini
│
├─1
│ 200857352.info
│ 200857352_1.xml
│ 200857352_1_0.mp4
│
├─10
│ 200857352.info
│ 200857352_10.xml
│ 200857352_10_0.mp4
│
├─2
│ 200857352.info
│ 200857352_2.xml
│ 200857352_2_0.mp4
│
├─3
│ 200857352.info
│ 200857352_3.xml
│ 200857352_3_0.mp4
│
├─4
│ 200857352.info
│ 200857352_4.xml
│ 200857352_4_0.mp4
│
├─5
│ 200857352.info
│ 200857352_5.xml
│ 200857352_5_0.mp4
│
├─6
│ 200857352.info
│ 200857352_6.xml
│ 200857352_6_0.mp4
│
├─7
│ 200857352.info
│ 200857352_7.xml
│ 200857352_7_0.mp4
│
├─8
│ 200857352.info
│ 200857352_8.xml
│ 200857352_8_0.mp4
│
└─9
200857352.info
200857352_9.xml
200857352_9_0.mp4说明:
1、视频名称位于根目录下的“200857352.dvi”文件中的“Title”字段。
2、一套视频有几节,以数字1开始进行命名子文件夹
3、数字子文件夹中的mp4文件就是每节的视频文件
4、数字子文件夹中的xml文件保存的是弹幕(猜测)
5、每节视频的课程名位于“info”文件的“PartName”字段
运行效果:
运行前:
运行:
运行后:
直接上代码:以后再来修改调整博客具体内容。
<# 背景:通过Windows应用商店的Windows App 哔哩哔哩可以直接下载B站的视频 不过是以视频AID命令的文件夹中,视频名称也不是正式的视频名称。 实现思路: 1. 获取目的目录根目录下的子目录对象,和文件对象。 2. 从文件对象中读取dvi文件得到视频课程的名称 3. 循环遍历子目录 1). 读取子目录中的info文件并取出“PartName”字段 2). 以1).中读取的“PartName”字段,重命名MP4格式的文件 #> $scripts_dir = Split-Path -Parent $MyInvocation.MyCommand.Definition # 脚本所在路径 # $root_path = $args # $args用于命令行传参数 $root_path = "F:\Bilibili_Cache\200857352\" write-host "------------------------------------------------------" write-host "进入根目录:" $root_path.FullName write-host "------------------------------------------------------" Set-Location $root_path # 切换到传入参数的需要操作目录 write-host "获取课程文件夹信息" write-host "------------------------------------------------------" $split_dir = Get-ChildItem -Path $root_path -Directory # 获取根目录下的子文件夹对象 $dvi_name = (Get-ChildItem -Path $root_path -File | Where-Object -FilterScript {$_.Name -like "*.dvi"} ).Name # 获取根目录下的“.dvi”文件名称 $serial_video_name = (Get-Content $root_path$dvi_name -Encoding utf8 | ConvertFrom-Json).Title # 读取根目录下的dvi文件获得视频课程的名称 write-host "获取课程文件夹信息成功" write-host "------------------------------------------------------" <# write-host "子目录对象:" $split_dir write-host "dvi文件名:" $dvi_name write-host "视频课程名称:" $serial_video_name #> write-host "新建课程文件夹信息" write-host "------------------------------------------------------" # 以课程名称创建文件夹 # 判断文件夹是否存在,存在删除后新建 $path_isexist = (Test-Path ((Get-Location).Path.ToString() +"\*") -Include $serial_video_name) if ( $path_isexist -eq $true ){ Remove-Item -Path $serial_video_name # 删除旧的课程目录 New-Item $serial_video_name -ItemType Directory # 新建课程目录 }else{ New-Item $serial_video_name -ItemType Directory # 新建课程目录 } write-host "------------------------------------------------------" write-host "处理课程目录" write-host "------------------------------------------------------" # 循环遍历子目录,将子目录中的.info文件的“PartName”字段取出,作为mp4格式文件的文件名 ForEach ($subdir in $split_dir){ # write-host "当前目录1:" (pwd).Path write-host "进入子目录" $subdir.FullName Set-Location $subdir #进入子目录 # write-host "当前目录2:" (pwd).Path $subvideoname = ((Get-Content -Encoding utf8 (Get-ChildItem $subdir.FullName "*.info" ).FullName ) | ConvertFrom-Json).PartName # 从info文件中取得子视频的名称 $subvideoname = ($subvideoname).ToString() + ".mp4" # 文件名加上后缀 # write-host "当前目录3:" (pwd).Path write-host "当前子目录中的视频名称为:" (Get-ChildItem -Filter "*.mp4").FullName # write-host "当前目录4:" (pwd).Path (Get-ChildItem -Filter "*.mp4") | Rename-Item -NewName $subvideoname # 子目录的mp4格式文件重命名 # write-host "当前目录5:" (pwd).Path Move-Item (Get-ChildItem -Filter "*.mp4" ).FullName ($subdir.Parent.FullName.ToString() + "\" + $serial_video_name ) # 将mp4文件拷贝到上级目录下实现建立的课程目录中 # write-host "当前目录6:" (pwd).Path Set-Location $subdir.Parent.FullName # 返回上级目录 } write-host "处理结束:" write-host "------------------------------------------------------" Set-Location $scripts_dir # 回到脚本所在路径