Parent: [af36ad] (diff)

Child: [b1ab1b] (diff)

Download this file

uprclutils.py    127 lines (109 with data), 3.9 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
from __future__ import print_function
import sys
import posixpath
import urllib
audiomtypes = frozenset([
'audio/mpeg',
'application/x-flac',
'application/ogg',
'audio/aac',
'audio/mp4',
'audio/x-aiff',
'audio/x-wav'
])
def rcldoctoentry(id, pid, httphp, pathprefix, doc):
"""
Transform a Doc objects into the format expected by the parent
Args:
id (str): objid for the entry
pid (str): objid for the browsed object (the parent container)
httphp: the hostport part of the generated track urls
pathprefix: is provided by our parent process (it's used to
what plugin an url belongs too when needed for
translating the internal into the real url (for plugins
based on external-services)
doc is the Doc object to be translated
Returns:
A dict representing an UPnP item, with the
keys as expected in the plgwithslave.cxx resultToEntries() function.
The permanent URIs, are of the following form, based on the
configured host:port and pathprefix arguments and track Id:
TBD
http://host:port/pathprefix/track?version=1&trackId=<trackid>
"""
uplog("rcldoctoentry: pid %s id %s httphp %s pathprefix %s" %
(pid, id, httphp, pathprefix))
li = {}
if doc.mtype not in audiomtypes:
return li
li['pid'] = pid
li['id'] = id
li['tp'] = 'it'
# Why no dc.title??
li['tt'] = doc.title
# TBD
li['upnp:class'] = 'object.item.audioItem.musicTrack'
# TBD Date format ?
# !! Albumart will have to come from somewhere else !
# li['upnp:class'] = doc.upnpclass
#li['res:channels'] =
#li['res:size'] =
#li['res:bitrate'] =
### #if doc.albumarturi:
### #li['upnp:albumArtURI'] = track.album.image
### li['discnumber'] = str(track.disc_num)
#albumartist=
#comment=
#composer=
#conductor=
#discnumber=
#genre=
#lyricist=
#lyrics=
for oname,dname in [('upnp:album', 'album'), ('releasedate','date'),
('upnp:originalTrackNumber', 'tracknumber'),
('upnp:artist', 'artist'), ('upnp:genre', 'genre'),
('res:mime', 'mtype'), ('duration', 'duration'),
('res:samplefreq', 'sample_rate')]:
val = getattr(doc, dname)
if val:
li[oname] = val
try:
val = li['upnp:originalTrackNumber']
l = val.split('/')
li['upnp:originalTrackNumber'] = l[0]
except:
pass
# Compute the url. We use the URL from recoll, stripped of file://
# and with the pathprefix prepended (the pathprefix is used by our
# parent process to match urls to plugins)
path = doc.getbinurl()
path = path[7:]
path = pathprefix + path
li['uri'] = "http://%s%s" % (httphp, urllib.quote(path))
uplog("rcldoctoentry: uri: %s" % li['uri'])
return li
def rclpathtoreal(path, pathprefix, httphp, pathmap):
path = path.replace(pathprefix, '', 1)
found = False
for fsp,htp in pathmap.iteritems():
if path.startswith(fsp):
path = path.replace(fsp, htp, 1)
found = True
if not found:
return None
return "http://" + httphp + path
def rcldirentry(id, pid, title, arturi=None, artist=None, upnpclass=None):
""" Create container entry in format expected by parent """
ret = {'id':id, 'pid':pid, 'tt':title, 'tp':'ct', 'searchable':'1'}
if arturi:
ret['upnp:albumArtURI'] = arturi
if artist:
ret['upnp:artist'] = artist
if upnpclass:
ret['upnp:class'] = upnpclass
else:
ret['upnp:class'] = 'object.container'
return ret
def uplog(s):
print(("%s: %s" % ('uprcl', s)).encode('utf-8'), file=sys.stderr)