phantompy/qasync_phantompy.py
2022-11-15 21:49:31 +00:00

133 lines
3.8 KiB
Python

#!/usr/local/bin/python3.sh
# -*-mode: python; indent-tabs-mode: nil; py-indent-offset: 4; coding: utf-8 -*
import sys
import os
import qasync
import asyncio
import time
import random
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import (QProgressBar, QWidget, QVBoxLayout)
from phantompy import Render
from lookupdns import LookFor as Render
global LOG
import logging
import warnings
warnings.filterwarnings('ignore')
LOG = logging.getLogger()
class Widget(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
self._label = QtWidgets.QLabel()
box = QtWidgets.QHBoxLayout()
self.setLayout(box)
box.addWidget(self._label)
self.progress = QProgressBar()
self.progress.setRange(0, 99)
box.addWidget(self.progress)
def update(self, text):
i = len(asyncio.all_tasks())
self._label.setText(str(i))
self.progress.setValue(int(text))
class ContextManager:
def __init__(self) -> None:
self._seconds = 0
async def __aenter__(self):
LOG.debug("ContextManager enter")
return self
async def __aexit__(self, *args):
LOG.debug("ContextManager exit")
async def tick(self):
await asyncio.sleep(1)
self._seconds += 1
return self._seconds
async def main(widget, app, ilen):
LOG.debug("Task started")
try:
async with ContextManager() as ctx:
for i in range(1, 120):
seconds = await ctx.tick()
LOG.info(str(seconds))
perc = 50 + int(float(len(app.lfps))*100.0/ilen)
if widget:
widget.update(str(perc))
LOG.debug(f"{app.lfps} {perc} {seconds}")
if len(app.lfps) == ilen:
print('\n'.join(app.lfps))
app.exit()
# raise asyncio.CancelledError
break
except asyncio.CancelledError as ex:
LOG.debug("Task cancelled")
def iMain(largs, bgui=True):
app = QtWidgets.QApplication([])
app.lstart = []
if bgui:
widget = Widget()
widget._app = app
widget.show()
else:
widget = None
loop = qasync.QEventLoop(app)
asyncio.set_event_loop(loop)
largs = sys.argv[1:]
url = largs[0]
outfile = largs[1]
jsfile = largs[2] if len(largs) > 2 else None
if os.path.exists(url):
with open(url, 'rt') as ofd:
elts = ofd.readlines()
random.shuffle(elts)
lelts = elts[:4]
else:
lelts = [url]
for i, elt in enumerate(lelts):
# run only starts the url loading
r = Render(app, do_print=False, do_save=True)
uri = elt.strip()
r.run(uri, outfile, jsfile)
per = int(float(i)*100.0/2/len(lelts))
LOG.debug(f"{r.percent} {app.lstart} {per} {i}")
if len(lelts) == 1: break
for j in range(1, random.randint(30, 120)):
# google throttles too many links at a time
if widget:
widget.update(str(per))
app.processEvents()
time.sleep(1)
LOG.info(f"queued {len(app.lstart)} urls")
# run until app.exec() is finished (Qt window is closed)
task = loop.create_task(main(widget, app, len(lelts)))
loop.run_forever()
# cancel remaining tasks and wait for them to complete
task.cancel()
tasks = asyncio.all_tasks()
loop.run_until_complete(asyncio.gather(*tasks))
if __name__ == '__main__':
try:
from exclude_badExits import vsetup_logging
d = int(os.environ.get('DEBUG', 0))
if d > 0:
vsetup_logging(10, stream=sys.stderr)
else:
vsetup_logging(20, stream=sys.stderr)
vsetup_logging(log_level, logfile='', stream=sys.stderr)
except: pass
iMain(sys.argv[1:], bgui=False)