{"version":3,"sources":["jsdelivr-header.js","/npm/canalplus-video-downloader@1.0.0/bin/index.js"],"names":[],"mappings":"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","file":"/npm/canalplus-video-downloader@1.0.0/bin/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/canalplus-video-downloader@1.0.0/bin/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nvar async = require('async');\nvar request = require('request');\nvar exec = require('child_process').exec;\nvar colour = require('colour');\nvar _ = require('lodash');\nvar path = require('path');\nvar uuid = require('uuid');\nvar ProgressBar = require('progress');\nvar parseXml = require('xml2js').parseString;\nvar fs = require('fs');\nvar PLAYER_URL = \"http://service.canal-plus.com/video/rest/getVideos/cplus/\";\n\nmodule.exports = function (ids) {\n\n    var bar = new ProgressBar('  downloading [:bar] :percent :etas', {\n        complete: '=',\n        incomplete: ' ',\n        width: 50,\n        total: ids.length\n    });\n\n    async.eachLimit(ids, 10, function (videoId, big_callback) {\n        async.waterfall([function getVideoInfo(callback) {\n            request.get(PLAYER_URL + videoId, function (err, resp, body) {\n                parseXml(body, {\n                    normalizeTags: true,\n                    mergeAttrs: true\n                }, function (err, xml) {\n                    try {\n                        var info = xml.videos.video[0].infos[0];\n                        var media = xml.videos.video[0].media[0];\n                        var rtn = {};\n                        rtn.date = info.publication[0].date[0].replace(/\\//g, '-');\n                        rtn.title = info.titrage[0].titre[0];\n                        rtn.subTtitle = info.titrage[0].sous_titre[0];\n                        rtn.playlistURL = media.videos[0].hls[0];\n                        callback(null, rtn);\n                    } catch (e) {\n                        return callback(('[ERROR] - VIDEO \\'' + videoId + '\\' DOES NOT EXIST').red);\n                    }\n                });\n            });\n        }, function getVideoUrl(info, callback) {\n            // QUICKER WAY\n            callback(null, _.set(info, 'segmentsUrl', info.playlistURL.replace('master', 'index_3_av')));\n\n            // request.get(info.playlistURL, (err, resp, body) => {\n            //         let segmentsUrl = body.split('\\n').filter(e => e.includes('index_3_av.m3u8'))\n            //         if (!segmentsUrl || !segmentsUrl[0]) {\n            //           return callback('[ERROR] no video found');\n            //         }\n            //         callback(null, )\n            //     })\n        }, function getSegmentsUrl(info, callback) {\n            request.get(info.segmentsUrl, function (err, resp, body) {\n                var files = body.split('\\n').filter(function (e) {\n                    return e.startsWith('http');\n                });\n                if (!files && !files.length) {\n                    return callback('[ERROR] no segments found');\n                }\n                callback(null, _.set(info, 'files', files));\n            });\n        }, function createTmpFolder(info, callback) {\n            info.filename = info.date + ' - ' + info.title;\n            info.fullname = info.date + ' - ' + info.title + '.mp4';\n            info.fileDest = path.join('/tmp', info.filename);\n            fs.mkdir(info.fileDest, function (err, folder) {\n                return callback(null, info);\n            });\n        }, function downloadSegments(info, callback) {\n            console.time('download ' + info.filename);\n            async.eachLimit(info.files, 10, function (file, cb) {\n                var stream = fs.createWriteStream(path.join(info.fileDest, path.basename(file)));\n                var totalLength = 0;\n                request.get(file).on('response', function (resp) {\n                    return totalLength = resp.headers['content-length'];\n                }).on('data', function (chunk) {\n                    return bar.tick(1 / info.files.length * (chunk.length / totalLength));\n                }).on('end', function () {\n                    cb(null);\n                }).pipe(stream);\n            }, function () {\n                // console.timeEnd('download ' + info.filename)\n                callback(null, info);\n            });\n        }, function mergeSegments(info, callback) {\n            if (fs.existsSync(info.fullname)) {\n                fs.unlinkSync(info.fullname);\n            }\n            var files = info.files.map(function (file) {\n                return path.join(info.fileDest, path.basename(file));\n            });\n            var command = [\"ffmpeg\", \"-i\", '\"concat:' + files.join('|') + '\"', \"-c\", \"copy\", \"-bsf:a\", \"aac_adtstoasc\", '\"' + info.fullname + '\"'].join(' ');\n            exec(command, function (error, stdout, stderr) {\n                callback(null, info);\n            });\n        }, function setDate(info, callback) {\n            fs.open(info.fullname, 'r', function (err, fd) {\n                var date = new Date(info.date.split('-').map(function (e) {\n                    return parseInt(e);\n                }).reverse());\n                fs.futimes(fd, date, date, function (err, resp) {\n                    callback(null);\n                });\n            });\n        }], function (err, resp) {\n            if (err) {\n                console.log(err);\n            }\n            big_callback(null);\n        });\n    });\n};"]}