# coding: utf-8
import os
import sys
import time
import json
import datetime
import argparse
import pyautogui as pygui
from pathlib import Path
from ._clipath import PYCHARMERS_CLI_BOOK2IMG_DIR
from ..utils.generic_utils import now_str
from ..utils.tkinter_utils import PortionSelector
from ..utils.monitor_utils import ProgressMonitor
from ..utils.print_utils import tabulate
from ..utils._colorings import toBLUE, toGREEN
[docs]class guiOperations():
"""Packaged Gui Operations.
Args:
ops (dict/str) : Operations.
"""
HEADER_KEYS = ["description"]
def __init__(self, ops={}):
self.init(ops=ops)
[docs] def init(self, ops={}):
"""Initialize the operation instance."""
if isinstance(ops, str):
with open(ops, mode="r") as jf:
ops = json.load(jf)
self.ops = ops
for key in guiOperations.HEADER_KEYS:
self.ops.pop(key)
[docs] def run(self):
"""Run the packaged operations."""
for n,op in self.ops.items():
method = op.get("method")
args = op.get("args", [])
kwargs = op.get("kwargs", {})
exec(f"pygui.{method}(*args, **kwargs)")
[docs]def book2img(argv=sys.argv[1:]):
"""Convert Book into Sequential Images.
Args:
-N/--num (int) : Number of screenshots to take.
-I/--interval (int) : Interval to take screenshots.
-OP/--operations (str) : Path or Abbreviation for Operations.
-O/--output (str) : Path to the output directory.
-S/--sec (int) : Time to take a screenshot.
Note:
When you run from the command line, execute as follows::
$ book2img -N 10 -I 1 -OP KindleApp
.. code-block:: sh
$ cat ~/.pycharmers/cli/book2img/kindleApp.json
{
"description": "Operations for KindleApp (Examples)",
"1": {
"method": "keyDown",
"args": [
"right"
],
"kwargs": {}
}
}
+--------------------------------------+
| Sample |
+======================================+
| .. image:: _images/cli.book2img.gif |
+--------------------------------------+
"""
if len(argv)==0:
tabulate([[os.path.splitext(fn.name)[0], json.load(fn.open()).get("description", "")] for fn in Path(PYCHARMERS_CLI_BOOK2IMG_DIR).glob("*.json")], headers=["Abbreviation", "Description"])
print(f"You can use these operations by\n{toBLUE('$ book2img -OP <Abbreviation>')}")
sys.exit(-1)
parser = argparse.ArgumentParser(prog="book2img", description="Convert Books to Image.", add_help=True)
parser.add_argument("-N", "--num", type=int, default=1, help="Number of screenshots to take.")
parser.add_argument("-I", "--interval", type=int, default=1, help="Interval to take screenshots.")
parser.add_argument("-OP", "--operations", type=str, help="Path or Abbreviation for Operations.")
parser.add_argument("-O", "--output", type=str, default=f"books-{now_str()}", help="Path to the output directory.")
parser.add_argument("-S", "--sec", type=int, default=3, help="Time to take a screenshot")
args = parser.parse_args(argv)
num = args.num
digit = len(str(num))
out_dir = args.output
interval = args.interval
sec = args.sec
ops = args.operations or {}
if (isinstance(ops, str)) and (not ops.endswith(".json")):
ops = os.path.join(PYCHARMERS_CLI_BOOK2IMG_DIR, ops+".json")
ops = guiOperations(ops=ops)
ps = PortionSelector()
ps.run()
region = ps.get_xywh()
print(f"Region (x,y,w,h): {toGREEN(region)}")
os.mkdir(out_dir)
print(f"{num} Images will saved at {toBLUE(out_dir)}")
print(f"Screenshot will be taken in {sec} seconds.")
time.sleep(sec)
monitor = ProgressMonitor(max_iter=num, barname="book2img")
for n in range(num):
monitor.report(it=n, num_screenshots=n+1)
ss = pygui.screenshot(region=region)
ss.save(os.path.join(out_dir, f"img{n:>0{digit}}.png"))
ops.run()
time.sleep(interval)
monitor.remove()