update the qt4reactor
[smewt:smewt.git] / smewt / plugins / coherencestore.py
1 # -*- coding: utf-8 -*-
2 # Licensed under the MIT license
3 # http://opensource.org/licenses/mit-license.php
4 #
5 # Copyright 2011, Ricard Marxer <ricard@smewt.com>
6 # Copyright 2011, Caleb Callaway <enlightened-despot@gmail.com>
7 # Copyright 2007-2010, Frank Scholz <dev@coherence-project.org>
8 # Copyright 2007, James Livingston  <doclivingston@gmail.com>
9
10 import os.path
11 import coherence.extern.louie as louie
12 import urllib
13
14 from smewt.media.series.serieobject import Series, Episode
15 from smewt.media.movie.movieobject import Movie
16 from smewt.base.utils import tolist
17
18 from coherence import __version_info__
19
20 from coherence.upnp.core import DIDLLite
21 from coherence.upnp.core import utils
22
23 from coherence.backend import BackendItem, BackendStore
24
25 from coherenceviews import *
26
27 ROOT_CONTAINER_ID = 0
28 VIDEO_CONTAINER = 100
29 SERIES_CONTAINER_ID = 101
30 MOVIES_CONTAINER_ID = 102
31
32 CONTAINER_COUNT = 10000
33
34 class MediaStore(BackendStore):
35
36     logCategory = 'smewt_media_store'
37     implements = ['MediaServer']
38
39     def __init__(self, server, **kwargs):
40         BackendStore.__init__(self,server,**kwargs)
41         self.warning("__init__ MediaStore %r", kwargs)
42         """
43         self.wmc_mapping.update({'4': lambda : self.get_by_id(SERIES_CONTAINER_ID),    # all series
44                                  '7': lambda : self.get_by_id(MOVIES_CONTAINER_ID)
45                                  })
46         """
47         self.server = server
48         self.smewt_db = kwargs.get("smewt_db", None)
49         self.urlbase = kwargs.get("urlbase", "")
50         self.only_available = kwargs.get("only_available", True)
51         self.series = None
52         self.episodes = None
53         
54         self.next_id = 0
55         self.items = {}
56         self.ids = {}
57         
58         try:
59             self.name = kwargs['name']
60         except KeyError:
61             self.name = "Smewt on %s" % self.server.coherence.hostname
62
63         self.root_container = Container(self, self.name, -1)
64         
65         self.add_container('All series', lambda pid: advSeries(self, self.smewt_db, parent_id=pid))
66         self.add_container('All movies', lambda pid: allMovies(self, self.smewt_db, parent_id=pid))
67         self.add_container('Movies by genre', lambda pid: moviesByProperty(self, self.smewt_db, 'genres', parent_id=pid))
68         self.add_container('Movies by year', lambda pid: moviesByProperty(self, self.smewt_db, 'year', getProperty = lambda x: [x.get('year', None)], parent_id=pid))
69         self.add_container('Movies by director', lambda pid: moviesByProperty(self, self.smewt_db, 'director', parent_id=pid))
70         self.add_container('Movies by cast', lambda pid: moviesByProperty(self, self.smewt_db, 'cast', getProperty = lambda x: [act.split('--')[0] for act in x.get('cast', [])], parent_id=pid))
71         
72         louie.send('Coherence.UPnP.Backend.init_completed', None, backend=self)
73
74     def add_container(self, name, childrenMethod):
75         cont = Container(self, name, self.root_container.get_id())
76         cont.add_children(childrenMethod(cont.id))
77         self.root_container.add_child(cont)
78
79     def get_by_id(self,id):
80         self.info("looking for id %r", id)
81         if '@' in id:
82           id = id.split('@')[0]
83         return self.items[int(id)]
84         
85     def new_item(self, item):
86         #FIXME: make a proper mapping between pygoo and upnp ids
87         item_id = self.next_id
88         """
89         smewt_id = tuple(item.keys())
90         if smewt_id in self.ids:
91           return self.ids[item]
92         """
93         self.items[item_id] = item
94         #self.ids[smewt_id] = item_id
95         
96         #print item_id
97         
98         self.next_id += 1
99       
100         return item_id
101
102     def upnp_init(self):
103         if self.server:
104           self.server.connection_manager_server.set_variable(0, 'SourceProtocolInfo',
105                              ['internal:%s:video/mp4:*' % self.server.coherence.hostname,
106                               'http-get:*:video/mp4:*',
107                               'internal:%s:video/x-msvideo:*' % self.server.coherence.hostname,
108                               'http-get:*:video/x-msvideo:*',
109                               'internal:%s:video/mpeg:*' % self.server.coherence.hostname,
110                               'http-get:*:video/mpeg:*',
111                               'internal:%s:video/avi:*' % self.server.coherence.hostname,
112                               'http-get:*:video/avi:*',
113                               'internal:%s:video/divx:*' % self.server.coherence.hostname,
114                               'http-get:*:video/divx:*',
115                               'internal:%s:video/quicktime:*' % self.server.coherence.hostname,
116                               'http-get:*:video/quicktime:*'],
117                              default=True)
118           self.server.content_directory_server.set_variable(0, 'SystemUpdateID', self.update_id)
119
120         self.warning("__init__ MediaStore initialized")