fix up the subscribe/update stuff
This commit is contained in:
parent
8a45968175
commit
73cabc2050
10 changed files with 118 additions and 74 deletions
|
@ -8,7 +8,7 @@ CELERY_ACCEPT_CONTENT = ['json']
|
||||||
CELERYBEAT_SCHEDULE = {
|
CELERYBEAT_SCHEDULE = {
|
||||||
'tick-every-5-minutes': {
|
'tick-every-5-minutes': {
|
||||||
'task': 'woodwind.tasks.tick',
|
'task': 'woodwind.tasks.tick',
|
||||||
'schedule': datetime.timedelta(seconds=30),
|
'schedule': datetime.timedelta(minutes=5),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# recommended to disable if not using -- introduces a lot of complexity
|
# recommended to disable if not using -- introduces a lot of complexity
|
||||||
|
|
|
@ -44,6 +44,13 @@ article {
|
||||||
float: left;
|
float: left;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
color: $armadillo;
|
||||||
|
border-bottom: 1px solid $armadillo;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 1.2em;
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ def process_feed_for_new_entries(feed):
|
||||||
|
|
||||||
|
|
||||||
def process_xml_feed_for_new_entries(feed):
|
def process_xml_feed_for_new_entries(feed):
|
||||||
logger.debug('updating feed: %s', feed)
|
logger.debug('fetching xml feed: %s', feed)
|
||||||
|
|
||||||
now = datetime.datetime.utcnow()
|
now = datetime.datetime.utcnow()
|
||||||
parsed = feedparser.parse(feed.feed)
|
parsed = feedparser.parse(feed.feed)
|
||||||
|
@ -71,11 +71,16 @@ def process_xml_feed_for_new_entries(feed):
|
||||||
default_author_photo = feed_props.get('logo')
|
default_author_photo = feed_props.get('logo')
|
||||||
|
|
||||||
all_uids = [e.id or e.link for e in parsed.entries]
|
all_uids = [e.id or e.link for e in parsed.entries]
|
||||||
|
if all_uids:
|
||||||
preexisting = set(row[0] for row in session.query(Entry.uid)
|
preexisting = set(row[0] for row in session.query(Entry.uid)
|
||||||
.filter(Entry.uid.in_(all_uids))
|
.filter(Entry.uid.in_(all_uids))
|
||||||
.filter(Entry.feed == feed))
|
.filter(Entry.feed == feed))
|
||||||
|
else:
|
||||||
|
preexisting = set()
|
||||||
|
|
||||||
|
logger.debug('found {} entries'.format(len(parsed.entries)))
|
||||||
for p_entry in parsed.entries:
|
for p_entry in parsed.entries:
|
||||||
|
logger.debug('processing entry {}'.format(p_entry))
|
||||||
permalink = p_entry.link
|
permalink = p_entry.link
|
||||||
uid = p_entry.id or permalink
|
uid = p_entry.id or permalink
|
||||||
|
|
||||||
|
@ -84,10 +89,10 @@ def process_xml_feed_for_new_entries(feed):
|
||||||
|
|
||||||
updated = datetime.datetime.fromtimestamp(
|
updated = datetime.datetime.fromtimestamp(
|
||||||
time.mktime(p_entry.updated_parsed)
|
time.mktime(p_entry.updated_parsed)
|
||||||
) if p_entry.updated_parsed else None
|
) if 'updated_parsed' in p_entry else None
|
||||||
published = datetime.datetime.fromtimestamp(
|
published = datetime.datetime.fromtimestamp(
|
||||||
time.mktime(p_entry.published_parsed)
|
time.mktime(p_entry.published_parsed)
|
||||||
) if p_entry.published_parsed else None
|
) if 'published_parsed' in p_entry else now
|
||||||
|
|
||||||
title = p_entry.get('title')
|
title = p_entry.get('title')
|
||||||
|
|
||||||
|
@ -125,7 +130,7 @@ def process_xml_feed_for_new_entries(feed):
|
||||||
|
|
||||||
|
|
||||||
def process_html_feed_for_new_entries(feed):
|
def process_html_feed_for_new_entries(feed):
|
||||||
logger.debug('updating feed: %s', feed)
|
logger.debug('fetching html feed: %s', feed)
|
||||||
|
|
||||||
now = datetime.datetime.utcnow()
|
now = datetime.datetime.utcnow()
|
||||||
parsed = mf2util.interpret_feed(
|
parsed = mf2util.interpret_feed(
|
||||||
|
@ -133,9 +138,12 @@ def process_html_feed_for_new_entries(feed):
|
||||||
hfeed = parsed.get('entries', [])
|
hfeed = parsed.get('entries', [])
|
||||||
|
|
||||||
all_uids = [e.get('uid') or e.get('url') for e in hfeed]
|
all_uids = [e.get('uid') or e.get('url') for e in hfeed]
|
||||||
|
if all_uids:
|
||||||
preexisting = set(row[0] for row in session.query(Entry.uid)
|
preexisting = set(row[0] for row in session.query(Entry.uid)
|
||||||
.filter(Entry.uid.in_(all_uids))
|
.filter(Entry.uid.in_(all_uids))
|
||||||
.filter(Entry.feed == feed))
|
.filter(Entry.feed == feed))
|
||||||
|
else:
|
||||||
|
preexisting = set()
|
||||||
|
|
||||||
# logger.debug('preexisting urls: %r', preexisting)
|
# logger.debug('preexisting urls: %r', preexisting)
|
||||||
|
|
||||||
|
@ -151,7 +159,7 @@ def process_html_feed_for_new_entries(feed):
|
||||||
# uid = hentry.get('uid') or uid
|
# uid = hentry.get('uid') or uid
|
||||||
entry = Entry(
|
entry = Entry(
|
||||||
feed=feed,
|
feed=feed,
|
||||||
published=hentry.get('published'),
|
published=hentry.get('published') or now,
|
||||||
updated=hentry.get('updated'),
|
updated=hentry.get('updated'),
|
||||||
uid=uid,
|
uid=uid,
|
||||||
permalink=permalink,
|
permalink=permalink,
|
||||||
|
|
|
@ -7,12 +7,19 @@
|
||||||
{% block head %}{% endblock %}
|
{% block head %}{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<main>
|
||||||
{% if current_user.is_authenticated() %}
|
{% if current_user.is_authenticated() %}
|
||||||
<div class="logged-in">{{ current_user.domain }}</div>
|
<div class="logged-in">{{ current_user.domain }}</div>
|
||||||
|
{% else %}
|
||||||
|
<form action="{{ url_for('.login') }}" method="GET">
|
||||||
|
<input type="text" name="me" placeholder="mydomain.com" />
|
||||||
|
<button type="submit">Login</button>
|
||||||
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% for message in get_flashed_messages() %}
|
{% for message in get_flashed_messages() %}
|
||||||
<div class="flash">{{ message | safe }}</div>
|
<div class="flash">{{ message | safe }}</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% block body %}{% endblock %}
|
{% block body %}{% endblock %}
|
||||||
|
</main>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
{% extends "base.jinja2" %}
|
{% extends "base.jinja2" %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
|
|
||||||
<main>
|
<form action="{{ url_for('.subscribe') }}" method="POST">
|
||||||
|
<input type="text" id="origin" name="origin" placeholder="Feed URL" />
|
||||||
|
<button type="submit" id="subscribe">Subscribe</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
{% for entry in entries %}
|
{% for entry in entries %}
|
||||||
<article>
|
<article>
|
||||||
<header>
|
<header>
|
||||||
|
@ -24,8 +28,24 @@
|
||||||
<div>
|
<div>
|
||||||
<a href="{{ entry.permalink }}">{{ entry.published }}</a>
|
<a href="{{ entry.permalink }}">{{ entry.published }}</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<form action="{{ current_user.micropub_endpoint }}" method="POST">
|
||||||
|
<input type="hidden" name="access_token" value="{{current_user.access_token}}"/>
|
||||||
|
<input type="hidden" name="h" value="entry"/>
|
||||||
|
<input type="hidden" name="like-of" value="{{ entry.permalink }}"/>
|
||||||
|
<button type="submit">Like</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<form action="{{ current_user.micropub_endpoint }}" method="POST">
|
||||||
|
<input type="hidden" name="access_token" value="{{current_user.access_token}}"/>
|
||||||
|
<input type="hidden" name="h" value="entry"/>
|
||||||
|
<input type="hidden" name="in-reply-to" value="{{ entry.permalink }}"/>
|
||||||
|
<textarea name="content"></textarea>
|
||||||
|
<button type="submit">Reply</button>
|
||||||
|
</form>
|
||||||
|
-->
|
||||||
|
|
||||||
</article>
|
</article>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</main>
|
|
||||||
|
|
||||||
{% endblock body %}
|
{% endblock body %}
|
||||||
|
|
|
@ -1,18 +1,28 @@
|
||||||
{% extends "base.jinja2" %}
|
{% extends "base.jinja2" %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
|
|
||||||
<main>
|
|
||||||
{% for feed in feeds %}
|
{% for feed in feeds %}
|
||||||
|
|
||||||
<form action="{{ url_for('.edit_feed', id=feed.id) }}" method="POST">
|
<div>
|
||||||
|
<form style="display:inline"
|
||||||
|
action="{{ url_for('.edit_feed') }}" method="POST">
|
||||||
<input type="hidden" name="id" value="{{ feed.id }}"/>
|
<input type="hidden" name="id" value="{{ feed.id }}"/>
|
||||||
<input type="text" name="name" value="{{ feed.name }}"/>
|
<input type="text" name="name" style="width:25%" value="{{ feed.name }}"/>
|
||||||
<input type="text" name="feed" value="{{ feed.feed }}"/>
|
<input type="text" name="feed" style="width:25%" value="{{ feed.feed }}"/>
|
||||||
<button type="submit">Save</button>
|
<button type="submit">Save</button>
|
||||||
</form>
|
</form>
|
||||||
|
<form style="display:inline;"
|
||||||
|
action="{{ url_for('.update_feed') }}" method="GET">
|
||||||
|
<input type="hidden" name="id" value="{{ feed.id }}"/>
|
||||||
|
<button type="submit">Update</button>
|
||||||
|
</form>
|
||||||
|
<form style="display:inline;"
|
||||||
|
action="{{ url_for('.delete_feed') }}" method="POST">
|
||||||
|
<input type="hidden" name="id" value="{{ feed.id }}"/>
|
||||||
|
<button type="submit">Delete</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</main>
|
|
||||||
|
|
||||||
{% endblock body %}
|
{% endblock body %}
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
{% extends "base.jinja2" %}
|
{% extends "base.jinja2" %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<main>
|
<form action="{{ url_for('.login') }}" method="GET">
|
||||||
<form action="{{ url_for('login') }}" method="GET">
|
|
||||||
<input type="text" name="me" placeholder="mydomain.com" />
|
<input type="text" name="me" placeholder="mydomain.com" />
|
||||||
<button type="submit">Login</button>
|
<button type="submit">Login</button>
|
||||||
</form>
|
</form>
|
||||||
</main>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{% extends "base.jinja2" %}
|
{% extends "base.jinja2" %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<main>
|
<main>
|
||||||
<form action="{{ url_for('subscribe') }}" method="POST">
|
<form action="{{ url_for('.subscribe') }}" method="POST">
|
||||||
<input type="hidden" id="origin" name="origin" value="{{ origin }}" />
|
<input type="hidden" id="origin" name="origin" value="{{ origin }}" />
|
||||||
|
|
||||||
{% for feed in feeds %}
|
{% for feed in feeds %}
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
{% extends "base.jinja2" %}
|
{% extends "base.jinja2" %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<main>
|
|
||||||
<form method="POST">
|
<form method="POST">
|
||||||
<input type="text" id="origin" name="origin" placeholder="Feed URL" />
|
<input type="text" id="origin" name="origin" placeholder="Feed URL" />
|
||||||
<button type="submit" id="subscribe">Subscribe</button>
|
<button type="submit" id="subscribe">Subscribe</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</main>
|
|
||||||
{% endblock body %}
|
{% endblock body %}
|
||||||
|
|
|
@ -15,9 +15,6 @@ ui = flask.Blueprint('ui', __name__)
|
||||||
|
|
||||||
@ui.route('/')
|
@ui.route('/')
|
||||||
def index():
|
def index():
|
||||||
import os
|
|
||||||
print('cwd', os.getcwd(), 'db', db)
|
|
||||||
|
|
||||||
if flask_login.current_user.is_authenticated():
|
if flask_login.current_user.is_authenticated():
|
||||||
feed_ids = [f.id for f in flask_login.current_user.feeds]
|
feed_ids = [f.id for f in flask_login.current_user.feeds]
|
||||||
entries = Entry.query.filter(
|
entries = Entry.query.filter(
|
||||||
|
@ -52,11 +49,12 @@ def feeds():
|
||||||
def update_feed():
|
def update_feed():
|
||||||
feed_id = flask.request.args.get('id')
|
feed_id = flask.request.args.get('id')
|
||||||
tasks.update_feed.delay(feed_id)
|
tasks.update_feed.delay(feed_id)
|
||||||
|
return flask.redirect(flask.url_for('.feeds'))
|
||||||
|
|
||||||
|
|
||||||
@ui.route('/delete_feed')
|
@ui.route('/delete_feed', methods=['POST'])
|
||||||
def delete_feed():
|
def delete_feed():
|
||||||
feed_id = flask.request.args.get('id')
|
feed_id = flask.request.form.get('id')
|
||||||
feed = Feed.query.get(feed_id)
|
feed = Feed.query.get(feed_id)
|
||||||
db.session.delete(feed)
|
db.session.delete(feed)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
@ -83,9 +81,6 @@ def edit_feed():
|
||||||
|
|
||||||
@ui.route('/login')
|
@ui.route('/login')
|
||||||
def login():
|
def login():
|
||||||
if True:
|
|
||||||
flask_login.login_user(User.query.all()[0], remember=True)
|
|
||||||
|
|
||||||
me = flask.request.args.get('me')
|
me = flask.request.args.get('me')
|
||||||
if me:
|
if me:
|
||||||
return micropub.authorize(
|
return micropub.authorize(
|
||||||
|
@ -151,21 +146,23 @@ def subscribe():
|
||||||
return flask.render_template('subscribe.jinja2')
|
return flask.render_template('subscribe.jinja2')
|
||||||
|
|
||||||
|
|
||||||
def add_subscription(origin, feed, type):
|
def add_subscription(origin, feed_url, type):
|
||||||
feed = None
|
feed = None
|
||||||
if type == 'html':
|
if type == 'html':
|
||||||
parsed = mf2util.interpret_feed(mf2py.parse(url=feed), feed)
|
flask.current_app.logger.debug('mf2py parsing %s', feed_url)
|
||||||
|
parsed = mf2util.interpret_feed(mf2py.parse(url=feed_url), feed_url)
|
||||||
name = parsed.get('name')
|
name = parsed.get('name')
|
||||||
if not name or len(name) > 140:
|
if not name or len(name) > 140:
|
||||||
p = urllib.parse.urlparse(origin)
|
p = urllib.parse.urlparse(origin)
|
||||||
name = p.netloc + p.path
|
name = p.netloc + p.path
|
||||||
feed = Feed(user=flask_login.current_user, name=name,
|
feed = Feed(user=flask_login.current_user, name=name,
|
||||||
origin=origin, feed=feed, type=type)
|
origin=origin, feed=feed_url, type=type)
|
||||||
elif type == 'xml':
|
elif type == 'xml':
|
||||||
parsed = feedparser.parse(feed)
|
flask.current_app.logger.debug('feedparser parsing %s', feed_url)
|
||||||
|
parsed = feedparser.parse(feed_url)
|
||||||
feed = Feed(user=flask_login.current_user,
|
feed = Feed(user=flask_login.current_user,
|
||||||
name=parsed.feed.title, origin=origin, feed=feed,
|
name=parsed.feed and parsed.feed.title,
|
||||||
type=type)
|
origin=origin, feed=feed_url, type=type)
|
||||||
if feed:
|
if feed:
|
||||||
db.session.add(feed)
|
db.session.add(feed)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue