Last active
October 27, 2016 16:53
-
-
Save matthewhochler/40a61e4244641d77d5db946fb2bbc3c4 to your computer and use it in GitHub Desktop.
Download MSNBC episodes - Deprecated
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import logging | |
import multiprocessing | |
import os | |
import urllib2 | |
import subprocess | |
import sys | |
import time | |
from xml.etree import ElementTree | |
__version__ = '2016.07.11' | |
class MsnbcPlayer(object): | |
def __init__(self, player_url): | |
self.player_url = player_url | |
def playlist_url(self): | |
return self.player_url.replace('manifest=f4m', 'manifest=m3u') | |
def playlist_xml(self): | |
playlist_url = self.playlist_url() | |
logging.info(playlist_url) | |
response = urllib2.urlopen(playlist_url) | |
response.readline() | |
playlist = u'<smil>\n' + response.read() | |
logging.info(playlist) | |
return playlist | |
def stream_url(self): | |
xml = self.playlist_xml() | |
tree = ElementTree.fromstring(xml) | |
elem = tree.find('.//video') | |
return elem.get('src') | |
@staticmethod | |
def video_mp4(stream_url, filename): | |
process = multiprocessing.Process(target=subprocess.call, args=([ | |
'ffmpeg', | |
'-y', # Overwrite output file if necessary | |
'-v', 'warning', # Log only warnings and errors | |
'-i', stream_url, | |
'-codec', 'copy', # Copy video codec | |
'-bsf:a', 'aac_adtstoasc', # Convert audio codec to AAC | |
filename, | |
],)) | |
process.start() | |
return process | |
def main(player_url, filename=None): | |
sys.stdout.write('\nmsnbc-dl v{}\n'.format(__version__)) | |
sys.stdout.write('\nGetting stream URL...') | |
sys.stdout.flush() | |
client = MsnbcPlayer(player_url) | |
stream_url = client.stream_url() | |
sys.stdout.write(' Done!\n') | |
sys.stdout.write(stream_url) | |
sys.stdout.flush() | |
if filename is not None: | |
filename = os.path.abspath(filename) | |
sys.stdout.write('\n\nConverting to MP4...') | |
sys.stdout.flush() | |
start_time = time.time() | |
process = client.video_mp4(stream_url, filename) | |
while process.is_alive() is True: | |
time.sleep(5) | |
sys.stdout.write('.') | |
sys.stdout.flush() | |
sys.stdout.write(' Done!') | |
elapsed = int(time.time() - start_time) | |
sys.stdout.write('\nElapsed: {}sec\n'.format(elapsed)) | |
sys.stdout.write(filename) | |
sys.stdout.flush() | |
if __name__ == '__main__': | |
player_url = sys.argv[1] | |
try: | |
filename = sys.argv[2] | |
except IndexError: | |
filename = None | |
main(player_url, filename) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment