nodejs 簡單學習之爬去視頻網站ts文件,合成一個ts視頻文件

 利用nodejs,request包 定時爬去 網站視頻ts接口,大概有1771個文件。javascript

首先,獲取到網站的ts視頻分段配置文件,獲取到後,放入本地文件,方便下次使用。java

而後,定時調用下載函數,進行下載,node

爬去過程當中會有下載失敗的,全部我在爬去完畢後,檢查下載失敗的,再次進行下載,服務器

最後,exec包執行cmd命令 進行合成一個ts文件函數

const request = require("request");
const fs = require("fs");
const { exec } = require('child_process');
const emptyFile = [];
const failDownload = [];

function reload(results) {
    results.forEach(el => {
        let checkUrl = './download/' + el;      //檢查文件是否已經存在
        if(fs.existsSync(checkUrl)) {        //獲取文件信息
            const r = fs.statSync(checkUrl);        //若是大小爲0,則是下載失敗的
            if(r && r.size == 0) {
                emptyFile.push(el);          //刪除下載失敗的
                const del = fs.unlinkSync(checkUrl);
                if(del) {
                    throw '刪除ts文件異常'
                }
                else {
                    console.log(el + '刪除成功')
                }          //從新下載
                download(el)
            }
        }
        else {
            download(el)
        }
    });
}
//這個合成函數在編輯中運行會報錯,暫且複製到cmd中運行的
function composite() {  // "/b":表示按二進制合併;不加就默認按字符轉合併,會出問題
    exec("copy /b H:\self-study\下載視頻流\download\*.ts H:\self-study\下載視頻流\download\冷血追擊.ts", (error, stdout, stderr) => {
        if (error) {
          console.error(`執行的錯誤: ${error}`);
          return;
        }
        console.log(`stdout: ${stdout}`);
        console.error(`stderr: ${stderr}`);
      });
}
function download(url) {
    const baseUrl = 'https://youku.com-qq.net/20190502/181_7ffa42fa/1000k/hls/';
    const downloadUrl = __dirname + '/download/' + url;
    request(baseUrl + url, (error, response, body) => {
        if(response) {
            failDownload.push(url);
            console.log(url + '下載成功')
        }
        if(error) {

            console.log(url + '下載失敗')
        }
    })
    .pipe(fs.createWriteStream(downloadUrl))  //下載後,按流直接寫入本地文件
}

const reg = /(\w+\.ts)/mg;
function getList(cb) {
    const getListFile = './download/getlist.txt';

    function doGetAgain () {
        //獲取ts分段配置文件
        request.get('https://youku.com-qq.net/20190502/181_7ffa42fa/1000k/hls/index.m3u8',(error, response, body) => {
            if(typeof body == 'string') {
                let results = body.match(reg);
                console.log(results);
                fs.writeFileSync(getListFile, results.join(','))
                cb && cb(results);
                console.log('從服務器獲取')
                return results;
            }
        })
    }
    //檢車本地是否有該文件
    if(fs.existsSync(getListFile)) {
        let data = fs.readFileSync(getListFile, 'utf-8');
        if(data) {
            console.log('從本地獲取');
            cb(data.split(','));
        }
        else {
           return doGetAgain(cb);
        }
    }
    return doGetAgain(cb);
}
function tickerGet(results) {
    const len = results.length -1;
    let i = 0;
    const ticker = setInterval(() => {
        if(i <= len) {
            download(results[i]);
            i++;
        }
        else {
            clearInterval(ticker);
            reload(results);
        }
    }, 3000)
}
getList(r => {
    //定時獲取下載
    tickerGet(r);
    //從新下載失敗的文件
    reload(r)  
    //合成  
    composite();
});
  
相關文章
相關標籤/搜索