批量修改bilibili下载视频的文件名

批量修改bilibili下载视频的文件名

[TOC]

需求

在bilibili上下载了学习视频,bili的客户端看视频非常不方便,习惯用potplayer看视频;但是bili上下载视频的文件名都是类似50200264_1_0.flv这样格式,所以就修改成bili上对应的详细介绍的文件名,类似01 介绍及快速搭建 Spring Boot 项目这个格式的。

分析

  1. 查看下载视频的目录,发现在视频全集下面分了两层目录


    批量修改bilibili下载视频的文件名_第1张图片
    文件目录
  2. 最底层有三个文件,其中flv文件,是视频文件,也是需要重命名的文件; xml文件记录的是弹幕; info文件记录的是文件信息,查看info文件可知,有个 "PartName" 字段记录的是文件名,获取这个字段信息即可。

    批量修改bilibili下载视频的文件名_第2张图片
    PartName

  1. 思路
    1. 遍历视频全集文件夹
    2. 读取info文件,截取"PartName"字段信息即文件名,排序后将文件名保存到临时文件demo.txt
    3. 手动修改demo.txt文件内容,修改成整齐的格式
    4. 遍历文件夹,获取flv文件的文件名,并截取其中的序号,比如 50200264_1_0.flv,获取中间的序号1,作为index
    5. 按行顺序读取demo.txt文件,将读取的文件名保存到ArrayList中,通过步骤4中的index-1获取
    6. 重命名

实现

  1. info结尾的文件保存到fileList

    /**
     * 遍历文件夹,将info结尾的文件保存到fileList中
     * @param filePath
     * @return
     */
    public static List 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;
    }
    
  2. 获取“PartName”字段信息,将字符串添加到list列表,并进行排序

    /**
     * 获取“PartName”字段信息,将字符串添加到list列表,并进行排序
     * @param fileListNew   新的文件列表
     * @return
     */
    public static List sortString(List fileListNew) {
        List 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;
    }
    
  3. 将排序后的字符串写入到文件中

    /**
     * 将排序后的字符串写入到文件中
     * @param newFileName   新文件路径
     * @param stringList    字符串列表
     * @throws IOException
     */
    public static void writeFile(String newFileName, List 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();
    }
    
  4. flv文件名,保存到fileList

    /**
     * 遍历文件夹,将flv结尾的文件名,添加到fileList中
     *
     * @param filePath
     * @return
     */
    public List 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;
    }
    
  5. demo.txt文件中,获取目标文件名,并添加到List中

    /**
     * 读取demo.txt文件,获取目标文件名,并添加到ArrayList中
     * @param file
     * @return
     */
    public List readeFile(File file) {
    
        List 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;
    }
    
  6. 读取demo.txt文件获取目标文件名,并通过遍历fileList获取flv文件名,然后重命名

    /**
     * 重命名文件
     * @param demo  demo.txt文件
     */
    public void renameToEnd(File demo) {
        // 读取demo.txt中的文件名,并保存demoList中
        List 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());
            }
        }
    }
    

结果

  1. 修改后的结果如下,需要注意的是,修改文件名后,bilibili的客户端就不能再查看文件了。


    批量修改bilibili下载视频的文件名_第3张图片
    修改后的文件名
  1. PotPlayer文件列表展示如下:


    批量修改bilibili下载视频的文件名_第4张图片
    PotPlayer播放列表

你可能感兴趣的:(批量修改bilibili下载视频的文件名)