Skip to content

Instantly share code, notes, and snippets.

@praseodym
Created June 21, 2012 09:26
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 praseodym/81ef7db5e99a3905659d to your computer and use it in GitHub Desktop.
Save praseodym/81ef7db5e99a3905659d to your computer and use it in GitHub Desktop.
Collegerama rip to mp4
#!/usr/bin/env python
# By Mark Janssen,
# Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
from xml.dom import minidom
from math import ceil
from collections import deque
from subprocess import call
from tempfile import mkdtemp
from os import chdir, mkdir, symlink, getcwd
import re, sys, shutil
if (len(sys.argv) < 2):
print 'Argument required: collegerama URL'
sys.exit()
if (len(sys.argv) == 3):
x264preset = sys.argv[2]
else:
x264preset = 'fast'
# Slide movie fps
fps = 1
origdir = getcwd()
tmpdir = mkdtemp()
chdir(tmpdir)
print "Temporary directory: " + tmpdir
# - Fetch original URL following redirects
call(["curl", '-s', '-L', sys.argv[1], '-oplayer'])
for line in open("player"):
if "InitParams" in line:
manifest = re.search('manifest=([^,]*),', line).group(1)
playbackticket = re.search('playbackTicket=([^,]*),', line).group(1)
if not playbackticket or not manifest:
print 'Something went fetching player.'
sys.exit()
# - Fetch manifest
call(["curl", '-s', manifest, '-omanifest.xml'])
# - Parse manifest XML
xmldoc = minidom.parse('manifest.xml')
# - Get slide timings
slidelist = xmldoc.getElementsByTagName('Slide')
presid = xmldoc.getElementsByTagName('Id')[0].firstChild.nodeValue
duration = int(ceil(float(xmldoc.getElementsByTagName('Duration')[0].firstChild.nodeValue) * fps))
title = xmldoc.getElementsByTagName('Title')[0].firstChild.nodeValue
output = '%s/%s.mp4' % (origdir, title)
print "College " + title
numslides = len(slidelist)
# - Fetch slides
if numslides:
slides = deque()
for s in slidelist:
timing = int(float(s.attributes['Time'].value) * fps)
slides.append(timing)
slidesdir = tmpdir+'/slides'
mkdir(slidesdir)
chdir(slidesdir)
call(["curl", '-s', 'http://collegerama.tudelft.nl/mediasite/FileServer/Presentation/%s/slide_[0001-%04d]_full.jpg?playbackTicket=%s' % (presid, numslides, playbackticket), '-o#1.jpg'])
shutil.copyfile('0001.jpg', '0000.jpg')
# - Create files with correct fps
slides2dir = tmpdir+'/slides2'
mkdir(slides2dir)
chdir(slides2dir)
x = 0
s = -1
for f in range(1, duration):
if f > x and slides:
s+=1
x = slides.popleft()
# print 'frame %d: %d (<%d)' % (f, s, x)
symlink('%s/%04d.jpg' % (slidesdir, s), '%06d.jpg' % f)
slidesmovie = '%s/slides.mp4' % tmpdir
call(['ffmpeg', '-f', 'image2', '-r', '1', r'-i', '%06d.jpg', '-preset', 'ultrafast', slidesmovie])
shutil.rmtree(slidesdir)
shutil.rmtree(slides2dir)
# filter = '[in] scale=640:360, pad=1280:480:640:0 [college]; movie=%s, scale=640:480 [slides]; [college][slides] overlay=0:0 [out]' % slidesmovie
filter = '[in] scale=512:288, pad=1024:786:512:480 [college]; movie=%s, scale=640:480 [slides]; [college][slides] overlay=0:0 [out]' % slidesmovie
else:
filter = 'scale=640:360'
# - Render video!
chdir(tmpdir)
videouri = xmldoc.getElementsByTagName('VideoUri')[0].firstChild.nodeValue.replace('mms:', 'mmsh:').replace('playbackTicket=', 'playbackTicket='+playbackticket)
print videouri
call(['ffmpeg', '-i', videouri, '-vf', filter, '-preset', x264preset, output])
shutil.rmtree(tmpdir)
print "Done! Output file: " + output
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment