~wattazoum/xbmc/mangas-tv-plugin

« back to all changes in this revision

Viewing changes to plugin.video.mangastv/resources/lib/main_mangastv.py

  • Committer: Oumar Aziz OUATTARA
  • Date: 2010-12-29 11:22:39 UTC
  • Revision ID: wattazoum@gmail.com-20101229112239-yjwnzuv6rqy1mppg
Initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import sys
 
2
import os
 
3
import re
 
4
import md5
 
5
import time
 
6
import urllib
 
7
import urllib2
 
8
import httplib
 
9
import cookielib
 
10
import xbmc
 
11
import xbmcgui
 
12
import xbmcaddon
 
13
import xbmcplugin
 
14
import simplejson as json
 
15
from BeautifulSoup import BeautifulSoup
 
16
 
 
17
__settings__ = sys.modules[ "__main__" ].__settings__
 
18
 
 
19
class updateArgs:
 
20
 
 
21
        def __init__(self, *args, **kwargs):
 
22
                for key, value in kwargs.iteritems():
 
23
                        if value == 'None':
 
24
                                kwargs[key] = None
 
25
                        else:
 
26
                                kwargs[key] = urllib.unquote_plus(kwargs[key])
 
27
                self.__dict__.update(kwargs)
 
28
 
 
29
class LoginMTV:
 
30
        def __init__(self, *args, **kwargs):
 
31
                self.currenturl = None
 
32
                self.referer = None
 
33
                self.opener = None
 
34
                self.settings = {}
 
35
                self.addon = xbmcaddon.Addon(id='plugin.video.mangastv')
 
36
                self.base_cache_path = xbmc.translatePath(self.addon.getAddonInfo('profile'))
 
37
                self.settings['username'] = __settings__.getSetting("username")
 
38
                self.settings['password'] = __settings__.getSetting("password")
 
39
                self.settings['prev_username'] = __settings__.getSetting("prev_username")
 
40
                self.settings['prev_password'] = __settings__.getSetting("prev_password")
 
41
                self.resp = None
 
42
                
 
43
                if self.settings['username'] == '' or self.settings['password'] == '':
 
44
                        self.resp = xbmcgui.Dialog().yesno("No username/password set!","Mangas-TV requires you to be logged in to view", \
 
45
                        "videos.  Would you like to log-in now?")
 
46
                        if self.resp:
 
47
                                __settings__.openSettings()
 
48
                                
 
49
                elif self.settings['username'] != self.settings['prev_username'] or self.settings['password'] != self.settings['prev_password']:
 
50
                        self.removeCookie = True
 
51
                else:
 
52
                        self.removeCookie = False
 
53
 
 
54
        def login(self):
 
55
                if (self.settings['username'] != '' and self.settings['password'] != ''):
 
56
                        
 
57
                        COOKIEFILE=os.path.join(self.base_cache_path, 'cookieMangastv.lwp')
 
58
                        if self.removeCookie == True:
 
59
                                try:
 
60
                                        "Mangastv --> COOKIEFILE DELETED"
 
61
                                        os.remove(COOKIEFILE)
 
62
                                except:
 
63
                                        pass
 
64
                        cj = cookielib.LWPCookieJar()
 
65
                        if os.path.exists(COOKIEFILE):
 
66
                                print "Mangastv -- > Already have the cookie!"
 
67
                                status = self.checkCookie(COOKIEFILE)
 
68
                                if status is True:
 
69
                                        print "Mangastv --> Login succeeded."
 
70
                                        cj.load(COOKIEFILE)
 
71
                                        __settings__.setSetting("prev_username", self.settings['username'])
 
72
                                        __settings__.setSetting("prev_password", self.settings['password'])
 
73
                                else:
 
74
                                        ex = 'XBMC.Notification("Login Failed:","Username/password is incorrect.", 3000)'
 
75
                                        xbmc.executebuiltin(ex)
 
76
                                        os.remove(COOKIEFILE)
 
77
 
 
78
                        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
 
79
                        self.referer = 'https://www.animeftw.tv/login'
 
80
                        self.opener.addheaders = [('Referer', self.referer),('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14')]
 
81
 
 
82
                        if not os.path.exists(COOKIEFILE):
 
83
                                print "Mangastv --> Cookie missing--attempting login!!!"
 
84
                                url = 'https://www.animeftw.tv/login.php'
 
85
                                data = urllib.urlencode({'_submit_check':'1', 'last_page':'http://www.animeftw.tv/videos','username':self.settings['username'],'password':self.settings['password'],'submit':'Sign In', 'remember':'on'})
 
86
                                urllib2.install_opener(self.opener)
 
87
                                try:
 
88
                                        req = self.opener.open(url, data)
 
89
                                        req.close()
 
90
                                        cj.save(COOKIEFILE)
 
91
                                        status = self.checkCookie(COOKIEFILE)
 
92
                                        if status == True:
 
93
                                                __settings__.setSetting("prev_username", self.settings['username'])
 
94
                                                __settings__.setSetting("prev_password", self.settings['password'])
 
95
                                except:
 
96
                                        ex = 'XBMC.Notification("Server Error:","Please try again.", 3000)'
 
97
                                        xbmc.executebuiltin(ex)
 
98
                        
 
99
                        return self.opener, status
 
100
                else:
 
101
                        if self.resp:
 
102
                                return self.opener, False
 
103
                        else:
 
104
                                return self.opener, 'exit'
 
105
                
 
106
        def checkCookie(self, COOKIEFILE):
 
107
                file = open(COOKIEFILE,'r').read()
 
108
                auth = re.search('authenticate=[0-9a-h]{32}', file)
 
109
                if auth != None:
 
110
                        return True
 
111
                else:
 
112
                        return False
 
113
                
 
114
class grabMangastv:
 
115
        def __init__(self, *args, **kwargs):
 
116
                self.opener, self.status = LoginMangastv().login()
 
117
                if not self.status:
 
118
                        self.opener, self.status = LoginMangastv().login()
 
119
                elif self.status is 'exit':
 
120
                        xbmc.executebuiltin('XBMC.Notification("Please Login:","A user account is required to view content.", 3000)')
 
121
                self.addon = xbmcaddon.Addon(id='plugin.video.animeftw')
 
122
                self.base_cache_path = xbmc.translatePath(self.addon.getAddonInfo('profile'))
 
123
                
 
124
        def downloadHTML(self, url):
 
125
                self.currenturl = url
 
126
                self.opener.addheaders = [('Referer', self.referer),('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14')]
 
127
                response = self.opener.open(self.currenturl)
 
128
                html = response.read()
 
129
                print "Mangastv --> GRABBING URL: "+self.currenturl
 
130
                self.referer = self.currenturl
 
131
                return html
 
132
                
 
133
        def getHTML(self, url): 
 
134
                self.currenturl = url
 
135
                htmlSource = None
 
136
                max_age = 3*60*60
 
137
                thumbprint = md5.new(self.currenturl).hexdigest()
 
138
                thumbprint += ".tmp"
 
139
                cache_dir = os.path.join(self.base_cache_path, "cache/");
 
140
                if not os.path.exists(cache_dir):
 
141
                        os.makedirs(cache_dir)
 
142
                cache_file = os.path.join(cache_dir, thumbprint)
 
143
                if os.path.exists(cache_file):
 
144
                        cache_modified_time = os.stat(cache_file).st_mtime
 
145
                        time_now = time.time()
 
146
                        if cache_modified_time < time_now - max_age:
 
147
                                print "Mangastv --> Cache is too old..."
 
148
                                htmlSource = self.downloadHTML(self.currenturl)
 
149
                                file = open(cache_file, 'w')
 
150
                                file.write(htmlSource)
 
151
                                file.close()
 
152
                        else:
 
153
                                htmlSource = open(cache_file, 'r').read()
 
154
                else:
 
155
                        htmlSource = self.downloadHTML(self.currenturl)
 
156
                        file = open(cache_file, 'w')
 
157
                        file.write(htmlSource)
 
158
                        file.close()    
 
159
                        
 
160
                return htmlSource
 
161
                
 
162
        def getInfo(self, title):
 
163
                enableThumbs = __settings__.getSetting("get_ext")
 
164
                info = {}
 
165
                if(enableThumbs == "true"):
 
166
                        thumbprint = md5.new(title).hexdigest()
 
167
                        thumbprint += ".nfo"
 
168
                        cache_dir = os.path.join(self.base_cache_path, "cache/")
 
169
                        cache_file = os.path.join(cache_dir, thumbprint)
 
170
                        if os.path.exists(cache_file):
 
171
                                datapool = open(cache_file, 'r')
 
172
                                datapool = datapool.read()
 
173
                                datapool = json.loads(datapool)
 
174
                        else:
 
175
                                try:
 
176
                                        url = "http://mal-api.com/anime/search?q="
 
177
                                        url += urllib.quote(title)
 
178
                                        datapool = urllib2.urlopen(url)
 
179
                                        datapool = datapool.read()
 
180
                                        file = open(cache_file, 'w')
 
181
                                        file.write(datapool)
 
182
                                        file.close()
 
183
                                        datapool = json.loads(datapool)
 
184
                                except:
 
185
                                        print "Mangastv --> Could not open MAL-API link for series "+str(title)
 
186
                                        datapool = []
 
187
                        
 
188
                        if len(datapool) > 0:
 
189
                                info['thumb'] = str(datapool[0]['image_url'].replace("t.jpg",".jpg"))
 
190
                                info['plot'] = unicode(datapool[0]['synopsis'].replace('<br>','\n')).encode('utf-8')
 
191
                                info['genre'] = ', '.join(datapool[0]['genres'])
 
192
                                info['rating'] = float(datapool[0]['members_score'])
 
193
                        else:
 
194
                                info['thumb'] = 'None'
 
195
                                info['plot'] = 'No plot info available for this series.'
 
196
                                info['genre'] = 'None'
 
197
                                info['rating'] = 0.0
 
198
                else:
 
199
                        info['thumb'] = 'None'
 
200
                        info['plot'] = 'No plot info available for this series.'
 
201
                        info['genre'] = 'None'
 
202
                        info['rating'] = 0.0
 
203
                        
 
204
                return info
 
205
                
 
206
        def getLatest(self):
 
207
                if self.status is True: 
 
208
                        self.referer = "http://www.animeftw.tv/"
 
209
                        htmlSource = self.getHTML("http://www.animeftw.tv")
 
210
                        soup = BeautifulSoup(htmlSource)
 
211
                        latest_list = soup.find('div', attrs={'class':'pad_good'}).findAll('div', attrs={'align':'center'})
 
212
                        latestList = []
 
213
                        for post in latest_list:
 
214
                                postDict = {}
 
215
                                epTitle = post.find('span').contents[0].replace('`', '\'')
 
216
                                showTitle = post.find('a').contents[0].replace('`', '\'')
 
217
                                info = self.getInfo(showTitle)
 
218
                                postDict['url'] = post.find('a')['href']
 
219
                                postDict['name'] = showTitle +" - "+ epTitle
 
220
                                showInfo = {'name': postDict['name'], 'url':"http://www.animeftw.tv"+postDict['url'], 'thumb':info['thumb'], 'plot':info['plot'], 'rating':info['rating'], 'genre': info['genre']}
 
221
                                UI().addItem({'Title':postDict['name'], 'mode':'episodes', 'referer':self.referer, 'url':"http://www.animeftw.tv"+postDict['url'], 'Thumb':showInfo['thumb']}, showInfo, True, len(latest_list))
 
222
                        UI().endofdirectory()
 
223
                
 
224
        def getAllSeries(self, category = 0):
 
225
                if self.status is True:
 
226
                        self.referer = "http://www.animeftw.tv/"
 
227
                        htmlSource = self.getHTML("http://www.animeftw.tv/videos")
 
228
                        soup = BeautifulSoup(htmlSource)
 
229
                        airing_list = soup.find('ul', attrs={'id':'ddsubmenu2'}).find('ul').findAll('li')
 
230
                        completed_list = soup.find('ul', attrs={'id':'ddsubmenu2'}).find(text='Completed Series').findNext('ul').findAll('ul')
 
231
                        completed_list = BeautifulSoup(str(completed_list))
 
232
                        completed_list = completed_list.findAll('li')
 
233
                        series_list = airing_list + completed_list
 
234
                        del soup
 
235
                        del airing_list
 
236
                        del completed_list
 
237
                        for series in series_list:
 
238
                                series = series.find('a')
 
239
                                seriesname = series.contents[0].replace('&nbsp;','').replace('`', '\'')
 
240
                                info = self.getInfo(seriesname)
 
241
                                seriesdict = {'name': seriesname, 'url':"http://www.animeftw.tv"+series['href'], 'thumb':info['thumb'], 'plot':info['plot'], 'rating':info['rating'], 'genre': info['genre']}
 
242
                                UI().addItem({'Title':seriesdict['name'], 'mode':'episodes', 'referer':self.referer, 'url':seriesdict['url'], 'category':'anime_all', 'Thumb':seriesdict['thumb']}, seriesdict, True, len(series_list))
 
243
                        del series_list
 
244
                        UI().endofdirectory('title')
 
245
                
 
246
        def getOVAs(self):
 
247
                if self.status is True:
 
248
                        self.referer = "http://www.animeftw.tv/"
 
249
                        htmlSource = self.getHTML("http://www.animeftw.tv/videos")
 
250
                        soup = BeautifulSoup(htmlSource)
 
251
                        completed_list = soup.find('ul', attrs={'id':'ddsubmenu2'}).find(text='OVA Series').findNext('ul').findAll('li')
 
252
                        del soup
 
253
                        for series in completed_list:
 
