mirror of
https://github.com/wassname/FanFicFare.git
synced 2026-09-13 12:11:20 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f1d9760aa9 | ||
|
|
b11bdd82db | ||
|
|
6e5de8060e | ||
|
|
2c1b9456bf | ||
|
|
60439cc658 | ||
|
|
fb95e1e168 | ||
|
|
0d490d2e50 | ||
|
|
838510c011 | ||
|
|
954ad00ca6 | ||
|
|
ee462d3742 | ||
|
|
56401e6dfa | ||
|
|
6070accbf5 | ||
|
|
eebb1ee8d0 | ||
|
|
bda307ed3d | ||
|
|
6b0c519f99 | ||
|
|
6533ee0187 | ||
|
|
3cc3b32012 | ||
|
|
315536a75b | ||
|
|
1c4250c0c1 | ||
|
|
6f7e700cd2 |
@@ -48,7 +48,7 @@ class FanFicFareBase(InterfaceActionBase):
|
||||
description = _('UI plugin to download FanFiction stories from various sites.')
|
||||
supported_platforms = ['windows', 'osx', 'linux']
|
||||
author = 'Jim Miller'
|
||||
version = (2, 3, 2)
|
||||
version = (2, 3, 4)
|
||||
minimum_calibre_version = (1, 48, 0)
|
||||
|
||||
#: This field defines the GUI plugin class that contains all the code
|
||||
|
||||
+21
-12
@@ -21,19 +21,19 @@ from datetime import datetime
|
||||
try:
|
||||
from PyQt5 import QtWidgets as QtGui
|
||||
from PyQt5 import QtCore
|
||||
from PyQt5.Qt import (QDialog, QTableWidget, QVBoxLayout, QHBoxLayout, QGridLayout,
|
||||
QPushButton, QFont, QLabel, QCheckBox, QIcon, QLineEdit,
|
||||
QComboBox, QProgressDialog, QTimer, QDialogButtonBox,
|
||||
QPixmap, Qt, QAbstractItemView, QTextEdit, pyqtSignal,
|
||||
QGroupBox, QFrame, QTextBrowser, QSize, QAction)
|
||||
from PyQt5.Qt import (QDialog, QWidget, QTableWidget, QVBoxLayout, QHBoxLayout,
|
||||
QGridLayout, QPushButton, QFont, QLabel, QCheckBox, QIcon,
|
||||
QLineEdit, QComboBox, QProgressDialog, QTimer, QDialogButtonBox,
|
||||
QScrollArea, QPixmap, Qt, QAbstractItemView, QTextEdit,
|
||||
pyqtSignal, QGroupBox, QFrame, QTextBrowser, QSize, QAction)
|
||||
except ImportError as e:
|
||||
from PyQt4 import QtGui
|
||||
from PyQt4 import QtCore
|
||||
from PyQt4.Qt import (QDialog, QTableWidget, QVBoxLayout, QHBoxLayout, QGridLayout,
|
||||
QPushButton, QFont, QLabel, QCheckBox, QIcon, QLineEdit,
|
||||
QComboBox, QProgressDialog, QTimer, QDialogButtonBox,
|
||||
QPixmap, Qt, QAbstractItemView, QTextEdit, pyqtSignal,
|
||||
QGroupBox, QFrame, QTextBrowser, QSize, QAction)
|
||||
from PyQt4.Qt import (QDialog, QWidget, QTableWidget, QVBoxLayout, QHBoxLayout,
|
||||
QGridLayout, QPushButton, QFont, QLabel, QCheckBox, QIcon,
|
||||
QLineEdit, QComboBox, QProgressDialog, QTimer, QDialogButtonBox,
|
||||
QScrollArea, QPixmap, Qt, QAbstractItemView, QTextEdit,
|
||||
pyqtSignal, QGroupBox, QFrame, QTextBrowser, QSize, QAction)
|
||||
|
||||
try:
|
||||
from calibre.gui2 import QVariant
|
||||
@@ -1450,6 +1450,15 @@ class ViewLog(SizePersistedDialog):
|
||||
|
||||
self.lineno = None
|
||||
|
||||
scrollable = QScrollArea()
|
||||
scrollcontent = QWidget()
|
||||
scrollable.setWidget(scrollcontent)
|
||||
scrollable.setWidgetResizable(True)
|
||||
self.l.addWidget(scrollable)
|
||||
|
||||
self.sl = QVBoxLayout()
|
||||
scrollcontent.setLayout(self.sl)
|
||||
|
||||
## error = (lineno, msg)
|
||||
for (lineno, error_msg) in errors:
|
||||
# print('adding label for error:%s: %s'%(lineno, error_msg))
|
||||
@@ -1460,7 +1469,7 @@ class ViewLog(SizePersistedDialog):
|
||||
label.setStyleSheet("QLabel { margin-left: 2em; color : blue; } QLabel:hover { color: red; }");
|
||||
label.setToolTip(_('Click to go to line %s')%lineno)
|
||||
label.mouseReleaseEvent = partial(self.label_clicked, lineno=lineno)
|
||||
self.l.addWidget(label)
|
||||
self.sl.addWidget(label)
|
||||
|
||||
# html='<p>'+'</p><p>'.join([ '(lineno: %s) %s'%e for e in errors ])+'</p>'
|
||||
|
||||
@@ -1470,7 +1479,7 @@ class ViewLog(SizePersistedDialog):
|
||||
# self.tb.setHtml(html)
|
||||
# l.addWidget(self.tb)
|
||||
|
||||
self.l.insertStretch(-1)
|
||||
self.sl.insertStretch(-1)
|
||||
|
||||
horz = QHBoxLayout()
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ except:
|
||||
|
||||
from calibre.library.field_metadata import FieldMetadata
|
||||
field_metadata = FieldMetadata()
|
||||
|
||||
|
||||
from calibre_plugins.fanficfare_plugin.common_utils import (
|
||||
set_plugin_icon_resources, get_icon, create_menu_action_unique,
|
||||
get_library_uuid)
|
||||
@@ -497,11 +497,11 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
},"\n".join(url_list))
|
||||
else:
|
||||
self.gui.status_bar.show_message(_('Finished Fetching Story URLs from Email.'),3000)
|
||||
|
||||
|
||||
else:
|
||||
if url_list:
|
||||
self.add_dialog("\n".join(url_list),merge=False)
|
||||
else:
|
||||
else:
|
||||
msg = _('No Valid Story URLs Found in Unread Emails.')
|
||||
if reject_list:
|
||||
msg = msg + '<p>'+(_('(%d Story URLs Skipped, on Rejected URL List)')%len(reject_list))+'</p>'
|
||||
@@ -509,7 +509,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
msg,
|
||||
show=True,
|
||||
show_copy_button=False)
|
||||
|
||||
|
||||
def get_urls_from_page_menu(self,anthology=False):
|
||||
|
||||
urltxt = ""
|
||||
@@ -534,7 +534,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
|
||||
self.gui.status_bar.show_message(_('Finished Fetching Story URLs from Page.'),3000)
|
||||
self.restore_cursor()
|
||||
|
||||
|
||||
if url_list:
|
||||
self.add_dialog("\n".join(url_list),merge=d.anthology,anthology_url=url)
|
||||
else:
|
||||
@@ -606,7 +606,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
self.gui.status_bar.show_message(_('Can only UnNew books in library'),
|
||||
3000)
|
||||
return
|
||||
|
||||
|
||||
if not self.gui.current_view().selectionModel().selectedRows() :
|
||||
self.gui.status_bar.show_message(_('No Selected Books to Get URLs From'),
|
||||
3000)
|
||||
@@ -632,7 +632,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
suffix='.epub',
|
||||
dir=tdir)
|
||||
db.copy_format_to(book['calibre_id'],'EPUB',tmp,index_is_id=True)
|
||||
|
||||
|
||||
unnewtmp = PersistentTemporaryFile(prefix='unnew-%s-'%book['calibre_id'],
|
||||
suffix='.epub',
|
||||
dir=tdir)
|
||||
@@ -656,7 +656,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
if fmt.lower() != 'epub' and db.has_format(book['calibre_id'],fmt,index_is_id=True):
|
||||
logger.debug("autoconvert remove f:"+fmt)
|
||||
db.remove_format(book['calibre_id'], fmt, index_is_id=True)#, notify=False
|
||||
|
||||
|
||||
def get_unnew_books_finish(self, book_list, tdir=None):
|
||||
remove_dir(tdir)
|
||||
if prefs['autoconvert']:
|
||||
@@ -787,7 +787,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
|
||||
self.busy_cursor()
|
||||
self.gui.status_bar.show_message(_('Fetching Story URLs for Series...'))
|
||||
|
||||
|
||||
# get list from identifiers:url/uri if present, but only if
|
||||
# it's *not* a valid story URL.
|
||||
mergeurl = self.get_story_url(db,book_id)
|
||||
@@ -798,7 +798,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
|
||||
self.gui.status_bar.show_message(_('Finished Fetching Story URLs for Series.'),3000)
|
||||
self.restore_cursor()
|
||||
|
||||
|
||||
#print("urlmapfile:%s"%urlmapfile)
|
||||
|
||||
# AddNewDialog collects URLs, format and presents buttons.
|
||||
@@ -958,7 +958,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
init_label=_("Fetching metadata for stories...")
|
||||
win_title=_("Downloading metadata for stories")
|
||||
status_prefix=_("Fetched metadata for")
|
||||
|
||||
|
||||
self.gui.status_bar.show_message(status_bar, 3000)
|
||||
LoopProgressDialog(self.gui,
|
||||
books,
|
||||
@@ -1072,7 +1072,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
## Getting metadata from configured column.
|
||||
custom_columns = self.gui.library_view.model().custom_columns
|
||||
if ( collision in (CALIBREONLYSAVECOL) and
|
||||
prefs['savemetacol'] != '' and
|
||||
prefs['savemetacol'] != '' and
|
||||
prefs['savemetacol'] in custom_columns ):
|
||||
|
||||
savedmeta_book_id = book['calibre_id']
|
||||
@@ -1081,13 +1081,13 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
identicalbooks = self.do_id_search(url)
|
||||
if len(identicalbooks) == 1:
|
||||
savedmeta_book_id = identicalbooks.pop()
|
||||
|
||||
|
||||
if savedmeta_book_id:
|
||||
label = custom_columns[prefs['savemetacol']]['label']
|
||||
savedmetadata = db.get_custom(savedmeta_book_id, label=label, index_is_id=True)
|
||||
else:
|
||||
savedmetadata = None
|
||||
|
||||
|
||||
if savedmetadata:
|
||||
# sets flag inside story so getStoryMetadataOnly won't hit server.
|
||||
adapter.setStoryMetadata(savedmetadata)
|
||||
@@ -1123,19 +1123,19 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
if userpass.status:
|
||||
adapter.username = userpass.user.text()
|
||||
adapter.password = userpass.passwd.text()
|
||||
|
||||
|
||||
except exceptions.AdultCheckRequired:
|
||||
if question_dialog(self.gui, _('Are You an Adult?'), '<p>'+
|
||||
_("%s requires that you be an adult. Please confirm you are an adult in your locale:")%url,
|
||||
show_copy_button=False):
|
||||
adapter.is_adult=True
|
||||
|
||||
|
||||
# let other exceptions percolate up.
|
||||
story = adapter.getStoryMetadataOnly(get_cover=False)
|
||||
book['title'] = story.getMetadata('title')
|
||||
book['author'] = [story.getMetadata('author')]
|
||||
book['url'] = story.getMetadata('storyUrl')
|
||||
|
||||
|
||||
## Check reject list. Redundant with below for when story
|
||||
## URL changes, but also kept here to avoid network hit in
|
||||
## most common case where given url is story url.
|
||||
@@ -1167,7 +1167,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
book['icon']='rotate-right.png'
|
||||
book['status'] = _('Skipped')
|
||||
return
|
||||
|
||||
|
||||
################################################################################################################################################33
|
||||
|
||||
book['is_adult'] = adapter.is_adult
|
||||
@@ -1176,7 +1176,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
|
||||
book['icon'] = 'plus.png'
|
||||
book['status'] = _('Add')
|
||||
|
||||
|
||||
if not bgmeta:
|
||||
# set PI version instead of default.
|
||||
if 'version' in options:
|
||||
@@ -1187,7 +1187,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
if prefs['savemetacol'] != '':
|
||||
# get metadata to save in configured column.
|
||||
book['savemetacol'] = story.dump_html_metadata()
|
||||
|
||||
|
||||
book['title'] = story.getMetadata("title", removeallentities=True)
|
||||
book['author_sort'] = book['author'] = story.getList("author", removeallentities=True)
|
||||
book['publisher'] = story.getMetadata("site")
|
||||
@@ -1198,7 +1198,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
else:
|
||||
book['comments']=''
|
||||
book['series'] = story.getMetadata("series", removeallentities=True)
|
||||
|
||||
|
||||
if story.getMetadataRaw('datePublished'):
|
||||
book['pubdate'] = story.getMetadataRaw('datePublished').replace(tzinfo=local_tz)
|
||||
if story.getMetadataRaw('dateUpdated'):
|
||||
@@ -1207,7 +1207,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
book['timestamp'] = story.getMetadataRaw('dateCreated').replace(tzinfo=local_tz)
|
||||
else:
|
||||
book['timestamp'] = None # need *something* there for calibre.
|
||||
|
||||
|
||||
if not merge:# skip all the collision code when d/ling for merging.
|
||||
if collision in (CALIBREONLY, CALIBREONLYSAVECOL):
|
||||
book['icon'] = 'metadata.png'
|
||||
@@ -1334,7 +1334,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
# check make sure incoming is newer.
|
||||
lastupdated=story.getMetadataRaw('dateUpdated')
|
||||
logger.debug("OVERWRITE site updated: %s"%lastupdated)
|
||||
|
||||
|
||||
# updated doesn't have time (or is midnight), use dates only.
|
||||
# updated does have time, use full timestamps.
|
||||
if (lastupdated.time() == time.min and fileupdated.date() > lastupdated.date()) or \
|
||||
@@ -1377,19 +1377,19 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
if not label and k in field_metadata:
|
||||
label=field_metadata[k]['name']
|
||||
key='calibre_std_'+k
|
||||
|
||||
|
||||
# if k == 'user_categories':
|
||||
# value=u', '.join(mi.get(k))
|
||||
# label=_('User Categories')
|
||||
|
||||
|
||||
if label: # only if it has a human readable name.
|
||||
if value is None or not book['calibre_id']:
|
||||
## if existing book, populate existing calibre column
|
||||
## values in metadata, else '' to hide.
|
||||
value=''
|
||||
value=''
|
||||
book['calibre_columns'][key]={'val':value,'label':label}
|
||||
#logger.debug("%s(%s): %s"%(label,key,value))
|
||||
|
||||
|
||||
# custom columns
|
||||
for k, column in self.gui.library_view.model().custom_columns.iteritems():
|
||||
if k != prefs['savemetacol']:
|
||||
@@ -1405,7 +1405,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
value=''
|
||||
book['calibre_columns'][key]={'val':value,'label':label}
|
||||
# logger.debug("%s(%s): %s"%(label,key,value))
|
||||
|
||||
|
||||
# if still 'good', make a temp file to write the output to.
|
||||
# For HTML format users, make the filename inside the zip something reasonable.
|
||||
# For crazy long titles/authors, limit it to 200chars.
|
||||
@@ -1472,11 +1472,20 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
htmllog = htmllog + '</table></body></html>'
|
||||
|
||||
payload = ([], book_list, options)
|
||||
self.gui.proceed_question(self.update_error_column,
|
||||
payload, htmllog,
|
||||
_('FanFicFare log'), _('FanFicFare download ended'), msg,
|
||||
show_copy_button=False,
|
||||
log_viewer_unique_name="FanFicFare log viewer")
|
||||
|
||||
# log_viewer_unique_name implemented here: https://github.com/kovidgoyal/calibre/compare/v2.56.0...v2.57.0
|
||||
if calibre_version >= (2, 57, 0):
|
||||
self.gui.proceed_question(self.update_error_column,
|
||||
payload, htmllog,
|
||||
_('FanFicFare log'), _('FanFicFare download ended'), msg,
|
||||
show_copy_button=False,
|
||||
log_viewer_unique_name="FanFicFare log viewer")
|
||||
else:
|
||||
self.gui.proceed_question(self.update_error_column,
|
||||
payload, htmllog,
|
||||
_('FanFicFare log'), _('FanFicFare download ended'), msg,
|
||||
show_copy_button=False)
|
||||
|
||||
return
|
||||
|
||||
cookiejarfile = PersistentTemporaryFile(suffix='.cookiejar',
|
||||
@@ -1710,11 +1719,18 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
|
||||
do_update_func = self.do_download_list_update
|
||||
|
||||
self.gui.proceed_question(do_update_func,
|
||||
payload, htmllog,
|
||||
_('FanFicFare log'), _('FanFicFare download complete'), msg,
|
||||
show_copy_button=False,
|
||||
log_viewer_unique_name="FanFicFare log viewer")
|
||||
# log_viewer_unique_name implemented here: https://github.com/kovidgoyal/calibre/compare/v2.56.0...v2.57.0
|
||||
if calibre_version >= (2, 57, 0):
|
||||
self.gui.proceed_question(do_update_func,
|
||||
payload, htmllog,
|
||||
_('FanFicFare log'), _('FanFicFare download complete'), msg,
|
||||
show_copy_button=False,
|
||||
log_viewer_unique_name="FanFicFare log viewer")
|
||||
else:
|
||||
self.gui.proceed_question(do_update_func,
|
||||
payload, htmllog,
|
||||
_('FanFicFare log'), _('FanFicFare download complete'), msg,
|
||||
show_copy_button=False)
|
||||
|
||||
def do_download_merge_update(self, payload):
|
||||
|
||||
@@ -1752,6 +1768,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
|
||||
self.get_epubmerge_plugin().do_merge(tmp.name,
|
||||
[ x['outfile'] for x in good_list ],
|
||||
tags=mergebook['tags'],
|
||||
titleopt=mergebook['title'],
|
||||
keepmetadatafiles=True,
|
||||
source=mergebook['url'])
|
||||
@@ -2044,7 +2061,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
prefs['gencalcover'] == SAVE_YES ## yes, always
|
||||
or (prefs['gencalcover'] == SAVE_YES_UNLESS_IMG ## yes, unless image.
|
||||
and book['all_metadata']['cover_image'] not in ('specific','first','default')) ):
|
||||
|
||||
|
||||
cover_generated = False # flag for polish below.
|
||||
# Yes, should do gencov. Which?
|
||||
if prefs['calibre_gen_cover'] and HAS_CALGC:
|
||||
@@ -2057,19 +2074,19 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
cover_generated = True
|
||||
elif prefs['plugin_gen_cover'] and 'Generate Cover' in self.gui.iactions:
|
||||
# plugin, if available.
|
||||
|
||||
|
||||
#logger.debug("Do Generate Cover added:%s gcnewonly:%s"%(book['added'],prefs['gcnewonly']))
|
||||
|
||||
|
||||
# force a refresh if generating cover so complex composite
|
||||
# custom columns are current and correct
|
||||
db.refresh_ids([book_id])
|
||||
|
||||
|
||||
gc_plugin = self.gui.iactions['Generate Cover']
|
||||
setting_name = None
|
||||
if prefs['allow_gc_from_ini']:
|
||||
if not configuration: # might already have it from allow_custcol_from_ini
|
||||
configuration = get_fff_config(book['url'],options['fileform'])
|
||||
|
||||
|
||||
# template => regexp to match => GC Setting to use.
|
||||
# generate_cover_settings:
|
||||
# ${category} => Buffy:? the Vampire Slayer => Buffy
|
||||
@@ -2082,21 +2099,21 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
if re.search(regexp,value):
|
||||
setting_name = setting
|
||||
break
|
||||
|
||||
|
||||
if setting_name:
|
||||
logger.debug("Generate Cover Setting from generate_cover_settings(%s)"%setting_name)
|
||||
if setting_name not in gc_plugin.get_saved_setting_names():
|
||||
logger.info("GC Name %s not found, discarding! (check personal.ini for typos)"%setting_name)
|
||||
setting_name = None
|
||||
|
||||
|
||||
if not setting_name and book['all_metadata']['site'] in prefs['gc_site_settings']:
|
||||
setting_name = prefs['gc_site_settings'][book['all_metadata']['site']]
|
||||
logger.debug("Generate Cover Setting from site(%s)"%setting_name)
|
||||
|
||||
|
||||
if not setting_name and 'Default' in prefs['gc_site_settings']:
|
||||
setting_name = prefs['gc_site_settings']['Default']
|
||||
logger.debug("Generate Cover Setting from Default(%s)"%setting_name)
|
||||
|
||||
|
||||
if setting_name:
|
||||
logger.debug("Running Generate Cover with settings %s."%setting_name)
|
||||
## fetch updated mi object from
|
||||
@@ -2105,14 +2122,14 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
realmi = db.get_metadata(book_id, index_is_id=True)
|
||||
gc_plugin.generate_cover_for_book(realmi,saved_setting_name=setting_name)
|
||||
cover_generated = True
|
||||
|
||||
|
||||
if cover_generated and prefs['gc_polish_cover'] and \
|
||||
options['fileform'] == "epub":
|
||||
# set cover inside epub from calibre's polish feature
|
||||
from calibre.ebooks.oeb.polish.main import polish, ALL_OPTS
|
||||
from calibre.utils.logging import Log
|
||||
from collections import namedtuple
|
||||
|
||||
|
||||
# Couldn't find a better way to get the cover path.
|
||||
cover_path = os.path.join(db.library_path,
|
||||
db.path(book_id, index_is_id=True),
|
||||
@@ -2123,7 +2140,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
opts.update(data)
|
||||
O = namedtuple('Options', ' '.join(ALL_OPTS.iterkeys()))
|
||||
opts = O(**opts)
|
||||
|
||||
|
||||
log = Log(level=Log.DEBUG)
|
||||
outfile = db.format_abspath(book_id,
|
||||
formmapping[options['fileform']],
|
||||
@@ -2489,7 +2506,7 @@ class FanFicFarePlugin(InterfaceAction):
|
||||
|
||||
def restore_cursor(self):
|
||||
QApplication.restoreOverrideCursor()
|
||||
|
||||
|
||||
def split_text_to_urls(urls):
|
||||
# remove dups while preserving order.
|
||||
dups=set()
|
||||
|
||||
@@ -847,18 +847,6 @@ extracategories:The Sentinel
|
||||
## this should go in your personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
[bdsm-geschichten.net]
|
||||
## Some sites do not require a login, but do require the user to
|
||||
## confirm they are adult for adult content. In commandline version,
|
||||
## this should go in your personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## This site offers no index page so we can either guess the chapter URLs
|
||||
## by dec/incrementing numbers ('guess') or walk all the chapters in the metadata
|
||||
## parsing state ('parse'). Since guessing can lead to errors for non-standard
|
||||
## story URLs, the default is to parse
|
||||
#find_chapters:guess
|
||||
|
||||
[bloodshedverse.com]
|
||||
## website encoding(s) In theory, each website reports the character
|
||||
## encoding they use for each page. In practice, some sites report it
|
||||
@@ -904,15 +892,6 @@ strip_text_links:true
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Blood Ties
|
||||
|
||||
[buffynfaith.net]
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Buffy: The Vampire Slayer
|
||||
|
||||
## Some sites also require the user to confirm they are adult for
|
||||
## adult content. In commandline version, this should go in your
|
||||
## personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
[fanfic.castletv.net]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
@@ -1268,27 +1247,6 @@ cover_exclusion_regexp:/css/bir.png
|
||||
[forums.sufficientvelocity.com]
|
||||
## see [base_xenforoforum]
|
||||
|
||||
[grangerenchanted.com]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
## commandline version, this should go in your personal.ini, not
|
||||
## defaults.ini.
|
||||
#username:YourName
|
||||
#password:yourpassword
|
||||
|
||||
## Some sites also require the user to confirm they are adult for
|
||||
## adult content. In commandline version, this should go in your
|
||||
## personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Harry Potter
|
||||
extracharacters:Hermione Granger
|
||||
|
||||
## Extra metadata that this adapter knows about. See [dramione.org]
|
||||
## for examples of how to use them.
|
||||
extra_valid_entries:read,reviews
|
||||
|
||||
[hlfiction.net]
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Highlander
|
||||
@@ -1536,22 +1494,6 @@ extracategories:Supernatural
|
||||
extracharacters:Sam,Dean
|
||||
extraships:Sam/Dean
|
||||
|
||||
[scarhead.net]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
## commandline version, this should go in your personal.ini, not
|
||||
## defaults.ini.
|
||||
#username:YourName
|
||||
#password:yourpassword
|
||||
|
||||
## Some sites also require the user to confirm they are adult for
|
||||
## adult content. In commandline version, this should go in your
|
||||
## personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Harry Potter
|
||||
|
||||
[sheppardweir.com]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
@@ -1693,15 +1635,6 @@ readings_label: Readings
|
||||
## personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
[tokra.fandomnet.com]
|
||||
## Some sites do not require a login, but do require the user to
|
||||
## confirm they are adult for adult content. In commandline version,
|
||||
## this should go in your personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Stargate: SG-1
|
||||
|
||||
[tolkienfanfiction.com]
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Lord of the Rings
|
||||
@@ -2069,11 +2002,6 @@ cover_exclusion_regexp:/stories/999/images/.*?_trophy.png
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:NCIS
|
||||
|
||||
[www.nickngreg.nl]
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:CSI
|
||||
extraships:Nick Stokes/Greg Sanders
|
||||
|
||||
[www.phoenixsong.net]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
@@ -2367,20 +2295,6 @@ extracategories:Andromeda
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Artemis Fowl
|
||||
|
||||
[www.therabidreader.com]
|
||||
## Some sites do not require a login, but do require the user to
|
||||
## confirm they are adult for adult content. In commandline version,
|
||||
## this should go in your personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
## commandline version, this should go in your personal.ini, not
|
||||
## defaults.ini.
|
||||
#username:YourName
|
||||
#password:yourpassword
|
||||
|
||||
|
||||
[www.naiceanilme.net]
|
||||
## Some sites do not require a login, but do require the user to
|
||||
## confirm they are adult for adult content. In commandline version,
|
||||
@@ -2394,8 +2308,6 @@ extracategories:Artemis Fowl
|
||||
#username:YourName
|
||||
#password:yourpassword
|
||||
|
||||
|
||||
|
||||
[overrides]
|
||||
## It may sometimes be useful to override all of the specific format,
|
||||
## site and site:format sections in your private configuration. For
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
# Translators:
|
||||
# Ettore Atalan <atalanttore@googlemail.com>, 2014-2015
|
||||
# ILB, 2014-2016
|
||||
# jumo none, 2016
|
||||
# Sebastian Keller <Haggard@gmx.de>, 2015
|
||||
# Simon_Schuette <simonschuette@arcor.de>, 2014-2016
|
||||
# Simon S, 2015
|
||||
@@ -13,8 +14,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: calibre-plugins\n"
|
||||
"POT-Creation-Date: 2016-04-28 16:06+Central Daylight Time\n"
|
||||
"PO-Revision-Date: 2016-04-16 14:33+0000\n"
|
||||
"Last-Translator: ILB\n"
|
||||
"PO-Revision-Date: 2016-06-22 21:43+0000\n"
|
||||
"Last-Translator: jumo none\n"
|
||||
"Language-Team: German (http://www.transifex.com/calibre/calibre-plugins/language/de/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -962,7 +963,7 @@ msgstr "Wenn eine Aktualisierung oder Überschreibung einer existierenden Story
|
||||
|
||||
#: config.py:1354
|
||||
msgid "Save All Errors"
|
||||
msgstr ""
|
||||
msgstr "Speicher alle Fehler"
|
||||
|
||||
#: config.py:1355
|
||||
msgid "If unchecked, these errors will not be saved:%s"
|
||||
@@ -2116,7 +2117,7 @@ msgstr "FanFiction-Geschichten herunterladen"
|
||||
|
||||
#: jobs.py:91
|
||||
msgid "%d of %d stories finished downloading"
|
||||
msgstr ""
|
||||
msgstr "%d von %d der Geschichten sind fertig runtergeladen"
|
||||
|
||||
#: jobs.py:103
|
||||
msgid "Download Results:"
|
||||
|
||||
@@ -2,17 +2,18 @@
|
||||
# Copyright (C) YEAR ORGANIZATION
|
||||
#
|
||||
# Translators:
|
||||
# Fitoschido, 2014
|
||||
# Adolfo Jayme-Barrientos, 2014
|
||||
# dario hereñu <magallania@gmail.com>, 2015
|
||||
# Jellby <jellby@yahoo.com>, 2014-2016
|
||||
# Antonio Mireles <antonio@mirelesindependent.com>, 2016
|
||||
# juanda097 <juanda097@openmailbox.org>, 2016
|
||||
# JimmXinu <retiefjimm@gmail.com>, 2015
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: calibre-plugins\n"
|
||||
"POT-Creation-Date: 2016-04-28 16:06+Central Daylight Time\n"
|
||||
"PO-Revision-Date: 2016-04-13 22:04+0000\n"
|
||||
"Last-Translator: Antonio Mireles <antonio@mirelesindependent.com>\n"
|
||||
"PO-Revision-Date: 2016-05-31 03:04+0000\n"
|
||||
"Last-Translator: juanda097 <juanda097@openmailbox.org>\n"
|
||||
"Language-Team: Spanish (http://www.transifex.com/calibre/calibre-plugins/language/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -465,7 +466,7 @@ msgstr "Estas configuraciones proporcionan un control más fino sobre qué metad
|
||||
|
||||
#: config.py:673
|
||||
msgid "personal.ini"
|
||||
msgstr ""
|
||||
msgstr "personal.ini"
|
||||
|
||||
#: config.py:680 config.py:784 config.py:785
|
||||
msgid "Edit personal.ini"
|
||||
@@ -485,11 +486,11 @@ msgstr ""
|
||||
msgid ""
|
||||
"View your personal.ini with usernames and passwords removed. For safely "
|
||||
"sharing your personal.ini settings with others."
|
||||
msgstr ""
|
||||
msgstr "Ver sus personal.ini con nombres de usuario y contraseñas eliminadas. Para compartir de forma segura la configuración personal.ini con otros."
|
||||
|
||||
#: config.py:704
|
||||
msgid "defaults.ini"
|
||||
msgstr ""
|
||||
msgstr "defaults.ini"
|
||||
|
||||
#: config.py:709
|
||||
msgid ""
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
# Translators:
|
||||
# Xotes <alois.glibert@gmail.com>, 2015
|
||||
# Franck, 2015
|
||||
# J M <JimmXinuTwo@xinu.nu>, 2016
|
||||
# Ptit Prince <leporello1791@gmail.com>, 2014-2016
|
||||
# Piconcely Yoann <yoanncoolazz@gmail.com>, 2015
|
||||
# sengian <sengian1@gmail.com>, 2016
|
||||
@@ -13,8 +14,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: calibre-plugins\n"
|
||||
"POT-Creation-Date: 2016-04-28 16:06+Central Daylight Time\n"
|
||||
"PO-Revision-Date: 2016-04-17 07:52+0000\n"
|
||||
"Last-Translator: sengian <sengian1@gmail.com>\n"
|
||||
"PO-Revision-Date: 2016-06-01 00:19+0000\n"
|
||||
"Last-Translator: J M <JimmXinuTwo@xinu.nu>\n"
|
||||
"Language-Team: French (http://www.transifex.com/calibre/calibre-plugins/language/fr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -208,7 +209,7 @@ msgid ""
|
||||
"%(cmplt)s and %(inprog)s tags will be still be updated, if known.\n"
|
||||
"%(lul)s tags will be updated if %(lus)s in %(is)s.\n"
|
||||
"(If Tags is set to 'New Only' in the Standard Columns tab, this has no effect.)"
|
||||
msgstr "Les étiquettes existantes seront gardées et toutes les nouvelles étiquettes ajoutées.\nLes étiquettes %(cmplt)s et %(inprog) seront quand même mise à jour, si connues.\nLes étiquettes %(lul)s seront mises à jour si %(lus)s dans %(is)s.\n(Si les étiquettes sont définies à 'Nouveau uniquement\" dans l'onglet colonnes standards, ceci n'a pas d'effet.)"
|
||||
msgstr "Les étiquettes existantes seront gardées et toutes les nouvelles étiquettes ajoutées.\nLes étiquettes %(cmplt)s et %(inprog)s seront quand même mise à jour, si connues.\nLes étiquettes %(lul)s seront mises à jour si %(lus)s dans %(is)s.\n(Si les étiquettes sont définies à 'Nouveau uniquement\" dans l'onglet colonnes standards, ceci n'a pas d'effet.)"
|
||||
|
||||
#: config.py:458
|
||||
msgid "Force Author into Author Sort?"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
# Copyright (C) YEAR ORGANIZATION
|
||||
#
|
||||
# Translators:
|
||||
# Alex, 2016
|
||||
# Nathan Follens, 2015
|
||||
# Rodolfo_Jadon, 2014-2015
|
||||
# Volluta <volluta@tutanota.com>, 2015
|
||||
@@ -10,8 +11,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: calibre-plugins\n"
|
||||
"POT-Creation-Date: 2016-04-28 16:06+Central Daylight Time\n"
|
||||
"PO-Revision-Date: 2016-03-29 09:06+0000\n"
|
||||
"Last-Translator: Kovid Goyal <kovid@kovidgoyal.net>\n"
|
||||
"PO-Revision-Date: 2016-06-23 02:16+0000\n"
|
||||
"Last-Translator: Alex\n"
|
||||
"Language-Team: Dutch (http://www.transifex.com/calibre/calibre-plugins/language/nl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -959,7 +960,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1354
|
||||
msgid "Save All Errors"
|
||||
msgstr ""
|
||||
msgstr "Sla alle fouten op"
|
||||
|
||||
#: config.py:1355
|
||||
msgid "If unchecked, these errors will not be saved:%s"
|
||||
@@ -1099,7 +1100,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1507
|
||||
msgid "Mark Emails Read"
|
||||
msgstr ""
|
||||
msgstr "Markeer emails gelezen"
|
||||
|
||||
#: config.py:1508
|
||||
msgid ""
|
||||
@@ -1336,7 +1337,7 @@ msgstr ""
|
||||
|
||||
#: dialogs.py:848
|
||||
msgid "Background Metadata?"
|
||||
msgstr ""
|
||||
msgstr "Achtergrond metadata?"
|
||||
|
||||
#: dialogs.py:849
|
||||
msgid ""
|
||||
@@ -1368,11 +1369,11 @@ msgstr ""
|
||||
|
||||
#: dialogs.py:1054
|
||||
msgid "Are you sure you want to remove this URL from the list?"
|
||||
msgstr ""
|
||||
msgstr "Weet u zeker dat u deze URL van de lijst wilt verwijderen?"
|
||||
|
||||
#: dialogs.py:1056
|
||||
msgid "Are you sure you want to remove the %d selected URLs from the list?"
|
||||
msgstr ""
|
||||
msgstr "Weet u zeker dat u de %d geselecteerde URLs van de lijst wilt verwijderen?"
|
||||
|
||||
#: dialogs.py:1074
|
||||
msgid "List of Books to Reject"
|
||||
@@ -1386,7 +1387,7 @@ msgstr ""
|
||||
|
||||
#: dialogs.py:1101
|
||||
msgid "Remove selected URLs from the list"
|
||||
msgstr ""
|
||||
msgstr "Verwijder geselecteerde URLs van de lijst"
|
||||
|
||||
#: dialogs.py:1116 dialogs.py:1120
|
||||
msgid "This will be added to whatever note you've set for each URL above."
|
||||
@@ -1456,7 +1457,7 @@ msgstr "FanFiction-verhalen downloaden van verschillende websites"
|
||||
|
||||
#: fff_plugin.py:293
|
||||
msgid "&Download from URLs"
|
||||
msgstr ""
|
||||
msgstr "&Download van URLs"
|
||||
|
||||
#: fff_plugin.py:295
|
||||
msgid "Download FanFiction Books from URLs"
|
||||
@@ -1785,7 +1786,7 @@ msgstr ""
|
||||
|
||||
#: fff_plugin.py:1053
|
||||
msgid "Cannot update non-epub format."
|
||||
msgstr ""
|
||||
msgstr "Kan "
|
||||
|
||||
#: fff_plugin.py:1128
|
||||
msgid "Are You an Adult?"
|
||||
@@ -2041,7 +2042,7 @@ msgstr ""
|
||||
|
||||
#: fff_plugin.py:1820
|
||||
msgid "Adding format to book failed for some reason..."
|
||||
msgstr ""
|
||||
msgstr "Het toevoegen "
|
||||
|
||||
#: fff_plugin.py:1823 jobs.py:321
|
||||
msgid "Error"
|
||||
@@ -2117,7 +2118,7 @@ msgstr ""
|
||||
|
||||
#: jobs.py:103
|
||||
msgid "Download Results:"
|
||||
msgstr ""
|
||||
msgstr "Downloadresultaten:"
|
||||
|
||||
#: jobs.py:105
|
||||
msgid "Successful:"
|
||||
@@ -2133,7 +2134,7 @@ msgstr "Download gestart..."
|
||||
|
||||
#: jobs.py:230
|
||||
msgid "Download %s completed, %s chapters."
|
||||
msgstr ""
|
||||
msgstr "Download %s voltooid, %s hoofdstukken."
|
||||
|
||||
#: jobs.py:255
|
||||
msgid "Already contains %d chapters. Reuse as is."
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
#
|
||||
# Translators:
|
||||
# Henrik Mattsson-Mårn <h@reglage.net>, 2016
|
||||
# J M <JimmXinuTwo@xinu.nu>, 2016
|
||||
# Jonatan Nyberg <jonatan@autistici.org>, 2016
|
||||
# Merarom <merarom@yahoo.es>, 2014-2015
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: calibre-plugins\n"
|
||||
"POT-Creation-Date: 2016-04-28 16:06+Central Daylight Time\n"
|
||||
"PO-Revision-Date: 2016-04-22 09:32+0000\n"
|
||||
"PO-Revision-Date: 2016-06-12 18:44+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>\n"
|
||||
"Language-Team: Swedish (http://www.transifex.com/calibre/calibre-plugins/language/sv/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -47,7 +48,7 @@ msgstr "Inställningar för:"
|
||||
|
||||
#: common_utils.py:497
|
||||
msgid "Clear"
|
||||
msgstr "Ta bort"
|
||||
msgstr "Rensa"
|
||||
|
||||
#: common_utils.py:499
|
||||
msgid "Clear all settings for this plugin"
|
||||
@@ -153,7 +154,7 @@ msgid ""
|
||||
"(title, author, URL, tags, custom columns, etc) from the web site. <br "
|
||||
"/>This sets whether that will default to on or off. <br />Columns set to "
|
||||
"'New Only' in the column tabs will only be set for new books."
|
||||
msgstr ""
|
||||
msgstr "Vid varje hämtning, erbjuder FanFicFare en möjlighet att uppdatera calibres metadata (titel, författare, URL, taggar, anpassade kolumner, osv.) från webbsidan. <br />Detta ställer in det som standard till på eller av. <br />Kolumner satt till \"Endast ny\" i kolumnflikarna kommer endast att ställas in för nya böcker."
|
||||
|
||||
#: config.py:432
|
||||
msgid "Default Update EPUB Cover when Updating EPUB?"
|
||||
@@ -164,7 +165,7 @@ msgid ""
|
||||
"On each download, FanFicFare offers an option to update the book cover image"
|
||||
" <i>inside</i> the EPUB from the web site when the EPUB is updated.<br "
|
||||
"/>This sets whether that will default to on or off."
|
||||
msgstr ""
|
||||
msgstr "Vid varje hämtning, erbjuder FanFicFare en möjlighet att uppdatera bokomslagesbilden <i>i</ i> EPUB:en från webbsidan när EPUB uppdateras. <br />Detta ställer in det som standard till på eller av."
|
||||
|
||||
#: config.py:437
|
||||
msgid "Default Background Metadata?"
|
||||
@@ -192,7 +193,7 @@ msgstr "Ta bort andra format som finns?"
|
||||
msgid ""
|
||||
"Check this to automatically delete all other ebook formats when updating an existing book.\n"
|
||||
"Handy if you have both a Nook(epub) and Kindle(mobi), for example."
|
||||
msgstr ""
|
||||
msgstr "Kryssa i det här för att automatiskt ta bort alla andra e-bokformat när du uppdaterar en befintlig bok.\nPraktiskt om du har både en Nook (EPUB) och Kindle (MOBI), till exempel."
|
||||
|
||||
#: config.py:453
|
||||
msgid "Keep Existing Tags when Updating Metadata?"
|
||||
@@ -208,7 +209,7 @@ msgstr ""
|
||||
|
||||
#: config.py:458
|
||||
msgid "Force Author into Author Sort?"
|
||||
msgstr ""
|
||||
msgstr "Tvingar författare in i författarsortering?"
|
||||
|
||||
#: config.py:459
|
||||
msgid ""
|
||||
@@ -260,11 +261,11 @@ msgstr ""
|
||||
|
||||
#: config.py:483
|
||||
msgid "Post Processing Options"
|
||||
msgstr ""
|
||||
msgstr "Efterbehandlings alternativ"
|
||||
|
||||
#: config.py:487
|
||||
msgid "Mark added/updated books when finished?"
|
||||
msgstr ""
|
||||
msgstr "Markera tillagda/uppdaterade böcker när det är klart?"
|
||||
|
||||
#: config.py:488
|
||||
msgid ""
|
||||
@@ -275,7 +276,7 @@ msgstr ""
|
||||
|
||||
#: config.py:492
|
||||
msgid "Show Marked books when finished?"
|
||||
msgstr ""
|
||||
msgstr "Visa markerade böcker när det är klart?"
|
||||
|
||||
#: config.py:493
|
||||
msgid ""
|
||||
@@ -303,11 +304,11 @@ msgstr ""
|
||||
|
||||
#: config.py:507
|
||||
msgid "Calculate Word Count:"
|
||||
msgstr ""
|
||||
msgstr "Beräkna antalet ord:"
|
||||
|
||||
#: config.py:520
|
||||
msgid "Automatically Convert new/update books?"
|
||||
msgstr ""
|
||||
msgstr "Konvertera automatiskt nya/uppdaterade böcker?"
|
||||
|
||||
#: config.py:521
|
||||
msgid ""
|
||||
@@ -322,7 +323,7 @@ msgstr "GUI-alternativ"
|
||||
|
||||
#: config.py:529
|
||||
msgid "Take URLs from Clipboard?"
|
||||
msgstr ""
|
||||
msgstr "Ta webbadresser från urklipp?"
|
||||
|
||||
#: config.py:530
|
||||
msgid "Prefill URLs from valid URLs in Clipboard when Adding New."
|
||||
@@ -330,7 +331,7 @@ msgstr ""
|
||||
|
||||
#: config.py:534
|
||||
msgid "Default to Update when books selected?"
|
||||
msgstr ""
|
||||
msgstr "Standard att uppdatera när böcker väljs?"
|
||||
|
||||
#: config.py:535
|
||||
msgid ""
|
||||
@@ -340,7 +341,7 @@ msgstr ""
|
||||
|
||||
#: config.py:539
|
||||
msgid "Keep 'Add New from URL(s)' dialog on top?"
|
||||
msgstr ""
|
||||
msgstr "Håll 'Lägg till ny från URL'-dialog överst?"
|
||||
|
||||
#: config.py:540
|
||||
msgid ""
|
||||
@@ -350,19 +351,19 @@ msgstr ""
|
||||
|
||||
#: config.py:544
|
||||
msgid "Show estimated time left?"
|
||||
msgstr ""
|
||||
msgstr "Visa beräknad tid som återstår?"
|
||||
|
||||
#: config.py:545
|
||||
msgid "When a Progress Bar is shown, show a rough estimate of the time left."
|
||||
msgstr ""
|
||||
msgstr "När en förloppsmätare visas, visa en grov uppskattning av den tid som återstår."
|
||||
|
||||
#: config.py:549
|
||||
msgid "Misc Options"
|
||||
msgstr ""
|
||||
msgstr "Tillbehör och övriga alternativ"
|
||||
|
||||
#: config.py:553
|
||||
msgid "Inject calibre Series when none found?"
|
||||
msgstr ""
|
||||
msgstr "Inför calibre serier när ingen finns?"
|
||||
|
||||
#: config.py:554
|
||||
msgid ""
|
||||
@@ -383,7 +384,7 @@ msgstr ""
|
||||
|
||||
#: config.py:563
|
||||
msgid "Reject List"
|
||||
msgstr ""
|
||||
msgstr "Avvisa lista"
|
||||
|
||||
#: config.py:567
|
||||
msgid "Edit Reject URL List"
|
||||
@@ -463,7 +464,7 @@ msgstr ""
|
||||
|
||||
#: config.py:673
|
||||
msgid "personal.ini"
|
||||
msgstr ""
|
||||
msgstr "personal.ini"
|
||||
|
||||
#: config.py:680 config.py:784 config.py:785
|
||||
msgid "Edit personal.ini"
|
||||
@@ -477,7 +478,7 @@ msgstr ""
|
||||
|
||||
#: config.py:693
|
||||
msgid "View \"Safe\" personal.ini"
|
||||
msgstr ""
|
||||
msgstr "Visa \"säker\" personal.ini"
|
||||
|
||||
#: config.py:698 config.py:775
|
||||
msgid ""
|
||||
@@ -487,7 +488,7 @@ msgstr ""
|
||||
|
||||
#: config.py:704
|
||||
msgid "defaults.ini"
|
||||
msgstr ""
|
||||
msgstr "defaults.ini"
|
||||
|
||||
#: config.py:709
|
||||
msgid ""
|
||||
@@ -501,7 +502,7 @@ msgstr "Visa standardvärden"
|
||||
|
||||
#: config.py:721
|
||||
msgid "Calibre Columns"
|
||||
msgstr ""
|
||||
msgstr "calibre-kolumner"
|
||||
|
||||
#: config.py:728
|
||||
msgid ""
|
||||
@@ -522,7 +523,7 @@ msgstr ""
|
||||
|
||||
#: config.py:743
|
||||
msgid "Show Calibre Column Names"
|
||||
msgstr ""
|
||||
msgstr "Visa calibre-kolumn namn"
|
||||
|
||||
#: config.py:752
|
||||
msgid ""
|
||||
@@ -531,15 +532,15 @@ msgstr ""
|
||||
|
||||
#: config.py:762
|
||||
msgid "Plugin Defaults"
|
||||
msgstr ""
|
||||
msgstr "Tilläggets standardinställningar"
|
||||
|
||||
#: config.py:763
|
||||
msgid "Plugin Defaults (%s) (Read-Only)"
|
||||
msgstr ""
|
||||
msgstr "plugin standardinställningar (%s) (skrivskyddad)"
|
||||
|
||||
#: config.py:774
|
||||
msgid "View 'Safe' personal.ini"
|
||||
msgstr ""
|
||||
msgstr "Visa 'säker' personal.ini"
|
||||
|
||||
#: config.py:808
|
||||
msgid "Calibre Column Entry Names"
|
||||
@@ -637,15 +638,15 @@ msgstr ""
|
||||
|
||||
#: config.py:937
|
||||
msgid "Generate Calibre Cover:"
|
||||
msgstr ""
|
||||
msgstr "Generera calibre omslag:"
|
||||
|
||||
#: config.py:964
|
||||
msgid "Plugin %(gc)s"
|
||||
msgstr ""
|
||||
msgstr "Tillägg %(gc)s"
|
||||
|
||||
#: config.py:965
|
||||
msgid "Use plugin to create covers. Additional settings are below."
|
||||
msgstr ""
|
||||
msgstr "Använd tillägg för att skapa omslag. Ytterligare inställningar finns nedan."
|
||||
|
||||
#: config.py:972
|
||||
msgid "Calibre Generate Cover"
|
||||
@@ -660,7 +661,7 @@ msgstr ""
|
||||
|
||||
#: config.py:987
|
||||
msgid "Generate Covers Only for New Books"
|
||||
msgstr ""
|
||||
msgstr "Skapa omslag endast för nya böcker"
|
||||
|
||||
#: config.py:988
|
||||
msgid ""
|
||||
@@ -681,7 +682,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1001
|
||||
msgid "%(gc)s(Plugin) Settings"
|
||||
msgstr ""
|
||||
msgstr "%(gc)s(Plugin) Inställningar"
|
||||
|
||||
#: config.py:1009
|
||||
msgid ""
|
||||
@@ -731,7 +732,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1108
|
||||
msgid "Which column and algorithm to use are configured in %(cp)s."
|
||||
msgstr ""
|
||||
msgstr "Vilken kolumn och algoritm att använda är konfigurerade i%(cp)s."
|
||||
|
||||
#: config.py:1118
|
||||
msgid ""
|
||||
@@ -803,11 +804,11 @@ msgstr "Status"
|
||||
|
||||
#: config.py:1239
|
||||
msgid "Status:%(cmplt)s"
|
||||
msgstr "Status:%(cmplt)"
|
||||
msgstr "Status:%(cmplt)s"
|
||||
|
||||
#: config.py:1240
|
||||
msgid "Status:%(inprog)s"
|
||||
msgstr ""
|
||||
msgstr "Status:%(inprog)s"
|
||||
|
||||
#: config.py:1241 config.py:1403
|
||||
msgid "Series"
|
||||
@@ -911,7 +912,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1303
|
||||
msgid "Update this %s column(%s) with..."
|
||||
msgstr ""
|
||||
msgstr "Uppdatera denna %s kolumn(%s) med..."
|
||||
|
||||
#: config.py:1313
|
||||
msgid "Values that aren't valid for this enumeration column will be ignored."
|
||||
@@ -944,7 +945,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1335
|
||||
msgid "Special column:"
|
||||
msgstr ""
|
||||
msgstr "Special kolumn:"
|
||||
|
||||
#: config.py:1340
|
||||
msgid "Update/Overwrite Error Column:"
|
||||
@@ -958,7 +959,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1354
|
||||
msgid "Save All Errors"
|
||||
msgstr ""
|
||||
msgstr "Spara alla fel"
|
||||
|
||||
#: config.py:1355
|
||||
msgid "If unchecked, these errors will not be saved:%s"
|
||||
@@ -1050,7 +1051,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1460
|
||||
msgid "IMAP Server Name"
|
||||
msgstr ""
|
||||
msgstr "IMAP-servernamn"
|
||||
|
||||
#: config.py:1461
|
||||
msgid "Name of IMAP server--must allow IMAP4 with SSL. Eg: imap.gmail.com"
|
||||
@@ -1058,7 +1059,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1470
|
||||
msgid "IMAP User Name"
|
||||
msgstr ""
|
||||
msgstr "IMAP-användarnamn"
|
||||
|
||||
#: config.py:1471
|
||||
msgid ""
|
||||
@@ -1068,7 +1069,7 @@ msgstr ""
|
||||
|
||||
#: config.py:1480
|
||||
msgid "IMAP User Password"
|
||||
msgstr ""
|
||||
msgstr "IMAP-användarlösenord"
|
||||
|
||||
#: config.py:1481
|
||||
msgid ""
|
||||
@@ -1142,7 +1143,7 @@ msgstr "Visa nedladdningsalternativ"
|
||||
|
||||
#: dialogs.py:264 dialogs.py:810
|
||||
msgid "Output &Format:"
|
||||
msgstr ""
|
||||
msgstr "Utdata &format:"
|
||||
|
||||
#: dialogs.py:272 dialogs.py:818
|
||||
msgid ""
|
||||
@@ -1151,7 +1152,7 @@ msgstr "Välj utdataformat att skapa. Kan fastställa standard från plugin konf
|
||||
|
||||
#: dialogs.py:300 dialogs.py:838
|
||||
msgid "Update Calibre &Metadata?"
|
||||
msgstr ""
|
||||
msgstr "Uppdatera calibre &metadata?"
|
||||
|
||||
#: dialogs.py:301 dialogs.py:839
|
||||
msgid ""
|
||||
@@ -1212,7 +1213,7 @@ msgstr ""
|
||||
|
||||
#: dialogs.py:505
|
||||
msgid "For Individual Books"
|
||||
msgstr ""
|
||||
msgstr "För individuella böcker"
|
||||
|
||||
#: dialogs.py:506
|
||||
msgid "Get URLs and go to dialog for individual story downloads."
|
||||
@@ -1270,7 +1271,7 @@ msgstr ""
|
||||
|
||||
#: dialogs.py:590 dialogs.py:614 fff_plugin.py:960
|
||||
msgid "Fetched metadata for"
|
||||
msgstr ""
|
||||
msgstr "Hämtade metadata för"
|
||||
|
||||
#: dialogs.py:643
|
||||
msgid " - %s estimated until done"
|
||||
@@ -1359,7 +1360,7 @@ msgstr "Är du säker du vill ta bort valda %d böcker från listan?"
|
||||
|
||||
#: dialogs.py:1006
|
||||
msgid "Note"
|
||||
msgstr ""
|
||||
msgstr "Anteckning"
|
||||
|
||||
#: dialogs.py:1045
|
||||
msgid "Select or Edit Reject Note."
|
||||
@@ -1375,7 +1376,7 @@ msgstr ""
|
||||
|
||||
#: dialogs.py:1074
|
||||
msgid "List of Books to Reject"
|
||||
msgstr ""
|
||||
msgstr "Lista över böcker att avvisa"
|
||||
|
||||
#: dialogs.py:1087
|
||||
msgid ""
|
||||
@@ -1423,7 +1424,7 @@ msgstr ""
|
||||
|
||||
#: dialogs.py:1335
|
||||
msgid "Go back to fix errors?"
|
||||
msgstr ""
|
||||
msgstr "Gå tillbaka för att åtgärda fel?"
|
||||
|
||||
#: dialogs.py:1447
|
||||
msgid "Click an error below to return to Editing directly on that line:"
|
||||
@@ -1511,7 +1512,7 @@ msgstr ""
|
||||
|
||||
#: fff_plugin.py:338
|
||||
msgid "Add to \"Send to Device\" Lists"
|
||||
msgstr ""
|
||||
msgstr "Lägg till \"Skicka till enhet\"-listor"
|
||||
|
||||
#: fff_plugin.py:340
|
||||
msgid "Mark Unread: Add to \"To Read\" Lists"
|
||||
@@ -1527,15 +1528,15 @@ msgstr ""
|
||||
|
||||
#: fff_plugin.py:367
|
||||
msgid "Reject Selected Books"
|
||||
msgstr ""
|
||||
msgstr "Avvisa markerade böcker"
|
||||
|
||||
#: fff_plugin.py:375
|
||||
msgid "&Configure FanFicFare"
|
||||
msgstr ""
|
||||
msgstr "&Anpassa FanFicFare"
|
||||
|
||||
#: fff_plugin.py:378
|
||||
msgid "Configure FanFicFare"
|
||||
msgstr ""
|
||||
msgstr "Anpassa FanFicFare"
|
||||
|
||||
#: fff_plugin.py:433
|
||||
msgid "Cannot Update Reading Lists from Device View"
|
||||
@@ -1852,7 +1853,7 @@ msgstr ""
|
||||
|
||||
#: fff_plugin.py:1274
|
||||
msgid "In library: <a href=\"%(liburl)s\">%(liburl)s</a>"
|
||||
msgstr ""
|
||||
msgstr "I bibliotek: <a href=\"%(liburl)s\">%(liburl)s</a>"
|
||||
|
||||
#: fff_plugin.py:1275 fff_plugin.py:1289
|
||||
msgid "New URL: <a href=\"%(newurl)s\">%(newurl)s</a>"
|
||||
@@ -1888,7 +1889,7 @@ msgstr ""
|
||||
|
||||
#: fff_plugin.py:1291
|
||||
msgid "Click '<b>No</b>' to skip URL."
|
||||
msgstr ""
|
||||
msgstr "Klicka '<b>Nej</b>' för att hoppa över URL."
|
||||
|
||||
#: fff_plugin.py:1297
|
||||
msgid "Update declined by user due to differing story URL(%s)"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -77,7 +77,8 @@ class AshwinderSycophantHexComAdapter(BaseSiteAdapter):
|
||||
## Login seems to be reasonably standard across eFiction sites.
|
||||
def needToLoginCheck(self, data):
|
||||
if 'This story contains adult content and/or themes.' in data \
|
||||
or "That password doesn't match the one in our database" in data:
|
||||
or "That password doesn't match the one in our database" in data \
|
||||
or "Member Login" in data:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
@@ -117,7 +117,7 @@ class FictionManiaTVAdapter(BaseSiteAdapter):
|
||||
self.story.setMetadata('rating', value)
|
||||
|
||||
elif key == 'Complete':
|
||||
self.story.setMetadata('status', 'Complete' if value == 'Complete' else 'In-Progress')
|
||||
self.story.setMetadata('status', 'Completed' if value == 'Complete' else 'In-Progress')
|
||||
|
||||
elif key == 'Categories':
|
||||
for element in cells[1]('a'):
|
||||
|
||||
@@ -93,7 +93,7 @@ class FicwadComSiteAdapter(BaseSiteAdapter):
|
||||
try:
|
||||
data = self._fetchUrl(url)
|
||||
# non-existent/removed story urls get thrown to the front page.
|
||||
if "<h2>Welcome to FicWad</h2>" in data:
|
||||
if "<h4>Featured Story</h4>" in data:
|
||||
raise exceptions.StoryDoesNotExist(self.url)
|
||||
soup = self.make_soup(data)
|
||||
except urllib2.HTTPError, e:
|
||||
|
||||
@@ -188,9 +188,13 @@ class HarryPotterFanFictionComSiteAdapter(BaseSiteAdapter):
|
||||
|
||||
data = self._fetchUrl(url)
|
||||
|
||||
# remove everything after here--the site's chapters break the
|
||||
# BS4 parser.
|
||||
data = data[:data.index('<script type="text/javascript" src="reviewjs.js">')]
|
||||
try:
|
||||
# remove everything after here--the site's chapters break
|
||||
# the BS4 parser.
|
||||
data = data[:data.index('<script type="text/javascript" src="reviewjs.js">')]
|
||||
except:
|
||||
# some older stories don't have the code at the end that breaks things.
|
||||
pass
|
||||
|
||||
soup = self.make_soup(data)
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ class StoriesOnlineNetAdapter(BaseSiteAdapter):
|
||||
params['page'] = 'http://'+self.getSiteDomain()+'/'
|
||||
params['submit'] = 'Login'
|
||||
|
||||
loginUrl = 'https://' + self.getSiteDomain() + '/login.php'
|
||||
loginUrl = 'https://' + self.getSiteDomain() + '/sol-secure/login.php'
|
||||
logger.debug("Will now login to URL (%s) as (%s)" % (loginUrl,
|
||||
params['theusername']))
|
||||
|
||||
|
||||
@@ -228,11 +228,15 @@ class BaseXenForoForumAdapter(BaseSiteAdapter):
|
||||
|
||||
if ( url.startswith(self.getURLPrefix()) or
|
||||
url.startswith('http://'+self.getSiteDomain()) or
|
||||
url.startswith('https://'+self.getSiteDomain()) ) and ('/posts/' in url or '/threads/' in url):
|
||||
url.startswith('https://'+self.getSiteDomain()) ) and \
|
||||
( '/posts/' in url or '/threads/' in url or 'showpost.php' in url):
|
||||
|
||||
# brute force way to deal with SB's http->https change when hardcoded http urls.
|
||||
url = url.replace('http://'+self.getSiteDomain(),self.getURLPrefix())
|
||||
|
||||
# http://forums.spacebattles.com/showpost.php?p=4755532&postcount=9
|
||||
url = re.sub(r'showpost\.php\?p=([0-9]+)(&postcount=[0-9]+)?',r'/posts/\1/',url)
|
||||
|
||||
url = re.sub(r'(^[\'"]+|[\'"]+$)','',url) # strip leading or trailing '" from incorrect quoting.
|
||||
url = re.sub(r'like$','',url) # strip 'like' if incorrect 'like' link instead of proper post URL.
|
||||
|
||||
|
||||
@@ -853,18 +853,6 @@ extracategories:The Sentinel
|
||||
## this should go in your personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
[bdsm-geschichten.net]
|
||||
## Some sites do not require a login, but do require the user to
|
||||
## confirm they are adult for adult content. In commandline version,
|
||||
## this should go in your personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## This site offers no index page so we can either guess the chapter URLs
|
||||
## by dec/incrementing numbers ('guess') or walk all the chapters in the metadata
|
||||
## parsing state ('parse'). Since guessing can lead to errors for non-standard
|
||||
## story URLs, the default is to parse
|
||||
#find_chapters:guess
|
||||
|
||||
[bloodshedverse.com]
|
||||
## website encoding(s) In theory, each website reports the character
|
||||
## encoding they use for each page. In practice, some sites report it
|
||||
@@ -910,15 +898,6 @@ strip_text_links:true
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Blood Ties
|
||||
|
||||
[buffynfaith.net]
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Buffy: The Vampire Slayer
|
||||
|
||||
## Some sites also require the user to confirm they are adult for
|
||||
## adult content. In commandline version, this should go in your
|
||||
## personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
[fanfic.castletv.net]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
@@ -1256,27 +1235,6 @@ cover_exclusion_regexp:/css/bir.png
|
||||
[forums.sufficientvelocity.com]
|
||||
## see [base_xenforoforum]
|
||||
|
||||
[grangerenchanted.com]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
## commandline version, this should go in your personal.ini, not
|
||||
## defaults.ini.
|
||||
#username:YourName
|
||||
#password:yourpassword
|
||||
|
||||
## Some sites also require the user to confirm they are adult for
|
||||
## adult content. In commandline version, this should go in your
|
||||
## personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Harry Potter
|
||||
extracharacters:Hermione Granger
|
||||
|
||||
## Extra metadata that this adapter knows about. See [dramione.org]
|
||||
## for examples of how to use them.
|
||||
extra_valid_entries:read,reviews
|
||||
|
||||
[hlfiction.net]
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Highlander
|
||||
@@ -1524,22 +1482,6 @@ extracategories:Supernatural
|
||||
extracharacters:Sam,Dean
|
||||
extraships:Sam/Dean
|
||||
|
||||
[scarhead.net]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
## commandline version, this should go in your personal.ini, not
|
||||
## defaults.ini.
|
||||
#username:YourName
|
||||
#password:yourpassword
|
||||
|
||||
## Some sites also require the user to confirm they are adult for
|
||||
## adult content. In commandline version, this should go in your
|
||||
## personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Harry Potter
|
||||
|
||||
[sheppardweir.com]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
@@ -1681,15 +1623,6 @@ readings_label: Readings
|
||||
## personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
[tokra.fandomnet.com]
|
||||
## Some sites do not require a login, but do require the user to
|
||||
## confirm they are adult for adult content. In commandline version,
|
||||
## this should go in your personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Stargate: SG-1
|
||||
|
||||
[tolkienfanfiction.com]
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Lord of the Rings
|
||||
@@ -2051,11 +1984,6 @@ cover_exclusion_regexp:/stories/999/images/.*?_trophy.png
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:NCIS
|
||||
|
||||
[www.nickngreg.nl]
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:CSI
|
||||
extraships:Nick Stokes/Greg Sanders
|
||||
|
||||
[www.phoenixsong.net]
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
@@ -2349,20 +2277,6 @@ extracategories:Andromeda
|
||||
## Site dedicated to these categories/characters/ships
|
||||
extracategories:Artemis Fowl
|
||||
|
||||
[www.therabidreader.com]
|
||||
## Some sites do not require a login, but do require the user to
|
||||
## confirm they are adult for adult content. In commandline version,
|
||||
## this should go in your personal.ini, not defaults.ini.
|
||||
#is_adult:true
|
||||
|
||||
## Some sites require login (or login for some rated stories) The
|
||||
## program can prompt you, or you can save it in config. In
|
||||
## commandline version, this should go in your personal.ini, not
|
||||
## defaults.ini.
|
||||
#username:YourName
|
||||
#password:yourpassword
|
||||
|
||||
|
||||
[www.naiceanilme.net]
|
||||
## Some sites do not require a login, but do require the user to
|
||||
## confirm they are adult for adult content. In commandline version,
|
||||
@@ -2376,8 +2290,6 @@ extracategories:Artemis Fowl
|
||||
#username:YourName
|
||||
#password:yourpassword
|
||||
|
||||
|
||||
|
||||
[overrides]
|
||||
## It may sometimes be useful to override all of the specific format,
|
||||
## site and site:format sections in your private configuration. For
|
||||
|
||||
@@ -1069,6 +1069,9 @@ class Story(Configurable):
|
||||
if imgurl not in self.imgurls:
|
||||
|
||||
try:
|
||||
if imgurl == 'failedtoload':
|
||||
raise Exception("Previously failed to load")
|
||||
|
||||
parsedUrl = urlparse.urlparse(imgurl)
|
||||
if self.getConfig('no_image_processing'):
|
||||
(data,ext,mime) = no_convert_image(imgurl,
|
||||
|
||||
@@ -23,7 +23,7 @@ setup(
|
||||
# Versions should comply with PEP440. For a discussion on single-sourcing
|
||||
# the version across setup.py and the project code, see
|
||||
# https://packaging.python.org/en/latest/single_source_version.html
|
||||
version="2.3.2",
|
||||
version="2.3.4",
|
||||
|
||||
description='A tool for downloading fanfiction to eBook formats',
|
||||
long_description=long_description,
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# ffd-retief-hrd fanficfare
|
||||
application: fanficfare
|
||||
version: 2-3-02
|
||||
version: 2-3-04
|
||||
runtime: python27
|
||||
api_version: 1
|
||||
threadsafe: true
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
If you have any problems with this application, please
|
||||
report them in
|
||||
the <a href="http://groups.google.com/group/fanfic-downloader">FanFicFare Google Group</a>. The
|
||||
<a href="http://2-3-01.fanficfare.appspot.com">previous version
|
||||
<a href="http://2-3-03.fanficfare.appspot.com">previous version
|
||||
</a> is also available for you to use if necessary.
|
||||
</p>
|
||||
<div id='error'>
|
||||
|
||||
Reference in New Issue
Block a user