~ubuntu-branches/ubuntu/karmic/calibre/karmic

« back to all changes in this revision

Viewing changes to src/calibre/gui2/tools.py

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2009-07-30 12:49:41 UTC
  • mfrom: (1.3.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20090730124941-qjdsmri25zt8zocn
Tags: 0.6.3+dfsg-0ubuntu1
* New upstream release. Please see http://calibre.kovidgoyal.net/new_in_6/
  for the list of new features and changes.
* remove_postinstall.patch: Update for new version.
* build_debug.patch: Does not apply any more, disable for now. Might not be
  necessary any more.
* debian/copyright: Fix reference to versionless GPL.
* debian/rules: Drop obsolete dh_desktop call.
* debian/rules: Add workaround for weird Python 2.6 setuptools behaviour of
  putting compiled .so files into src/calibre/plugins/calibre/plugins
  instead of src/calibre/plugins.
* debian/rules: Drop hal fdi moving, new upstream version does not use hal
  any more. Drop hal dependency, too.
* debian/rules: Install udev rules into /lib/udev/rules.d.
* Add debian/calibre.preinst: Remove unmodified
  /etc/udev/rules.d/95-calibre.rules on upgrade.
* debian/control: Bump Python dependencies to 2.6, since upstream needs
  it now.

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
'''
7
7
Logic for setting up conversion jobs
8
8
'''
9
 
import os
 
9
 
 
10
import cPickle
 
11
 
10
12
from PyQt4.Qt import QDialog
11
13
 
 
14
from calibre.ptempfile import PersistentTemporaryFile
 
15
from calibre.gui2 import warning_dialog
 
16
from calibre.gui2.convert.single import NoSupportedInputFormats
 
17
from calibre.gui2.convert.single import Config as SingleConfig
 
18
from calibre.gui2.convert.bulk import BulkConfig
 
19
from calibre.customize.conversion import OptionRecommendation
12
20
from calibre.utils.config import prefs
13
 
from calibre.gui2.dialogs.lrf_single import LRFSingleDialog, LRFBulkDialog
14
 
from calibre.gui2.dialogs.epub import Config as EPUBConvert
15
 
from calibre.gui2.dialogs.mobi import Config as MOBIConvert
16
 
import calibre.gui2.dialogs.comicconf as ComicConf
17
 
from calibre.gui2 import warning_dialog
18
 
from calibre.ptempfile import PersistentTemporaryFile
19
 
from calibre.ebooks.lrf import preferred_source_formats as LRF_PREFERRED_SOURCE_FORMATS
20
 
from calibre.ebooks.metadata.opf import OPFCreator
21
 
from calibre.ebooks.epub.from_any import SOURCE_FORMATS as EPUB_PREFERRED_SOURCE_FORMATS
22
 
 
23
 
def get_dialog(fmt):
24
 
    return {
25
 
              'epub':EPUBConvert,
26
 
              'mobi':MOBIConvert,
27
 
              }[fmt]
28
 
 
29
 
def convert_single(fmt, parent, db, comics, others):
30
 
    changed = False
31
 
    jobs = []
32
 
    others_ids = [db.id(row) for row in others]
33
 
    comics_ids = [db.id(row) for row in comics]
34
 
    for row, row_id in zip(others, others_ids):
35
 
        temp_files = []
36
 
        d = get_dialog(fmt)(parent, db, row)
37
 
        if d.source_format is not None:
38
 
            d.exec_()
39
 
            if d.result() == QDialog.Accepted:
40
 
                opts = d.opts
41
 
                data = db.format(row, d.source_format)
42
 
                pt = PersistentTemporaryFile('.'+d.source_format.lower())
43
 
                pt.write(data)
44
 
                pt.close()
45
 
                of = PersistentTemporaryFile('.'+fmt)
46
 
                of.close()
47
 
                opts.output = of.name
48
 
                opts.from_opf = d.opf_file.name
49
 
                opts.verbose = 2
50
 
                args = [opts, pt.name]
51
 
                if d.cover_file:
52
 
                    temp_files.append(d.cover_file)
53
 
                    opts.cover = d.cover_file.name
54
 
                temp_files.extend([d.opf_file, pt, of])
55
 
                jobs.append(('any2'+fmt, args, _('Convert book: ')+d.mi.title,
56
 
                             fmt.upper(), row_id, temp_files))
57
 
                changed = True
58
 
 
59
 
    for row, row_id in zip(comics, comics_ids):
60
 
        mi = db.get_metadata(row)
61
 
        title = author = _('Unknown')
62
 
        if mi.title:
63
 
            title = mi.title
64
 
        if mi.authors:
65
 
            author =  ','.join(mi.authors)
66
 
        defaults = db.conversion_options(db.id(row), 'comic')
67
 
        opts, defaults = ComicConf.get_conversion_options(parent, defaults, title, author)
68
 
        if defaults is not None:
69
 
            db.set_conversion_options(db.id(row), 'comic', defaults)
70
 
        if opts is None: continue
71
 
        for _fmt in ['cbz', 'cbr']:
72
 
            try:
73
 
                data = db.format(row, _fmt.upper())
74
 
                if data is not None:
75
 
                    break
76
 
            except:
77
 
                continue
78
 
        pt = PersistentTemporaryFile('.'+_fmt)
79
 
        pt.write(data)
80
 
        pt.close()
81
 
        of = PersistentTemporaryFile('.'+fmt)
82
 
        of.close()
83
 
        opts.output = of.name
84
 
        opts.verbose = 2
85
 
        args = [pt.name, opts]
86
 
        changed = True
87
 
        jobs.append(('comic2'+fmt, args, _('Convert comic: ')+opts.title,
88
 
                     fmt.upper(), row_id, [pt, of]))
89
 
 
90
 
    return jobs, changed
91
 
 
92
 
 
93
 
 
94
 
def convert_single_lrf(parent, db, comics, others):
95
 
    changed = False
96
 
    jobs = []
97
 
    others_ids = [db.id(row) for row in others]
98
 
    comics_ids = [db.id(row) for row in comics]
99
 
    for row, row_id in zip(others, others_ids):
100
 
        temp_files = []
101
 
        d = LRFSingleDialog(parent, db, row)
102
 
        if d.selected_format:
103
 
            d.exec_()
104
 
            if d.result() == QDialog.Accepted:
105
 
                cmdline = d.cmdline
106
 
                data = db.format(row, d.selected_format)
107
 
                pt = PersistentTemporaryFile('.'+d.selected_format.lower())
108
 
                pt.write(data)
109
 
                pt.close()
110
 
                of = PersistentTemporaryFile('.lrf')
111
 
                of.close()
112
 
                cmdline.extend(['-o', of.name])
113
 
                cmdline.append(pt.name)
114
 
                if d.cover_file:
115
 
                    temp_files.append(d.cover_file)
116
 
                temp_files.extend([pt, of])
117
 
                jobs.append(('any2lrf', [cmdline], _('Convert book: ')+d.title(),
118
 
                             'LRF', row_id, temp_files))
119
 
                changed = True
120
 
 
121
 
    for row, row_id in zip(comics, comics_ids):
122
 
        mi = db.get_metadata(row)
123
 
        title = author = _('Unknown')
124
 
        if mi.title:
125
 
            title = mi.title
126
 
        if mi.authors:
127
 
            author =  ','.join(mi.authors)
128
 
        defaults = db.conversion_options(db.id(row), 'comic')
129
 
        opts, defaults = ComicConf.get_conversion_options(parent, defaults, title, author)
130
 
        if defaults is not None:
131
 
            db.set_conversion_options(db.id(row), 'comic', defaults)
132
 
        if opts is None: continue
133
 
        for fmt in ['cbz', 'cbr']:
134
 
            try:
135
 
                data = db.format(row, fmt.upper())
136
 
                if data is not None:
137
 
                    break
138
 
            except:
139
 
                continue
140
 
        if data is None:
141
 
            continue
142
 
        pt = PersistentTemporaryFile('.'+fmt)
143
 
        pt.write(data)
144
 
        pt.close()
145
 
        of = PersistentTemporaryFile('.lrf')
146
 
        of.close()
147
 
        opts.output = of.name
148
 
        opts.verbose = 1
149
 
        args = [pt.name, opts]
150
 
        changed = True
151
 
        jobs.append(('comic2lrf', args, _('Convert comic: ')+opts.title,
152
 
                     'LRF', row_id, [pt, of]))
153
 
 
154
 
    return jobs, changed
155
 
 
156
 
def convert_bulk(fmt, parent, db, comics, others):
157
 
    if others:
158
 
        d = get_dialog(fmt)(parent, db)
159
 
        if d.exec_() != QDialog.Accepted:
160
 
            others, user_mi = [], None
161
 
        else:
162
 
            opts = d.opts
163
 
            opts.verbose = 2
164
 
            user_mi = d.user_mi
165
 
    if comics:
166
 
        comic_opts = ComicConf.get_bulk_conversion_options(parent)
167
 
        if not comic_opts:
168
 
            comics = []
169
 
    bad_rows = []
170
 
    jobs = []
171
 
    total = sum(map(len, (others, comics)))
172
 
    if total == 0:
173
 
        return
174
 
    parent.status_bar.showMessage(_('Starting Bulk conversion of %d books')%total, 2000)
175
 
 
176
 
    for i, row in enumerate(others+comics):
177
 
        row_id = db.id(row)
178
 
        if row in others:
179
 
            data = None
180
 
            for _fmt in EPUB_PREFERRED_SOURCE_FORMATS:
181
 
                try:
182
 
                    data = db.format(row, _fmt.upper())
183
 
                    if data is not None:
184
 
                        break
185
 
                except:
186
 
                    continue
187
 
            if data is None:
188
 
                bad_rows.append(row)
189
 
                continue
190
 
            options = opts.copy()
191
 
            mi = db.get_metadata(row)
192
 
            if user_mi is not None:
193
 
                if user_mi.series_index == 1:
194
 
                    user_mi.series_index = None
195
 
                mi.smart_update(user_mi)
196
 
            db.set_metadata(db.id(row), mi)
197
 
            opf = OPFCreator(os.getcwdu(), mi)
198
 
            opf_file = PersistentTemporaryFile('.opf')
199
 
            opf.render(opf_file)
200
 
            opf_file.close()
201
 
            pt = PersistentTemporaryFile('.'+_fmt.lower())
202
 
            pt.write(data)
203
 
            pt.close()
204
 
            of = PersistentTemporaryFile('.'+fmt)
205
 
            of.close()
206
 
            cover = db.cover(row)
207
 
            cf = None
208
 
            if cover:
209
 
                cf = PersistentTemporaryFile('.jpeg')
210
 
                cf.write(cover)
211
 
                cf.close()
212
 
                options.cover = cf.name
213
 
            options.output = of.name
214
 
            options.from_opf = opf_file.name
215
 
            args = [options, pt.name]
216
 
            desc = _('Convert book %d of %d (%s)')%(i+1, total, repr(mi.title))
217
 
            temp_files = [cf] if cf is not None else []
218
 
            temp_files.extend([opf_file, pt, of])
219
 
            jobs.append(('any2'+fmt, args, desc, fmt.upper(), row_id, temp_files))
220
 
        else:
221
 
            options = comic_opts.copy()
222
 
            mi = db.get_metadata(row)
223
 
            if mi.title:
224
 
                options.title = mi.title
225
 
            if mi.authors:
226
 
                options.author =  ','.join(mi.authors)
227
 
            data = None
228
 
            for _fmt in ['cbz', 'cbr']:
229
 
                try:
230
 
                    data = db.format(row, _fmt.upper())
231
 
                    if data is not None:
232
 
                        break
233
 
                except:
234
 
                    continue
235
 
 
236
 
            pt = PersistentTemporaryFile('.'+_fmt.lower())
237
 
            pt.write(data)
238
 
            pt.close()
239
 
            of = PersistentTemporaryFile('.'+fmt)
240
 
            of.close()
241
 
            setattr(options, 'output', of.name)
242
 
            options.verbose = 1
243
 
            args = [pt.name, options]
244
 
            desc = _('Convert book %d of %d (%s)')%(i+1, total, repr(mi.title))
245
 
            jobs.append(('comic2'+fmt, args, desc, fmt.upper(), row_id, [pt, of]))
246
 
 
247
 
    if bad_rows:
248
 
        res = []
249
 
        for row in bad_rows:
250
 
            title = db.title(row)
251
 
            res.append('<li>%s</li>'%title)
252
 
 
253
 
        msg = _('<p>Could not convert %d of %d books, because no suitable source format was found.<ul>%s</ul>')%(len(res), total, '\n'.join(res))
254
 
        warning_dialog(parent, _('Could not convert some books'), msg).exec_()
255
 
 
256
 
    return jobs, False
257
 
 
258
 
 
259
 
def convert_bulk_lrf(parent, db, comics, others):
260
 
    if others:
261
 
        d = LRFBulkDialog(parent)
262
 
        if d.exec_() != QDialog.Accepted:
263
 
            others = []
264
 
    if comics:
265
 
        comic_opts = ComicConf.get_bulk_conversion_options(parent)
266
 
        if not comic_opts:
267
 
            comics = []
268
 
    bad_rows = []
269
 
    jobs = []
270
 
    total = sum(map(len, (others, comics)))
271
 
    if total == 0:
272
 
        return
273
 
    parent.status_bar.showMessage(_('Starting Bulk conversion of %d books')%total, 2000)
274
 
 
275
 
    for i, row in enumerate(others+comics):
276
 
        row_id = db.id(row)
277
 
        if row in others:
278
 
            cmdline = list(d.cmdline)
279
 
            mi = db.get_metadata(row)
280
 
            if mi.title:
281
 
                cmdline.extend(['--title', mi.title])
282
 
            if mi.authors:
283
 
                cmdline.extend(['--author', ','.join(mi.authors)])
284
 
            if mi.publisher:
285
 
                cmdline.extend(['--publisher', mi.publisher])
286
 
            if mi.comments:
287
 
                cmdline.extend(['--comment', mi.comments])
288
 
            data = None
289
 
            for fmt in LRF_PREFERRED_SOURCE_FORMATS:
290
 
                try:
291
 
                    data = db.format(row, fmt.upper())
292
 
                    if data is not None:
293
 
                        break
294
 
                except:
295
 
                    continue
296
 
            if data is None:
297
 
                bad_rows.append(row)
298
 
                continue
299
 
            pt = PersistentTemporaryFile('.'+fmt.lower())
300
 
            pt.write(data)
301
 
            pt.close()
302
 
            of = PersistentTemporaryFile('.lrf')
303
 
            of.close()
304
 
            cover = db.cover(row)
305
 
            cf = None
306
 
            if cover:
307
 
                cf = PersistentTemporaryFile('.jpeg')
308
 
                cf.write(cover)
309
 
                cf.close()
310
 
                cmdline.extend(['--cover', cf.name])
311
 
            cmdline.extend(['-o', of.name])
312
 
            cmdline.append(pt.name)
313
 
            desc = _('Convert book %d of %d (%s)')%(i+1, total, repr(mi.title))
314
 
            temp_files = [cf] if cf is not None else []
315
 
            temp_files.extend([pt, of])
316
 
            jobs.append(('any2lrf', [cmdline], desc, 'LRF', row_id, temp_files))
317
 
        else:
318
 
            options = comic_opts.copy()
319
 
            mi = db.get_metadata(row)
320
 
            if mi.title:
321
 
                options.title = mi.title
322
 
            if mi.authors:
323
 
                options.author =  ','.join(mi.authors)
324
 
            data = None
325
 
            for fmt in ['cbz', 'cbr']:
326
 
                try:
327
 
                    data = db.format(row, fmt.upper())
328
 
                    if data is not None:
329
 
                        break
330
 
                except:
331
 
                    continue
332
 
 
333
 
            pt = PersistentTemporaryFile('.'+fmt.lower())
334
 
            pt.write(data)
335
 
            pt.close()
336
 
            of = PersistentTemporaryFile('.lrf')
337
 
            of.close()
338
 
            setattr(options, 'output', of.name)
339
 
            options.verbose = 1
340
 
            args = [pt.name, options]
341
 
            desc = _('Convert book %d of %d (%s)')%(i+1, total, repr(mi.title))
342
 
            jobs.append(('comic2lrf', args, desc, 'LRF', row_id, [pt, of]))
343
 
 
344
 
    if bad_rows:
345
 
        res = []
346
 
        for row in bad_rows:
347
 
            title = db.title(row)
348
 
            res.append('<li>%s</li>'%title)
349
 
 
350
 
        msg = _('<p>Could not convert %d of %d books, because no suitable source format was found.<ul>%s</ul>')%(len(res), total, '\n'.join(res))
351
 
        warning_dialog(parent, _('Could not convert some books'), msg).exec_()
352
 
 
353
 
    return jobs, False
354
 
 
355
 
def set_conversion_defaults_lrf(comic, parent, db):
356
 
    if comic:
357
 
        ComicConf.set_conversion_defaults(parent)
358
 
    else:
359
 
        LRFSingleDialog(parent, None, None).exec_()
360
 
 
361
 
def _set_conversion_defaults(dialog, comic, parent, db):
362
 
    if comic:
363
 
        ComicConf.set_conversion_defaults(parent)
364
 
    else:
365
 
        d = dialog(parent, db)
366
 
        d.setWindowTitle(_('Set conversion defaults'))
367
 
        d.exec_()
368
 
 
369
 
def _fetch_news(data, fmt):
370
 
    pt = PersistentTemporaryFile(suffix='_feeds2%s.%s'%(fmt.lower(), fmt.lower()))
371
 
    pt.close()
372
 
    args = ['feeds2%s'%fmt.lower(), '--output', pt.name, '--debug']
373
 
    if data['username']:
374
 
        args.extend(['--username', data['username']])
375
 
    if data['password']:
376
 
        args.extend(['--password', data['password']])
377
 
    args.append(data['script'] if data['script'] else data['title'])
378
 
    return 'feeds2'+fmt.lower(), [args], _('Fetch news from ')+data['title'], fmt.upper(), [pt]
379
 
 
 
21
 
 
22
def convert_single_ebook(parent, db, book_ids, auto_conversion=False, out_format=None):
 
23
    changed = False
 
24
    jobs = []
 
25
    bad = []
 
26
 
 
27
    total = len(book_ids)
 
28
    if total == 0:
 
29
        return None, None, None
 
30
    parent.status_bar.showMessage(_('Starting conversion of %d books') % total, 2000)
 
31
 
 
32
    for i, book_id in enumerate(book_ids):
 
33
        temp_files = []
 
34
 
 
35
        try:
 
36
            d = SingleConfig(parent, db, book_id, None, out_format)
 
37
 
 
38
            if auto_conversion:
 
39
                d.accept()
 
40
                result = QDialog.Accepted
 
41
            else:
 
42
                result = d.exec_()
 
43
 
 
44
            if result == QDialog.Accepted:
 
45
                mi = db.get_metadata(book_id, True)
 
46
                in_file = db.format_abspath(book_id, d.input_format, True)
 
47
 
 
48
                out_file = PersistentTemporaryFile('.' + d.output_format)
 
49
                out_file.write(d.output_format)
 
50
                out_file.close()
 
51
                temp_files = []
 
52
 
 
53
                desc = _('Convert book %d of %d (%s)') % (i + 1, total, repr(mi.title))
 
54
 
 
55
                recs = cPickle.loads(d.recommendations)
 
56
                args = [in_file, out_file.name, recs]
 
57
                if d.opf_file is not None:
 
58
                    recs.append(('read_metadata_from_opf', d.opf_file.name,
 
59
                        OptionRecommendation.HIGH))
 
60
                    temp_files.append(d.opf_file)
 
61
                if d.cover_file is not None:
 
62
                    recs.append(('cover', d.cover_file.name,
 
63
                        OptionRecommendation.HIGH))
 
64
                    temp_files.append(d.cover_file)
 
65
                temp_files.append(out_file)
 
66
                jobs.append(('gui_convert', args, desc, d.output_format.upper(), book_id, temp_files))
 
67
 
 
68
                changed = True
 
69
        except NoSupportedInputFormats:
 
70
            bad.append(book_id)
 
71
 
 
72
    if bad != []:
 
73
        res = []
 
74
        for id in bad:
 
75
            title = db.title(id, True)
 
76
            res.append('%s'%title)
 
77
 
 
78
        msg = '%s' % '\n'.join(res)
 
79
        warning_dialog(parent, _('Could not convert some books'),
 
80
            _('Could not convert %d of %d books, because no suitable source'
 
81
               ' format was found.') % (len(res), total),
 
82
            msg).exec_()
 
83
 
 
84
    return jobs, changed, bad
 
85
 
 
86
def convert_bulk_ebook(parent, db, book_ids, out_format=None):
 
87
    changed = False
 
88
    jobs = []
 
89
    bad = []
 
90
 
 
91
    total = len(book_ids)
 
92
    if total == 0:
 
93
        return None, None, None
 
94
    parent.status_bar.showMessage(_('Starting conversion of %d books') % total, 2000)
 
95
 
 
96
    d = BulkConfig(parent, db, out_format)
 
97
    if d.exec_() != QDialog.Accepted:
 
98
        return jobs, changed, bad
 
99
 
 
100
    output_format = d.output_format
 
101
    recs = cPickle.loads(d.recommendations)
 
102
 
 
103
    for i, book_id in enumerate(book_ids):
 
104
        temp_files = []
 
105
 
 
106
        try:
 
107
            d = SingleConfig(parent, db, book_id, None, output_format)
 
108
            d.accept()
 
109
 
 
110
            mi = db.get_metadata(book_id, True)
 
111
            in_file = db.format_abspath(book_id, d.input_format, True)
 
112
 
 
113
            out_file = PersistentTemporaryFile('.' + output_format)
 
114
            out_file.write(output_format)
 
115
            out_file.close()
 
116
            temp_files = []
 
117
 
 
118
            lrecs = list(recs)
 
119
 
 
120
            if d.opf_file is not None:
 
121
                lrecs.append(('read_metadata_from_opf', d.opf_file.name,
 
122
                    OptionRecommendation.HIGH))
 
123
                temp_files.append(d.opf_file)
 
124
            if d.cover_file is not None:
 
125
                lrecs.append(('cover', d.cover_file.name,
 
126
                    OptionRecommendation.HIGH))
 
127
                temp_files.append(d.cover_file)
 
128
 
 
129
            desc = _('Convert book %d of %d (%s)') % (i + 1, total, repr(mi.title))
 
130
 
 
131
            args = [in_file, out_file.name, lrecs]
 
132
            temp_files.append(out_file)
 
133
            jobs.append(('gui_convert', args, desc, d.output_format.upper(), book_id, temp_files))
 
134
 
 
135
            changed = True
 
136
        except NoSupportedInputFormats:
 
137
            bad.append(book_id)
 
138
 
 
139
    if bad != []:
 
140
        res = []
 
141
        for id in bad:
 
142
            title = db.title(id, True)
 
143
            res.append('%s'%title)
 
144
 
 
145
        msg = '%s' % '\n'.join(res)
 
146
        warning_dialog(parent, _('Could not convert some books'),
 
147
            _('Could not convert %d of %d books, because no suitable '
 
148
            'source format was found.') % (len(res), total),
 
149
            msg).exec_()
 
150
 
 
151
    return jobs, changed, bad
380
152
 
381
153
def fetch_scheduled_recipe(recipe, script):
382
154
    from calibre.gui2.dialogs.scheduler import config
 
155
    from calibre.ebooks.conversion.config import load_defaults
383
156
    fmt = prefs['output_format'].lower()
384
 
    pt = PersistentTemporaryFile(suffix='_feeds2%s.%s'%(fmt.lower(), fmt.lower()))
 
157
    pt = PersistentTemporaryFile(suffix='_recipe_out.%s'%fmt.lower())
385
158
    pt.close()
386
 
    args = ['feeds2%s'%fmt.lower(), '--output', pt.name, '--debug']
 
159
    recs = []
 
160
    ps = load_defaults('page_setup')
 
161
    if 'output_profile' in ps:
 
162
        recs.append(('output_profile', ps['output_profile'],
 
163
            OptionRecommendation.HIGH))
 
164
    lf = load_defaults('look_and_feel')
 
165
    if lf.get('base_font_size', 0.0) != 0.0:
 
166
        recs.append(('base_font_size', lf['base_font_size'],
 
167
            OptionRecommendation.HIGH))
 
168
 
 
169
    lr = load_defaults('lrf_output')
 
170
    if lr.get('header', False):
 
171
        recs.append(('header', True, OptionRecommendation.HIGH))
 
172
        recs.append(('header_format', '%t', OptionRecommendation.HIGH))
 
173
 
 
174
    args = [script, pt.name, recs]
387
175
    if recipe.needs_subscription:
388
176
        x = config.get('recipe_account_info_%s'%recipe.id, False)
389
177
        if not x:
390
178
            raise ValueError(_('You must set a username and password for %s')%recipe.title)
391
 
        args.extend(['--username', x[0], '--password', x[1]])
392
 
    args.append(script)
393
 
    return 'feeds2'+fmt, [args], _('Fetch news from ')+recipe.title, fmt.upper(), [pt]
394
 
 
395
 
 
396
 
def convert_single_ebook(*args):
397
 
    fmt = prefs['output_format'].lower()
398
 
    if fmt == 'lrf':
399
 
        return convert_single_lrf(*args)
400
 
    elif fmt in ('epub', 'mobi'):
401
 
        return convert_single(fmt, *args)
402
 
 
403
 
def convert_bulk_ebooks(*args):
404
 
    fmt = prefs['output_format'].lower()
405
 
    if fmt == 'lrf':
406
 
        return convert_bulk_lrf(*args)
407
 
    elif fmt in ('epub', 'mobi'):
408
 
        return convert_bulk(fmt, *args)
409
 
 
410
 
def set_conversion_defaults(comic, parent, db):
411
 
    fmt = prefs['output_format'].lower()
412
 
    if fmt == 'lrf':
413
 
        return set_conversion_defaults_lrf(comic, parent, db)
414
 
    elif fmt in ('epub', 'mobi'):
415
 
        return _set_conversion_defaults(get_dialog(fmt), comic, parent, db)
416
 
 
417
 
def fetch_news(data):
418
 
    fmt = prefs['output_format'].lower()
419
 
    return _fetch_news(data, fmt)
 
179
        recs.append(('username', x[0], OptionRecommendation.HIGH))
 
180
        recs.append(('password', x[1], OptionRecommendation.HIGH))
 
181
 
 
182
 
 
183
    return 'gui_convert', args, _('Fetch news from ')+recipe.title, fmt.upper(), [pt]
 
184
 
 
185