Windows UWP 哔哩哔哩(B站)缓存视频重命名工具

背景

最近发现B站上面一些比较好的视频,想要将它下载本地,当时逛Github的时候,发现一个Python小工具,使用的是Windows应用商城中的哔哩哔哩的缓存功能,然后修改名称的方法。


试用了下,可以实现功能,看了下源码,是很简单的文本字符串处理、文件重命名、文件移动、遍历文件夹功能。

正好最近在学习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 UWP 哔哩哔哩(B站)缓存视频重命名工具
运行:
Windows UWP 哔哩哔哩(B站)缓存视频重命名工具
运行后:
Windows UWP 哔哩哔哩(B站)缓存视频重命名工具
Windows UWP 哔哩哔哩(B站)缓存视频重命名工具

直接上代码:以后再来修改调整博客具体内容。

<#
背景:通过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 # 回到脚本所在路径

Windows UWP 哔哩哔哩(B站)缓存视频重命名工具

上一篇:怎样完全删除sqlserver


下一篇:SQL 各种连接:内连接,外连接(左外,右外,完全外)