def handle_url(self): url = self.url_var.get().strip() path = self.path_var.get().strip() if url == '' or path == '': showwarning("warning", "url or path can't be empty!") print("warning", "url or path can't be empty!") return if not os.path.exists(path): showerror("error", " No such file or directory!") print('error', 'No such file or directory') return # 插画详情页下载 if re.match("htt(p|ps)://www.pixivision.net/(zh|ja|en|zh-tw)/a/\d*", url): showinfo("info", "Start download pixivision.net page:" + url) print("info", "Start download pixivision.net page:" + url) IlluDownloadThread( url.strip(), path=path, create_path=True, downloader=self.downloader).register_hook( success_callback=self.download_callback).start() return # 插画列表页下载 elif re.match( r"htt(p|ps)://www.pixivision.net/(zh|ja|en|zh-tw)/c/illustration(/|)(\?p=\d+|)", url): showinfo("info", "Start download pixivision.net page:" + url) print("info", "Start download pixivision.net page:" + url) PixivisionLauncher( url, save_path=path, downloader=self.downloader).register_hook( success_callback=self.download_callback).start() return elif CommonUtils.set_int(url) != 0: showinfo( "info", "Downloading id:" + str(CommonUtils.set_int(url)) + " illustration") print( "info", "Downloading id:" + str(CommonUtils.set_int(url)) + " illustration") self.queue.add_work( Task(TASK_TYPE_ID, DOWNLOAD_MODE_ID, id=CommonUtils.set_int(url), path=path)) return elif url.startswith("http"): # 无法解析的pixivison站 或非 pixiv站 不支持 if url.find("pixivision.net") != -1: showerror("error", "The download link is not supported") print("error", "The download link is not supported") return showinfo("info", "Downloading url:" + url) print("info", "Downloading url:" + url) self.queue.add_work( Task(TASK_TYPE_URL, DOWNLOAD_MODE_URL, url=url, path=path)) else: showerror("error", "")
def search(self, keywords, path): id_set = set() page = CommonUtils.set_int(self.page_number.get(), 2) fav_num = CommonUtils.set_int(self.fav_num.get(), 0) tasks = [] for p in range(1, page + 1): result = self.search_handler.search(keywords, page=p, download_threshold=fav_num) if len(result) == 0: print('warning', 'Page:' + str(p) + ' Search results are Empty') continue for illu in result: if illu.id in id_set: continue else: task = Task(TASK_TYPE_SEARCH, DOWNLOAD_MODE_ID, title='search ' + keywords, path=path, p_limit=CommonUtils.set_int( self.p_limit.get(), 0), id=illu.id, illu=illu, get_from='search_page') id_set.add(illu.id) tasks.append(task) print('Search ' + keywords + ' from web page get:' + str(len(tasks))) api_search_data = api_search(keywords, self.api, page=page, download_threshold=fav_num, id_set=id_set) if len(api_search_data) == 0: print('warning', 'Api search results are empty') else: print('Search ' + keywords + ' from pixiv Api get:' + str(len(api_search_data))) for illu in api_search_data: task = Task(TASK_TYPE_SEARCH_API, DOWNLOAD_MODE_DETAIL, path=path, p_limit=CommonUtils.set_int(self.p_limit.get(), 0), illu=illu, title='search ' + keywords, get_from='search_api') tasks.append(task) all_count = len(tasks) if all_count > 0: current_count = AtomicInteger.AtomicInteger() if not os.path.exists(path): os.makedirs(path) for task in tasks: task.all_count = all_count task.current_count = current_count self.queue.add_work(task)
def related(self, id_var, path): page = CommonUtils.set_int(self.page_number.get(), 2) fav_num = CommonUtils.set_int(self.fav_num.get(), 0) illusts = [] result = self.api.illust_related(id_var) next_url = result.next_url datas = result.illusts if len(datas) == 0: print('warning', 'Get related illus of ' + str(id_var) + ' are empty') return illusts.extend(datas) page -= 1 while len(datas) > 0 and CommonUtils.is_not_empty( next_url) and page > 0: result = self.api.get(next_url) datas = result.illusts next_url = result.next_url illusts.extend(datas) page -= 1 tasks = [] id_set = set() p_limit = CommonUtils.set_int(self.p_limit.get(), 0) for illust in illusts: if not illust or illust.id in id_set: continue if fav_num > 0: if illust.total_bookmarks < fav_num: continue task = Task(TASK_TYPE_RELATED, DOWNLOAD_MODE_DETAIL, path=path, p_limit=p_limit, illu=illust, title="Related by id " + str(id_var), get_from='related') tasks.append(task) id_set.add(illust.id) if len(tasks) == 0: print('warning', 'Get related illus of ' + str(id_var) + ' are empty') return else: print('Get related illus of ' + str(id_var) + ' All:' + str(len(tasks))) all_count = len(tasks) current_count = AtomicInteger.AtomicInteger() if not os.path.exists(path): os.makedirs(path) for task in tasks: task.all_count = all_count task.current_count = current_count self.queue.add_work(task)
def ranking(self, path, mode, date, pages=1): path = path + "/ranking_" + mode + '_' + date page = 0 offset = 0 tasks = [] while page < pages: ranking_data = self.api.app_ranking(mode=mode, date=date, offset=offset).illusts page = page + 1 if len(ranking_data) > 0: print ('Get from ranking(page=' + str(page) + '):' + str(len(ranking_data))) for illu in ranking_data: task = Task(TASK_TYPE_RANKING, DOWNLOAD_MODE_DETAIL, path=path, p_limit=CommonUtils.set_int(self.p_limit.get(), 0), illu=illu, title="Ranking_" + mode + "_" + date, get_from='ranking') tasks.append(task) offset = offset + 1 else: print ('warning', 'Ranking(page=' + str(page) + ') results are empty') showerror("error", 'Ranking(page=' + str(page) + ') results are empty') break all_count = len(tasks) if all_count > 0: current_count = AtomicInteger.AtomicInteger() if not os.path.exists(path): os.makedirs(path) for task in tasks: task.all_count = all_count task.current_count = current_count self.queue.add_work(task)
def handle_related(self): id_var = CommonUtils.set_int(self.id_var.get().strip()) if id_var <= 0: showwarning("warning", "Please enter search keywords!") print("warning", "Please enter search keywords!") return if CommonUtils.is_empty(self.path_var.get()): showwarning("warning", "path can't be empty!") print("warning", "path can't be empty!") return path = self.path_var.get().strip() if not os.path.exists(path): showerror("error", " No such file or directory!") print('error', 'No such file or directory') return path = path + "/" + CommonUtils.filter_dir_name("related_" + str(id_var)) showinfo("info", "Get related illus of " + str(id_var) + " :") related_handler = Thread(target=self.related, args=(id_var, path)) related_handler.start()
def handle_ranking(self): mode = self.mode_var.get() path = self.path_var.get().strip() page = CommonUtils.set_int(self.page_number.get(), 2) date = self.date_var.get().strip() if CommonUtils.is_empty(path): showwarning("warning", "path can't be empty!") print ("warning", "path can't be empty!") return if not os.path.exists(path): showerror("error", " No such file or directory!") print ('error', 'No such file or directory') return if not CommonUtils.validate_date_str(date): showerror("error", "Date Wrong!") print ('error', 'Date Wrong') return if datetime.datetime.strptime(date, '%Y-%m-%d') > datetime.datetime.now(): showerror("error", "The date can not be greater than the day!") print ('error', 'The date can not be greater than the day') return showinfo("info", "Get ranking...") ranking_handler = Thread(target=self.ranking, args=(path, mode, date, page)) ranking_handler.start()