03-27-2011, 07:58 PM | #1 |
creator of calibre
Posts: 44,395
Karma: 23798586
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
|
calibre's new plugin API
This is for plugin developers,
I just finished developing a new API for calibre plugins that makes coding plugins a lot easier/cleaner. The new API is backward compatible, i.e. old plugins should continue to work. It also fixes a bug where some users on windows with non ASCII paths were unable to load plugins, however for this fix to work for your plugin, you have to move it to use the new API. Major features: 1. You can seamlessly import python code from different python files inside your plugin zip file using pythons normal import syntax, no more mucking around with zip import 2. A couple of new builtin functions that allow you to easy load images/data files from your plugin zip file 3. Point 1. means you no longer need the complicated structure of proxy classes in your InterfaceAction plugins I also wrote a nice tutorial with sample plugins illustrating the techniques, available here: http://calibre-ebook.com/user_manual...g_plugins.html Note that the example plugins have their minimum_calibre_version set to 0.7.53, so you either have to change the calibre version in your copy of the calibre source or wait for the next calibre release to actually run the plugins. Let me know if you have any questions/concerns. Last edited by kovidgoyal; 03-27-2011 at 08:04 PM. |
03-27-2011, 08:01 PM | #2 |
creator of calibre
Posts: 44,395
Karma: 23798586
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
|
Oh and if you have any suggestions on clarifying/improving the tutorial, do let me know.
|
Advert | |
|
03-27-2011, 08:27 PM | #3 |
Calibre Plugins Developer
Posts: 4,678
Karma: 2162246
Join Date: Oct 2010
Location: Australia
Device: Kindle Oasis
|
I've updated the Introduction to plugins sticky to point to the new manual page.
The changes are very cool - looking forward to not having to maintain the 4,000 lines of Goodreads Sync plugin in a single file and reducing the repeated copy/paste of common plugin code. Plus of course hopefully reduced support issues from that nasty ZipImport error... 2 plugins converted, 14 remaining, sigh... |
03-30-2011, 09:49 AM | #4 |
Calibre Plugins Developer
Posts: 4,678
Karma: 2162246
Join Date: Oct 2010
Location: Australia
Device: Kindle Oasis
|
Hi Kovid,
After days of work I am finally down to the last plugin to be converted, and it is the most complex (Goodreads Sync). However I am having a problem trying to work out how to get the importing to work. It relies on a library in a folder called “oauth2” which in turn uses another library “httplib2” which is a peer folder (as “httplib2” gets invoked directly by my code too). I have added these two folders to your interface_demo project to replicate the scenario in simpler code you are familiar with, and added this line to ui.py: import calibre_plugins.interface_demo.oauth2 The problem occurs within the __init__.py of oauth2, as it in turn on line 32 needs to resolve “import httplib2”. I have tried all sorts of variations of modifying that line to for instance: import calibre_plugins.interface_demo.httplib2 but nothing is working. Help me Obi Wan... |
03-30-2011, 10:18 AM | #5 |
creator of calibre
Posts: 44,395
Karma: 23798586
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
|
You'll need to replace import httplib2 with
import calibre_plugins.interface_demo.httplib2 as httplib2 That should do the trick, if not, let me know. |
Advert | |
|
03-30-2011, 10:32 AM | #6 |
Calibre Plugins Developer
Posts: 4,678
Karma: 2162246
Join Date: Oct 2010
Location: Australia
Device: Kindle Oasis
|
I could have sworn I tried that... thanks Kovid, that works...
|
03-30-2011, 04:38 PM | #7 |
Sigil developer
Posts: 1,274
Karma: 1101600
Join Date: Jan 2011
Location: UK
Device: Kindle PW, K4 NT, K3, Kobo Touch
|
Well I was 'this' close to another release, but I think I'll wait for 0.7.53 to come out so I can update to the new plugin api. In the meantime maybe I'll just add one more thing...
|
03-30-2011, 04:57 PM | #8 |
Calibre Plugins Developer
Posts: 4,678
Karma: 2162246
Join Date: Oct 2010
Location: Australia
Device: Kindle Oasis
|
@meme - well if you are running from source you could do the dev for it so you are ready to release this weekend
A straight migration of the code doesn't take too long - but if like me you decide to refactor it at the same time into separated code files and change your patterns for splitting the code it becomes rather non-trivial, I miss my C# refactoring tools, sigh. Plus you get no auto-completion assistance in Eclipse of any of your own code since it can't resolve the import statements. Then to round things off for me I found that Eclipse's IDE "Problems" parsing refused to work on many of my code files, so I may as well have been back to working in notepad for all the assistance it would give me in telling me about missing imports etc. I have no idea why Eclipse does that for some files and not others - not Kovid's problem I know! I've finished converting them all now and done some testing but I wouldn't be surprised if I've introduced some bugs as careful as I tried to be. It will all pay off in the long term hopefully. |
03-31-2011, 01:09 PM | #9 |
Grand Sorcerer
Posts: 6,216
Karma: 16534894
Join Date: Sep 2009
Location: UK
Device: Kobo: KA1, ClaraHD, Forma, Libra2, Clara2E. PocketBook: TouchHD3
|
I have to admit to being a little intimidated by these changes, probably due to me being a rank amateur not a proper developer. I am going to take you at your word that the changes are backward compatible and that anyone using my plugin as-is will still be able to use it after v7.53 is released. I have no extra features currently planned.
Nevertheless, I am going to slowly try to get to grips with the changes which would need to be made to my very simple plugin. As a start I tried to download the sample from the manual but am getting Code:
Forbidden You don't have permission to access /downloads/interface_demo_plugin.zip on this server. |
03-31-2011, 01:17 PM | #10 |
creator of calibre
Posts: 44,395
Karma: 23798586
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
|
That was my mistake, try the download again, it should work now.
|
03-31-2011, 01:18 PM | #11 |
Calibre Plugins Developer
Posts: 4,678
Karma: 2162246
Join Date: Oct 2010
Location: Australia
Device: Kindle Oasis
|
@jackie_w - assuming you have Calibre from source, just look in src\calibre\manual\plugin_examples\interface_demo
EDIT: I see Kovid posted a fix... |
03-31-2011, 01:28 PM | #12 |
Grand Sorcerer
Posts: 6,216
Karma: 16534894
Join Date: Sep 2009
Location: UK
Device: Kobo: KA1, ClaraHD, Forma, Libra2, Clara2E. PocketBook: TouchHD3
|
Download works now, thanks.
@kiwidude - I don't run from source. When I said "amateur" I really meant it By the way, could you identify a simple (and preferably short) plugin which you have already upgraded so that I can get a better feel for what's going on. |
03-31-2011, 01:50 PM | #13 |
Calibre Plugins Developer
Posts: 4,678
Karma: 2162246
Join Date: Oct 2010
Location: Australia
Device: Kindle Oasis
|
I haven't uploaded any officially as yet of course, but here is the new version of my "Temp Marker" plugin which is a trivial one.
You can't install it without running from source and winding down the minimum_calibre_version (until 0.7.53 is released) but you can look through the code and compare with my original version which you can download from here. I have a "Foo Example" plugin that I do some find/replace operations on as a starting point for each migration or new plugin that I write. The common_utils.py is a linked file that I share across my plugins containing common utility functions or UI stuff I reuse. I also have a batch file that I double-click on in Eclipse which builds the whole zip and runs it in Calibre, it looks like this for this plugin: Code:
@ECHO OFF pushd . SET ZIPNAME=Temp Marker cd "D:\CalibreDev\latest\calibre\src\calibre\plugins\%ZIPNAME%" wzzip.exe -u -e0 "%ZIPNAME%.zip" ..\_CommonUtils\common_utils.py wzzip.exe -u -e0 "%ZIPNAME%.zip" *.py wzzip.exe -u -e0 "%ZIPNAME%.zip" *.txt wzzip.exe -u -e0 -P -r "%ZIPNAME%.zip" images calibre-customize -a "%ZIPNAME%.zip" popd SET ZIPNAME= calibre-debug -g |
03-31-2011, 02:35 PM | #14 |
Grand Sorcerer
Posts: 6,216
Karma: 16534894
Join Date: Sep 2009
Location: UK
Device: Kobo: KA1, ClaraHD, Forma, Libra2, Clara2E. PocketBook: TouchHD3
|
@kiwidude,
Thank you. "Trivial" is the level I was hoping for. There is no way you're a rank amateur! I use quite a few of your plugins - they're fantastic! |
04-01-2011, 07:08 AM | #15 |
Sigil developer
Posts: 1,274
Karma: 1101600
Join Date: Jan 2011
Location: UK
Device: Kindle PW, K4 NT, K3, Kobo Touch
|
I'm trying to convert my plugin, and I've noticed while running from source I get errors like this for several dummy files even without running using my plugin - Calibre still runs though:
IndentationError: expected an indented block Failed to initialize plugin... Traceback (most recent call last): File "/home/meme/Calibre-Source/calibre/src/calibre/customize/ui.py", line 486, in initialize_plugins plugin = load_plugin(zfp) if not isinstance(zfp, type) else zfp File "/home/meme/Calibre-Source/calibre/src/calibre/customize/ui.py", line 49, in load_plugin return loader.load(path_to_zip_file) File "/home/meme/Calibre-Source/calibre/src/calibre/customize/zipplugin.py", line 169, in load m = importlib.import_module(plugin_module) File "importlib/__init__.py", line 37, in import_module File "/home/meme/Calibre-Source/calibre/src/calibre/customize/zipplugin.py", line 147, in load_module import_name), 'exec', dont_inherit=True) File "calibre_plugins.dummy12.__init__", line 38 print "HELLO!" ^ I've decided to split my code out into several files to make the most of the new api - it may be some time before it actually works again |
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
[GUI Plugin] Plugin Updater **Deprecated** | kiwidude | Plugins | 159 | 06-19-2011 12:27 PM |
Metadata scraper plugin api | kiwidude | Development | 5 | 03-06-2011 11:58 AM |
Goodreads has published an API | EricLandes | Calibre | 6 | 01-12-2011 04:39 PM |
New Plugin Type Idea: Library Plugin | cgranade | Plugins | 3 | 09-15-2010 12:11 PM |
Ubook plugin api | Dopedangel | Reading and Management | 0 | 08-25-2007 06:54 AM |