collection of pan.do/ra scripts

This commit is contained in:
j 2014-02-24 17:54:00 +05:30
commit 52454eced2
4 changed files with 93 additions and 0 deletions

1
.bzrignore Normal file
View file

@ -0,0 +1 @@
settings.json

5
README Normal file
View file

@ -0,0 +1,5 @@
A collection of pan.do/ra scripts
text2edit.py
creates a new edit with all videos embedded in a text

4
settings.json.example Normal file
View file

@ -0,0 +1,4 @@
{
"username": "user",
"password": "password"
}

83
text2edit.py Executable file
View file

@ -0,0 +1,83 @@
#!/usr/bin/env python
from __future__ import division
import json
import re
import sys
from optparse import OptionParser
from urllib import quote, unquote
from urlparse import urlparse
import ox
def encode_url(value):
return quote(value.replace(' ', '_'))
def decode_url(value):
return unquote(value.replace('_', ' '))
usage = "usage: %prog [options] text_url [name]"
parser = OptionParser(usage=usage)
parser.add_option('-s', '--settings', dest='settings',
help='path to settings.json', default='settings.json', type='string')
(opts, args) = parser.parse_args()
if not args:
parser.print_help()
sys.exit(1)
try:
settings = json.load(open(opts.settings))
except:
print 'Failed to open "%s" please create valid json file with username/password' % opts.settings
sys.exit(1)
u = urlparse(args[0])
base_url = '%s://%s/' % (u.scheme, u.netloc)
api = ox.API('%sapi/' % base_url)
text_id = unquote(args[0].split('/')[-1].replace('_', ' '))
name = args[1] if len(args) == 2 else ':'.join(text_id.split(':')[1:])
r = api.signin(username=settings['username'], password=settings['password'])
if r['status']['code'] != 200 or 'errors' in r['data']:
print 'failed to login'
sys.exit()
text = api.getText(id=text_id)['data']['text']
clips = []
for link in re.compile('href="([^"]*?)#embed').findall(text):
parts = link[1:].split('/')
if len(parts) == 3 and parts[0] not in ('grid', 'map'):
id = parts[0]
view = parts[1]
if view in ('editor', 'player', 'timeline'):
points = parts[2].split(',')
if len(points) == 3:
points = points[1:]
clips.append({
'item': id,
'in': ox.time2ms(points[0])/1000,
'out': ox.time2ms(points[1])/1000
})
durations = {}
items = list(set([c['item'] for c in clips]))
for item in items:
r = api.get(id=item, keys=['duration'])
durations[item] = r['data']['duration']
for c in clips:
if c['out'] > durations[c['item']]:
print 'fixing', c, 'setting out to', durations[c['item']]
c['out'] = durations[c['item']]
r = api.addEdit(name=name, type='static', clips=clips)
if 'id' in r['data']:
edit_url = '%sedits/%s' % (base_url, encode_url(r['data']['id']))
print edit_url, 'created'
else:
print 'ERROR'
print r