Skip to content

Instantly share code, notes, and snippets.

@elementiss
Last active December 2, 2024 09:30
Show Gist options
  • Save elementiss/4a7816bef881fef7ddc3e689620417cf to your computer and use it in GitHub Desktop.
Save elementiss/4a7816bef881fef7ddc3e689620417cf to your computer and use it in GitHub Desktop.
Корректировка пути к книге в библиотеке Icecream Ebook Reader 6.44
import sqlite3
import base64
import os
import hashlib
# в программе Icecream Ebook Reader 6.44 не предусмотрена корректировка пути к книге в библиотеке
# после физического переноса книги в другую папку файловой системы
# данный скрипт на питоне выводит все книги из библиотеки, у которых нет физического файла
# по указанному пути, и предлагает ввести новый актуальный путь, и сохраняет его в базе.
# заодно считает старый и новый хеши для дальнейшего ручного переноса заметок и закладок книги
# Перед запуском при необходимости исправить путь к базе.
# elementiss 2024-01-27
# Создаем соединение с базой данных
current_user = os.getlogin()
db_path = f"C:\\Users\\{current_user}\\.Icecream Ebook Reader\\data\\ebooklib.sqlite3"
# исправьте путь вручную для нетипичного расположения
#conn = sqlite3.connect('ebooklib.sqlite3')
conn = sqlite3.connect(db_path)
# Создаем курсор для выполнения SQL-запросов
c = conn.cursor()
# Выполняем SQL-запрос для получения всех записей из таблицы
c.execute("SELECT DISTINCT full_path FROM books")
# один путь может быть найден дважды из-за наличия книги в корзине, поэтому DISTINCT
# Получаем все строки из результата запроса
rows = c.fetchall()
# Выводим каждую запись на консоль
for row in rows:
decoded_row = base64.b64decode(row[0]).decode('utf-8')
# книги нет на диске
if not os.path.isfile(decoded_row):
md5_hash = hashlib.md5()
md5_hash.update(decoded_row.encode())
old_md5 = md5_hash.hexdigest()
# имя папки в которой лежат распакованные данные вниги, заметки, закладки,
# и идентификатор книги вычисляются как md5 от полного пути к книге
print(old_md5 + " " + decoded_row)
new_value = input("Введите новый путь к этой книге (ENTER - пропустить): \n")
if new_value != "":
md5_hash.update(new_value.encode())
new_md5 = md5_hash.hexdigest()
print(new_md5)
# вывели новый id книги для ручной замены
new_value = base64.b64encode(new_value.encode()).decode()
c.execute("UPDATE books SET full_path = ? WHERE full_path = ?", (new_value, row[0]))
conn.commit()
# обновили путь к книге в базе
# Закрываем соединение с базой данных
conn.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment