]> git.lizzy.rs Git - nhentai.git/commitdiff
fix page range issue #158
authorRicterZ <ricterzheng@gmail.com>
Sat, 10 Oct 2020 16:48:36 +0000 (00:48 +0800)
committerRicterZ <ricterzheng@gmail.com>
Sat, 10 Oct 2020 16:48:36 +0000 (00:48 +0800)
nhentai/cmdline.py
nhentai/command.py
nhentai/parser.py
nhentai/utils.py

index 1e132154044b723944ec1e1fd14e75e89dc3041a..ac52a35ee88f13b1bdb7a91531fa9dc7fb4ce6ae 100644 (file)
@@ -54,10 +54,8 @@ def cmd_parser():
                       help='list or download your favorites.')
 
     # page options
-    parser.add_option('--page', type='int', dest='page', action='store', default=1,
-                      help='page number of search results')
-    parser.add_option('--page-range', type='string', dest='page_range', action='store',
-                      help='page range of favorites.  e.g. 1,2-5,14')
+    parser.add_option('--page', '--page-range', type='string', dest='page', action='store', default='',
+                      help='page number of search results. e.g. 1,2-5,14')
     parser.add_option('--sorting', dest='sorting', action='store', default='recent',
                       help='sorting of doujinshi (recent / popular / popular-[today|week])',
                       choices=['recent', 'popular', 'popular-today', 'popular-week'])
index 621fef246b0798b9bb176ba6d2182f5982d2f50a..5222951b1db5d7ec5dbd0751bdc7c85de01808bb 100644 (file)
@@ -11,7 +11,8 @@ from nhentai.doujinshi import Doujinshi
 from nhentai.downloader import Downloader
 from nhentai.logger import logger
 from nhentai.constant import BASE_URL
-from nhentai.utils import generate_html, generate_cbz, generate_main_html, generate_pdf, check_cookie, signal_handler, DB
+from nhentai.utils import generate_html, generate_cbz, generate_main_html, generate_pdf, \
+    paging, check_cookie, signal_handler, DB
 
 
 def main():
@@ -31,18 +32,20 @@ def main():
     doujinshi_ids = []
     doujinshi_list = []
 
+    page_list = paging(options.page)
+
     if options.favorites:
         if not options.is_download:
             logger.warning('You do not specify --download option')
 
-        doujinshis = favorites_parser(options.page_range)
+        doujinshis = favorites_parser(page=page_list)
 
     elif options.keyword:
         from nhentai.constant import LANGUAGE
         if LANGUAGE:
             logger.info('Using default language: {0}'.format(LANGUAGE))
             options.keyword += ', language:{}'.format(LANGUAGE)
-        doujinshis = search_parser(options.keyword, sorting=options.sorting, page=options.page)
+        doujinshis = search_parser(options.keyword, sorting=options.sorting, page=page_list)
 
     elif not doujinshi_ids:
         doujinshi_ids = options.id
index bece331e0ec8029ed96865a7f1edae2b889dcae8..fd08d33af98483e3cb772963b96e780345b6dc55 100644 (file)
@@ -64,7 +64,7 @@ def _get_title_and_id(response):
     return result
 
 
-def favorites_parser(page_range=''):
+def favorites_parser(page=None):
     result = []
     html = BeautifulSoup(request('get', constant.FAV_URL).content, 'html.parser')
     count = html.find('span', attrs={'class': 'count'})
@@ -78,20 +78,20 @@ def favorites_parser(page_range=''):
         return []
     pages = int(count / 25)
 
-    if pages:
-        pages += 1 if count % (25 * pages) else 0
+    if page:
+        page_range_list = page
     else:
-        pages = 1
+        if pages:
+            pages += 1 if count % (25 * pages) else 0
+        else:
+            pages = 1
 
-    logger.info('You have %d favorites in %d pages.' % (count, pages))
+        logger.info('You have %d favorites in %d pages.' % (count, pages))
 
-    if os.getenv('DEBUG'):
-        pages = 1
+        if os.getenv('DEBUG'):
+            pages = 1
 
