pandora_mlt/generate.py

108 lines
2.9 KiB
Python
Executable File

#!/usr/bin/python
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
import json
import ox
import os
config = json.load(open(os.path.expanduser('~/.ox/client.json')))
api = ox.API(config['url'])
api.signin(username=config['username'], password=config['password'])
def get_files(item):
files = api.findMedia({
"keys": [
"selected",
#"path",
"part",
"language",
"type",
"duration",
"instances"
],
"query": {
"conditions":[{
"key": "id",
"value": item,
"operator": "=="
}]
},
"range": [0, 100],
"sort": [{"key": "path", "operator": "+"}]
})['data']['items']
files = filter(lambda f: f['type'] == 'video' and f['selected'], files)
for f in files:
f['path'] = f['instances'][0]['path']
del f['instances']
return files
def get_clips(terms, layer):
clips = []
for term in terms:
r = api.findClips({
"keys":["position","annotations","id","in","out","videoRatio", "parts"],
"query":{"conditions":[{"operator":"=","key":layer,"value":term}],
"operator":"&"},
"range":[0,1000],
"sort":[{"operator":"+","key":"position"}],
#"sort":[{"operator":"+","key":"year"}],
"itemsQuery":{
"operator":"&",
"conditions":[{"operator":"=","key":"subtitles","value":term}]
}
})
if not 'data' in r or not 'items' in r['data']:
print r
clips += r['data']['items']
cache = {}
playlist = []
clips.sort(key=lambda c: c['in'])
for clip in clips:
id = clip['id'].split('/')[0]
part = 1
if not id in cache:
cache[id] = get_files(id)
data = cache[id]
position = 0
#FIXME: handle clips that span across parts
for part, f in enumerate(data):
if clip['in'] < position + f['duration']:
clip_in = clip['in'] - position
clip_out = clip['out'] - position
break
else:
position += f['duration']
path = f['path']
print path, clip_in, clip_out
subtitles = ''
for a in clip['annotations']:
subtitles += a['value']
subtitles = ox.strip_tags(subtitles)
playlist.append({
"id": id,
"part": part,
"path": path,
"in": clip_in,
"out": clip_out,
"subtitles": subtitles
})
return playlist
if __name__ == "__main__":
import sys
if len(sys.argv) != 4:
print 'usage: %s <layer> <term> <output.json>' % sys.argv[0]
sys.exit(1)
layer = sys.argv[1]
terms = [sys.argv[2]]
output = sys.argv[3]
playlist = get_clips(terms)
with open(output, 'w') as f:
json.dump(playlist, f, indent=2)