diff --git a/resources/images/news/aif_ru.png b/resources/images/news/aif_ru.png new file mode 100644 index 0000000000..57d98f3832 Binary files /dev/null and b/resources/images/news/aif_ru.png differ diff --git a/resources/images/news/izvestia.png b/resources/images/news/izvestia.png new file mode 100644 index 0000000000..d80a2a06f0 Binary files /dev/null and b/resources/images/news/izvestia.png differ diff --git a/resources/images/news/kommersant.png b/resources/images/news/kommersant.png new file mode 100644 index 0000000000..f9b76536dd Binary files /dev/null and b/resources/images/news/kommersant.png differ diff --git a/resources/images/news/ria_ru.png b/resources/images/news/ria_ru.png new file mode 100644 index 0000000000..069c37f72e Binary files /dev/null and b/resources/images/news/ria_ru.png differ diff --git a/resources/recipes/aif_ru.recipe b/resources/recipes/aif_ru.recipe new file mode 100644 index 0000000000..b5d6015d0c --- /dev/null +++ b/resources/recipes/aif_ru.recipe @@ -0,0 +1,31 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +www.aif.ru +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class AIF_ru(BasicNewsRecipe): + title = 'Arguments & Facts - Russian' + __author__ = 'Darko Miletic' + description = 'News from Russia' + publisher = 'AIF' + category = 'news, politics, Russia' + oldest_article = 2 + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + encoding = 'cp1251' + language = 'ru' + publication_type = 'magazine' + extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Verdana,Arial,Helvetica,sans1,sans-serif} ' + keep_only_tags = [dict(name='div',attrs={'id':'inner'})] + remove_tags = [ + dict(name=['iframe','object','link','base','input','img']) + ,dict(name='div',attrs={'class':'photo'}) + ,dict(name='p',attrs={'class':'resizefont'}) + ] + + feeds = [(u'News', u'http://www.aif.ru/rss/all.php')] + diff --git a/resources/recipes/izvestia.recipe b/resources/recipes/izvestia.recipe new file mode 100644 index 0000000000..7d04ab7b07 --- /dev/null +++ b/resources/recipes/izvestia.recipe @@ -0,0 +1,28 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +izvestia.ru +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Izvestia(BasicNewsRecipe): + title = 'Izvestia' + __author__ = 'Darko Miletic' + description = 'News from Russia' + publisher = 'Izvestia' + category = 'news, politics, Russia' + oldest_article = 5 + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + encoding = 'cp1251' + language = 'ru' + publication_type = 'newspaper' + masthead_url = 'http://images.izvestia.ru/izv/sys/logo.gif' + extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Verdana,Arial,Helvetica,sans1,sans-serif} ' + keep_only_tags = [dict(name='div', attrs={'class':'newsFull'})] + remove_tags = [dict(name=['iframe','object','img','link','base'])] + remove_tags_before = dict(name='h1', attrs={'class':'statya'}) + + feeds = [(u'Daily edition', u'http://rss.feedsportal.com/c/32171/f/424076/index.rss')] diff --git a/resources/recipes/kommersant.recipe b/resources/recipes/kommersant.recipe new file mode 100644 index 0000000000..f24a5da909 --- /dev/null +++ b/resources/recipes/kommersant.recipe @@ -0,0 +1,42 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +www.kommersant.ru +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class Kommersant_ru(BasicNewsRecipe): + title = 'Kommersant' + __author__ = 'Darko Miletic' + description = 'News from Russia' + publisher = 'Kommersant' + category = 'news, politics, Russia' + oldest_article = 5 + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + encoding = 'cp1251' + language = 'ru' + publication_type = 'newspaper' + masthead_url = 'http://www.kommersant.ru/CorpPics/logo_daily_1.gif' + extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Arial, sans1, sans-serif} span#ctl00_ContentPlaceHolderStyle_LabelSubTitle{margin-bottom: 1em; display: block} .author{margin-bottom: 1em; display: block} .paragraph{margin-bottom: 1em; display: block} .vvodka{font-weight: bold; margin-bottom: 1em} ' + + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + keep_only_tags = [ + dict(attrs={'id':'ctl00_ContentPlaceHolderStyle_PanelHeader'}) + ,dict(attrs={'class':['vvodka','paragraph','author']}) + ] + remove_tags = [dict(name=['iframe','object','link','img','base'])] + + feeds = [(u'Articles', u'http://feeds.kommersant.ru/RSS_Export/RU/daily.xml')] + + def print_version(self, url): + return url.replace('doc-rss.aspx','doc.aspx') + '&print=true' + diff --git a/resources/recipes/ria_ru.recipe b/resources/recipes/ria_ru.recipe new file mode 100644 index 0000000000..ad01b02db0 --- /dev/null +++ b/resources/recipes/ria_ru.recipe @@ -0,0 +1,43 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +www.rian.ru +''' + +from calibre.web.feeds.news import BasicNewsRecipe + +class RIANovosti(BasicNewsRecipe): + title = 'RIA Novosti - Russian' + __author__ = 'Darko Miletic' + description = 'News from Russia' + publisher = 'RIA' + category = 'news, politics, Russia' + oldest_article = 2 + max_articles_per_feed = 100 + no_stylesheets = True + use_embedded_content = False + encoding = 'utf8' + language = 'ru' + publication_type = 'newsportal' + masthead_url = 'http://img.beta.rian.ru/images/22868/43/228684314.jpg' + extra_css = ' @font-face {font-family: "sans1";src:url(res:///opt/sony/ebook/FONT/tt0003m_.ttf)} body{font-family: Arial,Helvetica,sans1,sans-serif} ' + remove_tags_before = dict(name='h1') + remove_tags_after = dict(name='div', attrs={'class':'text'}) + remove_tags = [dict(name=['iframe','object','link','img','base'])] + + feeds = [ + (u'Frontpage', u'http://www.rian.ru/export/rss2/lenta/index.xml') + ,(u'Politics', u'http://www.rian.ru/export/rss2/politics/index.xml') + ,(u'World', u'http://www.rian.ru/export/rss2/world/index.xml') + ,(u'Economy', u'http://www.rian.ru/export/rss2/economy/index.xml') + ,(u'Society', u'http://www.rian.ru/export/rss2/society/index.xml') + ,(u'Moscow', u'http://www.rian.ru/export/rss2/moscow/index.xml') + ,(u'Defense', u'http://www.rian.ru/export/rss2/defense_safety/index.xml') + ,(u'Science', u'http://www.rian.ru/export/rss2/science/index.xml') + ,(u'Turism', u'http://www.rian.ru/export/rss2/tourism/index.xml') + ,(u'Culture', u'http://www.rian.ru/export/rss2/culture/index.xml') + ] + + def print_version(self, url): + return url.replace('.html','-print.html') + diff --git a/src/calibre/library/db/__init__.py b/src/calibre/library/db/__init__.py new file mode 100644 index 0000000000..0080175bfa --- /dev/null +++ b/src/calibre/library/db/__init__.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + + diff --git a/src/calibre/library/db/base.py b/src/calibre/library/db/base.py new file mode 100644 index 0000000000..a2374583eb --- /dev/null +++ b/src/calibre/library/db/base.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai + +__license__ = 'GPL v3' +__copyright__ = '2010, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + +''' Design documentation {{{ + + Storage paradigm {{{ + * Agnostic to storage paradigm (i.e. no book per folder assumptions) + * Two separate concepts: A store and collection + A store is a backend, like a sqlite database associated with a path on + the local filesystem, or a cloud based storage solution. + A collection is a user defined group of stores. Most of the logic for + data manipulation sorting/searching/restrictions should be in the collection + class. The collection class should transparently handle the + conversion from store name + id to row number in the collection. + * Not sure how feasible it is to allow many-many maps between stores + and collections. + }}} + + Event system {{{ + * Comprehensive event system that other components can subscribe to + * Subscribers should be able to temporarily block receiving events + * Should event dispatch be asynchronous? + * Track last modified time for metadata and each format + }}} +}}}''' + +# Imports {{{ +# }}} + + + +