254
                                series = series.find('a')
 
255
                                seriesname = series.contents[0].replace('&nbsp;','').replace('`', '\'')
 
256
                                info = self.getInfo(seriesname)
 
257
                                series = {'name':seriesname, 'url':"http://www.animeftw.tv"+series['href'], 'thumb':info['thumb'], 'plot':info['plot'], 'rating':info['rating'], 'genre': info['genre']}
 
258
                                UI().addItem({'Title':series['name'], 'mode':'episodes', 'referer':self.referer, 'url':series['url'], 'category':'ovas', 'Thumb':series['thumb']}, series, True, len(completed_list))
 
259
                        del completed_list
 
260
                        UI().endofdirectory('none')
 
261
                
 
262
        def getMovies(self):
 
263
                if self.status is True:
 
264
                        self.referer = "http://www.animeftw.tv/"
 
265
                        htmlSource = self.getHTML("http://www.animeftw.tv/movies")
 
266
                        soup = BeautifulSoup(htmlSource)
 
267
                        completed_list = soup.find('table', attrs={'width':'100%'}).findAll('tr')
 
268
                        del soup
 
269
                        for movie in completed_list:
 
270
                                cells = movie.findAll('td')
 
271
                                cell = cells[0].find('img')
 
272
                                cell2 = movie.findAll('a', attrs={'href' : re.compile("http://www.animeftw.tv/movies/")})
 
273
                                if len(cell2) > 1:
 
274
                                        for vid in cell2:
 
275
                                                vid_name = vid.string.split(', ')
 
276
                                                movie = {'name':vid_name[1], 'url':vid['href'], 'thumb':cell['src']}
 
277
                                                UI().addItem({'Title':movie['name'], 'mode':'episode', 'referer':self.referer, 'url':movie['url'], 'category':'movies', 'Thumb':movie['thumb']}, None, True, len(completed_list))
 
278
                                else:
 
279
                                        movie = {'name':cell['title'].replace('`', '\''), 'url':cell2[0]['href'], 'thumb':cell['src']}  
 
280
                                        UI().addItem({'Title':movie['name'], 'mode':'episode', 'referer':self.referer, 'url':movie['url'], 'category':'movies', 'Thumb':movie['thumb']}, None, True, len(completed_list))
 
281
                        del completed_list
 
282
                        UI().endofdirectory('none')
 
283
                
 
284
        def getAiringSeries(self):
 
285
                if self.status is True:
 
286
                        self.referer = "http://www.animeftw.tv/"
 
287
                        htmlSource = self.getHTML("http://www.animeftw.tv/videos")
 
288
                        soup = BeautifulSoup(htmlSource)
 
289
                        airing_list = soup.find('ul', attrs={'id':'ddsubmenu2'}).find('ul').findAll('li')
 
290
                        del soup
 
291
                        for series in airing_list:
 
292
                                series = series.find('a')
 
293
                                seriesname = series.contents[0].replace('&nbsp;','').replace('`', '\'')
 
294
                                info = self.getInfo(seriesname)
 
295
                                series = {'name':seriesname, 'url':"http://www.animeftw.tv"+series['href'], 'thumb':info['thumb'], 'plot':info['plot'], 'rating':info['rating'], 'genre': info['genre']}
 
296
                                UI().addItem({'Title':series['name'], 'mode':'episodes', 'referer':self.referer, 'url':series['url'], 'Thumb':series['thumb']}, series, True, len(airing_list))
 
297
                        del airing_list
 
298
                        UI().endofdirectory('title')
 
299
                
 
300
        def getCompletedSeries(self):
 
301
                if self.status is True:
 
302
                        self.referer = "http://www.animeftw.tv/"
 
303
                        htmlSource = self.getHTML("http://www.animeftw.tv/videos")
 
304
                        soup = BeautifulSoup(htmlSource)
 
305
                        completed_list = soup.find('ul', attrs={'id':'ddsubmenu2'}).find(text='Completed Series').findNext('ul').findAll('ul')
 
306
                        completed_list = BeautifulSoup(str(completed_list))
 
307
                        completed_list = completed_list.findAll('li')
 
308
                        del soup
 
309
                        for series in completed_list:
 
310
                                series = series.find('a')
 
311
                                seriesname = series.contents[0].replace('&nbsp;','').replace('`', '\'')
 
312
                                info = self.getInfo(seriesname)
 
313
                                series = {'name':seriesname, 'url':"http://www.animeftw.tv"+series['href'], 'thumb':info['thumb'], 'plot':info['plot'], 'rating':info['rating'], 'genre': info['genre']}
 
