批量修改bilibili下载视频的文件名
<font size=4>
[TOC]
需求
在bilibili上下载了学习视频,bili的客户端看视频非常不方便,习惯用potplayer看视频;但是bili上下载视频的文件名都是类似50200264_1_0.flv
这样格式,所以就修改成bili上对应的详细介绍的文件名,类似01 介绍及快速搭建 Spring Boot 项目
这个格式的。
分析
-
查看下载视频的目录,发现在视频全集下面分了两层目录
-
最底层有三个文件,其中
flv
文件,是视频文件,也是需要重命名的文件;xml
文件记录的是弹幕;info
文件记录的是文件信息,查看info
文件可知,有个 "PartName" 字段记录的是文件名,获取这个字段信息即可。
- 思路
- 遍历视频全集文件夹
- 读取
info
文件,截取"PartName"
字段信息即文件名,排序后将文件名保存到临时文件demo.txt
- 手动修改
demo.txt
文件内容,修改成整齐的格式 - 遍历文件夹,获取
flv
文件的文件名,并截取其中的序号,比如50200264_1_0.flv
,获取中间的序号1
,作为index
- 按行顺序读取
demo.txt
文件,将读取的文件名保存到ArrayList
中,通过步骤4中的index-1
获取 - 重命名
实现
-
将
info
结尾的文件保存到fileList
中/** * 遍历文件夹,将info结尾的文件保存到fileList中 * @param filePath * @return */ public static List<File> getFileList(String filePath) { File dir = new File(filePath); // 该文件目录下文件全部放入数组 File[] files = dir.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { String fileName = files[i].getName(); // 判断是文件还是文件夹 if (files[i].isDirectory()) { // 获取文件绝对路径 getFileList(files[i].getAbsolutePath()); } else if (fileName.endsWith("info")) { // 判断文件名是否是以info结尾 String strFileName = files[i].getAbsolutePath(); fileList.add(files[i]); } else { continue; } } } return fileList; }
-
获取“PartName”字段信息,将字符串添加到list列表,并进行排序
/** * 获取“PartName”字段信息,将字符串添加到list列表,并进行排序 * @param fileListNew 新的文件列表 * @return */ public static List<String> sortString(List<File> fileListNew) { List<String> strList = new ArrayList<>(16); for (int i = 0; i < fileListNew.size(); i++) { File file = fileListNew.get(i); try { BufferedReader br = new BufferedReader(new FileReader(file)); String str; while ((str = br.readLine()) != null) { // 获取“PartName”字段对应的文件名 String partName = str.split(",")[18].split(":")[1]; // 字文件名添加到List strList.add(partName); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 排序获取到的文件名 Collections.sort(strList); return strList; }
-
将排序后的字符串写入到文件中
/** * 将排序后的字符串写入到文件中 * @param newFileName 新文件路径 * @param stringList 字符串列表 * @throws IOException */ public static void writeFile(String newFileName, List<String> stringList) throws IOException { FileWriter fw = new FileWriter(newFileName); BufferedWriter bw = new BufferedWriter(fw); for (int i = 0; i < stringList.size(); i++) { String str = stringList.get(i); bw.append(str + "\r\n"); } bw.close(); }
-
将
flv
文件名,保存到fileList
中/** * 遍历文件夹,将flv结尾的文件名,添加到fileList中 * * @param filePath * @return */ public List<File> getFileList(String filePath) { File dir = new File(filePath); // 该文件目录下文件全部放入数组 File[] files = dir.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { String fileName = files[i].getName(); // 判断是文件还是文件夹 if (files[i].isDirectory()) { // 获取文件绝对路径 getFileList(files[i].getAbsolutePath()); } else if (fileName.endsWith("flv")) { // 判断文件名是否是以flv结尾 String strFileName = files[i].getAbsolutePath(); // logger.info("strFileName : " + strFileName); fileList.add(files[i]); } else { continue; } } } return fileList; }
-
从
demo.txt
文件中,获取目标文件名,并添加到List中/** * 读取demo.txt文件,获取目标文件名,并添加到ArrayList中 * @param file * @return */ public List<String> readeFile(File file) { List<String> strList = new ArrayList<>(); try { BufferedReader br = new BufferedReader(new FileReader(file)); String lines; while ((lines = br.readLine()) != null) { strList.add(lines); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return strList; }
-
读取
demo.txt
文件获取目标文件名,并通过遍历fileList获取flv
文件名,然后重命名/** * 重命名文件 * @param demo demo.txt文件 */ public void renameToEnd(File demo) { // 读取demo.txt中的文件名,并保存demoList中 List<String> demoList = readeFile(demo); for (int i = 0; i < fileList.size(); i++) { // 获取flv文件 File fileOld = fileList.get(i); // 截取flv文件名中的序号 String str = fileOld.getName().split("_")[1]; // 将String类型的序号转成int类型 int anInt = Integer.parseInt(str); // 获取flv文件的路径 String newPathTemp = fileOld.getPath().split("57936239_")[0]; String newPath = newPathTemp.endsWith("\\") ? newPathTemp : newPathTemp+"\\"; // 拼接成新的文件名 String newFileName = newPath + demoList.get(anInt-1) + ".flv"; // 创建新的文件 File dest = new File(newFileName); // 重命名 if (fileOld.renameTo(dest)) { System.out.println("重命名成功: " + dest.getName()); } } }
结果
-
修改后的结果如下,需要注意的是,修改文件名后,bilibili的客户端就不能再查看文件了。
-
PotPlayer文件列表展示如下: