Register Guidelines E-Books Search Today's Posts Mark Forums Read

Go Back   MobileRead Forums > E-Book Software > Calibre > Development

Notices

Reply
 
Thread Tools Search this Thread
Old 09-20-2014, 07:21 AM   #1
plugin_dev
Junior Member
plugin_dev began at the beginning.
 
Posts: 8
Karma: 10
Join Date: Sep 2014
Location: Edinburgh
Device: Kindle
Writing a plugin and my method isn't being called

I'm trying to write a plugin which will zero the ratings on any books which are imported.

I thought this would be a simple job, but sadly it is proving a little more fiddly than I'd expect. Looking at the documentation I see that I need a FileTypePlugin, and there is the ability to call a method post-import, which sounds like it should do the right thing.

My code looks like this:

Code:
import os
from calibre.customize import FileTypePlugin
from calibre.ebooks.metadata.meta import get_metadata, set_metadata

class ZeroRatingsPlugin(FileTypePlugin):

    name                = 'Reset Rating Plugin'
    description         = 'When a book is imported set the rating to zero.'
    supported_platforms = ['windows', 'osx', 'linux']
    author              = 'Mysql.'
    version             = (1, 0, 1)
    file_types          = set(['epub', 'mobi', 'lit', 'prc'])
    on_import           = True
    on_postimport       = True
    minimum_calibre_version = (2,0,0)

    def run(self, path_to_ebook):
        '''
        NOP
        '''
        print "ZeroRatings::run(%s)" % path_to_ebook
        return path_to_ebook

    def postimport( book_id, book_format, db):
        '''
        Find the path to the book, and zero the rating.
        '''
        print "ZeroRatings::postimport()"

        if db is None:
            from calibre.library import db
            db = db() # initialize calibre library database

        path_to_ebook = db.format_abspath(book_id, book_format, index_is_id=True)
        print( "Path to book is %s" % path_to_ebook )

        file = open(path_to_ebook, 'r+b')
        print "Book is at " , path_to_ebook
        ext  = os.path.splitext(path_to_ebook)[-1][1:].lower()
        mi = get_metadata(file, ext)
        print "Current rating is:", mi.rating
        mi.rating = 0
        set_metadata(file, mi, ext)
(Obviously the last part of the code is work in progress, and I've been able to test it due to the problem I'm having)

When I import a book I see this

Code:
	ZeroRatings::run(/home/skx/test/foo.epub)