314
                                UI().addItem({'Title':series['name'], 'mode':'episodes', 'referer':self.referer, 'url':series['url'], 'Thumb':series['thumb']}, series, True, len(completed_list))
 
315
                        del completed_list
 
316
                        UI().endofdirectory('title')
 
317
        
 
318
        def getGenreSeries(self, id):
 
319
                if self.status is True:
 
320
                        self.referer = "http://www.animeftw.tv/videos"
 
321
                        htmlSource = self.getHTML("http://www.animeftw.tv/videos/sort/"+id)
 
322
                        soup = BeautifulSoup(htmlSource)
 
323
                        container = soup.find('div', attrs={'id':'left_side'})
 
324
                        genre_list = container.findAll(href=re.compile('/videos/.*/'))
 
325
                        del genre_list[0:10]
 
326
                        del soup
 
327
                        for series in genre_list:
 
328
                                seriesname = series.string.replace('`', '\'')
 
329
                                info = self.getInfo(seriesname)
 
330
                                series = {"name":seriesname, "url":"http://www.animeftw.tv"+series['href'], 'thumb':info['thumb'], 'plot':info['plot'], 'rating':info['rating'], 'genre': info['genre']}
 
331
                                UI().addItem({'Title':series['name'], 'mode':'episodes', 'referer':self.referer, 'url':series['url'], 'Thumb':series['thumb']}, series, True, len(genre_list))
 
332
                        del genre_list
 
333
                        UI().endofdirectory('title')
 
334
                
 
335
        def getEpisodes(self, url, referer, category = None):
 
336
                if self.status is True:
 
337
                        self.referer = referer
 
338
                        htmlSource = self.getHTML(url)
 
339
                        soup = BeautifulSoup(htmlSource)
 
340
                        content_table = soup.find('table', attrs={'width':'100%'})
 
341
                        content_tr = content_table.findAll('tr')
 
342
                        content_td = content_tr[int(len(content_tr))-1].findAll('td')
 
343
                        content = content_td[int(len(content_td))-1].findAll('div')
 
344
                        del soup
 
345
                        del content_tr
 
346
                        del content_td
 
347
                        for i, item in enumerate(content):
 
348
                                itemname = str(item.contents[0]) + item.a.string.replace('`', '\'')
 
349
                                list_item = {'name':unicode(itemname).encode('utf-8'), 'url':item.a['href'], 'thumb':'None', 'plot':'None'}
 
350
                                UI().addItem({'Title':list_item['name'],'mode':'episode', 'referer':self.referer, 'url':list_item['url']}, None, True, len(content))
 
351
                        del content
 
352
                        UI().endofdirectory('none')
 
353
                        
 
354
        def getVidLink(self, url, referer, name):
 
355
                self.referer = referer
 
356
                self.name = name
 
357
                htmlSource = self.getHTML(url)
 
358
                r_src = re.compile('(src="(.*).divx")|(src="(.*).mkv")')
 
359
                src = re.search(r_src, htmlSource)
 
360
                src = src.group()
 
361
                src = src.replace('src="','').replace('"','')
 
362
                self.playVid(src, self.referer, self.name)
 
363
                
 
364
        def playVid(self, url, referer, name):
 
365
                stream_url = url+"?bar=1|Referer="+referer
 
366
                item = xbmcgui.ListItem(name)
 
367
                xbmc.Player(xbmc.PLAYER_CORE_DVDPLAYER).play(stream_url, item)
 
368
 
 
369
class UI:
 
370
        
 
371
        def __init__(self):
 
372
                self.main = Main(checkMode = False)
 
373
                xbmcplugin.setContent(int(sys.argv[1]), 'movies')
 
374
        
 
375
        def endofdirectory(self, sortMethod = 'none'):
 
376
                # set sortmethod to something xbmc can use
 
377
                if sortMethod == 'title':
 
378
                        xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL)
 
379
                        xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_VIDEO_RATING)
 
380
                elif sortMethod == 'none':
 
381
                        xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_NONE)
 
382
 
 
383
                dontAddToHierarchy = False
 
384
                xbmcplugin.endOfDirectory(handle = int(sys.argv[1]), updateListing = dontAddToHierarchy)
 
385
                        
 
386
        def addItem(self, info, extrainfo = None, isFolder=True, total_items = 0):
 
387
                #Defaults in dict. Use 'None' instead of None so it is compatible for quote_plus in parseArgs
 
388
                info.setdefault('url', 'None')
 
389
                info.setdefault('Thumb', 'None')
 
390
                info.setdefault('id','None')
 
391
                info.setdefault('category','None')
 
392
                info.setdefault('referer','None')
 
393
                info.setdefault('Icon', info['Thumb'])
 
