最近在B站中学习一些关于Java的技术,发现有的时候网速跟不上,容易出现卡顿,因此想再不用的时候将视频下载保存到本地进行观看,网页版B站没找到相关的下载按钮,于是搜索下载视频相关,找到了哔哩哔哩UWP,这个也是一个客户端,在Microsoft store中进行下载
下载完成进入首页之后就可以进行搜索视频

搜索到相关的视频进入到视频详细页
下滑找到视频的列表选择进行下载
这个时候可以进入下载列表页面进行查看下载状况
第二种查看下载队列
找到下载地址之后可以查看视频
我这里下载了15个视频进行举例
找到这15个视频文件
!!! 这好像不是我想要的东西呀,为什么视频文件不在同一个文件夹下,这样我看完一个还要自己找另一个文件夹打开视频,有点难以接受。
想想能下载已经不错了,勉强接受吧
打开文件夹1
这怎么事,视频的名称怎么没了???
嗯这个MP4文件应该就是我要的视频,双击打开
???视频出现错误 WTF
csdn查文章
嗯,还要用文本工具打开把前几个空白删了才能观看
删除,双击,成功
嗯,可以,下一个文件夹
WTF 200多个文件夹,我要删到猴年马月
于是我就写了一个Java程序:
从哔哩哔哩UWP中下载的视频,自动化将空白删除以及将所有的文件整合到一个目录下边
我们还要找一下看看能不能找到视频名方便我们快速定位
打开xml文件:嗯,应该是弹幕
打开info文件:不就是你嘛
在这里插入图片描述
package file.info;
import java.io.*;
public class StationBVideoAdjust {
public static void main(String[] args) {
// 视频原地址
String startPath = "原视频目录绝对地址到这一层(\\BilibiliDownload\\80585971)";
// 视频保存地址
String videoPath = "视频文件保存的地址";
File file = new File(startPath);
File[] files = file.listFiles();
// 判断文件夹是否存在
File videoFIle = new File(videoPath);
if (!videoFIle.exists()) {
videoFIle.mkdirs();
}
String videoName = "";
assert files != null;
for (File f : files) {
if (f.isDirectory()) {
File[] innerFiles = f.listFiles();
assert innerFiles != null;
for (File innerFile : innerFiles) {
if (innerFile.getName().endsWith("info")) {
// 处理info文件,获取视频名称
videoName = handleInfoFile(innerFile);
}
if (innerFile.getName().endsWith("mp4")) {
// 将文件移动
moveAndRename(innerFile, videoName, videoPath);
}
}
}
}
// 将文件删除
delFIle(file);
}
/**
* 删除整个目录
*
* @param file 目录文件
*/
private static void delFIle(File file) {
if (file == null) {
throw new NullPointerException("亲, 文件不能为空!");
}
if (file.isDirectory()) {
for (File f : file.listFiles()) {
delFIle(f);
}
}
file.delete();
}
/**
* 移动文件并且重命名
*
* @param innerFile 视频文件
* @param videoName 从info文件中获取到的文件的名称
* @param videoPath 视频文件的保存地址
*/
private static void moveAndRename(File innerFile, String videoName, String videoPath) {
String fileSavePath = videoPath + "\\" + videoName + ".mp4";
File file = new File(fileSavePath);
if (file.exists()) {
System.out.println(videoName + "已存在!");
return;
}
try (FileInputStream in = new FileInputStream(innerFile); FileOutputStream out = new FileOutputStream(file)) {
int len = -1;
byte[] bs1 = new byte[3];
byte[] bs = new byte[1024 * 10];
// 第一次执行要删除前三个字符
in.read(bs1);
while ((len = in.read(bs)) != -1) {
out.write(bs, 0, len);
}
out.flush();
System.out.println(videoName + "成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取视频的名称
*
* @param info info文件
* @return 返回获取到的文件的名称
*/
private static String handleInfoFile(File info) {
String str = "";
char[] c = new char[1024 * 8];
try (FileReader fReader = new FileReader(info)) {
fReader.read(c);
str = new String(c);
// 查找视频名称的位置
int videoNameIndex = str.indexOf("\"PartName\":\"") + 12;
str = str.substring(videoNameIndex);
int videoNameLast = str.indexOf('\"');
str = str.substring(0, videoNameLast);
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}