(I'm testing via "calibre-debug -s; calibre-customize -b $(pwd); calibre-debug -g", from my plugin-directory.)

That suggests that my Plugins run method is called but NOT the postimport method.

I get the feeling I'm missing something obvious, but I'm not sure what that might be.
plugin_dev is offline   Reply With Quote
Old 09-20-2014, 07:28 AM   #2
plugin_dev
Junior Member
plugin_dev began at the beginning.
 
Posts: 8
Karma: 10
Join Date: Sep 2014
Location: Edinburgh
Device: Kindle
I will say that if I follow the tutorial and update my code to have this:

Code:

    def run(self, path_to_ebook):
        '''
        NOP
        '''
        print "ZeroRatings::run(%s)" % path_to_ebook
        file = open(path_to_ebook, 'r+b')
        ext = os.path.splitext(path_to_ebook)[-1][1:].lower()
        mi = get_metadata(file, ext)
        mi.rating = 0
        set_metadata(file, mi, ext)
        return path_to_ebook
This works and sets the rating to zero for "Add Books | Add books from single directory" but not when I run "Add Books | Add books from ..".
plugin_dev is offline   Reply With Quote
Advert
Old 09-20-2014, 07:40 AM   #3
kovidgoyal
creator of calibre
kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.
 
kovidgoyal's Avatar
 
Posts: 43,744
Karma: 22446736
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
If you want to zero the ratings, do this

db.new_api.set_field('rating', {book_id:0})

in the postimport method.
kovidgoyal is offline   Reply With Quote
Old 09-20-2014, 07:49 AM   #4
plugin_dev
Junior Member
plugin_dev began at the beginning.
 
Posts: 8
Karma: 10
Join Date: Sep 2014
Location: Edinburgh
Device: Kindle
Thanks, that seems cleaner and easier than my meta-date manipulation.

However it doesn't solve the specific problem I'm having - that the postimport method is not being called.

I've upgraded to the latest, 2.3.0, release, and reset my ~/.config/calibre directroy. With those things done the following code shows output from "run" but not "postimport".

Code:
import os
from calibre.customize import FileTypePlugin
from calibre.ebooks.metadata.meta import get_metadata, set_metadata

class RatingReset(FileTypePlugin):

    name                = 'Rating-Reset Plugin'
    description         = 'When a book is imported set the rating to zero.'
    supported_platforms = ['windows', 'osx', 'linux']
    author              = 'Moi.'
    version             = (0, 0, 2)
    file_types          = set(['epub', 'mobi', 'lit', 'prc'])
    on_postimport       = True
    minimum_calibre_version = (2,3,0)

    print "RatingReset::loaded"

    def run(self, path_to_ebook):
        print "RatingReset::run(%s)" % path_to_ebook
        return path_to_ebook

    def postimport( book_id, book_format, db):
        print "RatingReset::postimport()"
        db.new_api.set_field('rating', {book_id:0})
plugin_dev is offline   Reply With Quote
Old 09-20-2014, 07:52 AM   #5
kovidgoyal
creator of calibre
kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.
 
kovidgoyal's Avatar
 
Posts: 43,744
Karma: 22446736
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
You're missing a self in postimport()
kovidgoyal is offline   Reply With Quote
Advert
Old 09-20-2014, 07:58 AM   #6
plugin_dev
Junior Member
plugin_dev began at the beginning.
 
Posts: 8
Karma: 10
Join Date: Sep 2014
Location: Edinburgh
Device: Kindle
Thanks for the prompt reply, again. I don't know how you have the patience.

Adding the missing "self" does not resolve the problem though, sadly:

Xlib: extension "GLX" missing on display ":0.0".
Code:
Could not initialize OpenGL for RasterGLSurface, reverting to RasterSurface.
Worker Launch took: 0.129006147385
Job: 1 Read metadata (0 of 1) finished
Read metadata (0 of 1)
	RatingReset::loaded
	RatingReset::run(/home/skx/tmp/tmp.epub)
Again the run method is called, but the postimport is not:

Code:
    def run(self, path_to_ebook):
        print "RatingReset::run(%s)" % path_to_ebook
        return path_to_ebook

    def postimport(self, book_id, book_format, db):
        print "RatingReset::postimport()"
        db.new_api.set_field('rating', {book_id:0})
plugin_dev is offline   Reply With Quote
Old 09-20-2014, 08:05 AM   #7
kovidgoyal
creator of calibre
kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.
 
kovidgoyal's Avatar
 
Posts: 43,744
Karma: 22446736
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
Hmm, I dont see anything else wrong. Perhaps the postimport hook for running plugins is broken, I will take a look at it when I next have a free moment.
kovidgoyal is offline   Reply With Quote
Old 09-20-2014, 08:48 AM   #8
kovidgoyal
creator of calibre
kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.kovidgoyal ought to be getting tired of karma fortunes by now.
 
kovidgoyal's Avatar
 
Posts: 43,744
Karma: 22446736
Join Date: Oct 2006
Location: Mumbai, India
Device: Various
There was indeeda bug, that affected postimport plugins when adding via the GUI only. You can add via

calibredb add file.epub

and it should work, or wait for the fix:

https://github.com/kovidgoyal/calibr...bc12e3919da763
kovidgoyal is offline   Reply With Quote
Old 09-20-2014, 09:02 AM   #9
plugin_dev
Junior Member
plugin_dev began at the beginning.
 
Posts: 8
Karma: 10
Join Date: Sep 2014
Location: Edinburgh
Device: Kindle
Thank you - I was in the middle of adding tracing to the various source files.

I've pulled your recent commits and I can confirm that this resolves my issue.

My my ResetRatings plugin is now working/complete.

Last edited by plugin_dev; 09-26-2014 at 01:52 AM. Reason: git release / not release.
plugin_dev is offline   Reply With Quote
Reply

Tags
plugin-development, plugins

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Regarding using metadata objects in identify method of metadata download plugin api aprekates Development 1 07-06-2014 03:35 AM
Writing a first plugin Agama Development 50 07-07-2012 04:06 PM
Plugin not customizable: Plugin: HTML Output does not need customization flyingfoxlee Conversion 2 02-24-2012 02:24 AM
Help with plugin writing meme Plugins 2 01-21-2011 01:57 PM
Writing an interface action plugin kiwidude Plugins 21 11-11-2010 04:11 PM


All times are GMT -4. The time now is 01:04 AM.


MobileRead.com is a privately owned, operated and funded community.