394
                #create params for xbmcplugin module
 
395
                u = sys.argv[0]+\
 
396
                        '?url='+urllib.quote_plus(info['url'])+\
 
397
                        '&mode='+urllib.quote_plus(info['mode'])+\
 
398
                        '&name='+urllib.quote_plus(info['Title'])+\
 
399
                        '&id='+urllib.quote_plus(info['id'])+\
 
400
                        '&category='+urllib.quote_plus(info['category'])+\
 
401
                        '&referer='+urllib.quote_plus(info['referer'])+\
 
402
                        '&icon='+urllib.quote_plus(info['Thumb'])
 
403
                #create list item
 
404
                if extrainfo != None:
 
405
                        li=xbmcgui.ListItem(label = extrainfo['name'], iconImage = info['Icon'], thumbnailImage = info['Thumb'])
 
406
                        li.setInfo( type="Video", infoLabels={ "Title":extrainfo['name'], "Plot":extrainfo['plot'], "Genre":extrainfo['genre'], 'Rating':extrainfo['rating']})
 
407
                else:
 
408
                        li=xbmcgui.ListItem(label = info['Title'], iconImage = info['Icon'], thumbnailImage = info['Thumb'])
 
409
                #for videos, replace context menu with queue and add to favorites
 
410
                if not isFolder:
 
411
                        li.setProperty("IsPlayable", "true")#let xbmc know this can be played, unlike a folder.
 
412
                        #add context menu items to non-folder items.
 
413
                        contextmenu = [('Queue Video', 'Action(Queue)')]
 
414
                #for folders, completely remove contextmenu, as it is totally useless.
 
415
                else:
 
416
                        li.addContextMenuItems([], replaceItems=True)
 
417
                        li.setProperty("IsPlayable", "true")
 
418
                #add item to list
 
419
                ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=li, isFolder=isFolder,totalItems=total_items)
 
420
 
 
421
        def showCategories(self):
 
422
                self.addItem({'Title':__settings__.getLocalizedString(50003), 'mode':'latest', 'cateogry':'series'})
 
423
                self.addItem({'Title':__settings__.getLocalizedString(50000), 'mode':'series', 'category':'series'})
 
424
                self.addItem({'Title':__settings__.getLocalizedString(50001), 'mode':'ovas', 'category':'series'})
 
425
                self.addItem({'Title':__settings__.getLocalizedString(50002), 'mode':'movies', 'category':'movie'})
 
426
                self.endofdirectory()
 
427
                
 
428
        def showAnimeSeries(self):
 
429
                self.addItem({'Title':__settings__.getLocalizedString(51000), 'mode':'anime_all'})
 
430
                self.addItem({'Title':__settings__.getLocalizedString(51001), 'mode':'anime_airing'})
 
431
                self.addItem({'Title':__settings__.getLocalizedString(51002), 'mode':'anime_completed'})
 
432
                self.addItem({'Title':__settings__.getLocalizedString(51004), 'mode':'anime_genre'})
 
433
                self.endofdirectory()
 
434
 
 
435
        def animeGenre(self):
 
436
                self.addItem({'Title':__settings__.getLocalizedString(50005), 'mode':'anime_withtag','id':'Action'})
 
437
                self.addItem({'Title':__settings__.getLocalizedString(50006), 'mode':'anime_withtag','id':'Adventure'})
 
438
                self.addItem({'Title':__settings__.getLocalizedString(50007), 'mode':'anime_withtag','id':'Aliens'})
 
439
                self.addItem({'Title':__settings__.getLocalizedString(50008), 'mode':'anime_withtag','id':'Angst'})
 
440
                self.addItem({'Title':__settings__.getLocalizedString(50009), 'mode':'anime_withtag','id':'Bishounen'})
 
441
                self.addItem({'Title':__settings__.getLocalizedString(50010), 'mode':'anime_withtag','id':'Bounty%20Hunters'})
 
442
                self.addItem({'Title':__settings__.getLocalizedString(50011), 'mode':'anime_withtag','id':'Clubs'})
 
443
                self.addItem({'Title':__settings__.getLocalizedString(50012), 'mode':'anime_withtag','id':'Comedy'})
 
444
                self.addItem({'Title':__settings__.getLocalizedString(50013), 'mode':'anime_withtag','id':'Coming%20of%20Age'})
 
445
                self.addItem({'Title':__settings__.getLocalizedString(50014), 'mode':'anime_withtag','id':'Conspiracy'})
 
446
                self.addItem({'Title':__settings__.getLocalizedString(50015), 'mode':'anime_withtag','id':'Contemporary%20Fantasy'})
 
