~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: 2011-01-26 23:18:58 UTC
  • Revision ID: aouattara@octo.com-20110126231858-lbp2h6re4397ygb5
Tags: 2.1
Ajout de la fonctionnalité de recherche.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
from BeautifulSoup import BeautifulSoup
13
13
from string import join
14
14
from resources.lib.utils import isCacheValid, debug, unescapeHTMLchar, is_number,\
15
 
         Browser, info
 
15
         Browser, info, _get_keyboard
16
16
from pickle import HIGHEST_PROTOCOL
17
17
 
18
18
__addonid__ = 'plugin.video.mangastv'
29
29
PLAY_VIDEO_MODE = 'playVideo'
30
30
SHOW_EPISODES_MODE = 'showEpisodes' 
31
31
LOGIN_TO_UNLOCK_MODE = 'loginToUnlock'
 
32
SEARCH_MODE = 'search'
32
33
 
33
34
# Empty cache dir when we change the version
34
35
profile_dir = xbmc.translatePath(__settings__.getAddonInfo('profile'))
61
62
                                                ANIME_LIST_MODE: 'tvshows',
62
63
                                                SHOW_EPISODES_MODE: 'episodes',
63
64
                                                PLAY_VIDEO_MODE: 'episodes',
64
 
                                                LOGIN_TO_UNLOCK_MODE: 'files' }
 
65
                                                LOGIN_TO_UNLOCK_MODE: 'files',
 
66
                                                SEARCH_MODE: 'tvshows' }
65
67
        
66
68
        def __init__(self):
67
69
                self.main = Main(checkMode=False)
82
84
                self.addItem({'Title': lang(30031), 'mode': MOST_VIEWED_MODE, 'url': __site_url__ + 'index.php?module=listeMangas&voir=vus&d=1&l=' + str(self.pagelimit)})
83
85
                self.addItem({'Title': lang(30032), 'mode': PROMOTED_LIST_MODE, 'url': __site_url__ + 'index.php?module=listeMangas&voir=prom&d=1&l=' + str(self.pagelimit)})
84
86
                self.addItem({'Title': lang(30033), 'mode': ANIME_LIST_MODE, 'url': __site_url__ + 'index.php?module=listeMangas&voir=tous&d=1'})
 
87
                self.addItem({'Title': lang(30045), 'mode': SEARCH_MODE, 'url': __site_url__ + "index.php?module=listeMangas"})
85
88
                self.endofdirectory()
86
89
 
87
90
        def __getFromCache(self, main, processFct, addSingleItemFct, dontAddToHierarchy = False):
128
131
                
129
132
                self.__getFromCache(main, __parseCategory, __addSingleItem)
130
133
                        
 
134
        def search(self, main):
 
135
                vq = _get_keyboard( heading=lang(30046) )
 
136
                
 
137
                if ( not vq ): return False, 0
 
138
                # we need to set the title to our query
 
139
                info("search query = " + vq)
 
140
                dialog = xbmcgui.DialogProgress()
 
141
                dialog.create("Mangas-TV.com", lang(30034), lang(30035))
 
142
                dialog.update(50)
 
143
 
 
144
                data = urllib.urlencode({"formAction" : "textRecherche", 'textRecherche' : vq, 'resultLicence': 1, 'submit':'Valider'})
 
145
                response = self.browser.opener.open(main.args.url, data)
 
146
                htmlsource = unicode(response.read(), 'utf-8', 'replace')
 
147
                response.close()
 
148
                soup = BeautifulSoup(htmlsource)
 
149
                dialog.update(100)
 
150
                dialog.close()
 
151
                listItems = []
 
152
                self.__parseAnimeSeries(soup, listItems);
 
153
                self.endofdirectory(sortMethod='title', dontAddToHierarchy=False)
 
154
                
 
155
                
 
156
        def __parseAnimeSeries(self, soup, listItems):
 
157
                listArticleManga = soup.findAll('div', attrs={'class':'articleManga'})
 
158
                total = len(listArticleManga)
 
