~josephjamesmills/+junk/mythtv-scopes1

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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#!/usr/bin/env python

import urllib2
from xml.etree.ElementTree import parse
import time
from MythTV import MSearch
from urlparse import urlparse
import os
import ConfigParser
from httplib import HTTP

class MythTVService:

    CONFFILE = os.path.expanduser("~")+"/.mythtv-scope-location.conf"

    def findBE(self, NEW=False):
        print "Finding Backend"
        BACKENDLOCATION = None
        for l in MSearch().searchMythBE():
          if l['st'] == 'urn:schemas-mythtv-org:device:MasterMediaServer:1':
            BACKEND = l['location']
            BACKEND = urlparse(BACKEND)
            BACKENDLOCATION = BACKEND.scheme+"://"+BACKEND.netloc
            config = ConfigParser.RawConfigParser()
            if NEW:
                config.add_section('Backend')
            config.set('Backend', 'Location', BACKENDLOCATION)
            response = urllib2.urlopen(BACKENDLOCATION+'/Myth/GetSetting?Key=MasterServerPort')
            tree = parse(response)
            elem = tree.getroot()
            MYTHPROTOCOLPORT = "6544"
            results = elem.find("Settings")
            for l in results:
                MYTHPROTOCOLPORT = l.findtext('Value')
                config.set('Backend', 'MythProtocolPort', MYTHPROTOCOLPORT)
            with open(self.CONFFILE, 'wb') as configfile:
                config.write(configfile)
        return BACKENDLOCATION, MYTHPROTOCOLPORT

    def checkURL(self, url):
        try:
            p = urlparse(url)
            h = HTTP(p[1])
            h.putrequest('HEAD', p[2])
            h.endheaders()
            if h.getreply()[0] == 200:
                return 1
            else:
                return 0
        except IOError:
            return 0

    def update_all(self):
        if not os.path.isfile(self.CONFFILE):
            self.findBE(True)
        config = ConfigParser.RawConfigParser()
        config.read(self.CONFFILE)
        
        try:
            BACKENDLOCATION = config.get('Backend', 'Location')
        except:
            BACKENDLOCATION, MYTHPROTOCOLPORT = self.findBE(True)
            if BACKENDLOCATION == None:
                exit(404)
        try:    
            MYTHPROTOCOLPORT = config.get('Backend', 'MythProtocolPort')
        except:
            BACKENDLOCATION, MYTHPROTOCOLPORT = self.findBE(True)
            if BACKENDLOCATION == None:
                exit(404)
        if not self.checkURL(BACKENDLOCATION):
            BACKENDLOCATION, MYTHPROTOCOLPORT = self.findBE(True)
            if BACKENDLOCATION == None:
                exit(404)
        base = BACKENDLOCATION+"/Dvr/GetRecordedList"
        response = urllib2.urlopen(base)
        tree = parse(response)
        elem = tree.getroot()
        results = elem.find("Programs")
        self.lastupdated = time.time()
        RESULTSLIST=[]
        for l in results:
            PROGRAMDATA={}
            PROGRAMDATA['StartTime'] = l.findtext('StartTime')
            PROGRAMDATA['EndTime'] = l.findtext('EndTime')
            PROGRAMDATA['Title'] = l.findtext('Title')
            PROGRAMDATA['SubTitle'] = l.findtext('SubTitle')
            PROGRAMDATA['Category'] = l.findtext('Category')
            PROGRAMDATA['CatType'] = l.findtext('CatType')
            PROGRAMDATA['Repeat'] = l.findtext('Repeat')
            PROGRAMDATA['VideoProps'] = l.findtext('VideoProps')
            PROGRAMDATA['AudioProps'] = l.findtext('AudioProps')
            PROGRAMDATA['SubProps'] = l.findtext('SubProps')
            PROGRAMDATA['SeriesId'] = l.findtext('SeriesId')
            PROGRAMDATA['ProgramId'] = l.findtext('ProgramId')
            PROGRAMDATA['Stars'] = l.findtext('Stars')
            PROGRAMDATA['FileSize'] = l.findtext('FileSize')
            PROGRAMDATA['LastModified'] = l.findtext('LastModified')
            PROGRAMDATA['ProgramFlags'] = l.findtext('ProgramFlags')
            PROGRAMDATA['FileName'] = l.findtext('FileName')
            PROGRAMDATA['HostName'] = l.findtext('HostName')
            PROGRAMDATA['Airdate'] = l.findtext('Airdate')
            PROGRAMDATA['Description'] = l.findtext('Description')
            PROGRAMDATA['Inetref'] = l.findtext('Inetref')
            PROGRAMDATA['Season'] = l.findtext('Season')
            PROGRAMDATA['Episode'] = l.findtext('Episode')
            PROGRAMDATA['ChanId'] = l.find('Channel').findtext('ChanId')
            PROGRAMDATA['ChanNum'] = l.find('Channel').findtext('ChanNum')
            PROGRAMDATA['CallSign'] = l.find('Channel').findtext('CallSign')
            PROGRAMDATA['IconURL'] = l.find('Channel').findtext('IconURL')
            PROGRAMDATA['ChannelName'] = l.find('Channel').findtext('ChannelName')
            PROGRAMDATA['MplexId'] = l.find('Channel').findtext('MplexId')
            PROGRAMDATA['TransportId'] = l.find('Channel').findtext('TransportId')
            PROGRAMDATA['ServiceId'] = l.find('Channel').findtext('ServiceId')
            PROGRAMDATA['NetworkId'] = l.find('Channel').findtext('NetworkId')
            PROGRAMDATA['ATSCMajorChan'] = l.find('Channel').findtext('ATSCMajorChan')
            PROGRAMDATA['ATSCMinorChan'] = l.find('Channel').findtext('ATSCMinorChan')
            PROGRAMDATA['Format'] = l.find('Channel').findtext('Format')
            PROGRAMDATA['Modulation'] = l.find('Channel').findtext('Modulation')
            PROGRAMDATA['Frequency'] = l.find('Channel').findtext('Frequency')
            PROGRAMDATA['FrequencyId'] = l.find('Channel').findtext('FrequencyId')
            PROGRAMDATA['FrequencyTable'] = l.find('Channel').findtext('FrequencyTable')
            PROGRAMDATA['FineTune'] = l.find('Channel').findtext('FineTune')
            PROGRAMDATA['SIStandard'] = l.find('Channel').findtext('SIStandard')
            PROGRAMDATA['ChanFilters'] = l.find('Channel').findtext('ChanFilters')
            PROGRAMDATA['SourceId'] = l.find('Channel').findtext('SourceId')
            PROGRAMDATA['InputId'] = l.find('Channel').findtext('InputId')
            PROGRAMDATA['CommFree'] = l.find('Channel').findtext('CommFree')
            PROGRAMDATA['UseEIT'] = l.find('Channel').findtext('UseEIT')
            PROGRAMDATA['Visible'] = l.find('Channel').findtext('Visible')
            PROGRAMDATA['XMLTVID'] = l.find('Channel').findtext('XMLTVID')
            PROGRAMDATA['DefaultAuth'] = l.find('Channel').findtext('DefaultAuth')
            PROGRAMDATA['Programs'] = l.find('Channel').findtext('Programs')
            PROGRAMDATA['Status'] = l.find('Recording').findtext('Status')
            PROGRAMDATA['Priority'] = l.find('Recording').findtext('Priority')
            PROGRAMDATA['StartTs'] = l.find('Recording').findtext('StartTs')
            PROGRAMDATA['EndTs'] = l.find('Recording').findtext('EndTs')
            PROGRAMDATA['RecordId'] = l.find('Recording').findtext('RecordId')
            PROGRAMDATA['RecGroup'] = l.find('Recording').findtext('RecGroup')
            PROGRAMDATA['PlayGroup'] = l.find('Recording').findtext('PlayGroup')
            PROGRAMDATA['StorageGroup'] = l.find('Recording').findtext('StorageGroup')
            PROGRAMDATA['RecType'] = l.find('Recording').findtext('RecType')
            PROGRAMDATA['DupInType'] = l.find('Recording').findtext('DupInType')
            PROGRAMDATA['DupMethod'] = l.find('Recording').findtext('DupMethod')
            PROGRAMDATA['EncoderId'] = l.find('Recording').findtext('EncoderId')
            PROGRAMDATA['Profile'] = l.find('Recording').findtext('Profile')
            PROGRAMDATA['ContentType'] = 'TELEVISION'
            PROGRAMDATA['Tagline'] = ''
            PROGRAMDATA['Director'] = ''
            PROGRAMDATA['Studio'] = ''
            PROGRAMDATA['BackendLocation'] = BACKENDLOCATION
            PROGRAMDATA['MythProtocolPort'] = MYTHPROTOCOLPORT
            artwork = l.find("Artwork")
            artworkinfos = artwork.find("ArtworkInfos")
            for art in artworkinfos:
                PROGRAMDATA[art.findtext('StorageGroup')] = art.findtext('URL')
            RESULTSLIST.append(PROGRAMDATA)
        base = BACKENDLOCATION+"/Video/GetVideoList"
        response = urllib2.urlopen(base)
        tree = parse(response)
        elem = tree.getroot()
        results = elem.find("VideoMetadataInfos")
        for l in results:
            VIDEODATA={}
            VIDEODATA['Id'] = l.findtext('Id')
            VIDEODATA['Title'] = l.findtext('Title')
            VIDEODATA['SubTitle'] = l.findtext('SubTitle')
            VIDEODATA['Tagline'] = l.findtext('Tagline')
            VIDEODATA['Director'] = l.findtext('Director')
            VIDEODATA['Studio'] = l.findtext('Studio')
            VIDEODATA['Description'] = l.findtext('Description')
            VIDEODATA['Certification'] = l.findtext('Certification')
            VIDEODATA['Inetref'] = l.findtext('Inetref')
            VIDEODATA['Collectionref'] = l.findtext('Collectionref')
            VIDEODATA['HomePage'] = l.findtext('HomePage')
            VIDEODATA['ReleaseDate'] = l.findtext('ReleaseDate')
            VIDEODATA['AddDate'] = l.findtext('AddDate')
            VIDEODATA['UserRating'] = l.findtext('UserRating')
            VIDEODATA['Length'] = l.findtext('Length')
            VIDEODATA['PlayCount'] = l.findtext('PlayCount')
            VIDEODATA['Season'] = l.findtext('Season')
            VIDEODATA['Episode'] = l.findtext('Episode')
            VIDEODATA['ParentalLevel'] = l.findtext('ParentalLevel')
            VIDEODATA['Visible'] = l.findtext('Visible')
            VIDEODATA['Watched'] = l.findtext('Watched')
            VIDEODATA['Processed'] = l.findtext('Processed')
            VIDEODATA['ContentType'] = l.findtext('ContentType')
            VIDEODATA['FileName'] = l.findtext('FileName')
            VIDEODATA['Hash'] = l.findtext('Hash')
            VIDEODATA['Hostname'] = l.findtext('Hostname')
            VIDEODATA['Trailer'] = l.findtext('Trailer')
            VIDEODATA['StorageGroup'] = 'Videos'
            artwork = l.find("Artwork")
            artworkinfos = artwork.find("ArtworkInfos")
            for art in artworkinfos:
                VIDEODATA[art.findtext('StorageGroup')] = art.findtext('URL')
            VIDEODATA['BackendLocation'] = BACKENDLOCATION
            VIDEODATA['MythProtocolPort'] = MYTHPROTOCOLPORT
            RESULTSLIST.append(VIDEODATA)
        return RESULTSLIST
        			
    def search(self, SEARCHTERM=None):
        FILTEREDLIST=[]
        try:
            if time.time() - self.lastupdated > 60:
                self.resultlist = self.update_all()
        except:
            self.resultlist = self.update_all()
        for result in self.resultlist:
            try:
                ST = SEARCHTERM.lower() 
            except:
                ST = ''
            if ST in result['Title'].lower() or ST in result['SubTitle'].lower() or ST in result['Description'].lower():
                FILTEREDLIST.append(result)
        return FILTEREDLIST

if __name__ == '__main__':
    mt = MythTVService()
    results = mt.search('house')
    for l in results:
        print l['Title'], l['SubTitle']
    exit(0)
    '''Action, Adult, Animals, Art_Music, Business, Children, Comedy, Crime/Mystery, Documentary, Drama, Educational, Food, Game, Health/Medical, History, Horror, HowTo, Misc, Movie, News, Reality, Romance, Science/Nature, SciFi/Fantasy, Shopping, Soaps, Spiritual, Sports, Talk, Travel, Unknown, War, Western'''