14
import simplejson as json
15
from BeautifulSoup import BeautifulSoup
17
__settings__ = sys.modules[ "__main__" ].__settings__
21
def __init__(self, *args, **kwargs):
22
for key, value in kwargs.iteritems():
26
kwargs[key] = urllib.unquote_plus(kwargs[key])
27
self.__dict__.update(kwargs)
30
def __init__(self, *args, **kwargs):
31
self.currenturl = None
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")
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?")
47
__settings__.openSettings()
49
elif self.settings['username'] != self.settings['prev_username'] or self.settings['password'] != self.settings['prev_password']:
50
self.removeCookie = True
52
self.removeCookie = False
55
if (self.settings['username'] != '' and self.settings['password'] != ''):
57
COOKIEFILE=os.path.join(self.base_cache_path, 'cookieMangastv.lwp')
58
if self.removeCookie == True:
60
"Mangastv --> COOKIEFILE DELETED"
64
cj = cookielib.LWPCookieJar()
65
if os.path.exists(COOKIEFILE):
66
print "Mangastv -- > Already have the cookie!"
67
status = self.checkCookie(COOKIEFILE)
69
print "Mangastv --> Login succeeded."
71
__settings__.setSetting("prev_username", self.settings['username'])
72
__settings__.setSetting("prev_password", self.settings['password'])
74
ex = 'XBMC.Notification("Login Failed:","Username/password is incorrect.", 3000)'
75
xbmc.executebuiltin(ex)
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')]
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)
88
req = self.opener.open(url, data)
91
status = self.checkCookie(COOKIEFILE)
93
__settings__.setSetting("prev_username", self.settings['username'])
94
__settings__.setSetting("prev_password", self.settings['password'])
96
ex = 'XBMC.Notification("Server Error:","Please try again.", 3000)'
97
xbmc.executebuiltin(ex)
99
return self.opener, status
102
return self.opener, False
104
return self.opener, 'exit'
106
def checkCookie(self, COOKIEFILE):
107
file = open(COOKIEFILE,'r').read()
108
auth = re.search('authenticate=[0-9a-h]{32}', file)
115
def __init__(self, *args, **kwargs):
116
self.opener, self.status = LoginMangastv().login()
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'))
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
133
def getHTML(self, url):
134
self.currenturl = url
137
thumbprint = md5.new(self.currenturl).hexdigest()
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)
153
htmlSource = open(cache_file, 'r').read()
155
htmlSource = self.downloadHTML(self.currenturl)
156
file = open(cache_file, 'w')
157
file.write(htmlSource)
162
def getInfo(self, title):
163
enableThumbs = __settings__.getSetting("get_ext")
165
if(enableThumbs == "true"):
166
thumbprint = md5.new(title).hexdigest()
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)
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')
183
datapool = json.loads(datapool)
185
print "Mangastv --> Could not open MAL-API link for series "+str(title)
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'])
194
info['thumb'] = 'None'
195
info['plot'] = 'No plot info available for this series.'
196
info['genre'] = 'None'
199
info['thumb'] = 'None'
200
info['plot'] = 'No plot info available for this series.'
201
info['genre'] = 'None'
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'})
213
for post in latest_list:
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()
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
237
for series in series_list:
238
series = series.find('a')
239
seriesname = series.contents[0].replace(' ','').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))
244
UI().endofdirectory('title')
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')
253
for series in completed_list:
254
series = series.find('a')
255
seriesname = series.contents[0].replace(' ','').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))
260
UI().endofdirectory('none')
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')
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/")})
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))
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))
282
UI().endofdirectory('none')
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')
291
for series in airing_list:
292
series = series.find('a')
293
seriesname = series.contents[0].replace(' ','').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))
298
UI().endofdirectory('title')
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')
309
for series in completed_list:
310
series = series.find('a')
311
seriesname = series.contents[0].replace(' ','').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))
316
UI().endofdirectory('title')
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/.*/'))
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))
333
UI().endofdirectory('title')
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')
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))
352
UI().endofdirectory('none')
354
def getVidLink(self, url, referer, name):
355
self.referer = referer
357
htmlSource = self.getHTML(url)
358
r_src = re.compile('(src="(.*).divx")|(src="(.*).mkv")')
359
src = re.search(r_src, htmlSource)
361
src = src.replace('src="','').replace('"','')
362
self.playVid(src, self.referer, self.name)
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)
372
self.main = Main(checkMode = False)
373
xbmcplugin.setContent(int(sys.argv[1]), 'movies')
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)
383
dontAddToHierarchy = False
384
xbmcplugin.endOfDirectory(handle = int(sys.argv[1]), updateListing = dontAddToHierarchy)
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
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'])
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']})
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
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.
416
li.addContextMenuItems([], replaceItems=True)
417
li.setProperty("IsPlayable", "true")
419
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=li, isFolder=isFolder,totalItems=total_items)
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()
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()
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()
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()
502
def latestAdditions(self):
503
grabMangastv().getLatest()
506
grabMangastv().getMovies()
509
grabMangastv().getAiringSeries()
512
grabMangastv().getCompletedSeries()
514
def seriesGenre(self):
515
grabMangastv().getGenreSeries(self.main.args.id)
518
grabMangastv().getEpisodes(self.main.args.url, self.main.args.referer, self.main.args.category)
520
def startVideo(self):
521
grabMangastv().getVidLink(self.main.args.url, self.main.args.referer, self.main.args.name)
525
def __init__(self, checkMode = True):
533
exec "self.args = updateArgs(%s')" % (sys.argv[2][1:].replace('&', "',").replace('=', "='"))
535
self.args = updateArgs(mode = 'None', url = 'None', name = 'None')
538
mode = self.args.mode
540
UI().showCategories()
541
elif mode == 'latest':
542
UI().latestAdditions()
543
elif mode == 'series':
544
UI().showAnimeSeries()
545
elif mode == 'anime_airing':
547
elif mode == 'anime_completed':
549
elif mode == 'anime_genre':
551
elif mode == 'anime_withtag':
553
elif mode == 'featured':
555
elif mode == 'anime_all' or mode == 'ovas':
557
elif mode == 'movies':
559
elif mode == 'episodes':
561
elif mode == 'episode':