批量修改bilibili下載視頻的文件名
<font size=4>
[TOC]
需求
在bilibili上下載了學(xué)習視頻蝗肪,bili的客戶端看視頻非常不方便词顾,習慣用potplayer看視頻;但是bili上下載視頻的文件名都是類似50200264_1_0.flv
這樣格式,所以就修改成bili上對應(yīng)的詳細介紹的文件名垃它,類似01 介紹及快速搭建 Spring Boot 項目
這個格式的。
分析
-
查看下載視頻的目錄烹看,發(fā)現(xiàn)在視頻全集下面分了兩層目錄
-
最底層有三個文件国拇,其中
flv
文件,是視頻文件惯殊,也是需要重命名的文件;xml
文件記錄的是彈幕;info
文件記錄的是文件信息酱吝,查看info
文件可知,有個 "PartName" 字段記錄的是文件名土思,獲取這個字段信息即可务热。
- 思路
- 遍歷視頻全集文件夾
- 讀取
info
文件忆嗜,截取"PartName"
字段信息即文件名,排序后將文件名保存到臨時文件demo.txt
- 手動修改
demo.txt
文件內(nèi)容崎岂,修改成整齊的格式 - 遍歷文件夾捆毫,獲取
flv
文件的文件名,并截取其中的序號冲甘,比如50200264_1_0.flv
绩卤,獲取中間的序號1
,作為index
- 按行順序讀取
demo.txt
文件江醇,將讀取的文件名保存到ArrayList
中濒憋,通過步驟4中的index-1
獲取 - 重命名
實現(xiàn)
-
將
info
結(jié)尾的文件保存到fileList
中/** * 遍歷文件夾,將info結(jié)尾的文件保存到fileList中 * @param filePath * @return */ public static List<File> getFileList(String filePath) { File dir = new File(filePath); // 該文件目錄下文件全部放入數(shù)組 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結(jié)尾 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”字段對應(yīng)的文件名 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結(jié)尾的文件名黔夭,添加到fileList中 * * @param filePath * @return */ public List<File> getFileList(String filePath) { File dir = new File(filePath); // 該文件目錄下文件全部放入數(shù)組 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結(jié)尾 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類型的序號轉(zhuǎn)成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"; // 創(chuàng)建新的文件 File dest = new File(newFileName); // 重命名 if (fileOld.renameTo(dest)) { System.out.println("重命名成功: " + dest.getName()); } } }
結(jié)果
-
修改后的結(jié)果如下颜屠,需要注意的是辰妙,修改文件名后,bilibili的客戶端就不能再查看文件了甫窟。
-
PotPlayer文件列表展示如下: