Procházet zdrojové kódy

added command for thumbnail generation

Dimitri Korsch před 3 roky
rodič
revize
7ef87b7951
5 změnil soubory, kde provedl 71 přidání a 2 odebrání
  1. 6 0
      app.py
  2. 4 0
      pycs/__init__.py
  3. 0 2
      pycs/frontend/WebServer.py
  4. 45 0
      pycs/management.py
  5. 16 0
      pycs/util/FileOperations.py

+ 6 - 0
app.py

@@ -1,8 +1,14 @@
 #!/usr/bin/env python
 
+import logging.config
+
 from pycs import app
 from pycs import settings
 from pycs.frontend.WebServer import WebServer
+from pycs.management import setup_commands
+
+logging.config.dictConfig(settings.logging)
+setup_commands(app)
 
 if __name__ == '__main__':
     server = WebServer(app, settings)

+ 4 - 0
pycs/__init__.py

@@ -15,6 +15,7 @@ from sqlalchemy import event
 from sqlalchemy import pool
 from sqlalchemy.engine import Engine
 
+
 print('=== Loading settings ===')
 with open('settings.json') as file:
     settings = munchify(json.load(file))
@@ -25,6 +26,8 @@ if not os.path.exists(settings.projects_folder):
 
 DB_FILE = Path.cwd() / settings.database
 
+
+
 app = Flask(__name__)
 app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{DB_FILE}"
 app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
@@ -45,3 +48,4 @@ db = SQLAlchemy(app, engine_options=dict(
     )
 )
 migrate = Migrate(app, db)
+

+ 0 - 2
pycs/frontend/WebServer.py

@@ -1,4 +1,3 @@
-import logging.config
 import typing as T
 
 from glob import glob
@@ -66,7 +65,6 @@ class WebServer:
 
     def __init__(self, app, settings: munch.Munch, discovery: bool = True):
 
-        logging.config.dictConfig(settings.logging)
         self.app = app
         # set json encoder so database objects are serialized correctly
         self.app.json_encoder = JSONEncoder

+ 45 - 0
pycs/management.py

@@ -0,0 +1,45 @@
+import click
+from tabulate import tabulate
+
+from pycs import app
+from pycs.database.Project import Project
+from pycs.util import FileOperations
+
+from flask.cli import AppGroup
+from flask.cli import with_appcontext
+
+def setup_commands(app):
+    app.cli.add_command(project_cli)
+
+project_cli = AppGroup("project")
+
+@project_cli.command()
+@click.argument("project_id")
+def generate_thumbnails(project_id):
+    if project_id == "all":
+        projects = Project.query.all()
+        app.logger.info(f"Generating thumbnails for all projects ({len(projects)})!")
+    else:
+        project = Project.query.get(project_id)
+        if project is None:
+            app.logger.error(f"Could not find project with ID {project_id}!")
+            return
+        app.logger.info(f"Generating thumbnails for project {project}!")
+        projects = [project]
+
+    for project in projects:
+        FileOperations.generate_thumbnails(project)
+
+@project_cli.command("list")
+def list_projects():
+    projects = Project.query.all()
+
+    print(f"Got {len(projects)} projects")
+    rows = [(p.id, p.name, p.description) for p in projects]
+
+    print(tabulate(rows,
+        headers=["id", "name", "description"],
+        tablefmt="fancy_grid"
+    ))
+
+

+ 16 - 0
pycs/util/FileOperations.py

@@ -7,13 +7,17 @@ from pathlib import Path
 import cv2
 
 from PIL import Image
+from tqdm import tqdm
 
+from pycs import app
 from pycs.database.File import File
+from pycs.database.Project import Project
 
 DEFAULT_JPEG_QUALITY = 80
 
 
 BoundingBox = namedtuple("BoundingBox", "x y w h")
+Size = namedtuple("Size", "max_width max_height")
 
 
 def file_info(data_folder: str, file_name: str, file_ext: str):
@@ -254,3 +258,15 @@ def find_images(folder,
             images.append(fpath)
 
     return images
+
+
+def generate_thumbnails(project: Project, sizes = [Size(200, 200), Size(2000, 1200)]):
+    app.logger.info(f"Generating thumbnails for project \"{project.name}\"")
+
+    files = list(project.files)
+    for file in tqdm(files):
+        for size in sizes:
+            resize_file(file,
+                project.root_folder,
+                size.max_width,
+                size.max_height)