You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

166 lines
7.3 KiB
Python

import requests, datetime, os, re
from bs4 import BeautifulSoup
# presumably needed for nsfw content
login_url = "https://www.archiveofourown.org/users/login"
data = {
"user": "translinkni",
"password": "notreallyanapi"
}
if os.path.exists("ficheader.html"):
os.remove("ficheader.html")
thefile = open("ficheader.html", "a")
with requests.Session() as s:
response = s.post(login_url , data)
print("Work ID: ")
id = input()
url = "https://archiveofourown.org/works/" + str(id)
ficpage = s.get(url)
ficsoup = BeautifulSoup(ficpage.content, "html.parser")
rating = ficsoup.find("dd", class_="rating").text.strip()
if str(rating) == "General Audiences":
prazerating = "g"
elif str(rating) == "Teen And Up Audiences":
prazerating = "t"
elif str(rating) == "Mature":
prazerating = "m"
elif str(rating) == "Explicit":
prazerating = "e"
warningheader = ficsoup.find("dd", {"class":["warning", "warnings"]})
rawwarnings = warningheader.find_all("li")
warnings = []
for c in rawwarnings:
warning = c.text
warnings.append(str(warning))
prazewarnings = []
if "No Archive Warnings Apply" in warnings:
prazewarn = 0
elif "Creator Chose Not To Use Archive Warnings" in warnings:
prazewarn = 1
prazewarnings.append("miscellaneous")
else:
prazewarn = 1
if "Major Character Death" in warnings:
prazewarnings.append("character death")
if "Underage" in warnings:
prazewarnings.append("underage")
categoryheader = ficsoup.find("dd", {"class":["category", "categories"]})
rawcategories = categoryheader.find_all("li")
categories = []
for c in rawcategories:
category = c.text
categories.append(str(category))
prazegenre = []
if "Gen" in categories:
prazegenre.append("gen")
if "M/M" in categories:
prazegenre.append("slash")
if "F/M" in categories:
prazegenre.append("het")
if "F/F" in categories:
prazegenre.append("femslash")
if "Multi" in categories:
prazegenre.append("poly")
fandomheader = ficsoup.find("dd", {"class":["fandom", "fandoms"]})
rawfandoms = fandomheader.find_all("li")
fandoms = []
for c in rawfandoms:
rawfandom = str(c.text)
if rawfandom == "Final Fantasy VI":
fandom = "FF6"
elif rawfandom == "Compilation of Final Fantasy VII":
fandom = "FF7"
elif rawfandom == "Crisis Core: Final Fantasy VII":
fandom = "FF7 Crisis Core"
elif rawfandom == "Final Fantasy VII (Video Game 1997)":
fandom = "FF7"
elif rawfandom == "Final Fantasy VII Remake (Video Game 2020)":
fandom = "FF7R"
elif rawfandom == "Final Fantasy X":
fandom = "FFX"
elif rawfandom == "Final Fantasy X Series":
fandom = "FFX"
elif rawfandom == "Final Fantasy X-2":
fandom = "FFX-2"
elif rawfandom == "Final Fantasy IX":
fandom = "FF9"
else:
fandom = rawfandom
fandoms.append(fandom)
characterheader = ficsoup.find("dd", {"class":["character", "characters"]})
rawcharacters = characterheader.find_all("li")
characters = []
for c in rawcharacters:
rawcharacter = str(c.text)
cleancharacter = re.sub(r" \(.*\)","",rawcharacter)
if cleancharacter == "Locke Cole":
character = "Locke"
elif cleancharacter == "Macías \"Mash\" Rene Figaro | Sabin Rene Figaro":
character = "Sabin"
elif cleancharacter == "Celes Chere":
character = "Celes"
elif cleancharacter == "Edgar Roni Figaro":
character = "Edgar"
elif cleancharacter == "Tina Branford | Terra Branford":
character = "Terra"
elif cleancharacter == "Original Characters":
character = "OCs"
elif cleancharacter == "Original Male Character":
character = "OMC"
elif cleancharacter == "Original Female Character":
character = "OFC"
else:
character = cleancharacter
characters.append(str(character))
date = ficsoup.find("dd", class_="published").text
prazedate = datetime.datetime.strptime(str(date), "%Y-%m-%d").strftime("%-d %B %Y")
words = ficsoup.find("dd", class_="words").text
title = ficsoup.find("h2", class_="title").text.strip()
summaryheader = ficsoup.find("div", class_="summary")
summary = summaryheader.find("blockquote")
notesheader = ficsoup.find("div", class_="notes")
try:
rawnotes = str(notesheader.find("blockquote"))
except:
rawnotes = 0
if rawnotes:
notesa = re.sub(r" rel=\"nofollow\"","",rawnotes)
notesb = re.sub(r"alt=\"\[community profile\]\"","alt=\"[community profile]\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"",notesa)
notesc = re.sub(r"alt=\"\[personal profile\]\"","alt=\"[personal profile]\" style=\"vertical-align: text-bottom; border: 0; padding-right: 1px;\"",notesb)
notesd = re.sub(r"</p><p>\n<small><b>Standard note for 3sf fills:</b> Im aware that some AO3 users may not consider prompt fills “gifts”, and will take no offence if the gift is refused!</small>","",notesc)
notes = re.sub(r"\n</p>","</p>",notesd)
else:
notes = 0
masterlist = s.get("https://tre.praze.net/fic/master.html")
mastersoup = BeautifulSoup(masterlist.content, "html.parser")
ficno = int(mastersoup.find("span", class_="ficno").text.strip()) + 1
thefile.write("<div class=\"fic\" id=\"fic" + str(ficno) + "\">\n")
thefile.write(" <h1><span class=\"ficno\">" + str(ficno) + "</span> <span class=\"fictitle\">" + title + "</span></h1>\n")
thefile.write(" <ul class=\"ficmeta\">\n")
thefile.write(" <li class=\"ficdate\">" + prazedate + "</li>\n")
thefile.write(" <li class=\"wordcount\">" + str(words) + "</li>\n")
if prazerating == "g":
thefile.write(" <li class=\"rating\"><span class=\"" + prazerating + "\"/></li>\n")
else:
thefile.write(" <li class=\"rating\"><span class=\"" + prazerating + "\"/> ()</li>\n")
thefile.write(" <li class=\"fandom\">" + "/".join(fandoms) + "</li>\n")
thefile.write(" <li class=\"characters\">" + ", ".join(characters) + "</li>\n")
thefile.write(" <li class=\"genre\">" + ", ".join(prazegenre) + "</li>\n")
if prazewarn:
thefile.write(" <li class=\"warnings\">" + ", ".join(prazewarnings) + "</li>\n")
thefile.write(" </ul>\n")
thefile.write(" <p class=\"summary\">" + str(summary)[34:-18] + "</p>\n")
if notes:
thefile.write(" <p class=\"note\">" + str(notes)[34:-18] + "</p>\n")
thefile.write(" <ul class=\"ficlinks\">\n")
thefile.write(" <li class=\"ao3link\"><a href=\"https://archiveofourown.org/works/" + str(id) + "\">AO3</a></li>\n")
thefile.write(" <li class=\"prazelink\"><a href=\"files/" + str(ficno) + ".html\">HTML</a></li>\n")
thefile.write(" <li class=\"prazelink\"><a href=\"files/" + str(ficno) + ".pdf\">PDF</a></li>\n")
thefile.write(" <li class=\"prazelink\"><a href=\"files/" + str(ficno) + ".epub\">EPUB</a></li>\n")
thefile.write(" </ul>\n")
thefile.write("</div>\n")
print("File saved to " + str(os.path.abspath("ficheader.html")))