aboutsummaryrefslogtreecommitdiff
path: root/src/book_transfer.py
blob: 3bda52ffda8f6aa6047f5ec427181a7a352495be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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, 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}'