159
                for articleManga in listArticleManga:
 
160
                        title = articleManga.find("div", attrs={"class": "nomMangaFr"}).find("a").find(text=True).strip()
 
161
                        url = __site_url__ + articleManga.find("div", attrs={"class": "nomMangaFr"}).find("a")['href']
 
162
                        image = __site_url__ + articleManga.find('img', attrs={'class': 'articleMangaImage'})['src']
 
163
                        desc = articleManga.find('p', attrs={'class': 'articleMangaDescription'}).find(text=True).strip()
 
164
                        detailManga = articleManga.find("div", attrs={"class": "optionDetailManga"})
 
165
                        stats = detailManga.findAll('b')
 
166
                        
 
167
                        # get genre
 
168
                        genre = lang(30039)
 
169
                        genreTable = articleManga.find("td", attrs={"class": "articleMangaContenu"}).find('table')
 
170
                        if genreTable is not None:
 
171
                                genreList = genreTable.findAll('td')
 
172
                                
 
173
                                genre = ""
 
174
                                prevGVotes = 0
 
175
                                for genreTd in genreList:
 
176
                                        genreCandidate = join(genreTd.find("br").findNextSiblings(text=True), '').strip()
 
177
                                        genreCandidate = genreCandidate.replace("\n votes", "")
 
178
                                        gVotes = int(genreTd.find("b").string)  
 
179
                                        if prevGVotes > 0 :
 
180
                                                genre = genre + ', ' + genreCandidate
 
181
                                        else :
 
182
                                                genre = genreCandidate
 
183
                                        prevGVotes = gVotes
 
184
                        
 
185
                        nbEpisodes = None
 
186
                        name = title
 
187
                        m = re.search("Episodes disponible\(s\): (([0-9]*?)/([0-9a-zA-Z_]*))", str(detailManga))
 
188
                        if m :
 
189
                                name = title + " (%s episodes)" % m.group(1)
 
190
                                nbEpisodes = m.group(2)
 
191
                                
 
192
                        infoLabels = { "name": title, "plot": desc, "genre": genre}                             
 
193
                        if nbEpisodes:
 
194
                                infoLabels['nbepisodes'] = nbEpisodes
 
195
                        
 
196
                        rating, votes, views = stats[1].find(text=True), stats[2].find(text=True), stats[3].find(text=True)
 
197
                        if rating is not None and is_number(rating):
 
198
                                infoLabels['rating'] = float(rating)
 
199
                        else : 
 
200
                                infoLabels['rating'] = 0.0
 
201
                        if votes is not None and is_number(rating):
 
202
                                infoLabels['votes'] = long(votes)
 
203
                        else:
 
204
                                infoLabels['votes'] = 0
 
205
                        if views is not None and is_number(rating):
 
206
                                infoLabels['playcount'] = long(views)
 
207
                        else:
 
208
                                infoLabels['playcount'] = 0
 
209
                        info = {'Title': name, 'mode' : SHOW_EPISODES_MODE, 'url': url , 'Thumb' : image}
 
210
                        debug('info = %s, infoLabel = %s' % (info, infoLabels))
 
211
                        item = (info, infoLabels)
 
212
                        listItems.append(item)
 
213
                        self.__addAnimeSeriesSingleItem(item, total)
 
214
                                
 
215
        def __addAnimeSeriesSingleItem(self, itemTuple, total):
 
216
                item, extra = itemTuple
 
217
                self.addItem(info=item, extrainfo=extra, total_items=total)     
 
218
 
131
219
        def showAnimeSeries(self, main):
132
 
                def __parseAnimeSeries(soup, listItems):
133
 
                        listArticleManga = soup.findAll('div', attrs={'class':'articleManga'})
134
 
                        total = len(listArticleManga)
135
 
                        for articleManga in listArticleManga:
136
 
                                title = articleManga.find("div", attrs={"class": "nomMangaFr"}).find("a").find(text=True).strip()
137
 
                                url = __site_url__ + articleManga.find("div", attrs={"class": "nomMangaFr"}).find("a")['href']
