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
|
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, path):
Gtk.Window.__init__(self)
self._ereader = ereader
self._book_id = book_id
self._data = data
self._path = path
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)
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):
self._transfer_book()
GLib.idle_add(self._complete_animation)
def _transfer_book(self):
dest = self._dest_name()
if self._path.suffix in ['.mobi', '.azw3']:
# Copy
os.makedirs(os.path.dirname(dest), exist_ok=True)
shutil.copyfile(self._path, dest)
else:
# Convert
os.makedirs(os.path.dirname(dest), exist_ok=True)
subprocess.run(['ebook-convert', self._path, dest])
def _dest_name(self):
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(self._path))[0])
ext = self._path.suffix if self._path.suffix in ['.mobi', '.azw3'] else '.mobi'
return f'{self._ereader}/{safe_author}-{safe_title}-{basename_no_ext}{ext}'
|