447
                self.addItem({'Title':__settings__.getLocalizedString(50016), 'mode':'anime_withtag','id':'Cyberpunk'})
 
448
                self.addItem({'Title':__settings__.getLocalizedString(50017), 'mode':'anime_withtag','id':'Daily%20Life'})
 
449
                self.addItem({'Title':__settings__.getLocalizedString(50018), 'mode':'anime_withtag','id':'Demons'})
 
450
                self.addItem({'Title':__settings__.getLocalizedString(50019), 'mode':'anime_withtag','id':'Detective'})
 
451
                self.addItem({'Title':__settings__.getLocalizedString(50020), 'mode':'anime_withtag','id':'Dystopia'})
 
452
                self.addItem({'Title':__settings__.getLocalizedString(50021), 'mode':'anime_withtag','id':'Ecchi'})
 
453
                self.addItem({'Title':__settings__.getLocalizedString(50022), 'mode':'anime_withtag','id':'Elementary%20School'})
 
454
                self.addItem({'Title':__settings__.getLocalizedString(50023), 'mode':'anime_withtag','id':'Elves'})
 
455
                self.addItem({'Title':__settings__.getLocalizedString(50024), 'mode':'anime_withtag','id':'Fantasy'})
 
456
                self.addItem({'Title':__settings__.getLocalizedString(50025), 'mode':'anime_withtag','id':'Female%20Students'})
 
457
                self.addItem({'Title':__settings__.getLocalizedString(50026), 'mode':'anime_withtag','id':'Gunfights'})
 
458
                self.addItem({'Title':__settings__.getLocalizedString(50027), 'mode':'anime_withtag','id':'Harem'})
 
459
                self.addItem({'Title':__settings__.getLocalizedString(50028), 'mode':'anime_withtag','id':'High%20School'})
 
460
                self.addItem({'Title':__settings__.getLocalizedString(50029), 'mode':'anime_withtag','id':'Historical'})
 
461
                self.addItem({'Title':__settings__.getLocalizedString(50030), 'mode':'anime_withtag','id':'Horror'})
 
462
                self.addItem({'Title':__settings__.getLocalizedString(50031), 'mode':'anime_withtag','id':'Humanoid'})
 
463
                self.addItem({'Title':__settings__.getLocalizedString(50032), 'mode':'anime_withtag','id':'Idol'})
 
464
                self.addItem({'Title':__settings__.getLocalizedString(50033), 'mode':'anime_withtag','id':'Love%20Polygon'})
 
465
                self.addItem({'Title':__settings__.getLocalizedString(50034), 'mode':'anime_withtag','id':'Magical'})
 
466
                self.addItem({'Title':__settings__.getLocalizedString(50035), 'mode':'anime_withtag','id':'Martial%20Arts'})
 
467
                self.addItem({'Title':__settings__.getLocalizedString(50036), 'mode':'anime_withtag','id':'Mecha'})
 
468
                self.addItem({'Title':__settings__.getLocalizedString(50037), 'mode':'anime_withtag','id':'Military'})
 
469
                self.addItem({'Title':__settings__.getLocalizedString(50038), 'mode':'anime_withtag','id':'Music'})
 
470
                self.addItem({'Title':__settings__.getLocalizedString(50039), 'mode':'anime_withtag','id':'Novel'})
 
471
                self.addItem({'Title':__settings__.getLocalizedString(50040), 'mode':'anime_withtag','id':'Nudity'})
 
472
                self.addItem({'Title':__settings__.getLocalizedString(50041), 'mode':'anime_withtag','id':'Parallel%20Universe'})
 
473
                self.addItem({'Title':__settings__.getLocalizedString(50042), 'mode':'anime_withtag','id':'Parody'})
 
474
                self.addItem({'Title':__settings__.getLocalizedString(50043), 'mode':'anime_withtag','id':'Piloted%20Robots'})
 
475
                self.addItem({'Title':__settings__.getLocalizedString(50044), 'mode':'anime_withtag','id':'Post-apocalyptic'})
 
476
                self.addItem({'Title':__settings__.getLocalizedString(50045), 'mode':'anime_withtag','id':'School%20Life'})
 
477
                self.addItem({'Title':__settings__.getLocalizedString(50046), 'mode':'anime_withtag','id':'SciFi'})
 
478
                self.addItem({'Title':__settings__.getLocalizedString(50047), 'mode':'anime_withtag','id':'Seinen'})
 
479
                self.addItem({'Title':__settings__.getLocalizedString(50048), 'mode':'anime_withtag','id':'Shoujo'})
 
480
                self.addItem({'Title':__settings__.getLocalizedString(50049), 'mode':'anime_withtag','id':'Shounen'})
 
