mirror of
https://github.com/Leseratte10/acsm-calibre-plugin
synced 2024-12-26 09:58:09 +01:00
109 lines
4 KiB
Python
109 lines
4 KiB
Python
|
#!/usr/bin/env python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
# Calibre plugin for ACSM files.
|
||
|
|
||
|
|
||
|
from calibre.customize import FileTypePlugin # type: ignore
|
||
|
__version__ = '0.0.1'
|
||
|
|
||
|
PLUGIN_NAME = "DeACSM"
|
||
|
PLUGIN_VERSION_TUPLE = tuple([int(x) for x in __version__.split(".")])
|
||
|
PLUGIN_VERSION = ".".join([str(x)for x in PLUGIN_VERSION_TUPLE])
|
||
|
|
||
|
import os
|
||
|
import traceback
|
||
|
|
||
|
from calibre.utils.config import config_dir # type: ignore
|
||
|
from calibre.constants import iswindows, isosx # type: ignore
|
||
|
|
||
|
|
||
|
|
||
|
class DeACSM(FileTypePlugin):
|
||
|
name = PLUGIN_NAME
|
||
|
description = "Takes an Adobe ACSM file and converts that into a useable EPUB file"
|
||
|
supported_platforms = ['linux']
|
||
|
author = "Leseratte10"
|
||
|
version = PLUGIN_VERSION_TUPLE
|
||
|
minimum_calibre_version = (5, 0, 0)
|
||
|
file_types = set(['acsm'])
|
||
|
on_import = True
|
||
|
on_preprocess = True
|
||
|
priority = 2000
|
||
|
|
||
|
def initialize(self):
|
||
|
"""
|
||
|
Dynamic modules can't be imported/loaded from a zipfile.
|
||
|
So this routine will extract the appropriate
|
||
|
library for the target OS and copy it to the 'alfcrypto' subdirectory of
|
||
|
calibre's configuration directory. That 'alfcrypto' directory is then
|
||
|
inserted into the syspath (as the very first entry) in the run function
|
||
|
so the CDLL stuff will work in the alfcrypto.py script.
|
||
|
The extraction only happens once per version of the plugin
|
||
|
Also perform upgrade of preferences once per version
|
||
|
"""
|
||
|
try:
|
||
|
self.pluginsdir = os.path.join(config_dir,"plugins")
|
||
|
if not os.path.exists(self.pluginsdir):
|
||
|
os.mkdir(self.pluginsdir)
|
||
|
self.maindir = os.path.join(self.pluginsdir,"DeACSM")
|
||
|
if not os.path.exists(self.maindir):
|
||
|
os.mkdir(self.maindir)
|
||
|
|
||
|
# only continue if we've never run this version of the plugin before
|
||
|
self.verdir = os.path.join(self.maindir,PLUGIN_VERSION)
|
||
|
if not os.path.exists(self.verdir):
|
||
|
if iswindows:
|
||
|
print("Windows not supported yet")
|
||
|
return
|
||
|
elif isosx:
|
||
|
print("Mac not supported yet")
|
||
|
return
|
||
|
else:
|
||
|
names = ["acsmdownloader", "adept_activate", "libgourou.so", "libzip.so.4"]
|
||
|
|
||
|
lib_dict = self.load_resources(names)
|
||
|
print("{0} v{1}: Copying needed library files from plugin's zip".format(PLUGIN_NAME, PLUGIN_VERSION))
|
||
|
|
||
|
for entry, data in lib_dict.items():
|
||
|
file_path = os.path.join(self.alfdir, entry)
|
||
|
try:
|
||
|
os.remove(file_path)
|
||
|
except:
|
||
|
pass
|
||
|
|
||
|
try:
|
||
|
open(file_path,'wb').write(data)
|
||
|
except:
|
||
|
print("{0} v{1}: Exception when copying needed library files".format(PLUGIN_NAME, PLUGIN_VERSION))
|
||
|
traceback.print_exc()
|
||
|
pass
|
||
|
|
||
|
# mark that this version has been initialized
|
||
|
os.mkdir(self.verdir)
|
||
|
except Exception as e:
|
||
|
traceback.print_exc()
|
||
|
raise
|
||
|
|
||
|
def is_customizable(self):
|
||
|
return True
|
||
|
|
||
|
def config_widget(self):
|
||
|
import calibre_plugins.deacsm.config as config # type: ignore
|
||
|
return config.ConfigWidget(self.plugin_path)
|
||
|
|
||
|
def save_settings(self, config_widget):
|
||
|
config_widget.save_settings()
|
||
|
|
||
|
def run(self, path_to_ebook: str):
|
||
|
# This code gets called by Calibre with a path to the new book file.
|
||
|
# We need to check if it's an ACSM file
|
||
|
|
||
|
print("{0} v{1}: Trying to parse file {2}".format(PLUGIN_NAME, PLUGIN_VERSION, os.path.basename(path_to_ebook)))
|
||
|
|
||
|
print("{0} v{1}: Failed, return original ...".format(PLUGIN_NAME, PLUGIN_VERSION))
|
||
|
return path_to_ebook
|
||
|
|
||
|
|
||
|
|