批量修改bilibili下載視頻的文件名

批量修改bilibili下載視頻的文件名

<font size=4>

[TOC]

需求

在bilibili上下載了學(xué)習視頻蝗肪,bili的客戶端看視頻非常不方便词顾,習慣用potplayer看視頻;但是bili上下載視頻的文件名都是類似50200264_1_0.flv這樣格式,所以就修改成bili上對應(yīng)的詳細介紹的文件名垃它,類似01 介紹及快速搭建 Spring Boot 項目這個格式的。

分析

  1. 查看下載視頻的目錄烹看,發(fā)現(xiàn)在視頻全集下面分了兩層目錄


    文件目錄
  2. 最底層有三個文件国拇,其中flv文件,是視頻文件惯殊,也是需要重命名的文件; xml文件記錄的是彈幕; info文件記錄的是文件信息酱吝,查看info文件可知,有個 "PartName" 字段記錄的是文件名土思,獲取這個字段信息即可务热。

    PartName

  1. 思路
    1. 遍歷視頻全集文件夾
    2. 讀取info文件忆嗜,截取"PartName"字段信息即文件名,排序后將文件名保存到臨時文件demo.txt
    3. 手動修改demo.txt文件內(nèi)容崎岂,修改成整齊的格式
    4. 遍歷文件夾捆毫,獲取flv文件的文件名,并截取其中的序號冲甘,比如 50200264_1_0.flv绩卤,獲取中間的序號1,作為index
    5. 按行順序讀取demo.txt文件江醇,將讀取的文件名保存到ArrayList中濒憋,通過步驟4中的index-1獲取
    6. 重命名

實現(xiàn)

  1. 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;
    }
    
  2. 獲取“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;
    }
    
  3. 將排序后的字符串寫入到文件中

    /**
     * 將排序后的字符串寫入到文件中
     * @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();
    }
    
  4. 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;
    }
    
  5. 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;
    }
    
  6. 讀取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é)果

  1. 修改后的結(jié)果如下颜屠,需要注意的是辰妙,修改文件名后,bilibili的客戶端就不能再查看文件了甫窟。


    修改后的文件名
  1. PotPlayer文件列表展示如下:


    PotPlayer播放列表
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末密浑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粗井,更是在濱河造成了極大的恐慌尔破,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浇衬,死亡現(xiàn)場離奇詭異懒构,居然都是意外死亡,警方通過查閱死者的電腦和手機耘擂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門胆剧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人醉冤,你說我怎么就攤上這事秩霍「菝酰” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵铃绒,是天一觀的道長鸽照。 經(jīng)常有香客問我,道長匿垄,這世上最難降的妖魔是什么移宅? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮椿疗,結(jié)果婚禮上漏峰,老公的妹妹穿的比我還像新娘。我一直安慰自己届榄,他們只是感情好浅乔,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铝条,像睡著了一般靖苇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上班缰,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天贤壁,我揣著相機與錄音,去河邊找鬼埠忘。 笑死脾拆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的莹妒。 我是一名探鬼主播名船,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旨怠!你這毒婦竟也來了渠驼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤鉴腻,失蹤者是張志新(化名)和其女友劉穎迷扇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽哎,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡谋梭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倦青。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡盹舞,死狀恐怖产镐,靈堂內(nèi)的尸體忽然破棺而出隘庄,到底是詐尸還是另有隱情,我是刑警寧澤癣亚,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布丑掺,位于F島的核電站,受9級特大地震影響述雾,放射性物質(zhì)發(fā)生泄漏街州。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一玻孟、第九天 我趴在偏房一處隱蔽的房頂上張望唆缴。 院中可真熱鬧,春花似錦黍翎、人聲如沸面徽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趟紊。三九已至,卻和暖如春碰酝,著一層夾襖步出監(jiān)牢的瞬間霎匈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工送爸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铛嘱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓碱璃,卻偏偏與公主長得像弄痹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嵌器,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一肛真、基礎(chǔ)知識:1、JVM爽航、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,365評論 0 4
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,446評論 0 13
  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序運行的過程中蚓让,可能需要對一些設(shè)備進...
    征程_Journey閱讀 948評論 0 1
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,358評論 0 17
  • 1讥珍、從味蕾的角度上去給一個食物打分历极,比如你吃到這個東西,你覺得他可以打10分衷佃。趟卸,那就證明這個東西非常好吃,接著往下...
    三歲就愛笑Lxx閱讀 97評論 0 0