mirror of
https://github.com/Tusko/vimeo-private-downloader.git
synced 2025-07-12 16:13:29 -07:00
added readme
This commit is contained in:
parent
c2dec5b01e
commit
e7ddca17b8
4 changed files with 442 additions and 1 deletions
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -2,4 +2,8 @@
|
||||||
# https://help.github.com/articles/ignoring-files
|
# https://help.github.com/articles/ignoring-files
|
||||||
# Example .gitignore files: https://github.com/github/gitignore
|
# Example .gitignore files: https://github.com/github/gitignore
|
||||||
/bower_components/
|
/bower_components/
|
||||||
/node_modules/
|
/node_modules/
|
||||||
|
|
||||||
|
*.m4a
|
||||||
|
*.m4v
|
||||||
|
*.zip
|
18
README.md
Normal file
18
README.md
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Vimeo Private Video Downloader
|
||||||
|
|
||||||
|
Node.js script helps you to download private videos from [Vimeo](https://vimeo.com)
|
||||||
|
|
||||||
|
Before you start, make sure you have installed [Node.js](https://nodejs.org/en/download/).
|
||||||
|
|
||||||
|
To check it run in terminal `node -v`. You will see `v10.11.0` for example. If you get error, install latest [Node.js](https://nodejs.org/en/download/).
|
||||||
|
|
||||||
|
To download videos you have to:
|
||||||
|
|
||||||
|
1. Open the browser developer tools on the network tab (`F12` on Windows/Linux, `CMD + Option + I` on Mac OS).
|
||||||
|
2. Start the video (or move mouse over the video).
|
||||||
|
3. In the dev tab, locate the load of the "master.json" file, copy its full URL.
|
||||||
|
4. Fill in `url` and `name`(using as filename) fields in `videojson.js` file
|
||||||
|
5. Run: node vimeo-downloader.js
|
||||||
|
6. Wait for console output `🌈 List finished`
|
||||||
|
|
||||||
|
Also, you can combine the m4v and m4a files with [mkvmerge](https://mkvtoolnix.download/)
|
280
videojson.js
Normal file
280
videojson.js
Normal file
|
@ -0,0 +1,280 @@
|
||||||
|
const list = [
|
||||||
|
// {
|
||||||
|
// name: '1. Introduction',
|
||||||
|
// url: 'https://60vod-adaptive.akamaized.net/exp=1581673348~acl=%2F290272859%2F%2A~hmac=85ab02c8b54d38be126dbedb3470a5b46971c475f82e17bde7114a93f652e01f/290272859/sep/video/1099558424,1099558420,1099557256,1099557251/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '2.1. Интро',
|
||||||
|
// url: 'https://117vod-adaptive.akamaized.net/exp=1581671870~acl=%2F207987916%2F%2A~hmac=74fe7a27bee712a90aeb8f0e34b089002adbe65040d757df8e7ebf60ee1f862a/207987916/sep/video/710158253,710158251,710158247,710158246/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '2.2. Mindset',
|
||||||
|
// url: 'https://120vod-adaptive.akamaized.net/exp=1581671964~acl=%2F207987919%2F%2A~hmac=c41f0eeb2c69b5ad3ec5045a9734544bbe15dab83e1d554d986bef8963d27a64/207987919/sep/video/710158304,710158302,710158298,710158294/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '2.3. Точка А и точка В',
|
||||||
|
// url: 'https://122vod-adaptive.akamaized.net/exp=1581672008~acl=%2F207987921%2F%2A~hmac=b444cacf99794d91a4b6b4d9df1e3e5b262980920ff21e809b7fe8f939fec49a/207987921/sep/video/710158242,710158240,710158238,710158235/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '2.4. 1 000 000 $ на пальцах фрезеровщика',
|
||||||
|
// url: 'https://127vod-adaptive.akamaized.net/exp=1581672039~acl=%2F207987926%2F%2A~hmac=ecc09a091f26ad9f9d30567ca88d9fd849172c4e760b4122076ac7731504f0a5/207987926/sep/video/710158301,710158299,710158295,710158293/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '2.5. Результат',
|
||||||
|
// url: 'https://130vod-adaptive.akamaized.net/exp=1581672064~acl=%2F207987929%2F%2A~hmac=16da1f0b4103ec1149a9b9e337920cb05f179a3e868b6e02f13e3061d20a2d18/207987929/sep/video/710158255,710158254,710158250,710158249/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '2.6. БОНУС: Интервью с Дейвом Ван Хузом',
|
||||||
|
// url: 'https://133vod-adaptive.akamaized.net/exp=1581672083~acl=%2F207987932%2F%2A~hmac=47690044cf3be7d1f9c5e9ac7757b7f4a4db2e416208624d154a1120c4c4ae50/207987932/sep/video/710158248,710158245,710158244,710158243/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '3.1. Интро',
|
||||||
|
// url: 'https://171vod-adaptive.akamaized.net/exp=1581672104~acl=%2F207987970%2F%2A~hmac=485e218f1289c98592147a00f0c8e49ee46a5c135f806a43239c9d7f1959098a/207987970/sep/video/710158477,710158475,710158473,710158470/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '3.2. Где рождается прибыль?',
|
||||||
|
// url: 'https://172vod-adaptive.akamaized.net/exp=1581672126~acl=%2F207987971%2F%2A~hmac=247dbb6e31563275fec146e146e5a9935ce306dcdbfd045cdba7609fb32a90a9/207987971/sep/video/710158488,710158485,710158483,710158480/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '3.3. 4 основные причины, почему не покупают',
|
||||||
|
// url: 'https://174vod-adaptive.akamaized.net/exp=1581674496~acl=%2F207987973%2F%2A~hmac=e254fc5539370bca3ed5d08a9587a6ef790a8dcdf95a04c248cc98ada36cbd7d/207987973/sep/video/710158493,710158491,710158490,710158489/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '3.4. Ценообразование (1. Задача)',
|
||||||
|
// url: 'https://176vod-adaptive.akamaized.net/exp=1581672161~acl=%2F207987975%2F%2A~hmac=12bf61b21f6a99e3ec88120f7931903d6627b8417c1469465bcdfbcd3f8ca150/207987975/sep/video/710158481,710158479,710158478,710158476/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '3.5. Ценообразование (2. Первичное ценообразование)',
|
||||||
|
// url: 'https://180vod-adaptive.akamaized.net/exp=1581672186~acl=%2F207987979%2F%2A~hmac=71d818fccf150de019c0063a45bf53a51d0326c31e08776c41d40d3ad8ef8965/207987979/sep/video/710158471,710158469,710158468,710158466/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '3.6. Ценообразование (3. Корректировка ценовых стандартов)',
|
||||||
|
// url: 'https://183vod-adaptive.akamaized.net/exp=1581672923~acl=%2F207987982%2F%2A~hmac=e04535517ffe3e49a73f9685d714f0fe32d5cca30d5b610d3051c718b99caf9f/207987982/sep/video/710158487,710158486,710158484,710158482/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '3.7. Ценообразование (4. Ценообразование для продвижения)',
|
||||||
|
// url: 'https://186vod-adaptive.akamaized.net/exp=1581674178~acl=%2F207987985%2F%2A~hmac=a3308955322b7be62e0b7aada1bcff2c0e0344e5858e4946370092467b477854/207987985/sep/video/710158543,710158540,710158539,710158537/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
{
|
||||||
|
name: '3.8. Ценообразование (5. Условия оплаты)',
|
||||||
|
url: 'https://187vod-adaptive.akamaized.net/exp=1581686305~acl=%2F207987986%2F%2A~hmac=1f9e72ad60a1056ff02247690cbf50605ea29a6b850426d59cf0609caa28d335/207987986/sep/video/710580598,710158518,710158516,710158513/master.json?base64_init=1'
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// name: '3.9. Внедрение максимизаторов прибыли',
|
||||||
|
// url: 'https://190vod-adaptive.akamaized.net/exp=1581672258~acl=%2F207987989%2F%2A~hmac=539a91587117c00501dc9140af23bfe0dff59a0dcb45ae7db786ecf771152e79/207987989/sep/video/710158500,710158499,710158498,710158497/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.1. Intro',
|
||||||
|
// url: 'https://80vod-adaptive.akamaized.net/exp=1581675672~acl=%2F207988079%2F%2A~hmac=363e26fba066add90ea08e35c1f1728076b695ff9c260307d57d14b55b39569e/207988079/sep/video/710158880,710158878,710158877,710158874/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.2. Storytelling',
|
||||||
|
// url: 'https://82vod-adaptive.akamaized.net/exp=1581675766~acl=%2F207988081%2F%2A~hmac=e6896f268944c672884e820a1446773b86884eb2b8ca0a7c3e027314b9ed74fa/207988081/sep/video/710158892,710158891,710158888,710158887/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.3. Scarcity',
|
||||||
|
// url: 'https://84vod-adaptive.akamaized.net/exp=1581676004~acl=%2F207988083%2F%2A~hmac=0d3a61e0cebf06d06b6661d87fb95f569b11f8353cd25a079ba5c65068cde14c/207988083/sep/video/710158957,710158956,710158955,710158953/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.4. Specificity',
|
||||||
|
// url: 'https://85vod-adaptive.akamaized.net/exp=1581675073~acl=%2F207988084%2F%2A~hmac=0ec6728b1fea9ee3aa52ab73b56ec61abc632d74d2091961793b33c6b5aacd26/207988084/sep/video/710158858,710158856,710158855,710158854/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.5. Emotions',
|
||||||
|
// url: 'https://87vod-adaptive.akamaized.net/exp=1581675615~acl=%2F207988086%2F%2A~hmac=35317698436003ac6f403ccab58aba93e7d0fe790a6dd19f9e1bfcf81a3287ee/207988086/sep/video/710158889,710158883,710158882,710158881/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.6. Satisfaction Conviction',
|
||||||
|
// url: 'https://89vod-adaptive.akamaized.net/exp=1581675107~acl=%2F207988088%2F%2A~hmac=7cc878ada7c6ebbd9421c7557cf489e87c282939eb1b7dc062ad226ebd3cebbd/207988088/sep/video/710158844,710158843,710158840,710158839/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.7. Reciprocity - Guilt',
|
||||||
|
// url: 'https://92vod-adaptive.akamaized.net/exp=1581675859~acl=%2F207988091%2F%2A~hmac=7cc7fbd92c82cc83cdad15c37ef4f3bc23193b70a0e10d063c841e15a2b99961/207988091/sep/video/710158868,710158867,710158865,710158864/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.8. Authority - Credibility - Legitimacy',
|
||||||
|
// url: 'https://94vod-adaptive.akamaized.net/exp=1581676552~acl=%2F207988093%2F%2A~hmac=a0180e12dc3ee05adda9086bf031c42395d0122272cb1b9c8b31b14591addc18/207988093/sep/video/710158879,710158876,710158875,710158873/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.9. Involvement In Ownership',
|
||||||
|
// url: 'https://95vod-adaptive.akamaized.net/exp=1581676381~acl=%2F207988094%2F%2A~hmac=1b76c81b3fced75ac407d2cf5bfebfa879adf2084af7e5a07d0f0c67bdcd0048/207988094/sep/video/710158872,710158871,710158870,710158869/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.10. Future Pacing',
|
||||||
|
// url: 'https://97vod-adaptive.akamaized.net/exp=1581675172~acl=%2F207988096%2F%2A~hmac=6a108fd5e3650bc9298ff7da6379d8718a315134a9aef30d793c2d92720647d4/207988096/sep/video/710158916,710158914,710158912,710158911/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.11. Desire Тo Сollect',
|
||||||
|
// url: 'https://98vod-adaptive.akamaized.net/exp=1581675190~acl=%2F207988097%2F%2A~hmac=ac44f988796c8dc215ce59876943c9930448414d2b908c822d2d993fc06cad3d/207988097/sep/video/710158917,710158915,710158913,710158910/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.12. Objection Raising - Objection Resolution',
|
||||||
|
// url: 'https://102vod-adaptive.akamaized.net/exp=1581675210~acl=%2F207988101%2F%2A~hmac=502b9b2931402c46f5e60a41007d745d808a9fb180b64adc9e1a234169f5f5a6/207988101/sep/video/710158947,710158945,710158943,710158941/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.13. Simplicity',
|
||||||
|
// url: 'https://104vod-adaptive.akamaized.net/exp=1581675224~acl=%2F207988103%2F%2A~hmac=4cfba1656be873dd7fc8c6e1bb3da57b0871c4e4c4d7720c117bb42315aedf67/207988103/sep/video/710158951,710158948,710158946,710158940/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.14. Consistency',
|
||||||
|
// url: 'https://105vod-adaptive.akamaized.net/exp=1581675450~acl=%2F207988104%2F%2A~hmac=fe545e6c3fd0c32fb7a7b8cfb8e06419e8d48973b3796b6e9d0cf724764848b1/207988104/sep/video/710158954,710158952,710158950,710158949/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '4.15. Триггеры. Дополнительные видео',
|
||||||
|
// url: 'https://144vod-adaptive.akamaized.net/exp=1581677012~acl=%2F207990743%2F%2A~hmac=678d10e338721d0df95b22d136649566bbb424914d067c36feced58c8b697136/207990743/sep/video/710168243,710168237,710168236,710168233/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '5.1. One to Manу: Part 1',
|
||||||
|
// url: 'https://139vod-adaptive.akamaized.net/exp=1581677925~acl=%2F207988138%2F%2A~hmac=9bd7b7ec50ea220750f8d71abcb5f76d867b1d836706e2d417abf160139340ea/207988138/sep/video/710159156,710159155,710159154,710159151/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '5.2. One to Manу: Part 2',
|
||||||
|
// url: 'https://141vod-adaptive.akamaized.net/exp=1581677946~acl=%2F207988140%2F%2A~hmac=95f7a21acd816c40578e5bcb410b3865531d2830c789ffd528cf05782b7f7a6f/207988140/sep/video/710159153,710159152,710159150,710159149/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '5.3. One to Manу: Part 3',
|
||||||
|
// url: 'https://145vod-adaptive.akamaized.net/exp=1581678423~acl=%2F207988144%2F%2A~hmac=3a0d3beb35d53dace4d2c43482144097a7bbcd09b49468260030b13b18ca59d1/207988144/sep/video/710159165,710159164,710159159,710159158/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '5.4. One to Manу: Part 4',
|
||||||
|
// url: 'https://149vod-adaptive.akamaized.net/exp=1581678152~acl=%2F207988148%2F%2A~hmac=9349bde34936e66c9c0986dbdace9fa158bc583c35a52a22467974c85536e7aa/207988148/sep/video/710159162,710159161,710159160,710159157/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '5.5. One to Manу: Part 5',
|
||||||
|
// url: 'https://8vod-adaptive.akamaized.net/exp=1581678000~acl=%2F261479807%2F%2A~hmac=9f51ae59fc174be552beb98ceb7f4baeabdab6fcb46cfd46117ecd69fd7180d6/261479807/sep/video/962773425,962773419,962773415,962773412/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '6.1. Автоматические воронки продаж',
|
||||||
|
// url: 'https://94vod-adaptive.akamaized.net/exp=1581681481~acl=%2F261479893%2F%2A~hmac=be336380fa5227b4e6fa51cf5a17bdbeaa9f3573a40fb2b82caf52bf2eab82df/261479893/sep/video/962774203,962774202,962774196,962774194/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '6.2. Lead Magnet',
|
||||||
|
// url: 'https://22vod-adaptive.akamaized.net/exp=1581681972~acl=%2F207988221%2F%2A~hmac=f8ff6f4672e676e1381e9d33d9016d15b7d990bb2f250223ca0236820b3a3626/207988221/sep/video/710159454,710159453,710159452,710159451/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '6.3. Tripwire',
|
||||||
|
// url: 'https://26vod-adaptive.akamaized.net/exp=1581680005~acl=%2F207988225%2F%2A~hmac=d79be290bbe403d76b64ba7c52dde001fe4fcd072a639e69539fd0e774f576bd/207988225/sep/video/710159461,710159460,710159458,710159456/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '6.4. Core offer',
|
||||||
|
// url: 'https://27vod-adaptive.akamaized.net/exp=1581681465~acl=%2F207988226%2F%2A~hmac=068443f20a8ca8ab67db910e8fdf8fff39c7d4e38dbfff940c45f25b08d44afa/207988226/sep/video/710159504,710159503,710159502,710159499/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '6.5. Profit Maximizer',
|
||||||
|
// url: 'https://30vod-adaptive.akamaized.net/exp=1581680037~acl=%2F207988229%2F%2A~hmac=2a97060c3bb29f31e273d2f864d26163509dc936ddb3243561d774c6fa82c64e/207988229/sep/video/710159462,710159459,710159457,710159455/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '7.1. Автоматизация. Часть 1',
|
||||||
|
// url: 'https://67vod-adaptive.akamaized.net/exp=1581682419~acl=%2F207988266%2F%2A~hmac=6abf24f1ebfd0fcd064fa57e94efb948fb8ebeae41734ccaf83764d8f7c7746d/207988266/sep/video/710159662,710159661,710159660,710159658/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '7.2. Автоматизация. Часть 2',
|
||||||
|
// url: 'https://70vod-adaptive.akamaized.net/exp=1581681188~acl=%2F207988269%2F%2A~hmac=22694c7bc2faae17c9f113979ef5188dff3a8d365f77389e0b89e0feca86b94f/207988269/sep/video/710159706,710159705,710159704,710159703/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '7.3. Автоматизация. Часть 3',
|
||||||
|
// url: 'https://73vod-adaptive.akamaized.net/exp=1581684852~acl=%2F207988272%2F%2A~hmac=9c51412c570b2c61d5162235f515dd9a983708769ee6ce72ec34e064d6a5a226/207988272/sep/video/710159710,710159709,710159708,710159707/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '7.4. Автоматизация. Часть 4',
|
||||||
|
// url: 'https://74vod-adaptive.akamaized.net/exp=1581683541~acl=%2F207988273%2F%2A~hmac=4bd02585a8dce59985f281a4ae80fbbd2f56ad749065cb198144ba734f46f5e0/207988273/sep/video/710159714,710159713,710159712,710159711/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '7.5. Автоматизация. Часть 5',
|
||||||
|
// url: 'https://76vod-adaptive.akamaized.net/exp=1581683943~acl=%2F207988275%2F%2A~hmac=647f6cfb9371ab6f48a9a52572536533fd5123a100d29fa123f8d88e140b0d76/207988275/sep/video/710159718,710159717,710159716,710159715/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '7.6. Автоматизация. Часть 6',
|
||||||
|
// url: 'https://78vod-adaptive.akamaized.net/exp=1581680725~acl=%2F207988277%2F%2A~hmac=947eb7ed54ad7749a22032b24474ee0d7795fb75b9489b9207bc4d4d7b6323fb/207988277/sep/video/710159702,710159701,710159700,710159698/master.json?base64_init=1'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '8.1. Трафик как система. Часть 1',
|
||||||
|
// url: 'https://101vod-adaptive.akamaized.net/exp=1581681661~acl=%2F207988300%2F%2A~hmac=0170d1485b2d698367340c12883f1f5fab16c09f2b2c3f8694fc8a7bf281bdf9/207988300/sep/video/710159808,710159807,710159806,710159802/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '8.2. Трафик как система. Часть 2',
|
||||||
|
// url: 'https://104vod-adaptive.akamaized.net/exp=1581682665~acl=%2F207988303%2F%2A~hmac=6b9e0ab166b8e2bc485e915fea2f571cf52f050afec328bd2e6a5ffd6dd69851/207988303/sep/video/710159874,710159873,710159872,710159867/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '8.3. Трафик как система. Часть 3',
|
||||||
|
// url: 'https://107vod-adaptive.akamaized.net/exp=1581682336~acl=%2F207988306%2F%2A~hmac=ec9fc995f009e73861659ac494d64e2d4d85fe5c769ba5c0261ca99e48b72f64/207988306/sep/video/710159924,710159923,710159922,710159919/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '8.4. Трафик как система. Часть 4',
|
||||||
|
// url: 'https://112vod-adaptive.akamaized.net/exp=1581681764~acl=%2F207988311%2F%2A~hmac=f85fd9c8a963f83a669b02c614f995f534a678d9f5736840ff7d8227951dca59/207988311/sep/video/710159871,710159870,710159869,710159864/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '9.1. Cooperation - 1',
|
||||||
|
// url: 'https://151vod-adaptive.akamaized.net/exp=1581683365~acl=%2F261084150%2F%2A~hmac=e919c02d5731bfebf829fd7b39125355c4de882831c272afdca67de3e41ee7b2/261084150/sep/video/960814913,960814912,960814911,960814909/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '9.2. Cooperation - 2',
|
||||||
|
// url: 'https://13vod-adaptive.akamaized.net/exp=1581684726~acl=%2F261479612%2F%2A~hmac=27146f399732efe548c00c7f862fbfb3940e330d74e4c98b1d83c11036d1e576/261479612/sep/video/962773018,962773017,962773015,962773014/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '9.3. Cooperation - 3',
|
||||||
|
// url: 'https://7vod-adaptive.akamaized.net/exp=1581683384~acl=%2F261084206%2F%2A~hmac=10309f3f9c593ae5fcaf7432bf61f518fac1bc4b45892a69dd89fa934013c497/261084206/sep/video/960815134,960815132,960815131,960815130/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '9.4. Cooperation - 4',
|
||||||
|
// url: 'https://16vod-adaptive.akamaized.net/exp=1581683394~acl=%2F261084215%2F%2A~hmac=99f5077a7263d43257a8b7dc64bdfd43e2f13ee43bf7afa354e3b99fa19affef/261084215/sep/video/960815368,960815366,960815364,960815363/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '9.5. Cooperation - 5',
|
||||||
|
// url: 'https://73vod-adaptive.akamaized.net/exp=1581683403~acl=%2F261084272%2F%2A~hmac=3af8ae33c6284474cc23ce560d827fb29d503ce818e77071bfc71e18f91a795e/261084272/sep/video/960815772,960815771,960815769,960815762/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '9.6. Cooperation - 6',
|
||||||
|
// url: 'https://82vod-adaptive.akamaized.net/exp=1581684257~acl=%2F261083881%2F%2A~hmac=561f193cf4c7740fd351d398f1e0cbccaa12241282e2bfb7f165bbb88d4b1552/261083881/sep/video/960814081,960814079,960814078,960814070/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '9.7. Cooperation - 7',
|
||||||
|
// url: 'https://9vod-adaptive.akamaized.net/exp=1581685046~acl=%2F261084008%2F%2A~hmac=b63199c9451acf6c072de30302d282a321e8d15232efd4b59f363048042988c2/261084008/sep/video/960814772,960814771,960814770,960814769/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '9.8. Cooperation - 8',
|
||||||
|
// url: 'https://3vod-adaptive.akamaized.net/exp=1581683432~acl=%2F261479602%2F%2A~hmac=11090b70c841e1d13a60b14ed89626e3e006035453a5557b7e9f45bc9abd381f/261479602/sep/video/962771893,962771892,962771891,962771890/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '10.1. Customer service - Введение',
|
||||||
|
// url: 'https://1vod-adaptive.akamaized.net/exp=1581684523~acl=%2F261480200%2F%2A~hmac=55b44d4f9aa994957dfc5a815b1948e5685c722631a7a1564c58b97e9aeb1c9f/261480200/sep/video/962775467,962775459,962775456,962775454/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '10.2. Правила и стандарты сервиса',
|
||||||
|
// url: 'https://80vod-adaptive.akamaized.net/exp=1581684279~acl=%2F261480079%2F%2A~hmac=81978971e5319bf5600e1619ab0c337a1ff2f8dea7b3bbc8e44e61eb3da8a0c0/261480079/sep/video/962774807,962774806,962774733,962774731/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '10.3. Таблица ответственности',
|
||||||
|
// url: 'https://63vod-adaptive.akamaized.net/exp=1581684315~acl=%2F261479462%2F%2A~hmac=48bfa514677d1bba8f4dd5a6f3baa2f08996767e2f100c380f7ea72525c93259/261479462/sep/video/962771830,962771828,962771827,962771826/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '10.4. Работа с клиентами в социальных сетях',
|
||||||
|
// url: 'https://186vod-adaptive.akamaized.net/exp=1581685140~acl=%2F261114985%2F%2A~hmac=d2d191ca54483c586392a1cfd0e7a168cb15bf5a9604f87c84eae61da298a82c/261114985/sep/video/960965202,960965201,960965200,960965199/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '10.5. Заключение',
|
||||||
|
// url: 'https://181vod-adaptive.akamaized.net/exp=1581684348~acl=%2F261114580%2F%2A~hmac=38ac2358e59c8cef1f69a51a4d8c58c61cb15930c87fb2f64fc21de8c05dedd4/261114580/sep/video/960962300,960962299,960962294,960962293/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '11.1. Зачем это вам?',
|
||||||
|
// url: 'https://116vod-adaptive.akamaized.net/exp=1581684907~acl=%2F261117315%2F%2A~hmac=8e89467eb1d940ebdc140073900fa0b7d1868f45bd19387635712cfdf75b4006/261117315/sep/video/960975762,960975761,960975759,960975756/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '11.2. Что такое деньги?',
|
||||||
|
// url: 'https://17vod-adaptive.akamaized.net/exp=1581684938~acl=%2F261117416%2F%2A~hmac=253515fd1b1cb6eaf07975de2ca50dc7352027bb8d35ab81c44ceba2460f72ee/261117416/sep/video/960976054,960976050,960976047,960976039/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '11.3. Created future',
|
||||||
|
// url: 'https://105vod-adaptive.akamaized.net/exp=1581684954~acl=%2F261117504%2F%2A~hmac=5596a862d8bc7a9d5152bb5a3542fd59144334aa385f674bdd01bd3b013e1f36/261117504/sep/video/960976871,960976860,960976859,960976858/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: '11.4. PxQ',
|
||||||
|
// url: 'https://62vod-adaptive.akamaized.net/exp=1581684969~acl=%2F261117261%2F%2A~hmac=457efdb88843a44b490f5b943aa3904fe5a330810f0f74895451d872131eec56/261117261/sep/video/960975200,960975199,960975195,960975194/master.json?base64_init=1',
|
||||||
|
// },
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
url: '',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
module.exports = list
|
139
vimeomaster.js
Normal file
139
vimeomaster.js
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
const fs = require("fs");
|
||||||
|
const url = require("url");
|
||||||
|
const https = require("https");
|
||||||
|
const log = (...args) => console.log("→", ...args);
|
||||||
|
const list = require("./videojson.js");
|
||||||
|
const promises = [];
|
||||||
|
|
||||||
|
list.forEach((el, i) => {
|
||||||
|
if (!el.name && !el.url) return;
|
||||||
|
|
||||||
|
promises.push(loadVideo(i));
|
||||||
|
});
|
||||||
|
|
||||||
|
Promise.all(promises).then(function(values) {
|
||||||
|
log("🌈", ` List finished`);
|
||||||
|
});
|
||||||
|
|
||||||
|
function loadVideo(num) {
|
||||||
|
let masterUrl = list[num].url;
|
||||||
|
if (!masterUrl.endsWith("?base64_init=1")) {
|
||||||
|
masterUrl += "?base64_init=1";
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise(resolve => {
|
||||||
|
getJson(masterUrl, (err, json) => {
|
||||||
|
if (err) {
|
||||||
|
log("⚠️", ` ${err}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const videoData = json.video
|
||||||
|
.sort((v1, v2) => v1.avg_bitrate - v2.avg_bitrate)
|
||||||
|
.pop();
|
||||||
|
const audioData = json.audio
|
||||||
|
.sort((a1, a2) => a1.avg_bitrate - a2.avg_bitrate)
|
||||||
|
.pop();
|
||||||
|
|
||||||
|
const videoBaseUrl = url.resolve(
|
||||||
|
url.resolve(masterUrl, json.base_url),
|
||||||
|
videoData.base_url
|
||||||
|
);
|
||||||
|
const audioBaseUrl = url.resolve(
|
||||||
|
url.resolve(masterUrl, json.base_url),
|
||||||
|
audioData.base_url
|
||||||
|
);
|
||||||
|
|
||||||
|
processFile(
|
||||||
|
"video",
|
||||||
|
videoBaseUrl,
|
||||||
|
videoData.init_segment,
|
||||||
|
videoData.segments,
|
||||||
|
list[num].name + ".m4v",
|
||||||
|
err => {
|
||||||
|
if (err) {
|
||||||
|
log("⚠️", ` ${err}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
processFile(
|
||||||
|
"audio",
|
||||||
|
audioBaseUrl,
|
||||||
|
audioData.init_segment,
|
||||||
|
audioData.segments,
|
||||||
|
list[num].name + ".m4a",
|
||||||
|
err => {
|
||||||
|
if (err) {
|
||||||
|
log("⚠️", ` ${err}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(num + 1);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function processFile(type, baseUrl, initData, segments, filename, cb) {
|
||||||
|
if (fs.existsSync(filename)) {
|
||||||
|
log("⚠️", ` ${filename} - ${type} already exists`);
|
||||||
|
cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
const segmentsUrl = segments.map(seg => baseUrl + seg.url);
|
||||||
|
|
||||||
|
const initBuffer = Buffer.from(initData, "base64");
|
||||||
|
fs.writeFileSync(filename, initBuffer);
|
||||||
|
|
||||||
|
const output = fs.createWriteStream(filename, {
|
||||||
|
flags: "a"
|
||||||
|
});
|
||||||
|
|
||||||
|
combineSegments(type, 0, segmentsUrl, output, filename, err => {
|
||||||
|
if (err) {
|
||||||
|
log("⚠️", ` ${err}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
output.end();
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function combineSegments(type, i, segmentsUrl, output, filename, cb) {
|
||||||
|
if (i >= segmentsUrl.length) {
|
||||||
|
log("🏁", ` ${filename} - ${type} done`);
|
||||||
|
return cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
log(
|
||||||
|
"📦",
|
||||||
|
type === "video" ? "📹" : "🎧",
|
||||||
|
`Downloading ${type} segment ${i}/${segmentsUrl.length} of ${filename}`
|
||||||
|
);
|
||||||
|
|
||||||
|
https
|
||||||
|
.get(segmentsUrl[i], res => {
|
||||||
|
res.on("data", d => output.write(d));
|
||||||
|
|
||||||
|
res.on("end", () =>
|
||||||
|
combineSegments(type, i + 1, segmentsUrl, output, filename, cb)
|
||||||
|
);
|
||||||
|
})
|
||||||
|
.on("error", e => {
|
||||||
|
cb(e);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getJson(url, cb) {
|
||||||
|
let data = "";
|
||||||
|
|
||||||
|
https
|
||||||
|
.get(url, res => {
|
||||||
|
res.on("data", d => (data += d));
|
||||||
|
|
||||||
|
res.on("end", () => cb(null, JSON.parse(data)));
|
||||||
|
})
|
||||||
|
.on("error", e => {
|
||||||
|
cb(e);
|
||||||
|
});
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue