diff --git a/api/api/__init__.py b/api/api/__init__.py index 1b9cb10..5caf385 100644 --- a/api/api/__init__.py +++ b/api/api/__init__.py @@ -1,6 +1,7 @@ import os from flask import Flask +from flask_cors import CORS def create_app(test_config=None): @@ -29,4 +30,6 @@ def create_app(test_config=None): app.register_blueprint(feed.bp) + CORS(app) + return app diff --git a/api/api/feed.py b/api/api/feed.py index 04720ee..f1deead 100644 --- a/api/api/feed.py +++ b/api/api/feed.py @@ -2,7 +2,6 @@ from datetime import datetime import validators from flask import Blueprint, jsonify, make_response, render_template, request -from werkzeug.exceptions import HTTPException from api.db import get_db @@ -54,7 +53,13 @@ def parse_page(): raise InvalidParameters("Incorrect URL") feed = scrape(args) - rss_xml = render_template("rss.xml", feed=feed, build_date=datetime.now()) - response = make_response(rss_xml) - response.headers["Content-Type"] = "application/rss+xml" - return response + + if args.get("format") and args.get("format") == 'json': + response = make_response(feed.to_json()) + response.headers["Content-Type"] = "application/json" + return response + else: + rss_xml = render_template("rss.xml", feed=feed, build_date=datetime.now()) + response = make_response(rss_xml) + response.headers["Content-Type"] = "application/rss+xml" + return response diff --git a/api/api/scraper.py b/api/api/scraper.py index f2fd185..55e9893 100644 --- a/api/api/scraper.py +++ b/api/api/scraper.py @@ -1,4 +1,5 @@ from datetime import datetime +import json import botasaurus as bt import dateparser @@ -23,12 +24,29 @@ class FeedItem: else: return self.title < other.title + def to_json(self): + return json.dumps( + self, + default=lambda o: o.__dict__, + sort_keys=True, + indent=4 + ) + + class Feed: def __init__(self, title, url, items): self.title = title self.url = url self.items = items + def to_json(self): + return json.dumps( + self, + default=lambda o: o.__dict__, + sort_keys=True, + indent=4 + ) + @bt.request(output=None) diff --git a/api/poetry.lock b/api/poetry.lock index 38df1e9..a04cf00 100644 --- a/api/poetry.lock +++ b/api/poetry.lock @@ -423,6 +423,20 @@ Werkzeug = ">=3.0.0" async = ["asgiref (>=3.2)"] dotenv = ["python-dotenv"] +[[package]] +name = "flask-cors" +version = "4.0.1" +description = "A Flask extension adding a decorator for CORS support" +optional = false +python-versions = "*" +files = [ + {file = "Flask_Cors-4.0.1-py2.py3-none-any.whl", hash = "sha256:f2a704e4458665580c074b714c4627dd5a306b333deb9074d0b1794dfa2fb677"}, + {file = "flask_cors-4.0.1.tar.gz", hash = "sha256:eeb69b342142fdbf4766ad99357a7f3876a2ceb77689dc10ff912aac06c389e4"}, +] + +[package.dependencies] +Flask = ">=0.9" + [[package]] name = "flask-sqlalchemy" version = "3.1.1" @@ -1194,4 +1208,4 @@ h11 = ">=0.9.0,<1" [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "d0e30c9d7e8186fec20b1716f1a47e7e759e26cd68c5af13bd1ef4b9259426dd" +content-hash = "5daa79623cbf7897be36e0f03161d313b789b393341f1848daaf2c1d0013aed8" diff --git a/api/pyproject.toml b/api/pyproject.toml index 8c26b42..4a64fcf 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -16,6 +16,7 @@ requests = "^2.31.0" botasaurus = "^4.0.14" dateparser = "^1.2.0" validators = "^0.28.1" +flask-cors = "^4.0.1" [build-system]