import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk import os import subprocess import shutil import os.path import pathlib import src.utils as utils import src.book_files as book_files import src.str_format as str_format from src.book_transfer import BookTransfer class BookDetail(Gtk.Window): def __init__(self, parent_window, library, ereader, book_id, data): Gtk.Window.__init__(self) utils.configure_dialog(self, parent_window, data['title'], height=800) self._library = library self._ereader = ereader scrolled_window = Gtk.ScrolledWindow() self.set_child(scrolled_window) box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=20) scrolled_window.set_child(box) utils.set_margin(box, 20) if has_info(data, 'subtitle'): box.append(utils.label(data['subtitle'])) if has_info(data, 'year'): box.append(utils.label(str(data['year']))) if len(data['authors']): box.append(utils.label(', '.join(data['authors']))) if len(data['genres']): box.append(utils.label(', '.join(data['genres']))) picture = Gtk.Picture.new_for_filename(f'{library}/{book_id}/cover.png') picture.set_can_shrink(False) box.append(picture) box.append(utils.label(data['summary'])) for path in book_files.get(library, book_id): box.append(self._book_line(book_id, data, path)) def _book_line(self, book_id, data, path): box = Gtk.Box(spacing=20) box.append(utils.label(os.path.basename(path))) open_button = Gtk.Button(label='Ouvrir') open_button.connect('clicked', lambda _: open_book(path)) box.append(open_button) download_button = Gtk.Button(label='Télécharger') download_button.connect('clicked', lambda _: download_book(book_id, data, path)) box.append(download_button) if self._ereader and os.path.exists(self._ereader): transfer_button = Gtk.Button(label='Transférer') transfer_button.connect('clicked', lambda _: self._transfer_book(book_id, data, path)) box.append(transfer_button) return box def _transfer_book(self, book_id, data, path): BookTransfer(self, self._ereader, book_id, data, path).present() def has_info(data, key): return key in data and data[key] def open_book(path): subprocess.run(['xdg-open', path]) def download_book(book_id, data, path): home = pathlib.Path.home() safe_author = str_format.safe_path(data['authors'][0]) if len(data['authors']) > 0 else book_id safe_title = str_format.safe_path(data['title']) basename, ext = os.path.splitext(os.path.basename(path)) safe_basename = str_format.safe_path(basename) dest = f'{home}/downloads/{safe_author}-{safe_title}-{safe_basename}{ext}' shutil.copyfile(path, dest)