diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index fa1b4056db..0b5c15b3f0 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -233,14 +233,18 @@ def create_option_parser(args, log): return parser, plumber +def abspath(x): + if x.startswith('http:') or x.startswith('https:'): + return x + return os.path.abspath(os.path.expanduser(x)) + def main(args=sys.argv): log = Log() parser, plumber = create_option_parser(args, log) opts = parser.parse_args(args)[0] - y = lambda q : os.path.abspath(os.path.expanduser(q)) for x in ('read_metadata_from_opf', 'cover'): if getattr(opts, x, None) is not None: - setattr(opts, x, y(getattr(opts, x))) + setattr(opts, x, abspath(getattr(opts, x))) recommendations = [(n.dest, getattr(opts, n.dest), OptionRecommendation.HIGH) \ for n in parser.options_iter() diff --git a/src/calibre/ebooks/conversion/plumber.py b/src/calibre/ebooks/conversion/plumber.py index 9bb3a71c03..339f1f92ec 100644 --- a/src/calibre/ebooks/conversion/plumber.py +++ b/src/calibre/ebooks/conversion/plumber.py @@ -424,7 +424,7 @@ OptionRecommendation(name='author_sort', OptionRecommendation(name='cover', recommended_value=None, level=OptionRecommendation.LOW, - help=_('Set the cover to the specified file.')), + help=_('Set the cover to the specified file or URL')), OptionRecommendation(name='comments', recommended_value=None, level=OptionRecommendation.LOW, @@ -638,6 +638,20 @@ OptionRecommendation(name='timestamp', continue setattr(mi, x, val) + def download_cover(self, url): + from calibre import browser + from PIL import Image + from cStringIO import StringIO + from calibre.ptempfile import PersistentTemporaryFile + self.log('Downloading cover from %r'%url) + br = browser() + raw = br.open_novisit(url).read() + buf = StringIO(raw) + pt = PersistentTemporaryFile('.jpg') + pt.close() + img = Image.open(buf) + img.convert('RGB').save(pt.name) + return pt.name def read_user_metadata(self): ''' @@ -655,6 +669,8 @@ OptionRecommendation(name='timestamp', mi = MetaInformation(opf) self.opts_to_mi(mi) if mi.cover: + if mi.cover.startswith('http:') or mi.cover.startswith('https:'): + mi.cover = self.download_cover(mi.cover) mi.cover_data = ('', open(mi.cover, 'rb').read()) mi.cover = None self.user_metadata = mi