批量修改bilibili客户端下载视频文件名

代码已上传:Github

起因

昨天晚上从B站电脑客户端下了一个分集视频

但是下载后的视频是这样的:

视频名是这样的:

这样既不直观又不美观,就算把视频文件放到一个文件夹内,连续看视频时也不容易记住看到哪个。所以就有了今天的事情。

经过

起初,我的想法是复制出来一个一个该文件名,但是当时我想到,作为一个优秀的程序员,怎么能干这种无脑的活呢???(其实是太懒了。。。)

于是,,,就去百度了,百度确实找到一个,但是上面的方法根本没有写全,虽然我已经尽力补全,但是他还是漏了一个非常关键的一步,所以我就决定自己来写。

分析

根据下载的文件来看,在info文件中,可以找到原视频的所有介绍信息,其中当然就有原视频的文件名(PartName),所以我们只需要把info文件中的文件名提取出来,然后再对flv视频文件重命名不就完事了吗。

具体可以分为以下步骤:

  1. 遍历我们下载好的视频目录,得到info文件集合和flv视频文件集合;
  2. 遍历读取info文件,从中提取我们需要的视频文件名;
  3. 循环遍历flv文件,提取视频序号,用来组装我们想要的视频名;
  4. 遍历flv,给每一个flv视频文件换上新名字;

