KG revisions

This commit is contained in:
GRiker 2010-06-06 02:58:56 -06:00
commit c5ac3d0348
11 changed files with 294 additions and 242 deletions

View File

@ -17,7 +17,7 @@ class Gizmodo(BasicNewsRecipe):
max_articles_per_feed = 100 max_articles_per_feed = 100
no_stylesheets = True no_stylesheets = True
encoding = 'utf-8' encoding = 'utf-8'
use_embedded_content = True use_embedded_content = False
language = 'en' language = 'en'
masthead_url = 'http://cache.gawkerassets.com/assets/gizmodo.com/img/logo.png' masthead_url = 'http://cache.gawkerassets.com/assets/gizmodo.com/img/logo.png'
extra_css = ' body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif} img{margin-bottom: 1em} ' extra_css = ' body{font-family: "Lucida Grande",Helvetica,Arial,sans-serif} img{margin-bottom: 1em} '
@ -29,9 +29,11 @@ class Gizmodo(BasicNewsRecipe):
, 'language' : language , 'language' : language
} }
remove_attributes = ['width','height'] remove_attributes = ['width','height']
remove_tags = [dict(name='div',attrs={'class':'feedflare'})] keep_only_tags = [dict(attrs={'class':'content permalink'})]
remove_tags_after = dict(name='div',attrs={'class':'feedflare'}) remove_tags_before = dict(name='h1')
remove_tags = [dict(attrs={'class':'contactinfo'})]
remove_tags_after = dict(attrs={'class':'contactinfo'})
feeds = [(u'Articles', u'http://feeds.gawker.com/gizmodo/full')] feeds = [(u'Articles', u'http://feeds.gawker.com/gizmodo/full')]

View File

@ -52,10 +52,12 @@ class Vreme(BasicNewsRecipe):
def parse_index(self): def parse_index(self):
articles = [] articles = []
soup = self.index_to_soup(self.INDEX) soup = self.index_to_soup(self.INDEX)
cover_item = soup.find('div',attrs={'id':'najava'})
if cover_item:
self.cover_url = self.INDEX + cover_item.img['src']
for item in soup.findAll(['h3','h4']): for item in soup.findAll(['h3','h4']):
description = '' description = u''
title_prefix = '' title_prefix = u''
feed_link = item.find('a') feed_link = item.find('a')
if feed_link and feed_link.has_key('href') and feed_link['href'].startswith('/cms/view.php'): if feed_link and feed_link.has_key('href') and feed_link['href'].startswith('/cms/view.php'):
url = self.INDEX + feed_link['href'] url = self.INDEX + feed_link['href']
@ -67,7 +69,7 @@ class Vreme(BasicNewsRecipe):
,'url' :url ,'url' :url
,'description':description ,'description':description
}) })
return [(soup.head.title.string, articles)] return [('Nedeljnik Vreme', articles)]
remove_tags = [ remove_tags = [
dict(name=['object','link']) dict(name=['object','link'])
@ -76,11 +78,3 @@ class Vreme(BasicNewsRecipe):
def print_version(self, url): def print_version(self, url):
return url + '&print=yes' return url + '&print=yes'
def get_cover_url(self):
cover_url = None
soup = self.index_to_soup(self.INDEX)
cover_item = soup.find('div',attrs={'id':'najava'})
if cover_item:
cover_url = self.INDEX + cover_item.img['src']
return cover_url

View File

@ -6,8 +6,7 @@ __docformat__ = 'restructuredtext en'
Device driver for the SONY devices Device driver for the SONY devices
''' '''
import os import os, time, re
import re
from calibre.devices.usbms.driver import USBMS from calibre.devices.usbms.driver import USBMS
from calibre.devices.prs505 import MEDIA_XML from calibre.devices.prs505 import MEDIA_XML
@ -66,6 +65,41 @@ class PRS505(USBMS):
def windows_filter_pnp_id(self, pnp_id): def windows_filter_pnp_id(self, pnp_id):
return '_LAUNCHER' in pnp_id return '_LAUNCHER' in pnp_id
def post_open_callback(self):
def write_cache(prefix):
try:
cachep = os.path.join(prefix, *(CACHE_XML.split('/')))
if not os.path.exists(cachep):
dname = os.path.dirname(cachep)
if not os.path.exists(dname):
try:
os.makedirs(dname, mode=0777)
except:
time.sleep(5)
os.makedirs(dname, mode=0777)
with open(cachep, 'wb') as f:
f.write(u'''<?xml version="1.0" encoding="UTF-8"?>
<cache xmlns="http://www.kinoma.com/FskCache/1">
</cache>
'''.encode('utf8'))
return True
except:
import traceback
traceback.print_exc()
return False
# Make sure we don't have the launcher partition
# as one of the cards
if self._card_a_prefix is not None:
if not write_cache(self._card_a_prefix):
self._card_a_prefix = None
if self._card_b_prefix is not None:
if not write_cache(self._card_b_prefix):
self._card_b_prefix = None
def get_device_information(self, end_session=True): def get_device_information(self, end_session=True):
return (self.gui_name, '', '', '') return (self.gui_name, '', '', '')

View File

@ -415,10 +415,11 @@ class XMLCache(object):
prints('\tmtime', strftime(os.path.getmtime(path))) prints('\tmtime', strftime(os.path.getmtime(path)))
record.set('date', date) record.set('date', date)
record.set('size', str(os.stat(path).st_size)) record.set('size', str(os.stat(path).st_size))
record.set('title', book.title) title = book.title if book.title else _('Unknown')
record.set('title', title)
ts = book.title_sort ts = book.title_sort
if not ts: if not ts:
ts = title_sort(book.title) ts = title_sort(title)
record.set('titleSorter', ts) record.set('titleSorter', ts)
record.set('author', authors_to_string(book.authors)) record.set('author', authors_to_string(book.authors))
ext = os.path.splitext(path)[1] ext = os.path.splitext(path)[1]

View File

@ -226,7 +226,7 @@ class GuiRunner(QObject):
self.splash_pixmap = QPixmap() self.splash_pixmap = QPixmap()
self.splash_pixmap.load(I('library.png')) self.splash_pixmap.load(I('library.png'))
self.splash_screen = QSplashScreen(self.splash_pixmap, self.splash_screen = QSplashScreen(self.splash_pixmap,
Qt.SplashScreen|Qt.WindowStaysOnTopHint) Qt.SplashScreen)
self.splash_screen.showMessage(_('Starting %s: Loading books...') % self.splash_screen.showMessage(_('Starting %s: Loading books...') %
__appname__) __appname__)
self.splash_screen.show() self.splash_screen.show()

View File

@ -28,7 +28,7 @@
<normaloff>:/images/library.png</normaloff>:/images/library.png</iconset> <normaloff>:/images/library.png</normaloff>:/images/library.png</iconset>
</property> </property>
<widget class="QWidget" name="centralwidget"> <widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
@ -305,78 +305,79 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <widget class="Splitter" name="vertical_splitter">
<item> <property name="sizePolicy">
<widget class="Splitter" name="vertical_splitter"> <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<property name="sizePolicy"> <horstretch>0</horstretch>
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <verstretch>100</verstretch>
<horstretch>0</horstretch> </sizepolicy>
<verstretch>100</verstretch> </property>
</sizepolicy> <property name="orientation">
</property> <enum>Qt::Vertical</enum>
<property name="orientation"> </property>
<enum>Qt::Vertical</enum> <widget class="QWidget" name="layoutWidget">
</property> <layout class="QHBoxLayout" name="horizontalLayout">
<widget class="QStackedWidget" name="stack"> <item>
<property name="sizePolicy"> <widget class="QStackedWidget" name="stack">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <property name="sizePolicy">
<horstretch>100</horstretch> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<verstretch>100</verstretch> <horstretch>100</horstretch>
</sizepolicy> <verstretch>100</verstretch>
</property> </sizepolicy>
<property name="currentIndex"> </property>
<number>0</number> <property name="currentIndex">
</property> <number>0</number>
<widget class="QWidget" name="library"> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <widget class="QWidget" name="library">
<item> <layout class="QHBoxLayout" name="horizontalLayout_2">
<widget class="Splitter" name="horizontal_splitter"> <item>
<property name="orientation"> <widget class="Splitter" name="horizontal_splitter">
<enum>Qt::Horizontal</enum> <property name="orientation">
</property> <enum>Qt::Horizontal</enum>
<widget class="QWidget" name="layoutWidget"> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <widget class="QWidget" name="layoutWidget">
<item> <layout class="QVBoxLayout" name="verticalLayout">
<widget class="TagsView" name="tags_view"> <item>
<property name="tabKeyNavigation"> <widget class="TagsView" name="tags_view">
<bool>true</bool> <property name="tabKeyNavigation">
</property> <bool>true</bool>
<property name="alternatingRowColors"> </property>
<bool>true</bool> <property name="alternatingRowColors">
</property> <bool>true</bool>
<property name="animated"> </property>
<bool>true</bool> <property name="animated">
</property> <bool>true</bool>
<property name="headerHidden"> </property>
<bool>true</bool> <property name="headerHidden">
</property> <bool>true</bool>
</widget> </property>
</item> </widget>
<item> </item>
<item>
<widget class="QCheckBox" name="popularity"> <widget class="QCheckBox" name="popularity">
<property name="text"> <property name="text">
<string>Sort by &amp;popularity</string> <string>Sort by &amp;popularity</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QComboBox" name="tag_match"> <widget class="QComboBox" name="tag_match">
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>0</number>
</property>
<item>
<property name="text">
<string>Match any</string>
</property> </property>
</item> <item>
<item> <property name="text">
<property name="text"> <string>Match any</string>
<string>Match all</string> </property>
</property> </item>
</item> <item>
</widget> <property name="text">
</item> <string>Match all</string>
<item> </property>
</item>
</widget>
</item>
<item>
<widget class="QPushButton" name="edit_categories"> <widget class="QPushButton" name="edit_categories">
<property name="toolTip"> <property name="toolTip">
<string>Create, edit, and delete user categories</string> <string>Create, edit, and delete user categories</string>
@ -385,10 +386,49 @@
<string>Manage &amp;user categories</string> <string>Manage &amp;user categories</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget>
<widget class="BooksView" name="library_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>100</horstretch>
<verstretch>10</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragDrop</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</widget> </widget>
<widget class="BooksView" name="library_view"> </item>
</layout>
</widget>
<widget class="QWidget" name="main_memory">
<layout class="QGridLayout">
<item row="0" column="0">
<widget class="DeviceBooksView" name="memory_view">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>100</horstretch> <horstretch>100</horstretch>
@ -420,139 +460,107 @@
<bool>false</bool> <bool>false</bool>
</property> </property>
</widget> </widget>
</widget> </item>
</item> </layout>
</layout> </widget>
<widget class="QWidget" name="card_a_memory">
<layout class="QGridLayout">
<item row="0" column="0">
<widget class="DeviceBooksView" name="card_a_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>10</horstretch>
<verstretch>10</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragDrop</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="card_b_memory">
<layout class="QGridLayout">
<item row="0" column="0">
<widget class="DeviceBooksView" name="card_b_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>10</horstretch>
<verstretch>10</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragDrop</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
<widget class="QWidget" name="main_memory"> </item>
<layout class="QGridLayout"> <item>
<item row="0" column="0"> <widget class="SideBar" name="sidebar" native="true">
<widget class="DeviceBooksView" name="memory_view"> <property name="sizePolicy">
<property name="sizePolicy"> <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <horstretch>0</horstretch>
<horstretch>100</horstretch> <verstretch>0</verstretch>
<verstretch>10</verstretch> </sizepolicy>
</sizepolicy> </property>
</property> <property name="minimumSize">
<property name="acceptDrops"> <size>
<bool>true</bool> <width>30</width>
</property> <height>0</height>
<property name="dragEnabled"> </size>
<bool>true</bool> </property>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragDrop</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget> </widget>
<widget class="QWidget" name="card_a_memory"> </item>
<layout class="QGridLayout"> </layout>
<item row="0" column="0"> </widget>
<widget class="DeviceBooksView" name="card_a_view"> <widget class="StatusBar" name="status_bar" native="true"/>
<property name="sizePolicy"> </widget>
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>10</horstretch>
<verstretch>10</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragDrop</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="card_b_memory">
<layout class="QGridLayout">
<item row="0" column="0">
<widget class="DeviceBooksView" name="card_b_view">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>10</horstretch>
<verstretch>10</verstretch>
</sizepolicy>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragEnabled">
<bool>true</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DragDrop</enum>
</property>
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="StatusBar" name="status_bar" native="true"/>
</widget>
</item>
<item>
<widget class="SideBar" name="sidebar" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@ -9,12 +9,6 @@ The database used to store ebook metadata
import os, sys, shutil, cStringIO, glob,functools, traceback import os, sys, shutil, cStringIO, glob,functools, traceback
from itertools import repeat from itertools import repeat
from math import floor from math import floor
try:
from PIL import Image as PILImage
PILImage
except ImportError:
import Image as PILImage
from PyQt4.QtGui import QImage from PyQt4.QtGui import QImage
@ -37,7 +31,7 @@ from calibre.utils.date import utcnow, now as nowf, utcfromtimestamp
from calibre.utils.config import prefs from calibre.utils.config import prefs
from calibre.utils.search_query_parser import saved_searches from calibre.utils.search_query_parser import saved_searches
from calibre.ebooks import BOOK_EXTENSIONS, check_ebook_format from calibre.ebooks import BOOK_EXTENSIONS, check_ebook_format
from calibre.utils.magick_draw import save_cover_data_to
if iswindows: if iswindows:
import calibre.utils.winshell as winshell import calibre.utils.winshell as winshell
@ -475,11 +469,9 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
if callable(getattr(data, 'save', None)): if callable(getattr(data, 'save', None)):
data.save(path) data.save(path)
else: else:
f = data if callable(getattr(data, 'read', None)):
if not callable(getattr(data, 'read', None)): data = data.read()
f = cStringIO.StringIO(data) save_cover_data_to(data, path)
im = PILImage.open(f)
im.convert('RGB').save(path, 'JPEG')
def book_on_device(self, id): def book_on_device(self, id):
if callable(self.book_on_device_func): if callable(self.book_on_device_func):

View File

@ -127,10 +127,7 @@ class ContentServer(object):
cherrypy.log('User agent: '+ua) cherrypy.log('User agent: '+ua)
if want_opds: if want_opds:
return self.stanza(search=kwargs.get('search', None), sortby=kwargs.get('sortby',None), authorid=kwargs.get('authorid',None), return self.opds(version=0)
tagid=kwargs.get('tagid',None),
seriesid=kwargs.get('seriesid',None),
offset=kwargs.get('offset', 0))
if want_mobile: if want_mobile:
return self.mobile() return self.mobile()

View File

@ -157,7 +157,9 @@ If you get timeout errors while browsing the calibre catalog in Stanza, try incr
Alternative for the iPad Alternative for the iPad
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
As of |app| version 0.7.0, on windows and OS X you can plugin your iPad into the computer using its charging cable, and |app| will detect it and show you a list of books on the iPad. You can then use the Send to device button to send books directly to iBooks on the iPad. As of |app| version 0.7.0, you can plugin your iPad into the computer using its charging cable, and |app| will detect it and show you a list of books on the iPad. You can then use the Send to device button to send books directly to iBooks on the iPad.
This method only works on Windows XP and higher and OS X 10.5 and higher. Linux is not supported (iTunes is not available in linux) and OS X 10.4 is not supported.
How do I use |app| with my Android phone? How do I use |app| with my Android phone?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -212,6 +212,23 @@ def create_cover_page(top_lines, logo_path, width=590, height=750,
p.DestroyMagickWand(canvas) p.DestroyMagickWand(canvas)
return ans return ans
def save_cover_data_to(data, path, bgcolor='white'):
'''
Saves image in data to path, in the format specified by the path
extension. Composes the image onto a blank cancas so as to
properly convert transparent images.
'''
with open(path, 'wb') as f:
f.write(data)
with p.ImageMagick():
img = load_image(path)
canvas = create_canvas(p.MagickGetImageWidth(img),
p.MagickGetImageHeight(img), bgcolor)
compose_image(canvas, img, 0, 0)
p.MagickWriteImage(canvas, path)
p.DestroyMagickWand(img)
p.DestroyMagickWand(canvas)
def test(): def test():
import subprocess import subprocess
with TemporaryFile('.png') as f: with TemporaryFile('.png') as f:

View File

@ -11,7 +11,7 @@ from lxml import html
from calibre.web.feeds.feedparser import parse from calibre.web.feeds.feedparser import parse
from calibre.utils.logging import default_log from calibre.utils.logging import default_log
from calibre import entity_to_unicode from calibre import entity_to_unicode, strftime
from calibre.utils.date import dt_factory, utcnow, local_tz from calibre.utils.date import dt_factory, utcnow, local_tz
class Article(object): class Article(object):
@ -53,12 +53,17 @@ class Article(object):
@dynamic_property @dynamic_property
def formatted_date(self): def formatted_date(self):
def fget(self): def fget(self):
if self._formatted_date is None: if self._formatted_date is None:
self._formatted_date = self.localtime.strftime(" [%a, %d %b %H:%M]") self._formatted_date = strftime(" [%a, %d %b %H:%M]",
t=self.localtime.timetuple())
return self._formatted_date return self._formatted_date
def fset(self, val): def fset(self, val):
self._formatted_date = val if isinstance(val, unicode):
self._formatted_date = val
return property(fget=fget, fset=fset) return property(fget=fget, fset=fset)
@dynamic_property @dynamic_property