Merge pull request 'reddit-support' (#1) from reddit-support into master
Reviewed-on: #1
This commit is contained in:
commit
1749a8659a
3
.gitignore
vendored
3
.gitignore
vendored
@ -128,4 +128,5 @@ dmypy.json
|
|||||||
# Pyre type checker
|
# Pyre type checker
|
||||||
.pyre/
|
.pyre/
|
||||||
setup.py
|
setup.py
|
||||||
utils
|
utils
|
||||||
|
praw.ini
|
||||||
|
2270
poetry.lock
generated
2270
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
@ -11,6 +11,7 @@ httpx = "^0.23.0"
|
|||||||
click = "^8.1.3"
|
click = "^8.1.3"
|
||||||
rich = "^12.5.1"
|
rich = "^12.5.1"
|
||||||
markdownify = "^0.11.6"
|
markdownify = "^0.11.6"
|
||||||
|
praw = "^7.7.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
poetry = "^1.1.14"
|
poetry = "^1.1.14"
|
||||||
|
97
src/cli.py
97
src/cli.py
@ -6,14 +6,15 @@ import uuid
|
|||||||
|
|
||||||
import click
|
import click
|
||||||
import httpx
|
import httpx
|
||||||
|
from praw import Reddit
|
||||||
from rich import pretty
|
from rich import pretty
|
||||||
from rich.status import Status
|
from rich.status import Status
|
||||||
from rich.traceback import install
|
from rich.traceback import install
|
||||||
from shiv.bootstrap import current_zipfile
|
from shiv.bootstrap import current_zipfile
|
||||||
|
|
||||||
import src
|
import src
|
||||||
from src.helpers import flip_char
|
from src.helpers import flip_char, load_config, write_config
|
||||||
from src.joplin import process_joplin_posts
|
from src.joplin import process_joplin_posts, get_folders, BASE_URL
|
||||||
from src.art import BANNERS
|
from src.art import BANNERS
|
||||||
|
|
||||||
|
|
||||||
@ -115,6 +116,98 @@ def beautify(words: list[str]):
|
|||||||
click.echo("".join(new_beautiful_string))
|
click.echo("".join(new_beautiful_string))
|
||||||
|
|
||||||
|
|
||||||
|
@main.command()
|
||||||
|
def get_saved_from_reddit() -> None:
|
||||||
|
"""Get saved posts from reddit."""
|
||||||
|
|
||||||
|
def _process(item):
|
||||||
|
fullname = item.fullname
|
||||||
|
if fullname.startswith("t3"):
|
||||||
|
# we got a post
|
||||||
|
title = f"{item.subreddit.display_name} - {item.title}"
|
||||||
|
body = item.selftext if item.selftext else item.url
|
||||||
|
elif fullname.startswith("t1"):
|
||||||
|
# comment time
|
||||||
|
try:
|
||||||
|
author_name = item.author.name
|
||||||
|
except AttributeError:
|
||||||
|
author_name = "[deleted]"
|
||||||
|
title = (
|
||||||
|
f"{item.submission.subreddit.display_name} - {item.submission.title}"
|
||||||
|
)
|
||||||
|
body = f"Comment from {author_name}:\n\n{item.body}"
|
||||||
|
else:
|
||||||
|
click.echo(f"Not sure how to process https://reddit.com{item.permalink}")
|
||||||
|
return
|
||||||
|
|
||||||
|
if item.over_18:
|
||||||
|
title = "🔴 " + title
|
||||||
|
body = "https://reddit.com" + item.permalink + "\n\n" + body
|
||||||
|
|
||||||
|
joplin = BASE_URL + cfg["JOPLIN_PORT"]
|
||||||
|
notes_url = joplin + f"/notes/?token={cfg.get('JOPLIN_TOKEN')}"
|
||||||
|
click.echo(f"Processing {title}...")
|
||||||
|
httpx.post(
|
||||||
|
notes_url,
|
||||||
|
json={
|
||||||
|
"title": title,
|
||||||
|
"body": body,
|
||||||
|
"parent_id": cfg.get("joplin_saved_posts_folder_id"),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
item.unsave()
|
||||||
|
|
||||||
|
cfg = load_config()
|
||||||
|
# because 2fa is enabled, we have to get the code first
|
||||||
|
twofa_code = click.prompt("What's the current 2fa code?", type=str)
|
||||||
|
if not cfg.get("REDDIT_CLIENT_ID"):
|
||||||
|
cfg["REDDIT_CLIENT_ID"] = ""
|
||||||
|
if not cfg.get("REDDIT_CLIENT_SECRET"):
|
||||||
|
cfg["REDDIT_CLIENT_SECRET"] = ""
|
||||||
|
if not cfg.get("REDDIT_PASSWORD"):
|
||||||
|
cfg["REDDIT_PASSWORD"] = ""
|
||||||
|
if not cfg.get("REDDIT_USERNAME"):
|
||||||
|
cfg["REDDIT_USERNAME"] = ""
|
||||||
|
if not cfg.get("joplin_saved_posts_folder_id"):
|
||||||
|
cfg["joplin_saved_posts_folder_id"] = ""
|
||||||
|
|
||||||
|
write_config(cfg)
|
||||||
|
|
||||||
|
username = cfg.get("REDDIT_USERNAME", "")
|
||||||
|
|
||||||
|
r = Reddit(
|
||||||
|
client_id=cfg.get("REDDIT_CLIENT_ID", ""),
|
||||||
|
client_secret=cfg.get("REDDIT_CLIENT_SECRET", ""),
|
||||||
|
username=username,
|
||||||
|
password=f"{cfg.get('REDDIT_PASSWORD', '')}:{twofa_code}",
|
||||||
|
user_agent=f"getter of saved posts, u/{username}",
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
r.user.me()
|
||||||
|
except Exception as e:
|
||||||
|
click.echo(f"Cannot connect to reddit: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not cfg.get("joplin_saved_posts_folder_id"):
|
||||||
|
folders = get_folders()
|
||||||
|
click.echo("Pick the folder that I should write your saved posts to:")
|
||||||
|
for count, option in enumerate(folders["items"]):
|
||||||
|
click.echo(f"{count} - {option['title']}")
|
||||||
|
folder_position = click.prompt("Number of folder?", type=int)
|
||||||
|
folder_name = folders["items"][folder_position]["title"]
|
||||||
|
folder_id = folders["items"][folder_position]["id"]
|
||||||
|
|
||||||
|
click.echo(f"Got it, will write to {folder_name}, ID {folder_id}.")
|
||||||
|
cfg["joplin_saved_posts_folder_id"] = folder_id
|
||||||
|
write_config(cfg)
|
||||||
|
|
||||||
|
for _ in range(10):
|
||||||
|
click.echo("Getting new posts...")
|
||||||
|
for item in r.user.me().saved(limit=None):
|
||||||
|
_process(item)
|
||||||
|
|
||||||
|
|
||||||
def update_from_gitea():
|
def update_from_gitea():
|
||||||
"""Get the newest release from Gitea and install it."""
|
"""Get the newest release from Gitea and install it."""
|
||||||
status = Status("Checking for new release...")
|
status = Status("Checking for new release...")
|
||||||
|
@ -105,18 +105,20 @@ def process_joplin_posts():
|
|||||||
httpx.get(
|
httpx.get(
|
||||||
joplin
|
joplin
|
||||||
+ f"/notes/{blob['id']}?fields=body&token={c.get('JOPLIN_TOKEN')}"
|
+ f"/notes/{blob['id']}?fields=body&token={c.get('JOPLIN_TOKEN')}"
|
||||||
).json()['body'].strip()
|
)
|
||||||
|
.json()["body"]
|
||||||
|
.strip()
|
||||||
)
|
)
|
||||||
click.echo(f"Processing {url}...")
|
click.echo(f"Processing {url}...")
|
||||||
site = httpx.get(url, follow_redirects=True)
|
site = httpx.get(url, follow_redirects=True)
|
||||||
soup = bs4.BeautifulSoup(site.content, features="html5lib")
|
soup = bs4.BeautifulSoup(site.content, features="html5lib")
|
||||||
# clean up that schizz
|
# clean up that schizz
|
||||||
title = soup.title.text
|
title = soup.title.text
|
||||||
[t.extract() for t in soup(['script', 'head', 'style'])]
|
[t.extract() for t in soup(["script", "head", "style"])]
|
||||||
body = md(str(soup))
|
body = md(str(soup))
|
||||||
httpx.put(
|
httpx.put(
|
||||||
joplin + f"/notes/{blob['id']}?token={c.get('JOPLIN_TOKEN')}",
|
joplin + f"/notes/{blob['id']}?token={c.get('JOPLIN_TOKEN')}",
|
||||||
json={'title': title, 'body': body}
|
json={"title": title, "body": body},
|
||||||
)
|
)
|
||||||
|
|
||||||
click.echo(resp)
|
click.echo(resp)
|
||||||
|
Loading…
Reference in New Issue
Block a user