代码实现

  1. 遍历视频目录,将info文件存入list集合;

     1 /**
     2  * 遍历下载目录,将info文件存入list集合
     3  * - 目的:提供info文件给getPartNameList()方法,获得想要的视频文件名
     4  *
     5  * @param downloadPath
     6  * @return
     7  */
     8 public static List<File> getInfoList(String downloadPath) {
     9     File dir = new File(downloadPath);
    10 ?
    11     // 把下载目录下的所有文件(可能是目录也可能是文件)放到数组中
    12     File[] subDirOrFile = dir.listFiles();
    13 ?
    14     if (subDirOrFile != null) {
    15         for (int i = 0; i < subDirOrFile.length; i++) {
    16             String fileName = subDirOrFile[i].getName();
    17             // 判断是否是目录,如果是目录继续遍历
    18             if (subDirOrFile[i].isDirectory()) {
    19                 getInfoList(subDirOrFile[i].getAbsolutePath());
    20                 //   判断是否以info结尾
    21             } else if (fileName.endsWith("info")) {
    22                 infoList.add(subDirOrFile[i]);
    23             } else {
    24                 continue;
    25             }
    26         }
    27     }
    28     return infoList;
    29 }
  2. 遍历视频目录,把flv视频文件放入list集合;
     1 /**
     2  * 根据下载路径,遍历获取所有视频文件list集合
     3  * -目的:改名时需要知道原始文件对象
     4  *
     5  * @param downloadPath
     6  * @return
     7  */
     8 public static List<File> getFlvList(String downloadPath) {
     9     File dir = new File(downloadPath);
    10 ?
    11     // 把下载目录下的所有文件放到数组中
    12     File[] subDirOrFile = dir.listFiles();
    13 ?
    14     if (subDirOrFile != null) {
    15         for (int i = 0; i < subDirOrFile.length; i++) {
    16             String fileName = subDirOrFile[i].getName();
    17             if (subDirOrFile[i].isDirectory()) {
    18                 getFlvList(subDirOrFile[i].getAbsolutePath());
    19             } else if (fileName.endsWith("flv")) {
    20                 flvList.add(subDirOrFile[i]);
    21             } else {
    22                 continue;
    23             }
    24         }
    25     }
    26     return flvList;
    27 }
  3. 遍历读取info文件,提取需要的视频名集合;
    ?

    /**
     * 读取 info 文件,获取视频文件名
     *
     * @param infoFile
     * @return
     */
    public static String getPartName(File infoFile) {
        BufferedReader br = null;
        String partName = null;
        try {
            br = new BufferedReader(new FileReader(infoFile));
            String str;
            while (null != (str = br.readLine())) {
                // 获取partName字段对应的文件名
                partName = str.split(",")[17].split(":")[1].replace("\"", "");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return partName;
    }
    ?
    /**
     * 遍历info 文件list集合,获得视频文件名list集合
     *
     * @param infoList
     * @return
     */
    public static List<String> getPartNameList(List<File> infoList) {
        List<String> partNameList = new ArrayList<>();
        for (int i = 0; i < infoList.size(); i++) {
            // 调用获取视频名的方法
            String partName = getPartName(infoList.get(i));
            partNameList.add(partName);
        }
        return partNameList;
    }

     
  4. 遍历flv文件集合,组装文件名;

     1 /**
     2  * 根据视频名,flv文件对象,av号来组装我们想要的文件对象
     3  * -用途:重命名的目标文件对象
     4  *
     5  * @param partName
     6  * @param flvFile
     7  * @param avNum
     8  * @return
     9  */
    10 public static File getDestFile(String partName, File flvFile, String avNum) {
    11     // 根据flv文件名截取视频的序号
    12     String index = flvFile.getName().split("_")[1];
    13 ?
    14     // 截取flv文件路径,作为重命名文件的路径 E:\Videos\75233634\
    15     String newPathTemp = flvFile.getPath().split(avNum + "_")[0];
    16     // 判断该路径最后有没有"\" ,没有则加上 E:\Videos\75233634\
    17     String newPath = newPathTemp.endsWith("\\") ? newPathTemp : newPathTemp + "\\";
    18     // 新的文件路径:即 E:\Videos\75233634\1_1、这阶段该如何学习.flv
    19     String newFilePath = newPath + index + "_" + partName + ".flv";
    20 ?
    21     File destFile = new File(newFilePath);
    22     return destFile;
    23 }

  5. main方法,完成批量重命名;

     1 // 这两个属于类的私有属性,定义在方法外边,分别代表info文件集合和flv视频文件集合
     2 private static List<File> infoList = new ArrayList<>();
     3 private static List<File> flvList = new ArrayList<>();
     4 ?
     5 public static void main(String[] args) {
     6     // 视频的下载路径
     7     String downloadPath = "E:\\Videos\\Bilibili videos\\75233634";
     8     // 视频av号:就是路径的最后一级目录
     9     String avNum = null;
    10     Pattern pattern = Pattern.compile("\\d+");
    11     Matcher matcher = pattern.matcher(downloadPath);
    12     if (matcher.find()) {
    13         avNum = matcher.group();
    14     }
    15 ?
    16     List<File> infoList = getInfoList(downloadPath);
    17     List<File> flvList = getFlvList(downloadPath);
    18     List<String> partNameList = getPartNameList(infoList);
    19 ?
    20     for (int i = 0; i < flvList.size(); i++) {
    21         // System.out.println(flvList.get(i));
    22         // System.out.println(getDestFile(partNameList.get(i), flvList.get(i), avNum));
    23         String partName = partNameList.get(i);
    24         File flvFile = flvList.get(i);
    25         // 目标文件:E:\Videos\75233634\1_1、这阶段该如何学习.flv
    26         File destFile = getDestFile(partName, flvFile, avNum);
    27         //原始文件:E:\Videos\Captures\75233634\1\75233634_1_0.flv
    28         File originFile = flvList.get(i);
    29         if (originFile.renameTo(destFile)) {
    30             System.out.println("success!" + destFile.getName());
    31         }
    32     }
    33 }

代码已上传:Github

结果

结果当然成功了,这肯定毋庸置疑了。

终于可以愉快的看视频了...??

坚定而缓慢地做自己力所能及的事。

时间

2019-12-12

地点

zut.north#5 2f

人物

me

竟然顺带复习了一下记叙文的六要素。

喜欢可以关注我,B站或微信公众号搜索 `Ep流苏`

原文地址:https://www.cnblogs.com/tassel/p/12038131.html

时间: 2024-08-30 09:31:28

批量修改bilibili客户端下载视频文件名的相关文章

批量修改指定目录下的文件名

import os def file_name_modify(dir, dir_name): """修改文件名字""" # 获取文件夹目录列表 dir_list = os.listdir(dir) # 进入目录 os.chdir(dir) # 遍历列表 for file in dir_list: # 判断文件是否为目录文件 if os.path.isdir(file): # 拼接前缀名 dir_name = dir_name + ' -- ' +

如何批量修改文件夹下的文件名

在工作或者平时生活中,我们有时候会遇到大批量的文件名需要重命名,十几二十个文件进行一个一个命名还是可以的,但如果涉及到成百上千个文件需要重命名,那一个一个改的方法显然太耗费时间和精力了,如果任务比较紧急的情况下,有时候还会误事.那么有什么办法可以简单一点重命名呢?笔者通过搜索,终于找到了比较合适的方法进行来解决这个问题,下面是操作的步骤. 第一步:获取这些不规则文件的文件名: 打开需要更改文件名的文件夹: 在这个文件夹下,新建一个txt文件,并在其中输入DIR *.*  /B >LIST.csv

Python 批量修改文件名

最近下载了几部美剧(越狱.迷失.权利的游戏......),每集文件名都好长好长..想改短一些,但一个一个改太累了,于是写了个脚本来实现批量修改: 修改前文件名: 修改后文件名: 代码实现: #encoding=utf-8 import os def rename(path,newname): # 获取path目录下的所有文件名和目录名 filenames = os.listdir(path)for filename in filenames: # 判断是文件还是目录 if os.path.isd

(原创)优酷android客户端 下载中 bug 解决

在网络情况不好的情况下,优酷android客户端下载视频会终止,用户放弃下载点击 删除该任务以后,切换到网络好的情况下进行下载,会显示该视频已在下载队列里,然后客户端UI界面却什么都看不到.导致用户根本无法下载. 其实优酷的下载都是使用读文件形式的 在优酷android的文件目录那里,(目前不考虑挂在SD卡和其他存储优化)就是内存设备/youku/offinedata里有很多下载视频的文件夹,里面有文件夹创建的时间.图片.flv形式的分集.info文件.youku.m3u8文件 下载信息(包括下

python windows下批量修改文件名

经常会下载一些资料和学习视频,往往这些资料名称很多,想批量修改又很不方便,刚好用python写一个修改文件名的小程序. windows下安装python这个就不多说了,直接下载安装程序安装即可.https://www.python.org/downloads/ 3.x 2.x 都可以 我这个程序,是利用正则表达式的方式,针对一些比较偏的文件名进行过滤修改.没有针对子目录修改,大家可以自己行加以利用修改. rename-input.py #!/usr/bin/env python #coding:

JAVA批量修改文件名

今天看传智播客的JAVA视频,每次都是接着以前的看的,今天想找特定的一个视频温习一下,发现下载的视频每个视频的名字都很长,以至于后面能区分的那一部分都被忽略了,刚学了点JAVA,突然想着能不能把文件名前面相同的部分都给去掉,这样后面关于视频所讲内容的那一部分就可以显示出来了.好吧,试一下吧. 想了一下思路,首先应该找到要修改的文件所在的目录,获取要修改文件的文件名,然后得到删除不要的那一部分的文件名,给文件重命名完毕. 鉴于初学,很多地方还不是很懂,于是从网上了查了一段代码. import ja

Python3 根据m3u8下载视频,批量下载ts文件并且合并

Python3 根据m3u8下载视频,批量下载ts文件并且合并 m3u8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求,是现在比较流行的一种加载方式,诸如腾讯视频之类大多都是切割成ts流进行加载. 示例代码: import os, shutil import urllib.request, urllib.error, requests #

GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流(转载)

最近听同事说他都在使用GitHub,GitHub是程序员的社区,在里面可以学到很多书上学不到的东西,所以最近在准备入手这方面的知识去尝试学习,正好碰到这么详细完整的文章,就转载了,希望对自己和大家有帮助. GitHub操作总结 : 总结看不明白就看下面的详细讲解. GitHub操作流程 : 第一次提交 : 方案一 : 本地创建项目根目录, 然后与远程GitHub关联, 之后的操作一样; -- 初始化Git仓库 :git init ; -- 提交改变到缓存 :git commit -m 'desc

MFC批量修改文件名工具

1批量修改文件名描述 1.1功能描述 批量修改同一文件夹下文件名字,可以定义一个新名字,后面接着文件从0开始的序号. 1.2所需技术 CFileDialog,CString方法操作得到所需,rename 2批量修改文件名运行流程 3批量修改文件名详细设计 3.1添加文件按钮响应OnAddFile 按下"添加文件"按钮后,打开一个文件对话框objFileDlg.但是要设置objFileDlg最大文件名缓冲区.然后获得第一个文件的起始位置,依次把全部的文件完整名添加到列表控件中,这里列表控