Raw source file available here .
from drstats.devrant import Devrant
from drstats.db import get_db
import json
import asyncio
from pprint import pprint as pp
import requests
dr = Devrant()
db = get_db()
def plain_object(obj):
for key, value in obj.items():
if isinstance(value, list) or isinstance(value, dict):
value = json.dumps(value)
obj[key] = value
return obj
from datetime import datetime
def timestamp_to_string(timestamp):
return datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S")
async def get_recent_rants(start_from=1, page_size=10):
loop = asyncio.get_running_loop()
page = 0
while True:
def get_rants():
return dr.get_rants("recent", page_size, start_from)["rants"]
rants = await asyncio.wait_for(loop.run_in_executor(None,get_rants), 15)
page += 1
for rant in rants:
if rant is None:
break
rant["tags"] = json.dumps("tags" in rant and rant["tags"] or "")
rant["created"] = timestamp_to_string(rant["created_time"])
rant = plain_object(rant)
yield rant
start_from += page_size
async def _sync_rants(start_from, page_size, count):
async for rant in get_recent_rants(start_from, page_size):
start_from += page_size
count += 1
rant["tags"] = json.dumps(rant["tags"])
db["rants"].upsert(rant, ["id"])
print(f"Upserted {count} rant(s).")
return count
async def sync_rants():
count = 0
start_from = 0
page_size = 20
while True:
try:
count += await asyncio.wait_for(
_sync_rants(start_from, page_size, count), 5
)
start_from += page_size
except Exception as ex:
print(ex)
print(
"If exception described above is an timeout related error, it's due ratelimiting and considered OK."
)
break
async def sync_comments():
comments_synced = 0
rants_synced = 0
for rant in db["rants"].find(order_by="-id"):
rants_synced += 1
try:
comments = dr.get_rant(rant["id"]).get("comments", [])
except Exception as ex:
print(ex)
print("Sleeping for a second..")
await asyncio.sleep(1)
continue
for comment in comments:
comments_synced += 1
comment["created"] = timestamp_to_string(comment["created_time"])
comment = plain_object(comment)
comment["rant_id"] = rant["id"]
db["comments"].upsert(comment, ["id"])
print(f"Synced {rants_synced} rants with {comments_synced} comments.")
def sync():
print(asyncio.run(sync_comments()))
print(asyncio.run(sync_rants()))