mirror of
				https://github.com/RicterZ/nhentai.git
				synced 2025-11-04 02:50:55 +01:00 
			
		
		
		
	Merge pull request #164 from RicterZ/fix-page-range
fix page range issue #158
This commit is contained in:
		@@ -54,10 +54,8 @@ def cmd_parser():
 | 
				
			|||||||
                      help='list or download your favorites.')
 | 
					                      help='list or download your favorites.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # page options
 | 
					    # page options
 | 
				
			||||||
    parser.add_option('--page', type='int', dest='page', action='store', default=1,
 | 
					    parser.add_option('--page', '--page-range', type='string', dest='page', action='store', default='',
 | 
				
			||||||
                      help='page number of search results')
 | 
					                      help='page number of search results. e.g. 1,2-5,14')
 | 
				
			||||||
    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('--sorting', dest='sorting', action='store', default='recent',
 | 
					    parser.add_option('--sorting', dest='sorting', action='store', default='recent',
 | 
				
			||||||
                      help='sorting of doujinshi (recent / popular / popular-[today|week])',
 | 
					                      help='sorting of doujinshi (recent / popular / popular-[today|week])',
 | 
				
			||||||
                      choices=['recent', 'popular', 'popular-today', 'popular-week'])
 | 
					                      choices=['recent', 'popular', 'popular-today', 'popular-week'])
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,8 @@ from nhentai.doujinshi import Doujinshi
 | 
				
			|||||||
from nhentai.downloader import Downloader
 | 
					from nhentai.downloader import Downloader
 | 
				
			||||||
from nhentai.logger import logger
 | 
					from nhentai.logger import logger
 | 
				
			||||||
from nhentai.constant import BASE_URL
 | 
					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():
 | 
					def main():
 | 
				
			||||||
@@ -31,18 +32,20 @@ def main():
 | 
				
			|||||||
    doujinshi_ids = []
 | 
					    doujinshi_ids = []
 | 
				
			||||||
    doujinshi_list = []
 | 
					    doujinshi_list = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    page_list = paging(options.page)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if options.favorites:
 | 
					    if options.favorites:
 | 
				
			||||||
        if not options.is_download:
 | 
					        if not options.is_download:
 | 
				
			||||||
            logger.warning('You do not specify --download option')
 | 
					            logger.warning('You do not specify --download option')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        doujinshis = favorites_parser(options.page_range)
 | 
					        doujinshis = favorites_parser(page=page_list)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    elif options.keyword:
 | 
					    elif options.keyword:
 | 
				
			||||||
        from nhentai.constant import LANGUAGE
 | 
					        from nhentai.constant import LANGUAGE
 | 
				
			||||||
        if LANGUAGE:
 | 
					        if LANGUAGE:
 | 
				
			||||||
            logger.info('Using default language: {0}'.format(LANGUAGE))
 | 
					            logger.info('Using default language: {0}'.format(LANGUAGE))
 | 
				
			||||||
            options.keyword += ', language:{}'.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:
 | 
					    elif not doujinshi_ids:
 | 
				
			||||||
        doujinshi_ids = options.id
 | 
					        doujinshi_ids = options.id
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,7 +64,7 @@ def _get_title_and_id(response):
 | 
				
			|||||||
    return result
 | 
					    return result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def favorites_parser(page_range=''):
 | 
					def favorites_parser(page=None):
 | 
				
			||||||
    result = []
 | 
					    result = []
 | 
				
			||||||
    html = BeautifulSoup(request('get', constant.FAV_URL).content, 'html.parser')
 | 
					    html = BeautifulSoup(request('get', constant.FAV_URL).content, 'html.parser')
 | 
				
			||||||
    count = html.find('span', attrs={'class': 'count'})
 | 
					    count = html.find('span', attrs={'class': 'count'})
 | 
				
			||||||
@@ -78,20 +78,20 @@ def favorites_parser(page_range=''):
 | 
				
			|||||||
        return []
 | 
					        return []
 | 
				
			||||||
    pages = int(count / 25)
 | 
					    pages = int(count / 25)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if pages:
 | 
					    if page:
 | 
				
			||||||
        pages += 1 if count % (25 * pages) else 0
 | 
					        page_range_list = page
 | 
				
			||||||
    else:
 | 
					    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'):
 | 
					        if os.getenv('DEBUG'):
 | 
				
			||||||
        pages = 1
 | 
					            pages = 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    page_range_list = range(1, 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)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for page in page_range_list:
 | 
					    for page in page_range_list:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
@@ -105,32 +105,6 @@ def favorites_parser(page_range=''):
 | 
				
			|||||||
    return result
 | 
					    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_):
 | 
					def doujinshi_parser(id_):
 | 
				
			||||||
    if not isinstance(id_, (int,)) and (isinstance(id_, (str,)) and not id_.isdigit()):
 | 
					    if not isinstance(id_, (int,)) and (isinstance(id_, (str,)) and not id_.isdigit()):
 | 
				
			||||||
        raise Exception('Doujinshi id({0}) is not valid'.format(id_))
 | 
					        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):
 | 
					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(',')])
 | 
					    # keyword = '+'.join([i.strip().replace(' ', '-').lower() for i in keyword.split(',')])
 | 
				
			||||||
    result = []
 | 
					    result = []
 | 
				
			||||||
    i = 0
 | 
					    if not page:
 | 
				
			||||||
    while i < 5:
 | 
					        page = [1]
 | 
				
			||||||
        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))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        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:
 | 
					            break
 | 
				
			||||||
        raise Exception('No result in response')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for row in response['result']:
 | 
					        if 'result' not in response:
 | 
				
			||||||
        title = row['title']['english']
 | 
					            logger.warn('No result in response in page {}'.format(p))
 | 
				
			||||||
        title = title[:85] + '..' if len(title) > 85 else title
 | 
					            break
 | 
				
			||||||
        result.append({'id': row['id'], 'title': title})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if not result:
 | 
					        for row in response['result']:
 | 
				
			||||||
        logger.warn('No results for keywords {}'.format(keyword))
 | 
					            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
 | 
					    return result
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -253,6 +253,26 @@ def signal_handler(signal, frame):
 | 
				
			|||||||
    exit(1)
 | 
					    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):
 | 
					class DB(object):
 | 
				
			||||||
    conn = None
 | 
					    conn = None
 | 
				
			||||||
    cur = None
 | 
					    cur = None
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user