mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Merge from trunk
This commit is contained in:
commit
1de538588a
@ -110,8 +110,10 @@ class BrandEins(BasicNewsRecipe):
|
|||||||
selected_issue = issue_map[selected_issue_key]
|
selected_issue = issue_map[selected_issue_key]
|
||||||
url = selected_issue.get('href', False)
|
url = selected_issue.get('href', False)
|
||||||
# Get the title for the magazin - build it out of the title of the cover - take the issue and year;
|
# Get the title for the magazin - build it out of the title of the cover - take the issue and year;
|
||||||
self.title = "brand eins " + selected_issue_key[4:] + "/" + selected_issue_key[0:4]
|
# self.title = "brand eins " + selected_issue_key[4:] + "/" + selected_issue_key[0:4]
|
||||||
|
# Get the alternative title for the magazin - build it out of the title of the cover - without the issue and year;
|
||||||
url = 'http://brandeins.de/'+url
|
url = 'http://brandeins.de/'+url
|
||||||
|
self.timefmt = ' ' + selected_issue_key[4:] + '/' + selected_issue_key[:4]
|
||||||
|
|
||||||
# url = "http://www.brandeins.de/archiv/magazin/tierisch.html"
|
# url = "http://www.brandeins.de/archiv/magazin/tierisch.html"
|
||||||
titles_and_articles = self.brand_eins_parse_issue(url)
|
titles_and_articles = self.brand_eins_parse_issue(url)
|
||||||
@ -163,4 +165,3 @@ class BrandEins(BasicNewsRecipe):
|
|||||||
current_articles.append({'title': title, 'url': url, 'description': description, 'date':''})
|
current_articles.append({'title': title, 'url': url, 'description': description, 'date':''})
|
||||||
titles_and_articles.append([chapter_title, current_articles])
|
titles_and_articles.append([chapter_title, current_articles])
|
||||||
return titles_and_articles
|
return titles_and_articles
|
||||||
|
|
||||||
|
@ -8,11 +8,7 @@ class DallasNews(BasicNewsRecipe):
|
|||||||
|
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
use_embedded_content = False
|
use_embedded_content = False
|
||||||
remove_tags_before = dict(name='h1')
|
auto_cleanup = True
|
||||||
keep_only_tags = {'class':lambda x: x and 'article' in x}
|
|
||||||
remove_tags = [
|
|
||||||
{'class':['DMNSocialTools', 'article ', 'article first ', 'article premium']},
|
|
||||||
]
|
|
||||||
|
|
||||||
feeds = [
|
feeds = [
|
||||||
('Local News',
|
('Local News',
|
||||||
|
@ -16,7 +16,7 @@ class FTDe(BasicNewsRecipe):
|
|||||||
use_embedded_content = False
|
use_embedded_content = False
|
||||||
timefmt = ' [%d %b %Y]'
|
timefmt = ' [%d %b %Y]'
|
||||||
language = 'de'
|
language = 'de'
|
||||||
max_articles_per_feed = 40
|
max_articles_per_feed = 30
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
|
|
||||||
remove_tags = [dict(id='navi_top'),
|
remove_tags = [dict(id='navi_top'),
|
||||||
@ -84,19 +84,19 @@ class FTDe(BasicNewsRecipe):
|
|||||||
dict(name='div', attrs={'class':'artikelsplitfaq'})]
|
dict(name='div', attrs={'class':'artikelsplitfaq'})]
|
||||||
#remove_tags_after = [dict(name='a', attrs={'class':'more'})]
|
#remove_tags_after = [dict(name='a', attrs={'class':'more'})]
|
||||||
|
|
||||||
feeds = [ ('Finanzen', 'http://www.ftd.de/rss2/finanzen/maerkte'),
|
feeds = [
|
||||||
('Meinungshungrige', 'http://www.ftd.de/rss2/meinungshungrige'),
|
('Unternehmen', 'http://www.ftd.de/rss2/unternehmen'),
|
||||||
('Unternehmen', 'http://www.ftd.de/rss2/unternehmen'),
|
('Finanzen', 'http://www.ftd.de/rss2/finanzen/maerkte'),
|
||||||
('Politik', 'http://www.ftd.de/rss2/politik'),
|
('Meinungen', 'http://www.ftd.de/rss2/meinungshungrige'),
|
||||||
('Karriere_Management', 'http://www.ftd.de/rss2/karriere-management'),
|
('Politik', 'http://www.ftd.de/rss2/politik'),
|
||||||
('IT_Medien', 'http://www.ftd.de/rss2/it-medien'),
|
('Management & Karriere', 'http://www.ftd.de/rss2/karriere-management'),
|
||||||
('Wissen', 'http://www.ftd.de/rss2/wissen'),
|
('IT & Medien', 'http://www.ftd.de/rss2/it-medien'),
|
||||||
('Sport', 'http://www.ftd.de/rss2/sport'),
|
('Wissen', 'http://www.ftd.de/rss2/wissen'),
|
||||||
('Auto', 'http://www.ftd.de/rss2/auto'),
|
('Sport', 'http://www.ftd.de/rss2/sport'),
|
||||||
('Lifestyle', 'http://www.ftd.de/rss2/lifestyle')
|
('Auto', 'http://www.ftd.de/rss2/auto'),
|
||||||
|
('Lifestyle', 'http://www.ftd.de/rss2/lifestyle')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
def print_version(self, url):
|
def print_version(self, url):
|
||||||
return url.replace('.html', '.html?mode=print')
|
return url.replace('.html', '.html?mode=print')
|
@ -3,7 +3,7 @@ from calibre.web.feeds.news import BasicNewsRecipe
|
|||||||
class AdvancedUserRecipe1298137661(BasicNewsRecipe):
|
class AdvancedUserRecipe1298137661(BasicNewsRecipe):
|
||||||
title = u'Helsingin Sanomat'
|
title = u'Helsingin Sanomat'
|
||||||
__author__ = 'oneillpt'
|
__author__ = 'oneillpt'
|
||||||
language = 'fi'
|
language = 'fi'
|
||||||
oldest_article = 7
|
oldest_article = 7
|
||||||
max_articles_per_feed = 100
|
max_articles_per_feed = 100
|
||||||
no_stylesheets = True
|
no_stylesheets = True
|
||||||
@ -11,21 +11,12 @@ class AdvancedUserRecipe1298137661(BasicNewsRecipe):
|
|||||||
conversion_options = {
|
conversion_options = {
|
||||||
'linearize_tables' : True
|
'linearize_tables' : True
|
||||||
}
|
}
|
||||||
remove_tags = [
|
keep_only_tags = [dict(name='div', attrs={'id':'main-content'}),
|
||||||
dict(name='a', attrs={'id':'articleCommentUrl'}),
|
dict(name='div', attrs={'class':'contentNewsArticle'})]
|
||||||
dict(name='p', attrs={'class':'newsSummary'}),
|
|
||||||
dict(name='div', attrs={'class':'headerTools'})
|
|
||||||
]
|
|
||||||
|
|
||||||
feeds = [(u'Uutiset - HS.fi', u'http://www.hs.fi/uutiset/rss/'), (u'Politiikka - HS.fi', u'http://www.hs.fi/politiikka/rss/'),
|
feeds = [(u'Uutiset - HS.fi', u'http://www.hs.fi/uutiset/rss/')
|
||||||
|
, (u'Politiikka - HS.fi', u'http://www.hs.fi/politiikka/rss/'),
|
||||||
(u'Ulkomaat - HS.fi', u'http://www.hs.fi/ulkomaat/rss/'), (u'Kulttuuri - HS.fi', u'http://www.hs.fi/kulttuuri/rss/'),
|
(u'Ulkomaat - HS.fi', u'http://www.hs.fi/ulkomaat/rss/'), (u'Kulttuuri - HS.fi', u'http://www.hs.fi/kulttuuri/rss/'),
|
||||||
(u'Kirjat - HS.fi', u'http://www.hs.fi/kulttuuri/kirjat/rss/'), (u'Elokuvat - HS.fi', u'http://www.hs.fi/kulttuuri/elokuvat/rss/')
|
(u'Kirjat - HS.fi', u'http://www.hs.fi/kulttuuri/kirjat/rss/'), (u'Elokuvat - HS.fi', u'http://www.hs.fi/kulttuuri/elokuvat/rss/')
|
||||||
]
|
]
|
||||||
|
|
||||||
def print_version(self, url):
|
|
||||||
j = url.rfind("/")
|
|
||||||
s = url[j:]
|
|
||||||
i = s.rfind("?ref=rss")
|
|
||||||
if i > 0:
|
|
||||||
s = s[:i]
|
|
||||||
return "http://www.hs.fi/tulosta" + s
|
|
||||||
|
BIN
recipes/icons/la_republica.png
Normal file
BIN
recipes/icons/la_republica.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 868 B |
@ -1,51 +1,55 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
__license__ = 'GPL v3'
|
__license__ = 'GPL v3'
|
||||||
__author__ = 'Lorenzo Vigentini, based on Darko Miletic, Gabriele Marini'
|
__author__ = 'Lorenzo Vigentini, based on Darko Miletic, Gabriele Marini'
|
||||||
__copyright__ = '2009, Darko Miletic <darko.miletic at gmail.com>, Lorenzo Vigentini <l.vigentini at gmail.com>'
|
__copyright__ = '2009-2011, Darko Miletic <darko.miletic at gmail.com>, Lorenzo Vigentini <l.vigentini at gmail.com>'
|
||||||
description = 'Italian daily newspaper - v1.01 (04, January 2010); 16.05.2010 new version'
|
description = 'Italian daily newspaper - v1.01 (04, January 2010); 16.05.2010 new version'
|
||||||
|
|
||||||
'''
|
'''
|
||||||
http://www.repubblica.it/
|
http://www.repubblica.it/
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
import re
|
||||||
from calibre.web.feeds.news import BasicNewsRecipe
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
class LaRepubblica(BasicNewsRecipe):
|
class LaRepubblica(BasicNewsRecipe):
|
||||||
__author__ = 'Lorenzo Vigentini, Gabriele Marini'
|
title = 'La Repubblica'
|
||||||
description = 'Italian daily newspaper'
|
__author__ = 'Lorenzo Vigentini, Gabriele Marini, Darko Miletic'
|
||||||
|
description = 'il quotidiano online con tutte le notizie in tempo reale. News e ultime notizie. Tutti i settori: politica, cronaca, economia, sport, esteri, scienza, tecnologia, internet, spettacoli, musica, cultura, arte, mostre, libri, dvd, vhs, concerti, cinema, attori, attrici, recensioni, chat, cucina, mappe. Le citta di Repubblica: Roma, Milano, Bologna, Firenze, Palermo, Napoli, Bari, Torino.'
|
||||||
cover_url = 'http://www.repubblica.it/images/homepage/la_repubblica_logo.gif'
|
masthead_url = 'http://www.repubblica.it/static/images/homepage/2010/la-repubblica-logo-home-payoff.png'
|
||||||
title = u'La Repubblica'
|
publisher = 'Gruppo editoriale L\'Espresso'
|
||||||
publisher = 'Gruppo editoriale L\'Espresso'
|
category = 'News, politics, culture, economy, general interest'
|
||||||
category = 'News, politics, culture, economy, general interest'
|
language = 'it'
|
||||||
|
timefmt = '[%a, %d %b, %Y]'
|
||||||
language = 'it'
|
oldest_article = 5
|
||||||
timefmt = '[%a, %d %b, %Y]'
|
encoding = 'utf8'
|
||||||
|
use_embedded_content = False
|
||||||
oldest_article = 5
|
#recursion = 10
|
||||||
max_articles_per_feed = 100
|
no_stylesheets = True
|
||||||
use_embedded_content = False
|
extra_css = """
|
||||||
recursion = 10
|
img{display: block}
|
||||||
|
"""
|
||||||
remove_javascript = True
|
|
||||||
no_stylesheets = True
|
|
||||||
|
|
||||||
|
preprocess_regexps = [
|
||||||
|
(re.compile(r'.*?<head>', re.DOTALL|re.IGNORECASE), lambda match: '<head>'),
|
||||||
|
(re.compile(r'<head>.*?<title>', re.DOTALL|re.IGNORECASE), lambda match: '<head><title>'),
|
||||||
|
(re.compile(r'</title>.*?</head>', re.DOTALL|re.IGNORECASE), lambda match: '</title></head>')
|
||||||
|
]
|
||||||
|
|
||||||
def get_article_url(self, article):
|
def get_article_url(self, article):
|
||||||
link = article.get('id', article.get('guid', None))
|
link = article.get('id', article.get('guid', None))
|
||||||
if link is None:
|
if link is None:
|
||||||
return article
|
return article
|
||||||
return link
|
return link
|
||||||
|
|
||||||
keep_only_tags = [dict(name='div', attrs={'class':'articolo'}),
|
keep_only_tags = [
|
||||||
dict(name='div', attrs={'class':'body-text'}),
|
dict(attrs={'class':'articolo'}),
|
||||||
# dict(name='div', attrs={'class':'page-content'}),
|
dict(attrs={'class':'body-text'}),
|
||||||
dict(name='p', attrs={'class':'disclaimer clearfix'}),
|
dict(name='p', attrs={'class':'disclaimer clearfix'}),
|
||||||
dict(name='div', attrs={'id':'contA'})
|
dict(attrs={'id':'contA'})
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
remove_tags = [
|
remove_tags = [
|
||||||
dict(name=['object','link']),
|
dict(name=['object','link','meta']),
|
||||||
dict(name='span',attrs={'class':'linkindice'}),
|
dict(name='span',attrs={'class':'linkindice'}),
|
||||||
dict(name='div', attrs={'class':'bottom-mobile'}),
|
dict(name='div', attrs={'class':'bottom-mobile'}),
|
||||||
dict(name='div', attrs={'id':['rssdiv','blocco']}),
|
dict(name='div', attrs={'id':['rssdiv','blocco']}),
|
||||||
|
@ -10,7 +10,7 @@ from calibre.web.feeds.news import BasicNewsRecipe
|
|||||||
|
|
||||||
class Sueddeutsche(BasicNewsRecipe):
|
class Sueddeutsche(BasicNewsRecipe):
|
||||||
|
|
||||||
title = u'Süddeutsche'
|
title = u'sueddeutsche.de'
|
||||||
description = 'News from Germany'
|
description = 'News from Germany'
|
||||||
__author__ = 'Oliver Niesner and Armin Geller'
|
__author__ = 'Oliver Niesner and Armin Geller'
|
||||||
use_embedded_content = False
|
use_embedded_content = False
|
||||||
@ -62,7 +62,7 @@ class Sueddeutsche(BasicNewsRecipe):
|
|||||||
(u'Sport', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ESport%24?output=rss'),
|
(u'Sport', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ESport%24?output=rss'),
|
||||||
(u'Leben', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ELeben%24?output=rss'),
|
(u'Leben', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5ELeben%24?output=rss'),
|
||||||
(u'Karriere', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EKarriere%24?output=rss'),
|
(u'Karriere', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EKarriere%24?output=rss'),
|
||||||
(u'München&Region', u'http://www.sueddeutsche.de/app/service/rss/ressort/muenchen/rss.xml'),
|
(u'München & Region', u'http://www.sueddeutsche.de/app/service/rss/ressort/muenchen/rss.xml'),
|
||||||
(u'Bayern', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EBayern%24?output=rss'),
|
(u'Bayern', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EBayern%24?output=rss'),
|
||||||
(u'Medien', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EMedien%24?output=rss'),
|
(u'Medien', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EMedien%24?output=rss'),
|
||||||
(u'Digital', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EDigital%24?output=rss'),
|
(u'Digital', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EDigital%24?output=rss'),
|
||||||
@ -75,7 +75,7 @@ class Sueddeutsche(BasicNewsRecipe):
|
|||||||
(u'Job', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EJob%24?output=rss'), # sometimes only
|
(u'Job', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EJob%24?output=rss'), # sometimes only
|
||||||
(u'Service', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EService%24?output=rss'), # sometimes only
|
(u'Service', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EService%24?output=rss'), # sometimes only
|
||||||
(u'Verlag', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EVerlag%24?output=rss'), # sometimes only
|
(u'Verlag', u'http://suche.sueddeutsche.de/query/%23/sort/-docdatetime/drilldown/%C2%A7ressort%3A%5EVerlag%24?output=rss'), # sometimes only
|
||||||
]
|
]
|
||||||
|
|
||||||
def print_version(self, url):
|
def print_version(self, url):
|
||||||
main, sep, id = url.rpartition('/')
|
main, sep, id = url.rpartition('/')
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from calibre.web.feeds.news import BasicNewsRecipe
|
from calibre.web.feeds.news import BasicNewsRecipe
|
||||||
|
|
||||||
class TelepolisNews(BasicNewsRecipe):
|
class TelepolisNews(BasicNewsRecipe):
|
||||||
title = u'Telepolis (News+Artikel)'
|
title = u'Telepolis'
|
||||||
__author__ = 'syntaxis'
|
__author__ = 'syntaxis'
|
||||||
publisher = 'Heise Zeitschriften Verlag GmbH & Co KG'
|
publisher = 'Heise Zeitschriften Verlag GmbH & Co KG'
|
||||||
description = 'News from Telepolis'
|
description = 'News from Telepolis'
|
||||||
@ -15,11 +15,8 @@ class TelepolisNews(BasicNewsRecipe):
|
|||||||
encoding = "utf-8"
|
encoding = "utf-8"
|
||||||
language = 'de'
|
language = 'de'
|
||||||
|
|
||||||
|
|
||||||
remove_empty_feeds = True
|
remove_empty_feeds = True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
keep_only_tags = [dict(name = 'div',attrs={'class':'head'}),dict(name = 'div',attrs={'class':'leftbox'}),dict(name='td',attrs={'class':'strict'})]
|
keep_only_tags = [dict(name = 'div',attrs={'class':'head'}),dict(name = 'div',attrs={'class':'leftbox'}),dict(name='td',attrs={'class':'strict'})]
|
||||||
remove_tags = [ dict(name='td',attrs={'class':'blogbottom'}),
|
remove_tags = [ dict(name='td',attrs={'class':'blogbottom'}),
|
||||||
dict(name='div',attrs={'class':'forum'}), dict(name='div',attrs={'class':'social'}),dict(name='div',attrs={'class':'blog-letter p-news'}),
|
dict(name='div',attrs={'class':'forum'}), dict(name='div',attrs={'class':'social'}),dict(name='div',attrs={'class':'blog-letter p-news'}),
|
||||||
@ -28,7 +25,6 @@ class TelepolisNews(BasicNewsRecipe):
|
|||||||
|
|
||||||
remove_tags_after = [dict(name='span', attrs={'class':['breadcrumb']})]
|
remove_tags_after = [dict(name='span', attrs={'class':['breadcrumb']})]
|
||||||
|
|
||||||
|
|
||||||
feeds = [(u'News', u'http://www.heise.de/tp/news-atom.xml')]
|
feeds = [(u'News', u'http://www.heise.de/tp/news-atom.xml')]
|
||||||
|
|
||||||
html2lrf_options = [
|
html2lrf_options = [
|
||||||
@ -39,8 +35,7 @@ class TelepolisNews(BasicNewsRecipe):
|
|||||||
|
|
||||||
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
|
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
|
||||||
|
|
||||||
|
|
||||||
def preprocess_html(self, soup):
|
def preprocess_html(self, soup):
|
||||||
mtag = '<meta http-equiv="Content-Type" content="text/html; charset=' + self.encoding + '">'
|
mtag = '<meta http-equiv="Content-Type" content="text/html; charset=' + self.encoding + '">'
|
||||||
soup.head.insert(0,mtag)
|
soup.head.insert(0,mtag)
|
||||||
return soup
|
return soup
|
@ -84,7 +84,7 @@ class PDNOVEL(USBMS):
|
|||||||
FORMATS = ['epub', 'pdf']
|
FORMATS = ['epub', 'pdf']
|
||||||
|
|
||||||
VENDOR_ID = [0x18d1]
|
VENDOR_ID = [0x18d1]
|
||||||
PRODUCT_ID = [0xb004]
|
PRODUCT_ID = [0xb004, 0xa004]
|
||||||
BCD = [0x224]
|
BCD = [0x224]
|
||||||
|
|
||||||
VENDOR_NAME = 'ANDROID'
|
VENDOR_NAME = 'ANDROID'
|
||||||
|
@ -204,6 +204,7 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
|
|||||||
class CoverView(QWidget): # {{{
|
class CoverView(QWidget): # {{{
|
||||||
|
|
||||||
cover_changed = pyqtSignal(object, object)
|
cover_changed = pyqtSignal(object, object)
|
||||||
|
cover_removed = pyqtSignal(object)
|
||||||
|
|
||||||
def __init__(self, vertical, parent=None):
|
def __init__(self, vertical, parent=None):
|
||||||
QWidget.__init__(self, parent)
|
QWidget.__init__(self, parent)
|
||||||
@ -289,10 +290,12 @@ class CoverView(QWidget): # {{{
|
|||||||
cm = QMenu(self)
|
cm = QMenu(self)
|
||||||
paste = cm.addAction(_('Paste Cover'))
|
paste = cm.addAction(_('Paste Cover'))
|
||||||
copy = cm.addAction(_('Copy Cover'))
|
copy = cm.addAction(_('Copy Cover'))
|
||||||
|
remove = cm.addAction(_('Remove Cover'))
|
||||||
if not QApplication.instance().clipboard().mimeData().hasImage():
|
if not QApplication.instance().clipboard().mimeData().hasImage():
|
||||||
paste.setEnabled(False)
|
paste.setEnabled(False)
|
||||||
copy.triggered.connect(self.copy_to_clipboard)
|
copy.triggered.connect(self.copy_to_clipboard)
|
||||||
paste.triggered.connect(self.paste_from_clipboard)
|
paste.triggered.connect(self.paste_from_clipboard)
|
||||||
|
remove.triggered.connect(self.remove_cover)
|
||||||
cm.exec_(ev.globalPos())
|
cm.exec_(ev.globalPos())
|
||||||
|
|
||||||
def copy_to_clipboard(self):
|
def copy_to_clipboard(self):
|
||||||
@ -315,6 +318,13 @@ class CoverView(QWidget): # {{{
|
|||||||
self.cover_changed.emit(id_,
|
self.cover_changed.emit(id_,
|
||||||
pixmap_to_data(pmap))
|
pixmap_to_data(pmap))
|
||||||
|
|
||||||
|
def remove_cover(self):
|
||||||
|
id_ = self.data.get('id', None)
|
||||||
|
self.pixmap = self.default_pixmap
|
||||||
|
self.do_layout()
|
||||||
|
self.update()
|
||||||
|
if id_ is not None:
|
||||||
|
self.cover_removed.emit(id_)
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
|
||||||
@ -457,6 +467,7 @@ class BookDetails(QWidget): # {{{
|
|||||||
remote_file_dropped = pyqtSignal(object, object)
|
remote_file_dropped = pyqtSignal(object, object)
|
||||||
files_dropped = pyqtSignal(object, object)
|
files_dropped = pyqtSignal(object, object)
|
||||||
cover_changed = pyqtSignal(object, object)
|
cover_changed = pyqtSignal(object, object)
|
||||||
|
cover_removed = pyqtSignal(object)
|
||||||
|
|
||||||
# Drag 'n drop {{{
|
# Drag 'n drop {{{
|
||||||
DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS
|
DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS
|
||||||
@ -514,6 +525,7 @@ class BookDetails(QWidget): # {{{
|
|||||||
|
|
||||||
self.cover_view = CoverView(vertical, self)
|
self.cover_view = CoverView(vertical, self)
|
||||||
self.cover_view.cover_changed.connect(self.cover_changed.emit)
|
self.cover_view.cover_changed.connect(self.cover_changed.emit)
|
||||||
|
self.cover_view.cover_removed.connect(self.cover_removed.emit)
|
||||||
self._layout.addWidget(self.cover_view)
|
self._layout.addWidget(self.cover_view)
|
||||||
self.book_info = BookInfo(vertical, self)
|
self.book_info = BookInfo(vertical, self)
|
||||||
self._layout.addWidget(self.book_info)
|
self._layout.addWidget(self.book_info)
|
||||||
|
@ -261,6 +261,8 @@ class LayoutMixin(object): # {{{
|
|||||||
self.book_details.files_dropped.connect(self.iactions['Add Books'].files_dropped_on_book)
|
self.book_details.files_dropped.connect(self.iactions['Add Books'].files_dropped_on_book)
|
||||||
self.book_details.cover_changed.connect(self.bd_cover_changed,
|
self.book_details.cover_changed.connect(self.bd_cover_changed,
|
||||||
type=Qt.QueuedConnection)
|
type=Qt.QueuedConnection)
|
||||||
|
self.book_details.cover_removed.connect(self.bd_cover_removed,
|
||||||
|
type=Qt.QueuedConnection)
|
||||||
self.book_details.remote_file_dropped.connect(
|
self.book_details.remote_file_dropped.connect(
|
||||||
self.iactions['Add Books'].remote_file_dropped_on_book,
|
self.iactions['Add Books'].remote_file_dropped_on_book,
|
||||||
type=Qt.QueuedConnection)
|
type=Qt.QueuedConnection)
|
||||||
@ -279,6 +281,12 @@ class LayoutMixin(object): # {{{
|
|||||||
if self.cover_flow:
|
if self.cover_flow:
|
||||||
self.cover_flow.dataChanged()
|
self.cover_flow.dataChanged()
|
||||||
|
|
||||||
|
def bd_cover_removed(self, id_):
|
||||||
|
self.library_view.model().db.remove_cover(id_, commit=True,
|
||||||
|
notify=False)
|
||||||
|
if self.cover_flow:
|
||||||
|
self.cover_flow.dataChanged()
|
||||||
|
|
||||||
def save_layout_state(self):
|
def save_layout_state(self):
|
||||||
for x in ('library', 'memory', 'card_a', 'card_b'):
|
for x in ('library', 'memory', 'card_a', 'card_b'):
|
||||||
getattr(self, x+'_view').save_state()
|
getattr(self, x+'_view').save_state()
|
||||||
|
@ -500,7 +500,8 @@ class JobsDialog(QDialog, Ui_JobsDialog):
|
|||||||
def kill_job(self, *args):
|
def kill_job(self, *args):
|
||||||
rows = [index.row() for index in
|
rows = [index.row() for index in
|
||||||
self.jobs_view.selectionModel().selectedRows()]
|
self.jobs_view.selectionModel().selectedRows()]
|
||||||
return error_dialog(self, _('No job'),
|
if not rows:
|
||||||
|
return error_dialog(self, _('No job'),
|
||||||
_('No job selected'), show=True)
|
_('No job selected'), show=True)
|
||||||
if question_dialog(self, _('Are you sure?'),
|
if question_dialog(self, _('Are you sure?'),
|
||||||
ngettext('Do you really want to stop the selected job?',
|
ngettext('Do you really want to stop the selected job?',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user