-    page_range_list = range(1, pages + 1)
-    if page_range:
-        logger.info('page range is {0}'.format(page_range))
-        page_range_list = page_range_parser(page_range, pages)
+        page_range_list = range(1, pages + 1)
 
     for page in page_range_list:
         try:
@@ -105,32 +105,6 @@ def favorites_parser(page_range=''):
     return result
 
 
-def page_range_parser(page_range, max_page_num):
-    pages = set()
-    ranges = str.split(page_range, ',')
-    for range_str in ranges:
-        idx = range_str.find('-')
-        if idx == -1:
-            try:
-                page = int(range_str)
-                if page <= max_page_num:
-                    pages.add(page)
-            except ValueError:
-                logger.error('page range({0}) is not valid'.format(page_range))
-        else:
-            try:
-                left = int(range_str[:idx])
-                right = int(range_str[idx + 1:])
-                if right > max_page_num:
-                    right = max_page_num
-                for page in range(left, right + 1):
-                    pages.add(page)
-            except ValueError:
-                logger.error('page range({0}) is not valid'.format(page_range))
-
-    return list(pages)
-
-
 def doujinshi_parser(id_):
     if not isinstance(id_, (int,)) and (isinstance(id_, (str,)) and not id_.isdigit()):
         raise Exception('Doujinshi id({0}) is not valid'.format(id_))
@@ -220,29 +194,35 @@ def print_doujinshi(doujinshi_list):
 
 
 def search_parser(keyword, sorting, page):
-    logger.debug('Searching doujinshis using keywords {0}'.format(keyword))
     # keyword = '+'.join([i.strip().replace(' ', '-').lower() for i in keyword.split(',')])
     result = []
-    i = 0
-    while i < 5:
-        try:
-            url = request('get', url=constant.SEARCH_URL, params={'query': keyword, 'page': page, 'sort': sorting}).url
-            response = request('get', url.replace('%2B', '+')).json()
-        except Exception as e:
-            logger.critical(str(e))
+    if not page:
+        page = [1]
 
-        break
+    for p in page:
+        i = 0
+        logger.info('Searching doujinshis using keywords "{0}" on page {1}'.format(keyword, p))
+        while i < 3:
+            try:
+                url = request('get', url=constant.SEARCH_URL, params={'query': keyword,
+                                                                      'page': p, 'sort': sorting}).url
+                response = request('get', url.replace('%2B', '+')).json()
+            except Exception as e:
+                logger.critical(str(e))
 
-    if 'result' not in response:
-        raise Exception('No result in response')
+            break
 
-    for row in response['result']:
-        title = row['title']['english']
-        title = title[:85] + '..' if len(title) > 85 else title
-        result.append({'id': row['id'], 'title': title})
+        if 'result' not in response:
+            logger.warn('No result in response in page {}'.format(p))
+            break
 
-    if not result:
-        logger.warn('No results for keywords {}'.format(keyword))
+        for row in response['result']:
+            title = row['title']['english']
+            title = title[:85] + '..' if len(title) > 85 else title
+            result.append({'id': row['id'], 'title': title})
+
+        if not result:
+            logger.warn('No results for keywords {}'.format(keyword))
 
     return result
 
index e8626b9e70a440c7fb1c4df0968c203d368a86ac..2a0cb5c0580ba4e13a8d8195d04fd92f98f90d63 100644 (file)
@@ -253,6 +253,26 @@ def signal_handler(signal, frame):
     exit(1)
 
 
+def paging(page_string):
+    # 1,3-5,14 -> [1, 3, 4, 5, 14]
+    if not page_string:
+        return []
+
+    page_list = []
+    for i in page_string.split(','):
+        if '-' in i:
+            start, end = i.split('-')
+            if not (start.isdigit() and end.isdigit()):
+                raise Exception('Invalid page number')
+            page_list.extend(list(range(int(start), int(end)+1)))
+        else:
+            if not i.isdigit():
+                raise Exception('Invalid page number')
+            page_list.append(int(i))
+
+    return page_list
+
+
 class DB(object):
     conn = None
     cur = None