-
-
Save jonatasleon/8e80592cfee9e769236089a4d40beaeb to your computer and use it in GitHub Desktop.
| #!/bin/env python3 | |
| import argparse | |
| import base64 | |
| import os | |
| import re | |
| import subprocess | |
| import sys | |
| from tempfile import mkstemp | |
| import requests | |
| from tqdm import tqdm | |
| if len(sys.argv) > 1: | |
| master_json_url = sys.argv[1] | |
| output_file = sys.argv[2] | |
| else: | |
| print('master.json must be passed as argument', file=sys.stderr) | |
| exit(1) | |
| base_url = master_json_url[:master_json_url.rfind('/', 0, -26) + 1] | |
| resp = requests.get(master_json_url) | |
| content = resp.json() | |
| heights = [(i, d['height']) for (i, d) in enumerate(content['video'])] | |
| idx, _ = max(heights, key=lambda h: h[1]) | |
| video = content['video'][idx] | |
| video_base_url = base_url + video['base_url'] | |
| print('base url:', video_base_url) | |
| filenameVideo = mkstemp(prefix='.mp4')[1] | |
| print ('saving to {}'.format(filenameVideo)) | |
| video_file = open(filenameVideo, 'wb') | |
| init_segment = base64.b64decode(video['init_segment']) | |
| video_file.write(init_segment) | |
| for segment in tqdm(video['segments']): | |
| segment_url = video_base_url + segment['url'] | |
| resp = requests.get(segment_url, stream=True) | |
| if resp.status_code != 200: | |
| print('not 200!') | |
| print(resp) | |
| print(segment_url) | |
| break | |
| for chunk in resp: | |
| video_file.write(chunk) | |
| video_file.flush() | |
| video_file.close() | |
| # Audio download here | |
| bitrate = [(i, d['bitrate']) for (i, d) in enumerate(content['audio'])] | |
| print('Bitrate', bitrate) | |
| idx, _ = max(bitrate, key=lambda x: x[1]) | |
| audio = content['audio'][idx] | |
| audio_base_url = base_url + audio['base_url'] | |
| print('Base url:', audio_base_url) | |
| filenameAudio = mkstemp(prefix='.mp4')[1] | |
| print('Saving AUDIO to %s' % filenameAudio) | |
| audio_file = open(filenameAudio, 'wb') | |
| init_segment = base64.b64decode(audio['init_segment']) | |
| audio_file.write(init_segment) | |
| for segment in tqdm(audio['segments']): | |
| segment_url = audio_base_url + segment['url'] | |
| segment_url = re.sub(r'/[a-zA-Z0-9_-]*/\.\./',r'/',segment_url.rstrip()) | |
| resp = requests.get(segment_url, stream=True) | |
| if resp.status_code != 200: | |
| print('not 200!') | |
| print(resp) | |
| print(segment_url) | |
| break | |
| for chunk in resp: | |
| audio_file.write(chunk) | |
| audio_file.flush() | |
| audio_file.close() | |
| print('Combining video and audio...') | |
| cmd = 'ffmpeg -y -i ' | |
| cmd += filenameAudio | |
| cmd += ' -i ' | |
| cmd += filenameVideo | |
| cmd += ' ' + output_file | |
| subprocess.call(cmd, shell=True) | |
| print('Mixing Done!') | |
| # Delete the remaining single audio and video files | |
| os.remove(filenameAudio) | |
| os.remove(filenameVideo) | |
| print("Temporary files removed!") | |
| print("Done!") |
Instructions
pip install requests tqdm
curl -o vimeo-download.py -L https://git.io/JJ0sN
chmod u+x vimeo-download.py
./vimeo-download <master.json url>Traceback (most recent call last):
File "C:\windows\system32\vimeo-download.py", line 16, in
output_file = sys.argv[2]
IndexError: list index out of range
How did you call the script in command line?
Did you did that? ./vimeo-download <master.json url> Where master.json url is url that load the metadata necessary to web player play the video.
Traceback (most recent call last):
File "C:\windows\system32\vimeo-download.py", line 16, in
output_file = sys.argv[2]
IndexError: list index out of range
it expects 2 arguments
json as the first and the name of the output file as second
so do something like this
./vimeo-download.py https://......master.json?base64_init=1 output.mp4
Thank you for script!
Unfortunately I was unable to get video because of /video/ and /audio/ part in master.json url:
...5fa435624613465457624/sep/video/234251241,324535,234254,23452352,53b36b3d/audio/5745456,3245345/master.json
So I've added line
base_url = base_url.split('/video/', 1)[0] + '/video/'
before line 29:
video_base_url = base_url + video['base_url']
And video urls became correct.
UPDATE: mkstemp argument 'prefix' is wrong - it leads to temp files like ''.mp4q3inl_k0".
mkstemp(suffix='.mp4')[1] might be better :)
Also add:
cmd += ' -c:v copy -c:a copy '
after cmd += filenameVideo
to avoid re-encoding
Where can i get master.json url for example for this video https://player.vimeo.com/video/819183591
Shorter URL for raw: https://git.io/JJ4rV