def mergeImagePdf(op, webtoonId, viewNo, cutNo, savePath, tmpPath, runningThreadNo, cookie, noProgressBar, digits): pdf_list = [] for i in range(0, cutNo): try: im = Image.open( os.path.join( tmpPath, "%s_%s_%d.png" % (getWebtoonName(op, webtoonId, cookie), str(viewNo), i))) if im.getbands() != ('R', 'G', 'B'): im = im.convert('RGBA') if len(im.getbands()) == 4: back = Image.new('RGBA', size=im.size, color=(255, 255, 255) + (255, )) im = alpha_composite(im, back).convert('RGB') im.save( os.path.join( tmpPath, "%s_%s_%d.png" % (getWebtoonName( op, webtoonId, cookie), str(viewNo), i))) pdf_list.append( os.path.join( tmpPath, "%s_%s_%d.png" % (getWebtoonName(op, webtoonId, cookie), str(viewNo), i))) except: pass pdf = convert(pdf_list) with open( os.path.join( savePath, "%%s_%%0%dd.pdf" % digits % (getWebtoonName(op, webtoonId, cookie), viewNo)), "wb") as f: f.write(pdf) if noProgressBar: log("m " + str(viewNo), 3) runningThreadNo.value -= 1
def mergeImage(op, webtoonId, viewNo, cutNo, savePath, tmpPath, runningThreadNo, cookie, digits): file_list = [] size_y = [] ti = Image.open( os.path.join( tmpPath, "%s_%s_0.png" % (getWebtoonName(op, webtoonId, cookie), str(viewNo)))) nx = ti.size[0] ti.close() for i in range(0, cutNo): file = os.path.join( tmpPath, "%s_%s_%d.png" % (getWebtoonName(op, webtoonId, cookie), str(viewNo), i)) image = Image.open(file) im = image.resize((nx, int(image.size[1] / image.size[0] * nx))) file_list.append(im) size_y.append(im.size[1]) image.close() ny = sum(size_y) canv = Image.new("RGB", (nx, ny), (256, 256, 256)) sumY = 0 for idx in range(len(file_list)): area = (0, sumY, nx, size_y[idx] + sumY) canv.paste(file_list[idx], area) sumY = sumY + size_y[idx] canv.save( os.path.join( savePath, "%%s_%%0%dd.png" % digits % (getWebtoonName(op, webtoonId, cookie), viewNo)), 'PNG') log("m " + str(viewNo), 3) runningThreadNo.value -= 1
def downPartialEpisode(op, webtoonId, start, finish, saveDir, divNo, modular, cnt, qu, savedEpisode, cookie, pbar): for viewNo in range(start, finish + 1): imgNo = getImgNo(op, webtoonId, viewNo, cookie) for i in range(modular, imgNo, divNo): imgName = os.path.join( saveDir, getWebtoonName(op, webtoonId, cookie) + "_" + str(viewNo) + "_" + str(i) + ".png") saveImg(op, webtoonId, viewNo, i, imgName, cookie) cnt[viewNo] -= 1 if cnt[viewNo] == 0: qu.put(viewNo) if not pbar: log("d " + str(viewNo), 5) savedEpisode.value -= 1
def downWebtoon(op, webtoonId, start, finish, saveDir, mergeOption, noProgressBar, multiThreadCount=8, multiThreadMergingCount=8, cookie=None): temp_dir = tempfile.TemporaryDirectory() pbarD = None pbarM = None if not noProgressBar: if mergeOption: pbarD = tqdm(total=finish - start + 1, maxinterval=1, position=0, desc="Download") pbarM = tqdm(total=finish - start + 1, maxinterval=1, position=1, desc="Merge") else: pbarD = tqdm(total=finish - start + 1, mininterval=0.01) if op == 'naver' or op == 'nbest' or op == 'nchall': webtoonId = int(webtoonId) thrs = list() cnt = Array('i', [multiThreadCount] * (finish + 1)) runningThreadNo = Value('i', 0) qu = Queue() leftEpisode = finish - start + 1 savedEpisode = Value('i', finish - start + 1) for i in range(0, multiThreadCount): if mergeOption: thr = Process(target=downPartialEpisode, args=(op, webtoonId, start, finish, temp_dir.name, multiThreadCount, i, cnt, qu, savedEpisode, cookie, not not pbarD)) else: thr = Process(target=downPartialEpisode, args=(op, webtoonId, start, finish, saveDir, multiThreadCount, i, cnt, qu, savedEpisode, cookie, not not pbarD)) thrs.append(thr) thr.start() laRunningThreadNo = 0 if mergeOption: while leftEpisode > 0: if laRunningThreadNo != runningThreadNo.value: diff = laRunningThreadNo - runningThreadNo.value if not noProgressBar: clear() pbarM.update(diff) clear() pbarD.refresh() pbarM.refresh() laRunningThreadNo -= diff if savedEpisode.value == 0 and multiThreadCount: multiThreadMergingCount += multiThreadCount / 2 multiThreadCount = 0 if not qu.empty( ) and runningThreadNo.value < multiThreadMergingCount: targetEpisode = qu.get() if targetEpisode not in shared.imgNo: getImgNo(op, webtoonId, targetEpisode, cookie) if shared.imgNo[targetEpisode] == 0: if not noProgressBar: clear() pbarM.update(1) clear() pbarD.refresh() pbarM.refresh() else: log("m " + str(targetEpisode), 5) leftEpisode -= 1 continue runningThreadNo.value += 1 laRunningThreadNo += 1 if not noProgressBar: clear() pbarD.update(1) clear() pbarD.refresh() pbarM.refresh() if mergeOption == 1: thr = Process(target=mergeImage, args=(op, webtoonId, targetEpisode, shared.imgNo[targetEpisode], saveDir, temp_dir.name, runningThreadNo, cookie, len(str(finish)))) else: thr = Process(target=mergeImagePdf, args=(op, webtoonId, targetEpisode, shared.imgNo[targetEpisode], saveDir, temp_dir.name, runningThreadNo, cookie, noProgressBar, len(str(finish)))) thr.start() thrs.append(thr) leftEpisode -= 1 for i in thrs: i.join() temp_dir.cleanup() try: if not noProgressBar: diff = laRunningThreadNo - runningThreadNo.value if not noProgressBar: clear() pbarM.update(diff) clear() pbarD.refresh() pbarM.refresh() laRunningThreadNo -= diff clear() pbarD.close() pbarM.close() except: pass