import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk, GLib, GObject import os import subprocess import shutil import threading import time import src.utils as utils import src.str_format as str_format class BookTransfer(Gtk.Window): def __init__(self, parent_window, ereader, book_id, data, paths): Gtk.Window.__init__(self) self._ereader = ereader self._book_id = book_id self._data = data self._paths = paths utils.configure_dialog(self, parent_window, data['title'], width=None, height=None, allow_escape=False) self._box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=20) self.set_child(self._box) utils.set_margin(self._box, 20) for path in paths: basename = os.path.basename(path) self._box.append(utils.label(basename)) self._spinner = Gtk.Spinner() self._spinner.start() self._box.append(self._spinner) thread = threading.Thread(target=self._transfer_books_daemon) thread.daemon = True thread.start() def _complete_animation(self): self._box.remove(self._spinner) self._box.append(utils.label('✔')) def _transfer_books_daemon(self): for path in self._paths: self._transfer_book(path) GLib.idle_add(self._complete_animation) def _transfer_book(self, path): dest = self._dest_name(path) if path.suffix in ['.mobi', '.azw3']: # Copy os.makedirs(os.path.dirname(dest), exist_ok=True) shutil.copyfile(path, dest) else: # Convert os.makedirs(os.path.dirname(dest), exist_ok=True) subprocess.run(['ebook-convert', path, dest]) def _dest_name(self, path): safe_author = str_format.safe_path(self._data['authors'][0]) if len(self._data['authors']) > 0 else self._book_id safe_title = str_format.safe_path(self._data['title']) basename_no_ext = str_format.safe_path(os.path.splitext(os.path.basename(path))[0]) ext = path.suffix if path.suffix in ['.mobi', '.azw3'] else '.mobi' return f'{self._ereader}/{safe_author}-{safe_title}-{basename_no_ext}{ext}'