mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Pull from trunk
This commit is contained in:
commit
0d878e08ba
@ -2,7 +2,7 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
||||||
__docformat__ = 'restructuredtext en'
|
__docformat__ = 'restructuredtext en'
|
||||||
__appname__ = 'calibre'
|
__appname__ = 'calibre'
|
||||||
__version__ = '0.5.0'
|
__version__ = '0.5.1'
|
||||||
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
||||||
'''
|
'''
|
||||||
Various run time constants.
|
Various run time constants.
|
||||||
|
@ -97,6 +97,8 @@ def xml_to_unicode(raw, verbose=False, strip_encoding_pats=False,
|
|||||||
if encoding is None:
|
if encoding is None:
|
||||||
encoding = force_encoding(raw, verbose)
|
encoding = force_encoding(raw, verbose)
|
||||||
try:
|
try:
|
||||||
|
if encoding.lower().strip() == 'macintosh':
|
||||||
|
encoding = 'mac-roman'
|
||||||
raw = raw.decode(encoding, 'replace')
|
raw = raw.decode(encoding, 'replace')
|
||||||
except LookupError:
|
except LookupError:
|
||||||
encoding = 'utf-8'
|
encoding = 'utf-8'
|
||||||
|
@ -31,7 +31,7 @@ from calibre.ebooks.oeb.transforms.htmltoc import HTMLTOCAdder
|
|||||||
from calibre.ebooks.oeb.transforms.manglecase import CaseMangler
|
from calibre.ebooks.oeb.transforms.manglecase import CaseMangler
|
||||||
from calibre.ebooks.mobi.palmdoc import compress_doc
|
from calibre.ebooks.mobi.palmdoc import compress_doc
|
||||||
from calibre.ebooks.mobi.langcodes import iana2mobi
|
from calibre.ebooks.mobi.langcodes import iana2mobi
|
||||||
from calibre.ebooks.mobi.mobiml import MBP_NS, MBP, MobiMLizer
|
from calibre.ebooks.mobi.mobiml import MBP_NS, MobiMLizer
|
||||||
from calibre.customize.ui import run_plugins_on_postprocess
|
from calibre.customize.ui import run_plugins_on_postprocess
|
||||||
from calibre.utils.config import Config, StringConfig
|
from calibre.utils.config import Config, StringConfig
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ class Serializer(object):
|
|||||||
hrefs = self.oeb.manifest.hrefs
|
hrefs = self.oeb.manifest.hrefs
|
||||||
buffer.write('<guide>')
|
buffer.write('<guide>')
|
||||||
for ref in self.oeb.guide.values():
|
for ref in self.oeb.guide.values():
|
||||||
path, frag = urldefrag(ref.href)
|
path = urldefrag(ref.href)[0]
|
||||||
if hrefs[path].media_type not in OEB_DOCS:
|
if hrefs[path].media_type not in OEB_DOCS:
|
||||||
continue
|
continue
|
||||||
buffer.write('<reference type="')
|
buffer.write('<reference type="')
|
||||||
@ -455,8 +455,6 @@ class MobiWriter(object):
|
|||||||
self._oeb.logger.info('Serializing images...')
|
self._oeb.logger.info('Serializing images...')
|
||||||
images = [(index, href) for href, index in self._images.items()]
|
images = [(index, href) for href, index in self._images.items()]
|
||||||
images.sort()
|
images.sort()
|
||||||
metadata = self._oeb.metadata
|
|
||||||
coverid = metadata.cover[0] if metadata.cover else None
|
|
||||||
for _, href in images:
|
for _, href in images:
|
||||||
item = self._oeb.manifest.hrefs[href]
|
item = self._oeb.manifest.hrefs[href]
|
||||||
try:
|
try:
|
||||||
|
@ -159,7 +159,7 @@ class Stylizer(object):
|
|||||||
for _, _, cssdict, text, _ in rules:
|
for _, _, cssdict, text, _ in rules:
|
||||||
try:
|
try:
|
||||||
selector = CSSSelector(text)
|
selector = CSSSelector(text)
|
||||||
except ExpressionError:
|
except (AssertionError, ExpressionError, etree.XPathSyntaxError):
|
||||||
continue
|
continue
|
||||||
for elem in selector(tree):
|
for elem in selector(tree):
|
||||||
self.style(elem)._update_cssdict(cssdict)
|
self.style(elem)._update_cssdict(cssdict)
|
||||||
|
@ -63,6 +63,8 @@ class HTMLTOCAdder(object):
|
|||||||
def __call__(self, oeb, context):
|
def __call__(self, oeb, context):
|
||||||
if 'toc' in oeb.guide:
|
if 'toc' in oeb.guide:
|
||||||
return
|
return
|
||||||
|
if not getattr(getattr(oeb, 'toc', False), 'nodes', False):
|
||||||
|
return
|
||||||
oeb.logger.info('Generating in-line TOC...')
|
oeb.logger.info('Generating in-line TOC...')
|
||||||
title = self.title or oeb.translate(DEFAULT_TITLE)
|
title = self.title or oeb.translate(DEFAULT_TITLE)
|
||||||
style = self.style
|
style = self.style
|
||||||
|
BIN
src/calibre/gui2/images/news/politico.png
Normal file
BIN
src/calibre/gui2/images/news/politico.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 572 B |
@ -94,6 +94,7 @@ class DateDelegate(QStyledItemDelegate):
|
|||||||
def createEditor(self, parent, option, index):
|
def createEditor(self, parent, option, index):
|
||||||
qde = QStyledItemDelegate.createEditor(self, parent, option, index)
|
qde = QStyledItemDelegate.createEditor(self, parent, option, index)
|
||||||
qde.setDisplayFormat('MM/dd/yyyy')
|
qde.setDisplayFormat('MM/dd/yyyy')
|
||||||
|
qde.setMinimumDate(QDate(100,1,1))
|
||||||
return qde
|
return qde
|
||||||
|
|
||||||
class BooksModel(QAbstractTableModel):
|
class BooksModel(QAbstractTableModel):
|
||||||
|
@ -238,6 +238,7 @@ class Main(MainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
QObject.connect(self.config_button, SIGNAL('clicked(bool)'), self.do_config)
|
QObject.connect(self.config_button, SIGNAL('clicked(bool)'), self.do_config)
|
||||||
self.connect(self.preferences_action, SIGNAL('triggered(bool)'), self.do_config)
|
self.connect(self.preferences_action, SIGNAL('triggered(bool)'), self.do_config)
|
||||||
|
self.connect(self.action_preferences, SIGNAL('triggered(bool)'), self.do_config)
|
||||||
QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'), self.do_advanced_search)
|
QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'), self.do_advanced_search)
|
||||||
|
|
||||||
####################### Library view ########################
|
####################### Library view ########################
|
||||||
@ -1220,12 +1221,14 @@ class Main(MainWindow, Ui_MainWindow):
|
|||||||
if ext in config['internally_viewed_formats']:
|
if ext in config['internally_viewed_formats']:
|
||||||
if ext == 'LRF':
|
if ext == 'LRF':
|
||||||
args = ['lrfviewer', name]
|
args = ['lrfviewer', name]
|
||||||
self.job_manager.server.run_free_job('lrfviewer', kwdargs=dict(args=args))
|
self.job_manager.server.run_free_job('lrfviewer',
|
||||||
|
kwdargs=dict(args=args))
|
||||||
else:
|
else:
|
||||||
args = ['ebook-viewer', name]
|
args = ['ebook-viewer', name]
|
||||||
if isosx:
|
if isosx:
|
||||||
args.append('--raise-window')
|
args.append('--raise-window')
|
||||||
self.job_manager.server.run_free_job('ebook-viewer', kwdargs=dict(args=args))
|
self.job_manager.server.run_free_job('ebook-viewer',
|
||||||
|
kwdargs=dict(args=args))
|
||||||
else:
|
else:
|
||||||
QDesktopServices.openUrl(QUrl('file:'+name))#launch(name)
|
QDesktopServices.openUrl(QUrl('file:'+name))#launch(name)
|
||||||
time.sleep(5) # User feedback
|
time.sleep(5) # User feedback
|
||||||
@ -1320,7 +1323,7 @@ class Main(MainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
############################### Do config ##################################
|
############################### Do config ##################################
|
||||||
|
|
||||||
def do_config(self):
|
def do_config(self, *args):
|
||||||
if self.job_manager.has_jobs():
|
if self.job_manager.has_jobs():
|
||||||
d = error_dialog(self, _('Cannot configure'), _('Cannot configure while there are running jobs.'))
|
d = error_dialog(self, _('Cannot configure'), _('Cannot configure while there are running jobs.'))
|
||||||
d.exec_()
|
d.exec_()
|
||||||
|
@ -1,149 +1,150 @@
|
|||||||
<ui version="4.0" >
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
<author>Kovid Goyal</author>
|
<author>Kovid Goyal</author>
|
||||||
<class>MainWindow</class>
|
<class>MainWindow</class>
|
||||||
<widget class="QMainWindow" name="MainWindow" >
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
<property name="geometry" >
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>865</width>
|
<width>1012</width>
|
||||||
<height>822</height>
|
<height>822</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="contextMenuPolicy" >
|
<property name="contextMenuPolicy">
|
||||||
<enum>Qt::NoContextMenu</enum>
|
<enum>Qt::NoContextMenu</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle" >
|
<property name="windowTitle">
|
||||||
<string>__appname__</string>
|
<string>__appname__</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowIcon" >
|
<property name="windowIcon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/library</normaloff>:/library</iconset>
|
<normaloff>:/library</normaloff>:/library</iconset>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralwidget" >
|
<widget class="QWidget" name="centralwidget">
|
||||||
<layout class="QGridLayout" name="gridLayout" >
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<item row="0" column="0" >
|
<item row="0" column="0">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_3" >
|
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||||
<item>
|
<item>
|
||||||
<widget class="LocationView" name="location_view" >
|
<widget class="LocationView" name="location_view">
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize" >
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>16777215</width>
|
<width>16777215</width>
|
||||||
<height>100</height>
|
<height>100</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="verticalScrollBarPolicy" >
|
<property name="verticalScrollBarPolicy">
|
||||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="horizontalScrollBarPolicy" >
|
<property name="horizontalScrollBarPolicy">
|
||||||
<enum>Qt::ScrollBarAsNeeded</enum>
|
<enum>Qt::ScrollBarAsNeeded</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tabKeyNavigation" >
|
<property name="tabKeyNavigation">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="showDropIndicator" stdset="0" >
|
<property name="showDropIndicator" stdset="0">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize" >
|
<property name="iconSize">
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>40</height>
|
<height>40</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="movement" >
|
<property name="movement">
|
||||||
<enum>QListView::Static</enum>
|
<enum>QListView::Static</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="flow" >
|
<property name="flow">
|
||||||
<enum>QListView::LeftToRight</enum>
|
<enum>QListView::LeftToRight</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="gridSize" >
|
<property name="gridSize">
|
||||||
<size>
|
<size>
|
||||||
<width>175</width>
|
<width>175</width>
|
||||||
<height>90</height>
|
<height>90</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="viewMode" >
|
<property name="viewMode">
|
||||||
<enum>QListView::ListMode</enum>
|
<enum>QListView::ListMode</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap" >
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="donate_button" >
|
<widget class="QToolButton" name="donate_button">
|
||||||
<property name="cursor" >
|
<property name="cursor">
|
||||||
<cursorShape>PointingHandCursor</cursorShape>
|
<cursorShape>PointingHandCursor</cursorShape>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/donate.svg</normaloff>:/images/donate.svg</iconset>
|
<normaloff>:/images/donate.svg</normaloff>:/images/donate.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize" >
|
<property name="iconSize">
|
||||||
<size>
|
<size>
|
||||||
<width>64</width>
|
<width>64</width>
|
||||||
<height>64</height>
|
<height>64</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRaise" >
|
<property name="autoRaise">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3" >
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="vanity" >
|
<widget class="QLabel" name="vanity">
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize" >
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>16777215</width>
|
<width>16777215</width>
|
||||||
<height>90</height>
|
<height>90</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="textFormat" >
|
<property name="textFormat">
|
||||||
<enum>Qt::RichText</enum>
|
<enum>Qt::RichText</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="openExternalLinks" >
|
<property name="openExternalLinks">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2" >
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_2" >
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Output:</string>
|
<string>Output:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="output_format" >
|
<widget class="QComboBox" name="output_format">
|
||||||
<property name="toolTip" >
|
<property name="toolTip">
|
||||||
<string>Set the output format that is used when converting ebooks and downloading news</string>
|
<string>Set the output format that is used when converting ebooks and downloading news</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@ -154,99 +155,99 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0" >
|
<item row="1" column="0">
|
||||||
<layout class="QHBoxLayout" >
|
<layout class="QHBoxLayout">
|
||||||
<property name="spacing" >
|
<property name="spacing">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin" >
|
<property name="margin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="advanced_search_button" >
|
<widget class="QToolButton" name="advanced_search_button">
|
||||||
<property name="toolTip" >
|
<property name="toolTip">
|
||||||
<string>Advanced search</string>
|
<string>Advanced search</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/search.svg</normaloff>:/images/search.svg</iconset>
|
<normaloff>:/images/search.svg</normaloff>:/images/search.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="shortcut" >
|
<property name="shortcut">
|
||||||
<string>Alt+S</string>
|
<string>Alt+S</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label" >
|
<widget class="QLabel" name="label">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>&Search:</string>
|
<string>&Search:</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="buddy" >
|
<property name="buddy">
|
||||||
<cstring>search</cstring>
|
<cstring>search</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="SearchBox" name="search" >
|
<widget class="SearchBox" name="search">
|
||||||
<property name="enabled" >
|
<property name="enabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
<horstretch>1</horstretch>
|
<horstretch>1</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="acceptDrops" >
|
<property name="acceptDrops">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip" >
|
<property name="toolTip">
|
||||||
<string>Search the list of books by title or author<br><br>Words separated by spaces are ANDed</string>
|
<string>Search the list of books by title or author<br><br>Words separated by spaces are ANDed</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="whatsThis" >
|
<property name="whatsThis">
|
||||||
<string>Search the list of books by title, author, publisher, tags and comments<br><br>Words separated by spaces are ANDed</string>
|
<string>Search the list of books by title, author, publisher, tags and comments<br><br>Words separated by spaces are ANDed</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoFillBackground" >
|
<property name="autoFillBackground">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="frame" >
|
<property name="frame">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="clear_button" >
|
<widget class="QToolButton" name="clear_button">
|
||||||
<property name="toolTip" >
|
<property name="toolTip">
|
||||||
<string>Reset Quick Search</string>
|
<string>Reset Quick Search</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/clear_left.svg</normaloff>:/images/clear_left.svg</iconset>
|
<normaloff>:/images/clear_left.svg</normaloff>:/images/clear_left.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="Line" name="line" >
|
<widget class="Line" name="line">
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0" >
|
<property name="sizeHint" stdset="0">
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@ -255,77 +256,77 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="config_button" >
|
<widget class="QToolButton" name="config_button">
|
||||||
<property name="toolTip" >
|
<property name="toolTip">
|
||||||
<string>Configuration</string>
|
<string>Configuration</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/config.svg</normaloff>:/images/config.svg</iconset>
|
<normaloff>:/images/config.svg</normaloff>:/images/config.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0" >
|
<item row="2" column="0">
|
||||||
<widget class="QStackedWidget" name="stack" >
|
<widget class="QStackedWidget" name="stack">
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
<horstretch>100</horstretch>
|
<horstretch>100</horstretch>
|
||||||
<verstretch>100</verstretch>
|
<verstretch>100</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex" >
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="library" >
|
<widget class="QWidget" name="library">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2" >
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout" >
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout" >
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="match_any" >
|
<widget class="QRadioButton" name="match_any">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Match any</string>
|
<string>Match any</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked" >
|
<property name="checked">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QRadioButton" name="match_all" >
|
<widget class="QRadioButton" name="match_all">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Match all</string>
|
<string>Match all</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked" >
|
<property name="checked">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="popularity" >
|
<widget class="QCheckBox" name="popularity">
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Sort by &popularity</string>
|
<string>Sort by &popularity</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="TagsView" name="tags_view" >
|
<widget class="TagsView" name="tags_view">
|
||||||
<property name="tabKeyNavigation" >
|
<property name="tabKeyNavigation">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="alternatingRowColors" >
|
<property name="alternatingRowColors">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="animated" >
|
<property name="animated">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="headerHidden" >
|
<property name="headerHidden">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@ -333,35 +334,35 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="BooksView" name="library_view" >
|
<widget class="BooksView" name="library_view">
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
<horstretch>100</horstretch>
|
<horstretch>100</horstretch>
|
||||||
<verstretch>10</verstretch>
|
<verstretch>10</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="acceptDrops" >
|
<property name="acceptDrops">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragEnabled" >
|
<property name="dragEnabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragDropOverwriteMode" >
|
<property name="dragDropOverwriteMode">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragDropMode" >
|
<property name="dragDropMode">
|
||||||
<enum>QAbstractItemView::DragDrop</enum>
|
<enum>QAbstractItemView::DragDrop</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="alternatingRowColors" >
|
<property name="alternatingRowColors">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="selectionBehavior" >
|
<property name="selectionBehavior">
|
||||||
<enum>QAbstractItemView::SelectRows</enum>
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="showGrid" >
|
<property name="showGrid">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap" >
|
<property name="wordWrap">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@ -370,76 +371,76 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="main_memory" >
|
<widget class="QWidget" name="main_memory">
|
||||||
<layout class="QGridLayout" >
|
<layout class="QGridLayout">
|
||||||
<item row="0" column="0" >
|
<item row="0" column="0">
|
||||||
<widget class="DeviceBooksView" name="memory_view" >
|
<widget class="DeviceBooksView" name="memory_view">
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
<horstretch>100</horstretch>
|
<horstretch>100</horstretch>
|
||||||
<verstretch>10</verstretch>
|
<verstretch>10</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="acceptDrops" >
|
<property name="acceptDrops">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragEnabled" >
|
<property name="dragEnabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragDropOverwriteMode" >
|
<property name="dragDropOverwriteMode">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragDropMode" >
|
<property name="dragDropMode">
|
||||||
<enum>QAbstractItemView::DragDrop</enum>
|
<enum>QAbstractItemView::DragDrop</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="alternatingRowColors" >
|
<property name="alternatingRowColors">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="selectionBehavior" >
|
<property name="selectionBehavior">
|
||||||
<enum>QAbstractItemView::SelectRows</enum>
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="showGrid" >
|
<property name="showGrid">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap" >
|
<property name="wordWrap">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="page" >
|
<widget class="QWidget" name="page">
|
||||||
<layout class="QGridLayout" >
|
<layout class="QGridLayout">
|
||||||
<item row="0" column="0" >
|
<item row="0" column="0">
|
||||||
<widget class="DeviceBooksView" name="card_view" >
|
<widget class="DeviceBooksView" name="card_view">
|
||||||
<property name="sizePolicy" >
|
<property name="sizePolicy">
|
||||||
<sizepolicy vsizetype="Expanding" hsizetype="Preferred" >
|
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||||
<horstretch>10</horstretch>
|
<horstretch>10</horstretch>
|
||||||
<verstretch>10</verstretch>
|
<verstretch>10</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="acceptDrops" >
|
<property name="acceptDrops">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragEnabled" >
|
<property name="dragEnabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragDropOverwriteMode" >
|
<property name="dragDropOverwriteMode">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="dragDropMode" >
|
<property name="dragDropMode">
|
||||||
<enum>QAbstractItemView::DragDrop</enum>
|
<enum>QAbstractItemView::DragDrop</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="alternatingRowColors" >
|
<property name="alternatingRowColors">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="selectionBehavior" >
|
<property name="selectionBehavior">
|
||||||
<enum>QAbstractItemView::SelectRows</enum>
|
<enum>QAbstractItemView::SelectRows</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="showGrid" >
|
<property name="showGrid">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap" >
|
<property name="wordWrap">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@ -450,221 +451,237 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QToolBar" name="tool_bar" >
|
<widget class="QToolBar" name="tool_bar">
|
||||||
<property name="minimumSize" >
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="contextMenuPolicy" >
|
<property name="contextMenuPolicy">
|
||||||
<enum>Qt::PreventContextMenu</enum>
|
<enum>Qt::PreventContextMenu</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="movable" >
|
<property name="movable">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="orientation" >
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize" >
|
<property name="iconSize">
|
||||||
<size>
|
<size>
|
||||||
<width>48</width>
|
<width>48</width>
|
||||||
<height>48</height>
|
<height>48</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolButtonStyle" >
|
<property name="toolButtonStyle">
|
||||||
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
<enum>Qt::ToolButtonTextUnderIcon</enum>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="toolBarArea" >
|
<attribute name="toolBarArea">
|
||||||
<enum>TopToolBarArea</enum>
|
<enum>TopToolBarArea</enum>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="toolBarBreak" >
|
<attribute name="toolBarBreak">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
<addaction name="action_add" />
|
<addaction name="action_add"/>
|
||||||
<addaction name="action_del" />
|
<addaction name="action_edit"/>
|
||||||
<addaction name="action_edit" />
|
<addaction name="action_convert"/>
|
||||||
<addaction name="separator" />
|
<addaction name="action_view"/>
|
||||||
<addaction name="action_sync" />
|
<addaction name="action_news"/>
|
||||||
<addaction name="action_save" />
|
<addaction name="separator"/>
|
||||||
<addaction name="separator" />
|
<addaction name="action_sync"/>
|
||||||
<addaction name="action_news" />
|
<addaction name="action_save"/>
|
||||||
<addaction name="action_convert" />
|
<addaction name="action_del"/>
|
||||||
<addaction name="action_view" />
|
<addaction name="separator"/>
|
||||||
|
<addaction name="action_preferences"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QStatusBar" name="statusBar" >
|
<widget class="QStatusBar" name="statusBar">
|
||||||
<property name="mouseTracking" >
|
<property name="mouseTracking">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<action name="action_add" >
|
<action name="action_add">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/add_book.svg</normaloff>:/images/add_book.svg</iconset>
|
<normaloff>:/images/add_book.svg</normaloff>:/images/add_book.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Add books</string>
|
<string>Add books</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="shortcut" >
|
<property name="shortcut">
|
||||||
<string>A</string>
|
<string>A</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRepeat" >
|
<property name="autoRepeat">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_del" >
|
<action name="action_del">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/trash.svg</normaloff>:/images/trash.svg</iconset>
|
<normaloff>:/images/trash.svg</normaloff>:/images/trash.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Remove books</string>
|
<string>Remove books</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip" >
|
<property name="toolTip">
|
||||||
<string>Remove books</string>
|
<string>Remove books</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="shortcut" >
|
<property name="shortcut">
|
||||||
<string>Del</string>
|
<string>Del</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_edit" >
|
<action name="action_edit">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/edit_input.svg</normaloff>:/images/edit_input.svg</iconset>
|
<normaloff>:/images/edit_input.svg</normaloff>:/images/edit_input.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Edit meta information</string>
|
<string>Edit meta information</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="shortcut" >
|
<property name="shortcut">
|
||||||
<string>E</string>
|
<string>E</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="autoRepeat" >
|
<property name="autoRepeat">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_sync" >
|
<action name="action_sync">
|
||||||
<property name="enabled" >
|
<property name="enabled">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/sync.svg</normaloff>:/images/sync.svg</iconset>
|
<normaloff>:/images/sync.svg</normaloff>:/images/sync.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Send to device</string>
|
<string>Send to device</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_save" >
|
<action name="action_save">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/save.svg</normaloff>:/images/save.svg</iconset>
|
<normaloff>:/images/save.svg</normaloff>:/images/save.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Save to disk</string>
|
<string>Save to disk</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="shortcut" >
|
<property name="shortcut">
|
||||||
<string>S</string>
|
<string>S</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_news" >
|
<action name="action_news">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/news.svg</normaloff>:/images/news.svg</iconset>
|
<normaloff>:/images/news.svg</normaloff>:/images/news.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Fetch news</string>
|
<string>Fetch news</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="shortcut" >
|
<property name="shortcut">
|
||||||
<string>F</string>
|
<string>F</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_convert" >
|
<action name="action_convert">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/convert.svg</normaloff>:/images/convert.svg</iconset>
|
<normaloff>:/images/convert.svg</normaloff>:/images/convert.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Convert E-books</string>
|
<string>Convert E-books</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="shortcut" >
|
<property name="shortcut">
|
||||||
<string>C</string>
|
<string>C</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_view" >
|
<action name="action_view">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/view.svg</normaloff>:/images/view.svg</iconset>
|
<normaloff>:/images/view.svg</normaloff>:/images/view.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>View</string>
|
<string>View</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="shortcut" >
|
<property name="shortcut">
|
||||||
<string>V</string>
|
<string>V</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_open_containing_folder" >
|
<action name="action_open_containing_folder">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/document_open.svg</normaloff>:/images/document_open.svg</iconset>
|
<normaloff>:/images/document_open.svg</normaloff>:/images/document_open.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Open containing folder</string>
|
<string>Open containing folder</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_show_book_details" >
|
<action name="action_show_book_details">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/dialog_information.svg</normaloff>:/images/dialog_information.svg</iconset>
|
<normaloff>:/images/dialog_information.svg</normaloff>:/images/dialog_information.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Show book details</string>
|
<string>Show book details</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_books_by_same_author" >
|
<action name="action_books_by_same_author">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/user_profile.svg</normaloff>:/images/user_profile.svg</iconset>
|
<normaloff>:/images/user_profile.svg</normaloff>:/images/user_profile.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Books by same author</string>
|
<string>Books by same author</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_books_in_this_series" >
|
<action name="action_books_in_this_series">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/books_in_series.svg</normaloff>:/images/books_in_series.svg</iconset>
|
<normaloff>:/images/books_in_series.svg</normaloff>:/images/books_in_series.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Books in this series</string>
|
<string>Books in this series</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_books_by_this_publisher" >
|
<action name="action_books_by_this_publisher">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/publisher.png</normaloff>:/images/publisher.png</iconset>
|
<normaloff>:/images/publisher.png</normaloff>:/images/publisher.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Books by this publisher</string>
|
<string>Books by this publisher</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_books_with_the_same_tags" >
|
<action name="action_books_with_the_same_tags">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/tags.svg</normaloff>:/images/tags.svg</iconset>
|
<normaloff>:/images/tags.svg</normaloff>:/images/tags.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Books with the same tags</string>
|
<string>Books with the same tags</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="action_send_specific_format_to_device" >
|
<action name="action_send_specific_format_to_device">
|
||||||
<property name="icon" >
|
<property name="icon">
|
||||||
<iconset resource="images.qrc" >
|
<iconset resource="images.qrc">
|
||||||
<normaloff>:/images/book.svg</normaloff>:/images/book.svg</iconset>
|
<normaloff>:/images/book.svg</normaloff>:/images/book.svg</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="text" >
|
<property name="text">
|
||||||
<string>Send specific format to device</string>
|
<string>Send specific format to device</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="action_preferences">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="images.qrc">
|
||||||
|
<normaloff>:/images/config.svg</normaloff>:/images/config.svg</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Preferences</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Configure calibre</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Ctrl+P</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
@ -694,7 +711,7 @@
|
|||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="images.qrc" />
|
<include location="images.qrc"/>
|
||||||
</resources>
|
</resources>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
@ -703,11 +720,11 @@
|
|||||||
<receiver>search</receiver>
|
<receiver>search</receiver>
|
||||||
<slot>clear()</slot>
|
<slot>clear()</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel" >
|
<hint type="sourcelabel">
|
||||||
<x>787</x>
|
<x>787</x>
|
||||||
<y>215</y>
|
<y>215</y>
|
||||||
</hint>
|
</hint>
|
||||||
<hint type="destinationlabel" >
|
<hint type="destinationlabel">
|
||||||
<x>755</x>
|
<x>755</x>
|
||||||
<y>213</y>
|
<y>213</y>
|
||||||
</hint>
|
</hint>
|
||||||
|
@ -605,7 +605,7 @@ def config(defaults=None):
|
|||||||
else:
|
else:
|
||||||
c = StringConfig(defaults, desc)
|
c = StringConfig(defaults, desc)
|
||||||
|
|
||||||
c.add_opt('--raise-window', default=False,
|
c.add_opt('raise_window', ['--raise-window'], default=False,
|
||||||
help=_('If specified, viewer window will try to come to the '
|
help=_('If specified, viewer window will try to come to the '
|
||||||
'front when started.'))
|
'front when started.'))
|
||||||
return c
|
return c
|
||||||
|
@ -244,7 +244,10 @@ def do_add(db, paths, one_book_per_directory, recurse, add_duplicates):
|
|||||||
if os.path.isdir(path):
|
if os.path.isdir(path):
|
||||||
dirs.append(path)
|
dirs.append(path)
|
||||||
else:
|
else:
|
||||||
files.append(path)
|
if os.path.exists(path):
|
||||||
|
files.append(path)
|
||||||
|
else:
|
||||||
|
print path, 'not found'
|
||||||
|
|
||||||
formats, metadata = [], []
|
formats, metadata = [], []
|
||||||
for book in files:
|
for book in files:
|
||||||
@ -261,12 +264,14 @@ def do_add(db, paths, one_book_per_directory, recurse, add_duplicates):
|
|||||||
|
|
||||||
formats.append(format)
|
formats.append(format)
|
||||||
metadata.append(mi)
|
metadata.append(mi)
|
||||||
|
|
||||||
file_duplicates = db.add_books(files, formats, metadata, add_duplicates=add_duplicates)
|
file_duplicates = []
|
||||||
if not file_duplicates[0]:
|
if files:
|
||||||
file_duplicates = []
|
file_duplicates = db.add_books(files, formats, metadata,
|
||||||
else:
|
add_duplicates=add_duplicates)
|
||||||
file_duplicates = file_duplicates[0]
|
if file_duplicates:
|
||||||
|
file_duplicates = file_duplicates[0]
|
||||||
|
|
||||||
|
|
||||||
dir_dups = []
|
dir_dups = []
|
||||||
for dir in dirs:
|
for dir in dirs:
|
||||||
@ -286,7 +291,9 @@ def do_add(db, paths, one_book_per_directory, recurse, add_duplicates):
|
|||||||
db.import_book(mi, formats)
|
db.import_book(mi, formats)
|
||||||
else:
|
else:
|
||||||
if dir_dups or file_duplicates:
|
if dir_dups or file_duplicates:
|
||||||
print >>sys.stderr, _('The following books were not added as they already exist in the database (see --duplicates option):')
|
print >>sys.stderr, _('The following books were not added as '
|
||||||
|
'they already exist in the database '
|
||||||
|
'(see --duplicates option):')
|
||||||
for mi, formats in dir_dups:
|
for mi, formats in dir_dups:
|
||||||
title = mi.title
|
title = mi.title
|
||||||
if isinstance(title, unicode):
|
if isinstance(title, unicode):
|
||||||
|
@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en'
|
|||||||
HTTP server for remote access to the calibre database.
|
HTTP server for remote access to the calibre database.
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import sys, textwrap, operator, os, re, logging
|
import sys, textwrap, operator, os, re, logging, subprocess
|
||||||
from itertools import repeat
|
from itertools import repeat
|
||||||
from logging.handlers import RotatingFileHandler
|
from logging.handlers import RotatingFileHandler
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
@ -23,6 +23,8 @@ from calibre.resources import jquery, server_resources, build_time
|
|||||||
from calibre.library import server_config as config
|
from calibre.library import server_config as config
|
||||||
from calibre.library.database2 import LibraryDatabase2, FIELD_MAP
|
from calibre.library.database2 import LibraryDatabase2, FIELD_MAP
|
||||||
from calibre.utils.config import config_dir
|
from calibre.utils.config import config_dir
|
||||||
|
from calibre.utils.mdns import publish as publish_zeroconf, \
|
||||||
|
stop_server as stop_zeroconf
|
||||||
|
|
||||||
build_time = datetime.strptime(build_time, '%d %m %Y %H%M%S')
|
build_time = datetime.strptime(build_time, '%d %m %Y %H%M%S')
|
||||||
server_resources['jquery.js'] = jquery
|
server_resources['jquery.js'] = jquery
|
||||||
@ -171,11 +173,14 @@ class LibraryServer(object):
|
|||||||
try:
|
try:
|
||||||
cherrypy.engine.start()
|
cherrypy.engine.start()
|
||||||
self.is_running = True
|
self.is_running = True
|
||||||
|
publish_zeroconf('Books in calibre', '_stanza._tcp',
|
||||||
|
self.opts.port, {'path':'/stanza'})
|
||||||
cherrypy.engine.block()
|
cherrypy.engine.block()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.exception = e
|
self.exception = e
|
||||||
finally:
|
finally:
|
||||||
self.is_running = False
|
self.is_running = False
|
||||||
|
stop_zeroconf()
|
||||||
|
|
||||||
def exit(self):
|
def exit(self):
|
||||||
cherrypy.engine.exit()
|
cherrypy.engine.exit()
|
||||||
@ -332,7 +337,11 @@ class LibraryServer(object):
|
|||||||
@expose
|
@expose
|
||||||
def index(self, **kwargs):
|
def index(self, **kwargs):
|
||||||
'The / URL'
|
'The / URL'
|
||||||
return self.static('index.html')
|
stanza = cherrypy.request.headers.get('Stanza-Device-Name', 919)
|
||||||
|
if stanza == 919:
|
||||||
|
return self.static('index.html')
|
||||||
|
return self.stanza()
|
||||||
|
|
||||||
|
|
||||||
@expose
|
@expose
|
||||||
def get(self, what, id):
|
def get(self, what, id):
|
||||||
|
@ -123,14 +123,16 @@ turned into a collection on the reader. Note that the PRS-500 does not support c
|
|||||||
How do I use |app| with my iPhone?
|
How do I use |app| with my iPhone?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
First install the Stanza reader on your iPhone from http://www.lexcycle.com . Then,
|
First install the Stanza reader on your iPhone from http://www.lexcycle.com . Then,
|
||||||
* Set the output format for calibre to EPUB (this can be done in the configuration dialog accessed by the little hammer icon next to the search bar)
|
* Set the output format for calibre to EPUB (The output format can be set next to the big red heart)
|
||||||
* Convert the books you want to read on your iPhone to EPUB format by selecting them and clicking the Convert button.
|
* Convert the books you want to read on your iPhone to EPUB format by selecting them and clicking the Convert button.
|
||||||
* Turn on the Content Server in the configurations dialog and leave |app| running.
|
* Turn on the Content Server in |app|'s preferences and leave |app| running.
|
||||||
* In the Stanza reader on your iPhone, add a new catalog. The URL of the catalog is of the form
|
* Now you should be able to access your books on your iPhone. If not, try the following:
|
||||||
|
In the Stanza reader on your iPhone, add a new catalog. The URL of the catalog is of the form
|
||||||
``http://10.34.56.89:8080/stanza``, where you should replace the IP address ``10.34.56.89``
|
``http://10.34.56.89:8080/stanza``, where you should replace the IP address ``10.34.56.89``
|
||||||
with the IP address of your computer. Stanza will the use the |app| content server to access all the
|
with the IP address of your computer. Stanza will the use the |app| content server to access all the
|
||||||
EPUB books in your |app| database.
|
EPUB books in your |app| database.
|
||||||
|
|
||||||
|
|
||||||
Library Management
|
Library Management
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
@ -227,7 +227,8 @@ class WorkerMother(object):
|
|||||||
return env
|
return env
|
||||||
|
|
||||||
def spawn_free_spirit_osx(self, arg, type='free_spirit'):
|
def spawn_free_spirit_osx(self, arg, type='free_spirit'):
|
||||||
script = 'from calibre.parallel import main; main(args=["calibre-parallel", %s]);'%repr(arg)
|
script = ('from calibre.parallel import main; '
|
||||||
|
'main(args=["calibre-parallel", %s]);')%repr(arg)
|
||||||
exe = self.gui_executable if type == 'free_spirit' else self.executable
|
exe = self.gui_executable if type == 'free_spirit' else self.executable
|
||||||
cmdline = [exe, '-c', self.prefix+script]
|
cmdline = [exe, '-c', self.prefix+script]
|
||||||
child = WorkerStatus(subprocess.Popen(cmdline, env=self.get_env()))
|
child = WorkerStatus(subprocess.Popen(cmdline, env=self.get_env()))
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1574
src/calibre/utils/Zeroconf.py
Executable file
1574
src/calibre/utils/Zeroconf.py
Executable file
File diff suppressed because it is too large
Load Diff
97
src/calibre/utils/mdns.py
Normal file
97
src/calibre/utils/mdns.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
from __future__ import with_statement
|
||||||
|
__license__ = 'GPL 3'
|
||||||
|
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
|
||||||
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
|
import socket
|
||||||
|
|
||||||
|
_server = None
|
||||||
|
|
||||||
|
def get_external_ip():
|
||||||
|
'Get IP address of interface used to connect to the outside world'
|
||||||
|
try:
|
||||||
|
ipaddr = socket.gethostbyname(socket.gethostname())
|
||||||
|
except:
|
||||||
|
ipaddr = '127.0.0.1'
|
||||||
|
if ipaddr == '127.0.0.1':
|
||||||
|
try:
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
s.connect(('google.com', 0))
|
||||||
|
ipaddr = s.getsockname()[0]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
return ipaddr
|
||||||
|
|
||||||
|
def start_server():
|
||||||
|
global _server
|
||||||
|
if _server is None:
|
||||||
|
from calibre.utils.Zeroconf import Zeroconf
|
||||||
|
_server = Zeroconf()
|
||||||
|
return _server
|
||||||
|
|
||||||
|
def publish(desc, type, port, properties=None, add_hostname=True):
|
||||||
|
'''
|
||||||
|
Publish a service.
|
||||||
|
|
||||||
|
:param desc: Description of service
|
||||||
|
:param type: Name and type of service. For example _stanza._tcp
|
||||||
|
:param port: Port the service listens on
|
||||||
|
:param properties: An optional dictionary whose keys and values will be put
|
||||||
|
into the TXT record.
|
||||||
|
'''
|
||||||
|
port = int(port)
|
||||||
|
server = start_server()
|
||||||
|
hostname = socket.gethostname()
|
||||||
|
if add_hostname:
|
||||||
|
desc += ' (on %s)'%hostname
|
||||||
|
local_ip = get_external_ip()
|
||||||
|
type = type+'.local.'
|
||||||
|
from calibre.utils.Zeroconf import ServiceInfo
|
||||||
|
service = ServiceInfo(type, desc+'.'+type,
|
||||||
|
address=socket.inet_aton(local_ip),
|
||||||
|
port=port,
|
||||||
|
properties=properties,
|
||||||
|
server=hostname+'.local.')
|
||||||
|
server.registerService(service)
|
||||||
|
|
||||||
|
def stop_server():
|
||||||
|
global _server
|
||||||
|
if _server is not None:
|
||||||
|
_server.close()
|
||||||
|
|
||||||
|
'''
|
||||||
|
class Publish(object):
|
||||||
|
|
||||||
|
def __init__(self, desc, name, port, txt=''):
|
||||||
|
self.desc = desc
|
||||||
|
self.name = name
|
||||||
|
self.port = port
|
||||||
|
self.txt = txt
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
if iswindows:
|
||||||
|
return
|
||||||
|
if isosx:
|
||||||
|
args = ['dns-sd', self.desc, self.name, '.', self.port]
|
||||||
|
else:
|
||||||
|
args = ['avahi-publish-service', self.desc, self.name, self.port]
|
||||||
|
if self.txt:
|
||||||
|
args.append(self.txt)
|
||||||
|
|
||||||
|
self.process = subprocess.Popen(args)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
if iswindows:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
process = getattr(self, 'process', None)
|
||||||
|
if process is not None:
|
||||||
|
process.poll()
|
||||||
|
if process.returncode is not None:
|
||||||
|
process.terminate()
|
||||||
|
process.poll()
|
||||||
|
if process.returncode is not None:
|
||||||
|
process.kill()
|
||||||
|
|
||||||
|
def publish(desc, name, port, txt):
|
||||||
|
'''
|
@ -34,6 +34,7 @@ recipe_modules = ['recipe_' + r for r in (
|
|||||||
'al_jazeera', 'winsupersite', 'borba', 'courrierinternational',
|
'al_jazeera', 'winsupersite', 'borba', 'courrierinternational',
|
||||||
'lamujerdemivida', 'soldiers', 'theonion', 'news_times',
|
'lamujerdemivida', 'soldiers', 'theonion', 'news_times',
|
||||||
'el_universal', 'mediapart', 'wikinews_en', 'ecogeek', 'daily_mail',
|
'el_universal', 'mediapart', 'wikinews_en', 'ecogeek', 'daily_mail',
|
||||||
|
'new_york_review_of_books_no_sub', 'politico',
|
||||||
)]
|
)]
|
||||||
|
|
||||||
import re, imp, inspect, time, os
|
import re, imp, inspect, time, os
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
|
||||||
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
|
'''
|
||||||
|
nybooks.com
|
||||||
|
'''
|
||||||
|
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
from lxml import html
|
||||||
|
from calibre.constants import preferred_encoding
|
||||||
|
|
||||||
|
class NewYorkReviewOfBooks(BasicNewsRecipe):
|
||||||
|
|
||||||
|
title = u'New York Review of Books (no subscription)'
|
||||||
|
description = u'Book reviews'
|
||||||
|
language = _('English')
|
||||||
|
__author__ = 'Kovid Goyal'
|
||||||
|
remove_tags_before = {'id':'container'}
|
||||||
|
remove_tags = [{'class':['noprint', 'ad', 'footer']}, {'id':'right-content'}]
|
||||||
|
|
||||||
|
def parse_index(self):
|
||||||
|
root = html.fromstring(self.browser.open('http://www.nybooks.com/current-issue').read())
|
||||||
|
date = root.xpath('//h4[@class = "date"]')[0]
|
||||||
|
self.timefmt = ' ['+date.text.encode(preferred_encoding)+']'
|
||||||
|
articles = []
|
||||||
|
for tag in date.itersiblings():
|
||||||
|
if tag.tag == 'h4': break
|
||||||
|
if tag.tag == 'p':
|
||||||
|
if tag.get('class') == 'indented':
|
||||||
|
articles[-1]['description'] += html.tostring(tag)
|
||||||
|
else:
|
||||||
|
href = tag.xpath('descendant::a[@href]')[0].get('href')
|
||||||
|
article = {
|
||||||
|
'title': u''.join(tag.xpath('descendant::text()')),
|
||||||
|
'date' : '',
|
||||||
|
'url' : 'http://www.nybooks.com'+href,
|
||||||
|
'description': '',
|
||||||
|
}
|
||||||
|
articles.append(article)
|
||||||
|
|
||||||
|
return [('Current Issue', articles)]
|
||||||
|
|
66
src/calibre/web/feeds/recipes/recipe_politico.py
Normal file
66
src/calibre/web/feeds/recipes/recipe_politico.py
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>'
|
||||||
|
'''
|
||||||
|
politico.com
|
||||||
|
'''
|
||||||
|
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class Politico(BasicNewsRecipe):
|
||||||
|
title = 'Politico'
|
||||||
|
__author__ = 'Darko Miletic'
|
||||||
|
description = 'Political news from USA'
|
||||||
|
publisher = 'Capitol News Company, LLC'
|
||||||
|
category = 'news, politics, USA'
|
||||||
|
oldest_article = 7
|
||||||
|
max_articles_per_feed = 100
|
||||||
|
use_embedded_content = False
|
||||||
|
no_stylesheets = True
|
||||||
|
remove_javascript = True
|
||||||
|
encoding = 'cp1252'
|
||||||
|
language = _('English')
|
||||||
|
|
||||||
|
html2lrf_options = [
|
||||||
|
'--comment', description
|
||||||
|
, '--category', category
|
||||||
|
, '--publisher', publisher
|
||||||
|
, '--ignore-tables'
|
||||||
|
]
|
||||||
|
|
||||||
|
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"\nlinearize_tables=True'
|
||||||
|
|
||||||
|
remove_tags = [dict(name=['notags','embed','object','link','img'])]
|
||||||
|
|
||||||
|
feeds = [
|
||||||
|
(u'Top Stories' , u'http://www.politico.com/rss/politicopicks.xml' )
|
||||||
|
,(u'Congress' , u'http://www.politico.com/rss/congress.xml' )
|
||||||
|
,(u'Ideas' , u'http://www.politico.com/rss/ideas.xml' )
|
||||||
|
,(u'Life' , u'http://www.politico.com/rss/life.xml' )
|
||||||
|
,(u'Lobbyists' , u'http://www.politico.com/rss/lobbyists.xml' )
|
||||||
|
,(u'Pitboss' , u'http://www.politico.com/rss/pitboss.xml' )
|
||||||
|
,(u'Politics' , u'http://www.politico.com/rss/politics.xml' )
|
||||||
|
,(u'Roger Simon' , u'http://www.politico.com/rss/rogersimon.xml' )
|
||||||
|
,(u'Suite Talk' , u'http://www.politico.com/rss/suitetalk.xml' )
|
||||||
|
,(u'Playbook' , u'http://www.politico.com/rss/playbook.xml' )
|
||||||
|
,(u'The Huddle' , u'http://www.politico.com/rss/huddle.xml' )
|
||||||
|
]
|
||||||
|
|
||||||
|
def preprocess_html(self, soup):
|
||||||
|
mtag = '<meta http-equiv="Content-Language" content="en-US"/>'
|
||||||
|
soup.head.insert(0,mtag)
|
||||||
|
for item in soup.findAll(style=True):
|
||||||
|
del item['style']
|
||||||
|
return soup
|
||||||
|
|
||||||
|
def print_url(self, soup, default):
|
||||||
|
printtags = soup.findAll('a',href=True)
|
||||||
|
for printtag in printtags:
|
||||||
|
if printtag.string == "Print":
|
||||||
|
return printtag['href']
|
||||||
|
return default
|
||||||
|
|
||||||
|
def print_version(self, url):
|
||||||
|
soup = self.index_to_soup(url)
|
||||||
|
return self.print_url(soup, None)
|
@ -14,6 +14,7 @@ class Time(BasicNewsRecipe):
|
|||||||
description = 'Weekly magazine'
|
description = 'Weekly magazine'
|
||||||
oldest_article = 7
|
oldest_article = 7
|
||||||
max_articles_per_feed = 100
|
max_articles_per_feed = 100
|
||||||
|
encoding = 'utf-8'
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
language = _('English')
|
language = _('English')
|
||||||
use_embedded_content = False
|
use_embedded_content = False
|
||||||
|
@ -5,3 +5,4 @@
|
|||||||
|
|
||||||
* Use multiprocessing for cpu_count instead of QThread
|
* Use multiprocessing for cpu_count instead of QThread
|
||||||
|
|
||||||
|
* Rationalize books table. Add a pubdate column, remove the uri column (and associated support in add_books) and convert series_index to a float.
|
118
upload.py
118
upload.py
@ -709,65 +709,67 @@ class upload(OptionlessCommand):
|
|||||||
('stage3', None)
|
('stage3', None)
|
||||||
]
|
]
|
||||||
|
|
||||||
class upload_rss(OptionlessCommand):
|
try:
|
||||||
|
class upload_rss(OptionlessCommand):
|
||||||
from bzrlib import log as blog
|
|
||||||
|
from bzrlib import log as blog
|
||||||
class ChangelogFormatter(blog.LogFormatter):
|
|
||||||
supports_tags = True
|
|
||||||
supports_merge_revisions = False
|
|
||||||
|
|
||||||
def __init__(self, num_of_versions=20):
|
|
||||||
from calibre.utils.rss_gen import RSS2
|
|
||||||
self.num_of_versions = num_of_versions
|
|
||||||
self.rss = RSS2(
|
|
||||||
title = 'calibre releases',
|
|
||||||
link = 'http://calibre.kovidgoyal.net/wiki/Changelog',
|
|
||||||
description = 'Latest release of calibre',
|
|
||||||
lastBuildDate = datetime.utcnow()
|
|
||||||
)
|
|
||||||
self.current_entry = None
|
|
||||||
|
|
||||||
def log_revision(self, r):
|
class ChangelogFormatter(blog.LogFormatter):
|
||||||
from calibre.utils.rss_gen import RSSItem, Guid
|
supports_tags = True
|
||||||
if len(self.rss.items) > self.num_of_versions-1:
|
supports_merge_revisions = False
|
||||||
return
|
|
||||||
msg = r.rev.message
|
def __init__(self, num_of_versions=20):
|
||||||
match = re.match(r'version\s+(\d+\.\d+.\d+)', msg)
|
from calibre.utils.rss_gen import RSS2
|
||||||
|
self.num_of_versions = num_of_versions
|
||||||
if match:
|
self.rss = RSS2(
|
||||||
if self.current_entry is not None:
|
title = 'calibre releases',
|
||||||
mkup = '<div><ul>%s</ul></div>'
|
link = 'http://calibre.kovidgoyal.net/wiki/Changelog',
|
||||||
self.current_entry.description = mkup%(''.join(
|
description = 'Latest release of calibre',
|
||||||
self.current_entry.description))
|
lastBuildDate = datetime.utcnow()
|
||||||
|
)
|
||||||
self.rss.items.append(self.current_entry)
|
self.current_entry = None
|
||||||
timestamp = r.rev.timezone + r.rev.timestamp
|
|
||||||
self.current_entry = RSSItem(
|
def log_revision(self, r):
|
||||||
title = 'calibre %s released'%match.group(1),
|
from calibre.utils.rss_gen import RSSItem, Guid
|
||||||
link = 'http://calibre.kovidgoyal.net/download',
|
if len(self.rss.items) > self.num_of_versions-1:
|
||||||
guid = Guid(match.group(), False),
|
return
|
||||||
pubDate = datetime(*time.gmtime(timestamp)[:6]),
|
msg = r.rev.message
|
||||||
description = []
|
match = re.match(r'version\s+(\d+\.\d+.\d+)', msg)
|
||||||
)
|
|
||||||
elif self.current_entry is not None:
|
if match:
|
||||||
if re.search(r'[a-zA-Z]', msg) and len(msg.strip()) > 5:
|
if self.current_entry is not None:
|
||||||
if 'translation' not in msg and not msg.startswith('IGN'):
|
mkup = '<div><ul>%s</ul></div>'
|
||||||
msg = msg.replace('<', '<').replace('>', '>')
|
self.current_entry.description = mkup%(''.join(
|
||||||
msg = re.sub('#(\d+)', r'<a href="http://calibre.kovidgoyal.net/ticket/\1">#\1</a>',
|
self.current_entry.description))
|
||||||
msg)
|
|
||||||
|
|
||||||
self.current_entry.description.append(
|
self.rss.items.append(self.current_entry)
|
||||||
'<li>%s</li>'%msg.strip())
|
timestamp = r.rev.timezone + r.rev.timestamp
|
||||||
|
self.current_entry = RSSItem(
|
||||||
|
title = 'calibre %s released'%match.group(1),
|
||||||
def run(self):
|
link = 'http://calibre.kovidgoyal.net/download',
|
||||||
from bzrlib import log, branch
|
guid = Guid(match.group(), False),
|
||||||
bzr_path = os.path.expanduser('~/work/calibre')
|
pubDate = datetime(*time.gmtime(timestamp)[:6]),
|
||||||
b = branch.Branch.open(bzr_path)
|
description = []
|
||||||
lf = upload_rss.ChangelogFormatter()
|
)
|
||||||
log.show_log(b, lf)
|
elif self.current_entry is not None:
|
||||||
lf.rss.write_xml(open('/tmp/releases.xml', 'wb'))
|
if re.search(r'[a-zA-Z]', msg) and len(msg.strip()) > 5:
|
||||||
subprocess.check_call('scp /tmp/releases.xml divok:/var/www/calibre.kovidgoyal.net/htdocs/downloads'.split())
|
if 'translation' not in msg and not msg.startswith('IGN'):
|
||||||
|
msg = msg.replace('<', '<').replace('>', '>')
|
||||||
|
msg = re.sub('#(\d+)', r'<a href="http://calibre.kovidgoyal.net/ticket/\1">#\1</a>',
|
||||||
|
msg)
|
||||||
|
|
||||||
|
self.current_entry.description.append(
|
||||||
|
'<li>%s</li>'%msg.strip())
|
||||||
|
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
from bzrlib import log, branch
|
||||||
|
bzr_path = os.path.expanduser('~/work/calibre')
|
||||||
|
b = branch.Branch.open(bzr_path)
|
||||||
|
lf = upload_rss.ChangelogFormatter()
|
||||||
|
log.show_log(b, lf)
|
||||||
|
lf.rss.write_xml(open('/tmp/releases.xml', 'wb'))
|
||||||
|
subprocess.check_call('scp /tmp/releases.xml divok:/var/www/calibre.kovidgoyal.net/htdocs/downloads'.split())
|
||||||
|
except ImportError:
|
||||||
|
upload_rss = None
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user