138
 
                                image = __site_url__ + articleManga.find('img', attrs={'class': 'articleMangaImage'})['src']
139
 
                                desc = articleManga.find('p', attrs={'class': 'articleMangaDescription'}).find(text=True).strip()
140
 
                                detailManga = articleManga.find("div", attrs={"class": "optionDetailManga"})
141
 
                                stats = detailManga.findAll('b')
142
 
                                
143
 
                                # get genre
144
 
                                genre = lang(30039)
145
 
                                genreTable = articleManga.find("td", attrs={"class": "articleMangaContenu"}).find('table')
146
 
                                if genreTable is not None:
147
 
                                        genreList = genreTable.findAll('td')
148
 
                                        
149
 
                                        genre = ""
150
 
                                        prevGVotes = 0
151
 
                                        for genreTd in genreList:
152
 
                                                genreCandidate = join(genreTd.find("br").findNextSiblings(text=True), '').strip()
153
 
                                                genreCandidate = genreCandidate.replace("\n votes", "")
154
 
                                                gVotes = int(genreTd.find("b").string)  
155
 
                                                if prevGVotes > 0 :
156
 
                                                        genre = genre + ', ' + genreCandidate
157
 
                                                else :
158
 
                                                        genre = genreCandidate
159
 
                                                prevGVotes = gVotes
160
 
                                
161
 
                                nbEpisodes = None
162
 
                                name = title
163
 
                                m = re.search("Episodes disponible\(s\): (([0-9]*?)/([0-9a-zA-Z_]*))", str(detailManga))
164
 
                                if m :
165
 
                                        name = title + " (%s episodes)" % m.group(1)
166
 
                                        nbEpisodes = m.group(2)
167
 
                                        
168
 
                                infoLabels = { "name": title, "plot": desc, "genre": genre}                             
169
 
                                if nbEpisodes:
170
 
                                        infoLabels['nbepisodes'] = nbEpisodes
171
 
                                
172
 
                                rating, votes, views = stats[1].find(text=True), stats[2].find(text=True), stats[3].find(text=True)
173
 
                                if rating is not None and is_number(rating):
174
 
                                        infoLabels['rating'] = float(rating)
175
 
                                else : 
176
 
                                        infoLabels['rating'] = 0.0
177
 
                                if votes is not None and is_number(rating):
178
 
                                        infoLabels['votes'] = long(votes)
179
 
                                else:
180
 
                                        infoLabels['votes'] = 0
181
 
                                if views is not None and is_number(rating):
182
 
                                        infoLabels['playcount'] = long(views)
183
 
                                else:
184
 
                                        infoLabels['playcount'] = 0
185
 
                                info = {'Title': name, 'mode' : SHOW_EPISODES_MODE, 'url': url , 'Thumb' : image}
186
 
                                debug('info = %s, infoLabel = %s' % (info, infoLabels))
187
 
                                item = (info, infoLabels)
188
 
                                listItems.append(item)
189
 
                                __addSingleItem(item, total)
190
 
                                
191
 
                def __addSingleItem(itemTuple, total):
192
 
                        item, extra = itemTuple
193
 
                        self.addItem(info=item, extrainfo=extra, total_items=total)     
194
 
 
195
 
                self.__getFromCache(main, __parseAnimeSeries, __addSingleItem)
 
220
                
 
221
                self.__getFromCache(main, self.__parseAnimeSeries, self.__addAnimeSeriesSingleItem)
196
222
 
197
223
        def showEpisodes(self, main, dontAddToHierarchy=False):
198
224
                def __showEpisodes(soup, listItems):
378
404
                        UI().showAnimeSeries(self)
379
405
                elif mode == PROMOTED_LIST_MODE:
380
406
                        UI().promoted(self)
 
407
                elif mode == SEARCH_MODE:
 
408
                        UI().search(self)
381
409
                elif mode == SHOW_EPISODES_MODE:
382
410
                        UI().showEpisodes(self)
383
411
                elif mode == PLAY_VIDEO_MODE: