aboutsummaryrefslogtreecommitdiff
path: root/src/book_transfer.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/book_transfer.py')
-rw-r--r--src/book_transfer.py66
1 files changed, 66 insertions, 0 deletions
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}'