diff options
author | Cédric Bonhomme <cedric@cedricbonhomme.org> | 2015-11-25 22:45:43 +0100 |
---|---|---|
committer | Cédric Bonhomme <cedric@cedricbonhomme.org> | 2015-11-25 22:45:43 +0100 |
commit | b2618e9404b84cc62d4becb02436233a0d53b375 (patch) | |
tree | a31f2dc76d23967fa0243374cf475923a4b7e451 /web/export.py | |
parent | Updated default platform URL (for Heroku...). (diff) | |
download | newspipe-b2618e9404b84cc62d4becb02436233a0d53b375.tar.gz newspipe-b2618e9404b84cc62d4becb02436233a0d53b375.tar.bz2 newspipe-b2618e9404b84cc62d4becb02436233a0d53b375.zip |
Rfactorization. Just a start...
Diffstat (limited to 'web/export.py')
-rw-r--r-- | web/export.py | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/web/export.py b/web/export.py new file mode 100644 index 00000000..f2eac25b --- /dev/null +++ b/web/export.py @@ -0,0 +1,230 @@ +#! /usr/bin/env python +#-*- coding: utf-8 -*- + +# jarr - A Web based news aggregator. +# Copyright (C) 2010-2015 Cédric Bonhomme - https://www.JARR-aggregator.org +# +# For more information : https://github.com/JARR-aggregator/JARR/ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +__author__ = "Cedric Bonhomme" +__version__ = "$Revision: 0.6 $" +__date__ = "$Date: 2011/10/24 $" +__revision__ = "$Date: 2014/04/12 $" +__copyright__ = "Copyright (c) Cedric Bonhomme" +__license__ = "AGPLv3" + +# +# This file contains the export functions of jarr. Indeed +# it is possible to export the database of articles in different formats: +# - simple HTML webzine; +# - text file. +# + +import os +import shutil +import time +import tarfile +from datetime import datetime + +from flask import jsonify + +import conf +from web import models + + +def HTML_HEADER(title="jarr", css="./style.css"): + return """<!DOCTYPE html> +<html lang="en-US"> +<head> +<title>%s</title> +<meta charset="utf-8"/> +<link rel="stylesheet" href="%s" /> +</head> +<body>""" % (title, css) + +HTML_FOOTER = """<hr /> +<p>This archive has been generated with +<a href="https://github.com/JARR-aggregator/JARR">jarr</a>. +A software under AGPLv3 license. +You are welcome to copy, modify or redistribute the source code according to the +<a href="https://www.gnu.org/licenses/agpl-3.0.txt">AGPLv3</a> license.</p> +</body> +</html> +""" + +CSS = """body { + font:normal medium 'Gill Sans','Gill Sans MT',Verdana,sans-serif; + margin:1.20em auto; + width:80%; + line-height:1.75; +} +blockquote { + font-size:small; + line-height:2.153846; + margin:2.153846em 0; + padding:0;font-style:oblique; + border-left:1px dotted; + margin-left:2.153846em; + padding-left:2.153846em; +} +blockquote p{ + margin:2.153846em 0; +} +p+br { + display:none; +} +h1 { +font-size:large; +} +h2,h3 { + font-size:medium; +} +hr { + border-style:dotted; + height:1px; + border-width: 1px 0 0 0; + margin:1.45em 0 1.4em; + padding:0; +} +a { + text-decoration:none; + color:#00008B; +} +#footer { + clear:both; + text-align:center; + font-size:small; +} +img { + border:0; +} +.horizontal,.simple li { + margin:0; + padding:0; + list-style:none; + display:inline +} +.simple li:before { + content:"+ "; +} +.simple > li:first-child:before { + content:""; +} +.author { + text-decoration:none; + display:block; + float:right; + margin-left:2em; + font-size:small; +} +.content { + margin:1.00em 1.00em; +}""" + + +def export_html(user): + """ + Export all articles of 'user' in Web pages. + """ + webzine_root = conf.WEBZINE_ROOT + "webzine/" + nb_articles = format(len(models.Article.query.filter(models.Article.user_id == user.id).all()), ",d") + index = HTML_HEADER("News archive") + index += "<h1>List of feeds</h1>\n" + index += """<p>%s articles.</p>\n<ul>\n""" % (nb_articles,) + for feed in user.feeds.order_by(models.Feed.title): + # creates a folder for each stream + feed_folder = webzine_root + str(feed.id) + try: + os.makedirs(feed_folder) + except OSError: + # directories already exists (not a problem) + pass + + index += """ <li><a href="%s">%s</a></li>\n""" % (feed.id, feed.title) + + posts = HTML_HEADER(feed.title, "../style.css") + posts += """<h1>Articles of the feed <a href="%s">%s</a></h1>\n""" % (feed.site_link, feed.title) + posts += """<p>%s articles.</p>\n""" % (format(len(feed.articles.all()), ",d"),) + + for article in feed.articles: + + post_file_name = os.path.normpath(feed_folder + "/" + str(article.id) + ".html") + feed_index = os.path.normpath(feed_folder + "/index.html") + + posts += article.date.ctime() + " - " + """<a href="./%s.html">%s</a>""" % \ + (article.id, article.title[:150]) + "<br />\n" + + a_post = HTML_HEADER(article.title, "../style.css") + a_post += '<div style="width:60%; overflow:hidden; text-align:justify; margin:0 auto">\n' + a_post += """<h1><a href="%s">%s</a></h1>\n<br />""" % \ + (article.link, article.title) + a_post += article.content + a_post += "</div>\n<hr />\n" + a_post += """<br />\n<a href="%s">Complete story</a>\n<br />\n""" % (article.link,) + a_post += HTML_FOOTER + + with open(post_file_name, "w") as f: + f.write(a_post) + + posts += HTML_FOOTER + if len(feed.articles.all()) != 0: + with open(feed_index, "w") as f: + f.write(posts) + + index += "</ul>\n" + index += "<p>" + time.strftime("Generated on %d %b %Y at %H:%M.") + "</p>\n" + index += HTML_FOOTER + with open(webzine_root + "index.html", "w") as f: + f.write(index) + with open(webzine_root + "style.css", "w") as f: + f.write(CSS) + + archive_file_name = datetime.now().strftime('%Y-%m-%d') + '.tar.gz' + with tarfile.open(conf.WEBZINE_ROOT + archive_file_name, "w:gz") as tar: + tar.add(webzine_root, arcname=os.path.basename(webzine_root)) + + shutil.rmtree(webzine_root) + + with open(conf.WEBZINE_ROOT + archive_file_name, 'rb') as export_file: + return export_file.read(), archive_file_name + +def export_json(user): + """ + Export all articles of 'user' in JSON. + """ + result = [] + for feed in user.feeds: + result.append({ + "title": feed.title, + "description": feed.description, + "link": feed.link, + "site_link": feed.site_link, + "enabled": feed.enabled, + "created_date": feed.created_date.strftime('%s'), + "articles": [ { + "title": article.title, + "link": article.link, + "content": article.content, + "readed": article.readed, + "like": article.like, + "date": article.date.strftime('%s'), + "retrieved_date": article.retrieved_date.strftime('%s') + } + for article in feed.articles + ] + }) + + return jsonify(result=result) |