Skip to content

Instantly share code, notes, and snippets.

@matthewhochler
Last active October 27, 2016 16:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matthewhochler/40a61e4244641d77d5db946fb2bbc3c4 to your computer and use it in GitHub Desktop.
Save matthewhochler/40a61e4244641d77d5db946fb2bbc3c4 to your computer and use it in GitHub Desktop.
Download MSNBC episodes - Deprecated
#!/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