481
                self.addItem({'Title':__settings__.getLocalizedString(50050), 'mode':'anime_withtag','id':'Slapstick'})
 
482
                self.addItem({'Title':__settings__.getLocalizedString(50051), 'mode':'anime_withtag','id':'Space%20Travel'})
 
483
                self.addItem({'Title':__settings__.getLocalizedString(50052), 'mode':'anime_withtag','id':'Special%20Squads'})
 
484
                self.addItem({'Title':__settings__.getLocalizedString(50053), 'mode':'anime_withtag','id':'Sports'})
 
485
                self.addItem({'Title':__settings__.getLocalizedString(50054), 'mode':'anime_withtag','id':'Sudden%20Girlfriend%20Appearance'})
 
486
                self.addItem({'Title':__settings__.getLocalizedString(50055), 'mode':'anime_withtag','id':'Swordplay'})
 
487
                self.addItem({'Title':__settings__.getLocalizedString(50056), 'mode':'anime_withtag','id':'Thriller'})
 
488
                self.addItem({'Title':__settings__.getLocalizedString(50057), 'mode':'anime_withtag','id':'Tragedy'})
 
489
                self.addItem({'Title':__settings__.getLocalizedString(50058), 'mode':'anime_withtag','id':'Underworld'})
 
490
                self.addItem({'Title':__settings__.getLocalizedString(50059), 'mode':'anime_withtag','id':'Vampires'})
 
491
                self.addItem({'Title':__settings__.getLocalizedString(50060), 'mode':'anime_withtag','id':'Virtual%20Reality'})
 
492
                self.addItem({'Title':__settings__.getLocalizedString(50061), 'mode':'anime_withtag','id':'World%20War%20II'})
 
493
                self.endofdirectory()
 
494
                
 
495
        def series(self):
 
496
                cat_dict = {'ovas':0,'movies':1,'anime_all':2}
 
497
                if(self.main.args.mode == 'anime_all'):
 
498
                        grabMangastv().getAllSeries(cat_dict[self.main.args.mode])
 
499
                elif(self.main.args.mode == 'ovas'):
 
500
                        grabMangastv().getOVAs()
 
501
                        
 
502
        def latestAdditions(self):
 
503
                grabMangastv().getLatest()
 
504
                
 
505
        def movies(self):
 
506
                grabMangastv().getMovies()
 
507
                        
 
508
        def airing(self):
 
509
                grabMangastv().getAiringSeries()
 
510
                
 
511
        def completed(self):
 
512
                grabMangastv().getCompletedSeries()
 
513
                
 
514
        def seriesGenre(self):
 
515
                grabMangastv().getGenreSeries(self.main.args.id)
 
516
                        
 
517
        def episodes(self):
 
518
                grabMangastv().getEpisodes(self.main.args.url, self.main.args.referer, self.main.args.category)
 
519
                
 
520
        def startVideo(self):
 
521
                grabMangastv().getVidLink(self.main.args.url, self.main.args.referer, self.main.args.name)
 
522
 
 
523
class Main:
 
524
 
 
525
        def __init__(self, checkMode = True):
 
526
                #self.user = None
 
527
                self.parseArgs()
 
528
                if checkMode:
 
529
                        self.checkMode()
 
530
 
 
531
        def parseArgs(self):
 
532
                if (sys.argv[2]):
 
533
                        exec "self.args = updateArgs(%s')" % (sys.argv[2][1:].replace('&', "',").replace('=', "='"))
 
534
                else:
 
535
                        self.args = updateArgs(mode = 'None', url = 'None', name = 'None')
 
536
 
 
537
        def checkMode(self):
 
538
                mode = self.args.mode
 
539
                if mode is None:
 
540
                        UI().showCategories()
 
541
                elif mode == 'latest':
 
542
                        UI().latestAdditions()
 
543
                elif mode == 'series':
 
544
                        UI().showAnimeSeries()
 
545
                elif mode == 'anime_airing':
 
546
                        UI().airing()
 
547
                elif mode == 'anime_completed':
 
548
                        UI().completed()
 
549
                elif mode == 'anime_genre':
 
550
                        UI().animeGenre()
 
551
                elif mode == 'anime_withtag':
 
552
                        UI().seriesGenre()
 
553
                elif mode == 'featured':
 
554
                        UI().featured()
 
555
                elif mode == 'anime_all' or mode == 'ovas':
 
556
                        UI().series()
 
557
                elif mode == 'movies':
 
558
                        UI().movies()
 
559
                elif mode == 'episodes':
 
560
                        UI().episodes()
 
561
                elif mode == 'episode':
 
562
                        UI().startVideo()