collection of pan.do/ra scripts
This commit is contained in:
commit
52454eced2
4 changed files with 93 additions and 0 deletions
1
.bzrignore
Normal file
1
.bzrignore
Normal file
|
@ -0,0 +1 @@
|
|||
settings.json
|
5
README
Normal file
5
README
Normal 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
4
settings.json.example
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"username": "user",
|
||||
"password": "password"
|
||||
}
|
83
text2edit.py
Executable file
83
text2edit.py
Executable 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
|
||||
|
||||
|
Loading…
Reference in a new issue