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 class BookDetail(Gtk.Window): def __init__(self, parent_window, library, book_id, data): Gtk.Window.__init__(self) utils.configure_dialog(self, parent_window, data['title'], height=800) 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(book_line(book_id, data, path)) def has_info(data, key): return key in data and data[key] def book_line(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) return box 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)