From a110c200e86d2325af07167531fac0f61d9681a0 Mon Sep 17 00:00:00 2001 From: Joris Guyonvarch Date: Fri, 26 Dec 2025 18:41:26 +0100 Subject: Switch to GUI to manage the library Allow to regroup the CLI and the view into one unique tool. --- src/book_transfer.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/book_transfer.py (limited to 'src/book_transfer.py') diff --git a/src/book_transfer.py b/src/book_transfer.py new file mode 100644 index 0000000..a89f779 --- /dev/null +++ b/src/book_transfer.py @@ -0,0 +1,66 @@ +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) + + 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 = 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}' -- cgit v1.2.3