Package elisa :: Package extern :: Module upnp_content_directory
[hide private]
[frames] | no frames]

Source Code for Module elisa.extern.upnp_content_directory

  1  # Licensed under the MIT license 
  2  # http://opensource.org/licenses/mit-license.php 
  3   
  4  # Copyright 2006-2008 Elisa team <contact@fluendo.com> 
  5   
  6  import re 
  7   
8 -def get_media_type(protocolInfo):
9 match = re.match(".*\:.*\:(.*)/(.*)\:.*", protocolInfo) 10 media_type = '' 11 format = '' 12 if match: 13 media_type, format = match.groups() 14 return media_type, format
15 16
17 -class Object:
18
19 - def __init__(self, id, name, child_count, parent):
20 21 self.id = id 22 self.name = name 23 #if child_count: 24 # reset child_count since it will be updated later on when Item instances 25 # will be added to the Folder 26 # TODO: handle this in non-recursive browsing scenario 27 #child_count = 0 28 self.child_count = child_count 29 if parent: 30 parent.add_child(self) 31 self.parentID = parent.get_id() 32 else: 33 self.parentID = -1
34
35 - def get_id(self):
36 return self.id
37
38 - def as_dict(self):
39 r = {'id': self.id, 'name': self.name, } 40 return r
41 42
43 -class Folder(Object):
44
45 - def __init__(self, id, name, child_count, search_class, parent):
46 Object.__init__(self, id, name, child_count, parent) 47 self.children = [] 48 self.search_class = search_class
49
50 - def add_child(self, child):
51 self.children.append(child) 52 self.child_count += 1
53
54 - def get_folder_with_id(self, folder_id):
55 folders = [ child for child in self.children 56 if isinstance(child, Folder) and \ 57 str(child.get_id()) == str(folder_id) ] 58 if folders: 59 folder = folders[0] 60 else: 61 folder = None 62 for child in self.children: 63 if isinstance(child, Folder): 64 folder = child.get_folder_with_id(folder_id) 65 if folder: 66 break 67 68 return folder
69
70 - def get_search_class(self):
71 return self.search_class
72
73 - def as_dict(self):
74 r = Object.as_dict(self) 75 r['children'] = [] 76 for child in self.children: 77 r['children'].append(child.as_dict()) 78 return r
79
80 -class Item(Object):
81
82 - def __init__(self, id, name, parentID, urls):
83 Object.__init__(self, id, name, 0, parentID) 84 self.urls = {} 85 self.urls_by_protocol = urls 86 for url, protocolInfo in urls.iteritems(): 87 self.urls[url] = get_media_type(protocolInfo)
88
89 - def get_url(self, preferred_formats):
90 for preferred_format in preferred_formats: 91 for url, (media_type, format) in self.urls.iteritems(): 92 if preferred_format == format: 93 return url 94 return ''
95
96 - def get_urls(self):
97 return self.urls
98
99 - def get_media_type(self):
100 infos = self.urls.values() 101 media_type = '' 102 if infos: 103 media_type = infos[0][0] 104 return media_type
105
106 - def get_mime_type(self, url):
107 infos = self.urls.get(url) 108 mime_type = '' 109 if infos: 110 mime_type = '%s/%s' % (infos[0], infos[1]) 111 return mime_type
112
113 - def as_dict(self):
114 r = Object.as_dict(self) 115 r.update({'urls': self.urls}) 116 return r
117
118 -def _sort_list(a_list):
119 r = [] 120 o = [] 121 a_list.sort() 122 for i in a_list: 123 try: 124 i = int(i) 125 except: 126 o.append(i) 127 else: 128 r.append(i) 129 r.sort() 130 r = [str(i) for i in r] 131 o.sort() 132 return r + o
133
134 -def _get_parent(root, folder, folders):
135 parent_id = folder['parent_id'] 136 parent = root.get_folder_with_id(parent_id) 137 if not parent: 138 if parent_id == '0': 139 parent = root 140 else: 141 try: 142 parent_parent_id = folders[parent_id]['parent_id'] 143 parent_parent = root.get_folder_with_id(parent_parent_id) 144 parent = Folder(parent_id, 145 folders[parent_id]['title'], 146 folder['child_count'], folder['upnp_class'], 147 parent_parent) 148 except KeyError: 149 print 'Parent not found for folder %s in %s' % (parent_id, 150 folders.keys()) 151 return parent
152 153
154 -def buildHierarchy(hashed_items, container_id, container_name, 155 build_parents=True):
156 items = {} 157 folders = {} 158 for item_id, item in hashed_items.iteritems(): 159 if not item.has_key('resources') or not item['resources']: 160 # folder 161 folders[item_id] = item 162 else: 163 items[item_id] = item 164 165 keys = _sort_list(folders.keys()) 166 167 root = Folder(container_id, container_name, 0, [], None) 168 169 for folder_id in keys: 170 folder = folders[folder_id] 171 172 if build_parents: 173 parent = _get_parent(root,folder, folders) 174 else: 175 parent = root 176 177 Folder(folder_id, folder['title'], folder['child_count'], 178 folder['upnp_class'], parent) 179 180 for item_id, item in items.iteritems(): 181 folder_id = item['parent_id'] 182 folder = root.get_folder_with_id(folder_id) 183 if not folder: 184 folder = root 185 Item(item_id, item['title'], folder, item['resources']) 186 187 return root
188