mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-11 09:13:57 -04:00
Merge from trunk
This commit is contained in:
commit
ad9ab338e1
@ -19,6 +19,62 @@
|
|||||||
# new recipes:
|
# new recipes:
|
||||||
# - title:
|
# - title:
|
||||||
|
|
||||||
|
- version: 0.8.70
|
||||||
|
date: 2012-09-21
|
||||||
|
|
||||||
|
new features:
|
||||||
|
- title: "Support for connecting MTP (non disk based) devices via USB, such as the Nexus 7 and the Kindle Fire HD (Windows Vista and newer and Linux only)"
|
||||||
|
type: major
|
||||||
|
description: "calibre can now detect and connect to devices that do not present themselves as USB disks to the operating system. Newer Android devices all use the 'MTP' protocol when connected via USB. calibre now supports devices using this protocol on both Windows (Vista and newer) and Linux."
|
||||||
|
|
||||||
|
- title: "Calibre Portable: Create a new installer that does not require manually unzipping the Calibre Portable folder. Instead just run the installer and point it to the location you want to install to."
|
||||||
|
|
||||||
|
- title: "Calibre Portable: Add support for multiple libraries created inside the 'Calibre Portable' folder."
|
||||||
|
|
||||||
|
- title: "In the main book list when editing a blank published date, use a default value of Jan 2000 so that changing the date it easier"
|
||||||
|
|
||||||
|
- title: "Template language: Add function approximate_formats() to get list of formats saved in the db for a book as opposed to the formats that actually exist on disk"
|
||||||
|
|
||||||
|
- title: "Template language: Add a couple of new functions to get the path to individual book formats and the calibre library as a whole"
|
||||||
|
|
||||||
|
- title: "Drivers for HTC Flyer and Trekstor 4ink"
|
||||||
|
|
||||||
|
bug fixes:
|
||||||
|
- title: "Conversion: Do not error out when tags have unparseable color attributes."
|
||||||
|
tickets: [1053583]
|
||||||
|
|
||||||
|
- title: "AZW3 Output: Do not error out if the input document contains embedded fonts of less than 1040 bytes."
|
||||||
|
tickets: [1052892]
|
||||||
|
|
||||||
|
- title: "Catalogs: Fix AZW3 output not properly indexed"
|
||||||
|
|
||||||
|
- title: "Get Books: Remove Beam Books due to lack of response to issues with the store."
|
||||||
|
|
||||||
|
- title: "Windows: Ignore drives A: and B: when scanning for the drives belonging to a device"
|
||||||
|
|
||||||
|
- title: "Kindle driver: Fix generation of apnx files for newer kindle firmware."
|
||||||
|
|
||||||
|
- title: "News download: If the output format is set to azw3, generate periodicals in mobi format as amazon does not support azw3 periodicals."
|
||||||
|
|
||||||
|
improved recipes:
|
||||||
|
- Indian Express
|
||||||
|
- Anadtech
|
||||||
|
- London Review of Books (subscrption version)
|
||||||
|
- Livemint
|
||||||
|
- xkcd
|
||||||
|
- Doghouse Diaries
|
||||||
|
|
||||||
|
new recipes:
|
||||||
|
- title: Various Hungarian recipes
|
||||||
|
author: laca
|
||||||
|
|
||||||
|
- title: NSFW Corp
|
||||||
|
author: Darko Miletic.
|
||||||
|
|
||||||
|
- title: FC Knudde and Stamgasten
|
||||||
|
author: drMerry
|
||||||
|
|
||||||
|
|
||||||
- version: 0.8.69
|
- version: 0.8.69
|
||||||
date: 2012-09-14
|
date: 2012-09-14
|
||||||
|
|
||||||
|
@ -126,9 +126,11 @@ Device Integration
|
|||||||
|
|
||||||
What devices does |app| support?
|
What devices does |app| support?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
At the moment |app| has full support for the SONY PRS line, Barnes & Noble Nook line, Cybook Gen 3/Opus, Amazon Kindle line, Entourage Edge, Longshine ShineBook, Ectaco Jetbook, BeBook/BeBook Mini, Irex Illiad/DR1000, Foxit eSlick, PocketBook line, Italica, eClicto, Iriver Story, Airis dBook, Hanvon N515, Binatone Readme, Teclast K3 and clones, SpringDesign Alex, Kobo Reader, various Android phones and the iPhone/iPad. In addition, using the :guilabel:`Connect to folder` function you can use it with any ebook reader that exports itself as a USB disk.
|
|app| can directly connect to all the major (and most of the minor) ebook reading devices,
|
||||||
|
smarthphones, tablets, etc.
|
||||||
There is also a special ``User Defined`` device plugin that can be used to connect to arbitrary devices that present their memory as disk drives. See the device plugin ``Preferences -> Plugins -> Device Plugins -> User Defined`` and ``Preferences -> Miscelleaneous -> Get information to setup the user defined device`` for more information.
|
In addition, using the :guilabel:`Connect to folder` function you can use it with any ebook reader that exports itself as a USB disk.
|
||||||
|
You can even connect to Apple devices (via iTunes), using the :guilabel:`Connect to iTunes`
|
||||||
|
function.
|
||||||
|
|
||||||
.. _devsupport:
|
.. _devsupport:
|
||||||
|
|
||||||
@ -159,8 +161,8 @@ Follow these steps to find the problem:
|
|||||||
* Make sure that you are connecting only a single device to your computer at a time. Do not have another |app| supported device like an iPhone/iPad etc. at the same time.
|
* Make sure that you are connecting only a single device to your computer at a time. Do not have another |app| supported device like an iPhone/iPad etc. at the same time.
|
||||||
* If you are connecting an Apple iDevice (iPad, iPod Touch, iPhone), use the 'Connect to iTunes' method in the 'Getting started' instructions in `Calibre + Apple iDevices: Start here <http://www.mobileread.com/forums/showthread.php?t=118559>`_.
|
* If you are connecting an Apple iDevice (iPad, iPod Touch, iPhone), use the 'Connect to iTunes' method in the 'Getting started' instructions in `Calibre + Apple iDevices: Start here <http://www.mobileread.com/forums/showthread.php?t=118559>`_.
|
||||||
* Make sure you are running the latest version of |app|. The latest version can always be downloaded from `the calibre website <http://calibre-ebook.com/download>`_.
|
* Make sure you are running the latest version of |app|. The latest version can always be downloaded from `the calibre website <http://calibre-ebook.com/download>`_.
|
||||||
* Ensure your operating system is seeing the device. That is, the device should be mounted as a disk, that you can access using Windows explorer or whatever the file management program on your computer is. On Windows your device **must have been assigned a drive letter**, like K:.
|
* Ensure your operating system is seeing the device. That is, the device should show up in Windows Explorer (in Windows) or Finder (in OS X).
|
||||||
* In calibre, go to Preferences->Plugins->Device Interface plugin and make sure the plugin for your device is enabled, the plugin icon next to it should be green when it is enabled.
|
* In |app|, go to Preferences->Plugins->Device Interface plugin and make sure the plugin for your device is enabled, the plugin icon next to it should be green when it is enabled.
|
||||||
* If all the above steps fail, go to Preferences->Miscellaneous and click debug device detection with your device attached and post the output as a ticket on `the calibre bug tracker <http://bugs.calibre-ebook.com>`_.
|
* If all the above steps fail, go to Preferences->Miscellaneous and click debug device detection with your device attached and post the output as a ticket on `the calibre bug tracker <http://bugs.calibre-ebook.com>`_.
|
||||||
|
|
||||||
My device is non-standard or unusual. What can I do to connect to it?
|
My device is non-standard or unusual. What can I do to connect to it?
|
||||||
@ -285,20 +287,47 @@ This method only works on Windows XP and higher, and OS X 10.5 and higher. Linux
|
|||||||
How do I use |app| with my Android phone/tablet?
|
How do I use |app| with my Android phone/tablet?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
There are two ways that you can connect your Android device to calibre. Using a USB cable-- or wirelessly, over the air.
|
There are two ways that you can connect your Android device to calibre. Using a USB cable -- or wirelessly, over the air.
|
||||||
**The USB cable method only works if your Android device can act as a USB disk, that means in windows it must have a drive letter, like K:**. Some devices may have a setting to put them in "disk mode" or "USB Transfer mode" that is needed before they act as USB disks.
|
The first step to using an Android device is installing an ebook reading
|
||||||
|
application on it. There are many free and paid ebook reading applications for
|
||||||
|
Android: Some examples (in no particular order):
|
||||||
|
`FBReader <https://play.google.com/store/apps/details?id=org.geometerplus.zlibrary.ui.android&hl=en>`_,
|
||||||
|
`Moon+ <https://play.google.com/store/apps/details?id=com.flyersoft.moonreader&hl=en>`_,
|
||||||
|
`Mantano <https://play.google.com/store/apps/details?id=com.mantano.reader.android.lite&hl=en>`_,
|
||||||
|
`Aldiko <https://play.google.com/store/apps/details?id=com.aldiko.android&hl=en>`_,
|
||||||
|
`Kindle <https://play.google.com/store/apps/details?id=com.amazon.kindle&feature=related_apps>`_.
|
||||||
|
|
||||||
Using a USB cable
|
Using a USB cable
|
||||||
^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
First install either the WordPlayer or Aldiko ebook reading apps from the Android Marketplace onto your phone. Then simply plug your phone into the computer with a USB cable. |app| should automatically detect the phone and then you can transfer books to it by clicking the Send to Device button. |app| does not have support for every single android device out there, so if your device is not automatically detected, follow the instructions at :ref:`devsupport` to get your device supported in |app|.
|
Simply plug your device into the computer with a USB cable. |app| should
|
||||||
|
automatically detect the device and then you can transfer books to it by
|
||||||
|
clicking the Send to Device button. |app| does not have support for every
|
||||||
|
single android device out there, so if your device is not automatically
|
||||||
|
detected, follow the instructions at :ref:`devsupport` to get your device
|
||||||
|
supported in |app|.
|
||||||
|
|
||||||
|
.. note:: With newer Android devices, the USB connection is only supported on
|
||||||
|
Windows Vista and newer and Linux. If you are on Windows XP or OS X,
|
||||||
|
you should use one of the wireless connection methods.
|
||||||
|
|
||||||
Over the air
|
Over the air
|
||||||
^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
The easiest way to browse your |app| collection on your Android device is by using the calibre content server, which makes your collection available over the net. First perform the following steps in |app|
|
The easiest way to transfer books wirelessly to your Android device is to use
|
||||||
|
the `Calibre Companion <http://www.multipie.co.uk/calibre-companion/>`_
|
||||||
|
Android app. This app is maintained by a core calibre developer and allows
|
||||||
|
|app| to connect to your Android device wirelessly, just as though you
|
||||||
|
plugged in the device with a USB cable. You can browse files on the device
|
||||||
|
in |app| and use the :guilabel:`Send to device` button to transfer files to
|
||||||
|
your device wirelessly.
|
||||||
|
|
||||||
* Set the Preferred Output Format in |app| to EPUB (The output format can be set under :guilabel:`Preferences->Interface->Behavior`)
|
|app| also has a builtin web server, the :guilabel:`Content Server`.
|
||||||
|
You can browse your |app| collection on your Android device is by using the
|
||||||
|
calibre content server, which makes your collection available over the net.
|
||||||
|
First perform the following steps in |app|
|
||||||
|
|
||||||
|
* Set the :guilabel:`Preferred Output Format` in |app| to EPUB (The output format can be set under :guilabel:`Preferences->Interface->Behavior`)
|
||||||
* Set the output profile to Tablet (this will work for phones as well), under :guilabel:`Preferences->Conversion->Common Options->Page Setup`
|
* Set the output profile to Tablet (this will work for phones as well), under :guilabel:`Preferences->Conversion->Common Options->Page Setup`
|
||||||
* Convert the books you want to read on your device to EPUB format by selecting them and clicking the Convert button.
|
* Convert the books you want to read on your device to EPUB format by selecting them and clicking the Convert button.
|
||||||
* Turn on the Content Server in |app|'s preferences and leave |app| running.
|
* Turn on the Content Server in |app|'s preferences and leave |app| running.
|
||||||
@ -307,11 +336,22 @@ Now on your Android device, open the browser and browse to
|
|||||||
|
|
||||||
http://192.168.1.2:8080/
|
http://192.168.1.2:8080/
|
||||||
|
|
||||||
Replace ``192.168.1.2`` with the local IP address of the computer running |app|. If your local network supports the use of computer names, you can replace the IP address with the network name of the computer. If you have changed the port the |app| content server is running on, you will have to change ``8080`` as well to the new port.
|
Replace ``192.168.1.2`` with the local IP address of the computer running
|
||||||
|
|app|. If your local network supports the use of computer names, you can
|
||||||
|
replace the IP address with the network name of the computer. If you have
|
||||||
|
changed the port the |app| content server is running on, you will have to
|
||||||
|
change ``8080`` as well to the new port.
|
||||||
|
|
||||||
The local IP address is the IP address you computer is assigned on your home network. A quick Google search will tell you how to find out your local IP address. You can now browse your book collection and download books from |app| to your device to open with whatever ebook reading software you have on your android device.
|
The local IP address is the IP address you computer is assigned on your home
|
||||||
|
network. A quick Google search will tell you how to find out your local IP
|
||||||
|
address. You can now browse your book collection and download books from |app|
|
||||||
|
to your device to open with whatever ebook reading software you have on your
|
||||||
|
android device.
|
||||||
|
|
||||||
Some reading programs support browsing the Calibre library directly. For example, in Aldiko, click My Catalogs, then + to add a catalog, then give the catalog a title such as "Calibre" and provide the URL listed above. You can now browse the Calibre library and download directly into the reading software.
|
Some reading programs support browsing the Calibre library directly. For
|
||||||
|
example, in Aldiko, click My Catalogs, then + to add a catalog, then give the
|
||||||
|
catalog a title such as "Calibre" and provide the URL listed above. You can now
|
||||||
|
browse the Calibre library and download directly into the reading software.
|
||||||
|
|
||||||
Can I access my |app| books using the web browser in my Kindle or other reading device?
|
Can I access my |app| books using the web browser in my Kindle or other reading device?
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
@ -12,25 +12,26 @@ class anan(BasicNewsRecipe):
|
|||||||
|
|
||||||
title = 'Anandtech'
|
title = 'Anandtech'
|
||||||
description = 'comprehensive Hardware Tests'
|
description = 'comprehensive Hardware Tests'
|
||||||
__author__ = 'Oliver Niesner'
|
__author__ = 'Oliver Niesner' # 2012-09-20 AGE: update
|
||||||
use_embedded_content = False
|
use_embedded_content = False
|
||||||
language = 'en'
|
language = 'en'
|
||||||
timefmt = ' [%d %b %Y]'
|
timefmt = ' [%d %b %Y]'
|
||||||
|
oldest_article = 7 # 2012-09-20 AGE: update
|
||||||
max_articles_per_feed = 40
|
max_articles_per_feed = 40
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
remove_javascript = True
|
remove_javascript = True
|
||||||
encoding = 'utf-8'
|
encoding = 'utf-8'
|
||||||
|
|
||||||
remove_tags=[
|
cover_url = 'http://www.anandtech.com/content/images/globals/header_logo.png' # 2012-09-20 AGE: new
|
||||||
dict(name='a', attrs={'style':'width:110px; margin-top:0px;text-align:center;'}),
|
masthead_url = 'http://www.anandtech.com/content/images/globals/printheader.png' # 2012-09-20 AGE: update
|
||||||
dict(name='a', attrs={'style':'width:110px; margin-top:0px; margin-right:20px;text-align:center;'}),
|
|
||||||
{'attrs':{'class':['article_links', 'header', 'body_right']}},
|
|
||||||
{'id':['crumbs']},
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
|
remove_tags=[
|
||||||
|
dict(name='a', attrs={'class': 'bluebutton noprint'}),
|
||||||
|
dict(name='img', attrs={'alt': 'header'}),
|
||||||
|
] # 2012-09-20 AGE: update
|
||||||
|
|
||||||
feeds = [ ('Anandtech', 'http://www.anandtech.com/rss/')]
|
feeds = [ ('Anandtech', 'http://www.anandtech.com/rss/')]
|
||||||
|
|
||||||
def print_version(self,url):
|
def print_version(self,url):
|
||||||
return url.replace('/show/', '/print/')
|
return url.replace('0Cshow0C', '0Cprint0C') # 2012-09-20 AGE: update
|
||||||
|
|
||||||
|
|
@ -1,21 +1,24 @@
|
|||||||
|
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
||||||
from calibre.web.feeds.news import BasicNewsRecipe
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
class AdvancedUserRecipe1348151548(BasicNewsRecipe):
|
||||||
class Index(BasicNewsRecipe):
|
title = u'Index.hu'
|
||||||
|
__author__ = 'laca'
|
||||||
title = u'INDEX.HU'
|
oldest_article = 2
|
||||||
oldest_article = 3
|
|
||||||
max_articles_per_feed = 50
|
|
||||||
language = 'hu'
|
language = 'hu'
|
||||||
|
masthead_url = 'http://index.hu/assets/images/index_logo.gif'
|
||||||
|
auto_cleanup = True
|
||||||
|
|
||||||
__author__ = 'Ezmegaz'
|
simultaneous_downloads= 1
|
||||||
|
max_articles_per_feed = 50
|
||||||
feeds = [(u'ALL', u'http://index.hu/24ora/rss/'),
|
|
||||||
(u'BELF\xd6LD', u'http://index.hu/belfold/rss/default/'),
|
|
||||||
(u'K\xdcLF\xd6LD', u'http://index.hu/kulfold/rss/default/'),
|
|
||||||
(u'BULV\xc1R', u'http://index.hu/bulvar/rss/default/'),
|
|
||||||
(u'GAZDAS\xc1G', u'http://index.hu/gazdasag/rss/default/'),
|
|
||||||
(u'TECH', u'http://index.hu/tech/rss/main/'),
|
|
||||||
(u'KULT\xdaRA', u'http://index.hu/kultur/rss/main/'),
|
|
||||||
(u'TUDOM\xc1NY', u'http://index.hu/tudomany/rss/main/'),
|
|
||||||
(u'V\xc9LEM\xc9NY', u'http://index.hu/velemeny/rss/default/')]
|
|
||||||
|
|
||||||
|
feeds = [(u'Belföld', u'http://index.hu/belfold/rss/'),
|
||||||
|
(u'Külföld', u'http://index.hu/kulfold/rss/'),
|
||||||
|
(u'Gazdaság', u'http://index.hu/gazdasag/rss/'),
|
||||||
|
(u'Tech', u'http://index.hu/tech/rss/'),
|
||||||
|
(u'Tudomány', u'http://index.hu/tudomany/rss/'),
|
||||||
|
(u'Kultúr', u'http://index.hu/kultur/rss/'),
|
||||||
|
(u'Sport Géza', u'http://sportgeza.hu/24ora/rss/'),
|
||||||
|
(u'Vélemény', u'http://index.hu/velemeny/rss/'),
|
||||||
|
(u'Velvet', u'http://velvet.hu/24ora/rss/'),
|
||||||
|
(u'Totalcar', u'http://totalcar.hu/24ora/rss/'),
|
||||||
|
(u'Dívány', u'http://divany.hu/24ora/rss/')]
|
||||||
|
@ -13,9 +13,13 @@ class IndianExpress(BasicNewsRecipe):
|
|||||||
#remove_tags_after = dict(name='td', attrs={'class':'newptool1'})
|
#remove_tags_after = dict(name='td', attrs={'class':'newptool1'})
|
||||||
remove_tags = [
|
remove_tags = [
|
||||||
dict(name='iframe'),
|
dict(name='iframe'),
|
||||||
dict(name='div', attrs={'class':['bookmarks_div', 'comment_box', 'bookmarks_div_bot', 'box']}),
|
dict(name='div', attrs={'class':['pagination_new', 'comments_desc',
|
||||||
dict(name='div', attrs={'id':['footer', 'tab_innerhc', 'discussion', 'google_new']}),
|
'commenttext', 'postcomm', 'content_right', 'bookmarks_div',
|
||||||
|
'comment_box', 'bookmarks_div_bot', 'box']}),
|
||||||
|
dict(name='div', attrs={'id':['footer', 'tab_innerhc', 'discussion',
|
||||||
|
'google_new', 'header_new', 'slidebox']}),
|
||||||
dict(name='a', attrs={'class':'nobdr'}),
|
dict(name='a', attrs={'class':'nobdr'}),
|
||||||
|
dict(name='h3', attrs={'class':['readcomm']}),
|
||||||
#dict(name='span', text=':'),
|
#dict(name='span', text=':'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
29
recipes/origo_hu.recipe
Normal file
29
recipes/origo_hu.recipe
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
class AdvancedUserRecipe1348136299(BasicNewsRecipe):
|
||||||
|
title = u'[origo]'
|
||||||
|
oldest_article = 2
|
||||||
|
language = 'hu'
|
||||||
|
auto_cleanup = True
|
||||||
|
|
||||||
|
__author__ = 'laca'
|
||||||
|
simultaneous_downloads= 1
|
||||||
|
max_articles_per_feed = 50
|
||||||
|
|
||||||
|
feeds = [(u'Itthon', u'http://origo.hu/contentpartner/rss/itthon/origo.xml'),
|
||||||
|
(u'Nagyvilág', u'http://origo.hu/contentpartner/rss/nagyvilag/origo.xml'),
|
||||||
|
(u'Gazdaság', u'http://origo.hu/contentpartner/rss/uzletinegyed/origo.xml'),
|
||||||
|
(u'Egészség', u'http://static2.origos.hu/contentpartner/rss/egeszseg/origo.xml'),
|
||||||
|
(u'Tudomány', u'http://origo.hu/contentpartner/rss/tudomany/origo.xml'),
|
||||||
|
(u'Techbázis', u'http://origo.hu/contentpartner/rss/techbazis/origo.xml'),
|
||||||
|
(u'Szoftverbázis', u'http://www.szoftverbazis.hu/rss/index.xml'),
|
||||||
|
(u'Sport', u'http://origo.hu/contentpartner/rss/sport/origo.xml'),
|
||||||
|
(u'Szórakozás', u'http://origo.hu/contentpartner/rss/szorakozas/origo.xml'),
|
||||||
|
(u'Időjárás', u'http://static1.origos.hu/contentpartner/rss/idojaras/origo.xml'),
|
||||||
|
(u'Filmklub', u'http://origo.hu/contentpartner/rss/filmklub/origo.xml'),
|
||||||
|
(u'Utazás', u'http://origo.hu/contentpartner/rss/utazas/origo.xml'),
|
||||||
|
(u'Autó', u'http://origo.hu/contentpartner/rss/auto/origo.xml'),
|
||||||
|
(u'Komment.hu', u'http://static5.origos.hu/contentpartner/rss/velemeny/origo.xml'),
|
||||||
|
(u'365.hu', u'http://origo.hu/contentpartner/rss/365/origo.xml'),
|
||||||
|
(u'Quart', u'http://www.quart.hu/contentpartner/rss/quart/origo.xml'),
|
||||||
|
(u'Forma-1', u'http://www.f1hirek.hu/contentpartner/rss/f1hirek/f1hirek.xml')]
|
23
recipes/portfolio_hu_hu.recipe
Normal file
23
recipes/portfolio_hu_hu.recipe
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
|
||||||
|
|
||||||
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
|
class AdvancedUserRecipe1348146838(BasicNewsRecipe):
|
||||||
|
title = u'Portfolio.hu'
|
||||||
|
__author__ = 'laca'
|
||||||
|
oldest_article = 2
|
||||||
|
language = 'hu'
|
||||||
|
masthead_url = 'http://www.portfolio.hu/img/logo2010.gif'
|
||||||
|
auto_cleanup = True
|
||||||
|
|
||||||
|
author = 'laca'
|
||||||
|
simultaneous_downloads= 1
|
||||||
|
max_articles_per_feed = 50
|
||||||
|
|
||||||
|
feeds = [(u'Makrogazdaság', u'http://www.portfolio.hu/rss/cikkek/makrogazdasag.xml'),
|
||||||
|
(u'Vállalatok', u'http://www.portfolio.hu/rss/cikkek/vallalatok.xml'),
|
||||||
|
(u'Tőzsdei hírek', u'http://www.portfolio.hu/rss/cikkek/tozsde.xml'),
|
||||||
|
(u'Deviza/kötvény', u'http://www.portfolio.hu/rss/cikkek/penzkotveny.xml'),
|
||||||
|
(u'Befektetési alapok', u'http://www.portfolio.hu/rss/cikkek/befalap.xml'),
|
||||||
|
(u'Ingatlan', u'http://www.portfolio.hu/rss/cikkek/ingatlan.xml'),
|
||||||
|
(u'Pénzcentrum', u'http://www.penzcentrum.hu/rss/all.xml')]
|
Binary file not shown.
Before Width: | Height: | Size: 101 KiB |
@ -164,7 +164,7 @@ class GoogleCode(Base):# {{{
|
|||||||
typ = 'Type-' + ('Source' if fname.endswith('.xz') else 'Archive' if
|
typ = 'Type-' + ('Source' if fname.endswith('.xz') else 'Archive' if
|
||||||
fname.endswith('.zip') else 'Installer')
|
fname.endswith('.zip') else 'Installer')
|
||||||
ext = os.path.splitext(fname)[1][1:]
|
ext = os.path.splitext(fname)[1][1:]
|
||||||
op = 'OpSys-'+{'msi':'Windows','zip':'Windows',
|
op = 'OpSys-'+{'msi':'Windows','exe':'Windows',
|
||||||
'dmg':'OSX','bz2':'Linux','xz':'All'}[ext]
|
'dmg':'OSX','bz2':'Linux','xz':'All'}[ext]
|
||||||
desc = self.files[fname]
|
desc = self.files[fname]
|
||||||
start = time.time()
|
start = time.time()
|
||||||
|
@ -43,7 +43,7 @@ def installer_description(fname):
|
|||||||
return 'Windows installer'
|
return 'Windows installer'
|
||||||
if fname.endswith('.dmg'):
|
if fname.endswith('.dmg'):
|
||||||
return 'OS X dmg'
|
return 'OS X dmg'
|
||||||
if fname.endswith('.zip'):
|
if fname.endswith('.exe'):
|
||||||
return 'Calibre Portable'
|
return 'Calibre Portable'
|
||||||
return 'Unknown file'
|
return 'Unknown file'
|
||||||
|
|
||||||
|
@ -4,7 +4,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__ = u'calibre'
|
__appname__ = u'calibre'
|
||||||
numeric_version = (0, 8, 69)
|
numeric_version = (0, 8, 70)
|
||||||
__version__ = u'.'.join(map(unicode, numeric_version))
|
__version__ = u'.'.join(map(unicode, numeric_version))
|
||||||
__author__ = u"Kovid Goyal <kovid@kovidgoyal.net>"
|
__author__ = u"Kovid Goyal <kovid@kovidgoyal.net>"
|
||||||
|
|
||||||
|
@ -1119,6 +1119,19 @@ class MetadataSources(PreferencesPlugin):
|
|||||||
config_widget = 'calibre.gui2.preferences.metadata_sources'
|
config_widget = 'calibre.gui2.preferences.metadata_sources'
|
||||||
description = _('Control how calibre downloads ebook metadata from the net')
|
description = _('Control how calibre downloads ebook metadata from the net')
|
||||||
|
|
||||||
|
class IgnoredDevices(PreferencesPlugin):
|
||||||
|
name = 'Ignored Devices'
|
||||||
|
icon = I('reader.png')
|
||||||
|
gui_name = _('Ignored devices')
|
||||||
|
category = 'Sharing'
|
||||||
|
gui_category = _('Sharing')
|
||||||
|
category_order = 4
|
||||||
|
name_order = 4
|
||||||
|
config_widget = 'calibre.gui2.preferences.ignored_devices'
|
||||||
|
description = _('Control which devices calibre will ignore when they are connected '
|
||||||
|
'to the computer.')
|
||||||
|
|
||||||
|
|
||||||
class Plugins(PreferencesPlugin):
|
class Plugins(PreferencesPlugin):
|
||||||
name = 'Plugins'
|
name = 'Plugins'
|
||||||
icon = I('plugins.png')
|
icon = I('plugins.png')
|
||||||
@ -1167,7 +1180,7 @@ class Misc(PreferencesPlugin):
|
|||||||
plugins += [LookAndFeel, Behavior, Columns, Toolbar, Search, InputOptions,
|
plugins += [LookAndFeel, Behavior, Columns, Toolbar, Search, InputOptions,
|
||||||
CommonOptions, OutputOptions, Adding, Saving, Sending, Plugboard,
|
CommonOptions, OutputOptions, Adding, Saving, Sending, Plugboard,
|
||||||
Email, Server, Plugins, Tweaks, Misc, TemplateFunctions,
|
Email, Server, Plugins, Tweaks, Misc, TemplateFunctions,
|
||||||
MetadataSources, Keyboard]
|
MetadataSources, Keyboard, IgnoredDevices]
|
||||||
|
|
||||||
#}}}
|
#}}}
|
||||||
|
|
||||||
|
@ -102,7 +102,9 @@ class DevicePlugin(Plugin):
|
|||||||
#: If set to True, calibre will ask the user if they want to manage the
|
#: If set to True, calibre will ask the user if they want to manage the
|
||||||
#: device with calibre, the first time it is detected. If you set this to
|
#: device with calibre, the first time it is detected. If you set this to
|
||||||
#: True you must implement :meth:`get_device_uid()` and
|
#: True you must implement :meth:`get_device_uid()` and
|
||||||
#: :meth:`ignore_connected_device()`.
|
#: :meth:`ignore_connected_device()` and
|
||||||
|
#: :meth:`get_user_blacklisted_devices` and
|
||||||
|
#: :meth:`set_user_blacklisted_devices`
|
||||||
ASK_TO_ALLOW_CONNECT = False
|
ASK_TO_ALLOW_CONNECT = False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -611,6 +613,19 @@ class DevicePlugin(Plugin):
|
|||||||
'''
|
'''
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def get_user_blacklisted_devices(self):
|
||||||
|
'''
|
||||||
|
Return map of device uid to friendly name for all devices that the user
|
||||||
|
has asked to be ignored.
|
||||||
|
'''
|
||||||
|
return {}
|
||||||
|
|
||||||
|
def set_user_blacklisted_devices(self, devices):
|
||||||
|
'''
|
||||||
|
Set the list of device uids that should be ignored by this driver.
|
||||||
|
'''
|
||||||
|
pass
|
||||||
|
|
||||||
# Dynamic control interface.
|
# Dynamic control interface.
|
||||||
# The following methods are probably called on the GUI thread. Any driver
|
# The following methods are probably called on the GUI thread. Any driver
|
||||||
# that implements these methods must take pains to be thread safe, because
|
# that implements these methods must take pains to be thread safe, because
|
||||||
|
@ -481,8 +481,21 @@ class MTP_DEVICE(BASE):
|
|||||||
def save_template(self):
|
def save_template(self):
|
||||||
return self.get_pref('send_template')
|
return self.get_pref('send_template')
|
||||||
|
|
||||||
|
def get_user_blacklisted_devices(self):
|
||||||
|
bl = frozenset(self.prefs['blacklist'])
|
||||||
|
ans = {}
|
||||||
|
for dev, x in self.prefs['history'].iteritems():
|
||||||
|
name = x[0]
|
||||||
|
if dev in bl:
|
||||||
|
ans[dev] = name
|
||||||
|
return ans
|
||||||
|
|
||||||
|
def set_user_blacklisted_devices(self, devs):
|
||||||
|
self.prefs['blacklist'] = list(devs)
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
dev = MTP_DEVICE(None)
|
dev = MTP_DEVICE(None)
|
||||||
dev.startup()
|
dev.startup()
|
||||||
|
@ -174,7 +174,7 @@ class SMART_DEVICE_APP(DeviceConfig, DevicePlugin):
|
|||||||
gui_name = _('Wireless Device')
|
gui_name = _('Wireless Device')
|
||||||
gui_name_template = '%s: %s'
|
gui_name_template = '%s: %s'
|
||||||
|
|
||||||
icon = I('devices/galaxy_s3.png')
|
icon = I('devices/tablet.png')
|
||||||
description = _('Communicate with Smart Device apps')
|
description = _('Communicate with Smart Device apps')
|
||||||
supported_platforms = ['windows', 'osx', 'linux']
|
supported_platforms = ['windows', 'osx', 'linux']
|
||||||
author = 'Charles Haley'
|
author = 'Charles Haley'
|
||||||
|
@ -1359,7 +1359,10 @@ class OPFCreator(Metadata):
|
|||||||
guide = E.guide()
|
guide = E.guide()
|
||||||
if self.guide is not None:
|
if self.guide is not None:
|
||||||
for ref in self.guide:
|
for ref in self.guide:
|
||||||
item = E.reference(type=ref.type, href=ref.href())
|
href = ref.href()
|
||||||
|
if isinstance(href, bytes):
|
||||||
|
href = href.decode('utf-8')
|
||||||
|
item = E.reference(type=ref.type, href=href)
|
||||||
if ref.title:
|
if ref.title:
|
||||||
item.set('title', ref.title)
|
item.set('title', ref.title)
|
||||||
guide.append(item)
|
guide.append(item)
|
||||||
|
@ -8,6 +8,7 @@ __copyright__ = '2008, Marshall T. Vandegrift <llasram@gmail.com>'
|
|||||||
|
|
||||||
import re, operator, math
|
import re, operator, math
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
from xml.dom import SyntaxErr
|
||||||
|
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
import cssutils
|
import cssutils
|
||||||
@ -279,7 +280,7 @@ class CSSFlattener(object):
|
|||||||
if 'color' in node.attrib:
|
if 'color' in node.attrib:
|
||||||
try:
|
try:
|
||||||
cssdict['color'] = Property('color', node.attrib['color']).value
|
cssdict['color'] = Property('color', node.attrib['color']).value
|
||||||
except ValueError:
|
except (ValueError, SyntaxErr):
|
||||||
pass
|
pass
|
||||||
del node.attrib['color']
|
del node.attrib['color']
|
||||||
if 'bgcolor' in node.attrib:
|
if 'bgcolor' in node.attrib:
|
||||||
|
@ -89,7 +89,7 @@ class Browser(QDialog):
|
|||||||
self.setMinimumSize(QSize(500, 500))
|
self.setMinimumSize(QSize(500, 500))
|
||||||
self.folders.selected.connect(self.accept)
|
self.folders.selected.connect(self.accept)
|
||||||
self.setWindowTitle(_('Choose folder on device'))
|
self.setWindowTitle(_('Choose folder on device'))
|
||||||
self.setWindowIcon(QIcon(I('devices/galaxy_s3.png')))
|
self.setWindowIcon(QIcon(I('devices/tablet.png')))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def current_item(self):
|
def current_item(self):
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
</property>
|
</property>
|
||||||
<property name="windowIcon">
|
<property name="windowIcon">
|
||||||
<iconset resource="../../../../resources/images.qrc">
|
<iconset resource="../../../../resources/images.qrc">
|
||||||
<normaloff>:/images/devices/galaxy_s3.png</normaloff>:/images/devices/galaxy_s3.png</iconset>
|
<normaloff>:/images/devices/tablet.png</normaloff>:/images/devices/tablet.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout">
|
<layout class="QGridLayout">
|
||||||
<item row="0" column="0" colspan="3">
|
<item row="0" column="0" colspan="3">
|
||||||
|
72
src/calibre/gui2/preferences/ignored_devices.py
Normal file
72
src/calibre/gui2/preferences/ignored_devices.py
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai
|
||||||
|
from __future__ import (unicode_literals, division, absolute_import,
|
||||||
|
print_function)
|
||||||
|
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2012, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||||
|
__docformat__ = 'restructuredtext en'
|
||||||
|
|
||||||
|
from PyQt4.Qt import (QLabel, QVBoxLayout, QListWidget, QListWidgetItem, Qt)
|
||||||
|
|
||||||
|
from calibre.gui2.preferences import ConfigWidgetBase, test_widget
|
||||||
|
|
||||||
|
class ConfigWidget(ConfigWidgetBase):
|
||||||
|
|
||||||
|
restart_critical = False
|
||||||
|
|
||||||
|
def genesis(self, gui):
|
||||||
|
self.gui = gui
|
||||||
|
self.l = l = QVBoxLayout()
|
||||||
|
self.setLayout(l)
|
||||||
|
|
||||||
|
self.la = la = QLabel(_(
|
||||||
|
'The list of devices that you have asked calibre to ignore. '
|
||||||
|
'Uncheck a device to have calibre stop ignoring it.'))
|
||||||
|
la.setWordWrap(True)
|
||||||
|
l.addWidget(la)
|
||||||
|
|
||||||
|
self.devices = f = QListWidget(self)
|
||||||
|
l.addWidget(f)
|
||||||
|
f.itemChanged.connect(self.changed_signal)
|
||||||
|
f.itemDoubleClicked.connect(self.toggle_item)
|
||||||
|
|
||||||
|
def toggle_item(self, item):
|
||||||
|
item.setCheckState(Qt.Checked if item.checkState() == Qt.Unchecked else
|
||||||
|
Qt.Unchecked)
|
||||||
|
|
||||||
|
def initialize(self):
|
||||||
|
self.devices.blockSignals(True)
|
||||||
|
self.devices.clear()
|
||||||
|
for dev in self.gui.device_manager.devices:
|
||||||
|
for d, name in dev.get_user_blacklisted_devices().iteritems():
|
||||||
|
item = QListWidgetItem('%s [%s]'%(name, d), self.devices)
|
||||||
|
item.setData(Qt.UserRole, (dev, d))
|
||||||
|
item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsUserCheckable|Qt.ItemIsSelectable)
|
||||||
|
item.setCheckState(Qt.Checked)
|
||||||
|
self.devices.blockSignals(False)
|
||||||
|
|
||||||
|
def restore_defaults(self):
|
||||||
|
if self.devices.count() > 0:
|
||||||
|
self.devices.clear()
|
||||||
|
|
||||||
|
def commit(self):
|
||||||
|
devs = {}
|
||||||
|
for i in xrange(0, self.devices.count()):
|
||||||
|
e = self.devices.item(i)
|
||||||
|
dev, uid = e.data(Qt.UserRole).toPyObject()
|
||||||
|
if dev not in devs:
|
||||||
|
devs[dev] = []
|
||||||
|
if e.checkState() == Qt.Checked:
|
||||||
|
devs[dev].append(uid)
|
||||||
|
|
||||||
|
for dev, bl in devs.iteritems():
|
||||||
|
dev.set_user_blacklisted_devices(bl)
|
||||||
|
|
||||||
|
return True # Restart required
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from PyQt4.Qt import QApplication
|
||||||
|
app = QApplication([])
|
||||||
|
test_widget('Sharing', 'Ignored Devices')
|
||||||
|
|
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
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
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
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
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user