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 ( )
print ( " Use title? (y/n) " )
thetitle = 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> I’ m 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 " )
if thetitle == " y " :
thefile . write ( " <h1><span class= \" ficno \" > " + str ( ficno ) + " </span> <span class= \" fictitle \" > " + title + " </span></h1> \n " )
else :
thefile . write ( " <h1><span class= \" ficno \" > " + str ( ficno ) + " </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 " ) ) )