import os import cardstring,gamesort,skeleton,variables from pathlib import Path from datetime import datetime,timedelta """ Generates backlog page """ home = str(Path.home()) def backlog(local=False): # delete existing file if not os.path.isdir("build/backlog"): os.mkdir("build/backlog") if os.path.exists("build/backlog/index.html"): os.remove("build/backlog/index.html") # write header skeleton.headerwrite("build/backlog/index.html","backlog",local) output = "build/backlog/index.html" filewrite = open(output, "a") filewrite.write(" <section>\n <div>\n <h1>Now Playing</h1>\n <div class=\"now-playing\">\n") playingnow = [] def nowplaying(): for console in gamesort.consolelists: if len(console["games"]) > 0: thegame = (console["games"])[-1] try: if thegame["gameplay"] > (datetime.now() - timedelta(days=180)): try: if thegame["completed"]: if thegame["completed"] >= thegame["gameplay"]: playing = False else: playing = True except: try: if thegame["beaten"]: if thegame["beaten"] >= thegame["gameplay"]: playing = False else: playing = True except: playing = True else: playing = False except: playing = False if playing == True: playingnow.append(thegame) nowplaying() playingnow = sorted(playingnow,key=lambda d: d["lastupdate"],reverse=True) for game in playingnow: if playingnow.index(game) == 0: filewrite.write(cardstring.playcard(game,local)) else: filewrite.write(cardstring.playcard(game,local,True)) filewrite.write(" </div>\n") # BACKLOG BREAKDOWN filewrite.write(" <h1>Backlog Breakdown</h1>\n <div class=\"backlog-breakdown\">\n <div class=\"backlog-charts\">\n <div class=\"mem-sum\">\n <div class=\"donut\">\n <svg viewBox=\"0 0 42 42\">\n <a href=\"") if local: filewrite.write(variables.localpath + "build/library/index.html") else: filewrite.write(variables.serverpath + "library") filewrite.write("\"><text x=\"21\" y=\"17.5\" style=\"font-size: 3.5px; opacity: 0.75; text-anchor: middle;\">Total Games</text>\n <text x=\"21\" y=\"27\" style=\"font-size: 10px; text-anchor: middle;\">" + str(len(gamesort.games)) + "</text>\n <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"4\" stroke=\"#000000c0\" fill=\"transparent\">\n </circle>\n") backlog = gamesort.unfinished(gamesort.games) + gamesort.unplayed(gamesort.games) takeup = 100 if gamesort.unplayed(gamesort.games) > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(200, 30%, 30%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(takeup) + " 100\">\n </circle>\n") takeup = takeup - round(((gamesort.unplayed(gamesort.games)/gamesort.total(gamesort.games))*100),1) if gamesort.unfinished(gamesort.games) > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(0, 38%, 35%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(takeup) + " 100\">\n </circle>\n") takeup = takeup - round(((gamesort.unfinished(gamesort.games)/gamesort.total(gamesort.games))*100),1) if gamesort.beaten(gamesort.games) > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(0, 0%, 82%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(takeup) + " 100\">\n </circle>\n") takeup = takeup - round(((gamesort.beaten(gamesort.games)/gamesort.total(gamesort.games))*100),1) if gamesort.completed(gamesort.games) > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(48, 75%, 70%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(takeup) + " 100\">\n </circle>\n") takeup = takeup - round(((gamesort.completed(gamesort.games)/gamesort.total(gamesort.games))*100),1) if gamesort.endless(gamesort.games) > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(275, 39%, 32%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(takeup) + " 100\">\n </circle>\n") yeargames = 0 yearplaying = 0 for game in gamesort.games: if game["initialdate"].year == int(gamesort.thisyear): try: if game["gameplay"]: if game["id"] not in variables.endlessgames: yeargames += 1 except: yeargames += 1 for game in gamesort.games: try: if game["beaten"].year == int(gamesort.thisyear): yeargames -= 1 except: try: if game["completed"].year == int(gamesort.thisyear): yeargames -= 1 except: pass filewrite.write(" </a></svg>\n </div>\n <div class=\"donut\">\n <svg viewBox=\"0 0 42 42\">\n <a href=\"") if local: filewrite.write(variables.localpath + "build/history/index.html") else: filewrite.write(variables.serverpath + "history") filewrite.write("\"><text x=\"21\" y=\"17.5\" style=\"font-size: 3.5px; opacity: 0.75; text-anchor: middle;\">" + gamesort.thisyear + " Backlog</text>\n <text x=\"21\" y=\"27\" style=\"font-size: 10px; text-anchor: middle;\">") if yeargames > 0: filewrite.write("⬆") elif yeargames < 0: filewrite.write("⬇") filewrite.write(str(abs(yeargames)) + "</text>\n <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"4\" stroke=\"#000000c0\" fill=\"transparent\">\n </circle>\n") yearbacklog = [] for game in gamesort.games: try: if game["completed"].year == int(gamesort.thisyear): yearbacklog.append(game) except: try: if game["beaten"].year == int(gamesort.thisyear): yearbacklog.append(game) except: if game["initialdate"].year == int(gamesort.thisyear): yearbacklog.append(game) yearcompleted = 0 yearbeaten = 0 yearendless = 0 yearunfinished = 0 yeartotal = len(yearbacklog) if yeartotal > 0: for game in yearbacklog: try: if game["completed"]: yearcompleted += 1 except: try: if game["beaten"]: yearbeaten += 1 except: try: if game["gameplay"]: if game["id"] in variables.endlessgames: yearendless += 1 else: yearunfinished += 1 except: pass yearunplayed = yeartotal - (yearcompleted + yearbeaten + yearunfinished + yearendless) yeartakeup = 100 if yearunplayed > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(200, 30%, 30%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(yeartakeup) + " 100\">\n </circle>\n") yeartakeup = yeartakeup - round(((yearunplayed/yeartotal)*100),1) if yearunfinished > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(0, 38%, 35%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(yeartakeup) + " 100\">\n </circle>\n") yeartakeup = yeartakeup - round(((yearunfinished/yeartotal)*100),1) if yearbeaten > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(0, 0%, 82%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(yeartakeup) + " 100\">\n </circle>\n") yeartakeup = yeartakeup - round(((yearbeaten/yeartotal)*100),1) if yearcompleted > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(48, 75%, 70%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(yeartakeup) + " 100\">\n </circle>\n") yeartakeup = yeartakeup - round(((yearcompleted/yeartotal)*100),1) if yearendless > 0: filewrite.write(" <circle id=\"circle\" r=\"15.91549430918954\" cy=\"21\" cx=\"21\" stroke-width=\"3\" stroke=\"hsla(275, 39%, 32%, 0.9)\" fill=\"transparent\" stroke-dasharray=\"" + str(yeartakeup) + " 100\">\n </circle>\n") filewrite.write(" </a></svg>\n </div>\n </div>\n <div class=\"status-tally\">\n <div class=\"backlog-tally\">\n <div style=\"width: " + str(round(((backlog/gamesort.total(gamesort.games))*100),1)) + "%;\">") if ((backlog/gamesort.total(gamesort.games))*100) > 50: filewrite.write("\n <span>Total Backlog · " + str(backlog) + " · " + str(round(((backlog/gamesort.total(gamesort.games))*100),1)) + "%</span>") filewrite.write("\n </div>\n <div style=\"width: " + str(100 - round(((backlog/gamesort.total(gamesort.games))*100),1)) + "%;\">") if ((backlog/gamesort.total(gamesort.games))*100) <= 50: filewrite.write("\n <span>Active Backlog · " + str(backlog) + " · " + str(round(((backlog/gamesort.total(gamesort.games))*100),1)) + "%</span>") filewrite.write("\n </div>\n </div>\n") compare = [] compare.append(gamesort.unplayed(gamesort.games)) compare.append(gamesort.unfinished(gamesort.games)) compare.append(gamesort.beaten(gamesort.games)) compare.append(gamesort.completed(gamesort.games)) compare.append(gamesort.endless(gamesort.games)) maxvalue = max(compare) if gamesort.unplayed(gamesort.games) / maxvalue > 0.5: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-unplayed/index.html") else: filewrite.write(variables.serverpath + "library/all-unplayed") filewrite.write("\">\n <div>" + str(gamesort.unplayed(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("UP.png\">\n </div>\n <div>\n <div class=\"Unplayed\" style=\"width: calc(100% * (" + str(gamesort.unplayed(gamesort.games)) + " / " + str(maxvalue) + "));\">" + str(round(((gamesort.unplayed(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Unplayed</div>\n </div>\n </a>\n") else: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-unplayed/index.html") else: filewrite.write(variables.serverpath + "library/all-unplayed") filewrite.write("\">\n <div>" + str(gamesort.unplayed(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("UP.png\">\n </div>\n <div>\n <div class=\"Unplayed\" style=\"width: calc(100% * (" + str(gamesort.unplayed(gamesort.games)) + " / " + str(maxvalue) + "));\">\n </div>\n <div class=\"borderless\">" + str(round(((gamesort.unplayed(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Unplayed</div>\n </div>\n </a>\n") if gamesort.unfinished(gamesort.games) / maxvalue > 0.5: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-unfinished/index.html") else: filewrite.write(variables.serverpath + "library/all-unfinished") filewrite.write("\">\n <div>" + str(gamesort.unfinished(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("UF.png\">\n </div>\n <div>\n <div class=\"Unfinished\" style=\"width: calc(100% * (" + str(gamesort.unfinished(gamesort.games)) + " / " + str(maxvalue) + "));\">" + str(round(((gamesort.unfinished(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Unfinished</div>\n </div>\n </a>\n") else: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-unfinished/index.html") else: filewrite.write(variables.serverpath + "library/all-unfinished") filewrite.write("\">\n <div>" + str(gamesort.unfinished(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("UF.png\">\n </div>\n <div>\n <div class=\"Unfinished\" style=\"width: calc(100% * (" + str(gamesort.unfinished(gamesort.games)) + " / " + str(maxvalue) + "));\">\n </div>\n <div class=\"borderless\">" + str(round(((gamesort.unfinished(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Unfinished</div>\n </div>\n </a>\n") if gamesort.beaten(gamesort.games) / maxvalue > 0.5: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-beaten/index.html") else: filewrite.write(variables.serverpath + "library/all-beaten") filewrite.write("\">\n <div>" + str(gamesort.beaten(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("B.png\">\n </div>\n <div>\n <div class=\"Beaten\" style=\"width: calc(100% * (" + str(gamesort.beaten(gamesort.games)) + " / " + str(maxvalue) + "));\">" + str(round(((gamesort.beaten(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Beaten</div>\n </div>\n </a>\n") else: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-beaten/index.html") else: filewrite.write(variables.serverpath + "library/all-beaten") filewrite.write("\">\n <div>" + str(gamesort.beaten(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("B.png\">\n </div>\n <div>\n <div class=\"Beaten\" style=\"width: calc(100% * (" + str(gamesort.beaten(gamesort.games)) + " / " + str(maxvalue) + "));\">\n </div>\n <div class=\"borderless\">" + str(round(((gamesort.beaten(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Beaten</div>\n </div>\n </a>\n") if gamesort.completed(gamesort.games) / maxvalue > 0.5: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-completed/index.html") else: filewrite.write(variables.serverpath + "library/all-completed") filewrite.write("\">\n <div>" + str(gamesort.completed(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("C.png\">\n </div>\n <div>\n <div class=\"Completed\" style=\"width: calc(100% * (" + str(gamesort.completed(gamesort.games)) + " / " + str(maxvalue) + "));\">" + str(round(((gamesort.completed(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Completed</div>\n </div>\n </a>\n") else: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-completed/index.html") else: filewrite.write(variables.serverpath + "library/all-completed") filewrite.write("\">\n <div>" + str(gamesort.completed(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("C.png\">\n </div>\n <div>\n <div class=\"Completed\" style=\"width: calc(100% * (" + str(gamesort.completed(gamesort.games)) + " / " + str(maxvalue) + "));\">\n </div>\n <div class=\"borderless\">" + str(round(((gamesort.completed(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Completed</div>\n </div>\n </a>\n") if gamesort.endless(gamesort.games) / maxvalue > 0.5: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-endless/index.html") else: filewrite.write(variables.serverpath + "library/all-endless") filewrite.write("\">\n <div>" + str(gamesort.endless(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("E.png\">\n </div>\n <div>\n <div class=\"Endless\" style=\"width: calc(100% * (" + str(gamesort.endless(gamesort.games)) + " / " + str(maxvalue) + "));\">" + str(round(((gamesort.endless(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Endless</div>\n </div>\n </a>\n") else: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/all-endless/index.html") else: filewrite.write(variables.serverpath + "library/all-endless") filewrite.write("\">\n <div>" + str(gamesort.endless(gamesort.games)) + "</div>\n <div>\n <img src=\"") if local: filewrite.write(variables.localpath + "build/") else: filewrite.write(variables.serverpath) filewrite.write("E.png\">\n </div>\n <div>\n <div class=\"Endless\" style=\"width: calc(100% * (" + str(gamesort.endless(gamesort.games)) + " / " + str(maxvalue) + "));\">\n </div>\n <div class=\"borderless\">" + str(round(((gamesort.endless(gamesort.games)/gamesort.total(gamesort.games))*100),1)) + "% Endless</div>\n </div>\n </a>\n") filewrite.write(" </div>\n </div>\n </div>\n") # PLATFORM SUMMARY filewrite.write(" <h1>Platform Summary</h1>\n <div class=\"platform-summary\">\n") listofconsoles = sorted(variables.consoles,key=lambda d: d["name"]) for console in listofconsoles: consolegames = [] for game in gamesort.games: if game["console"] == console["code"]: consolegames.append(game) ccompleted = 0 cbeaten = 0 cendless = 0 cunfinished = 0 ctotal = len(consolegames) if ctotal > 0: filewrite.write(" <div class=\"platform-card\">\n <a href=\"") if local: filewrite.write(variables.localpath + "build/library/" + console["shortname"].lower() + "-all/index.html") else: filewrite.write(variables.serverpath + "library/" + console["shortname"].lower() + "-all") filewrite.write("\" class=\"title\">" + console["name"] + "</a>\n <a href=\"") if local: filewrite.write(variables.localpath + "build/library/" + console["shortname"].lower() + "-all/index.html") else: filewrite.write(variables.serverpath + "library/" + console["shortname"].lower() + "-all") filewrite.write("\"class=\"abbr\">" + console["shortname"] + "</a>\n <div class=\"bars\">\n") for game in consolegames: try: if game["completed"]: ccompleted += 1 except: try: if game["beaten"]: cbeaten += 1 except: try: if game["gameplay"]: if game["id"] in variables.endlessgames: cendless += 1 else: cunfinished += 1 except: pass cunplayed = ctotal - (ccompleted + cbeaten + cunfinished + cendless) if cunplayed > 0: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/" + console["shortname"].lower() + "-unplayed/index.html") else: filewrite.write(variables.serverpath + "library/" + console["shortname"].lower() + "-unplayed") filewrite.write("\" class=\"unplayed\" title=\"Unplayed\" style=\"flex: " + str(cunplayed) + " 1 0%;\">" + str(cunplayed) + "</a>\n") if cunfinished > 0: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/" + console["shortname"].lower() + "-unfinished/index.html") else: filewrite.write(variables.serverpath + "library/" + console["shortname"].lower() + "-unfinished") filewrite.write("\" class=\"unfinished\" title=\"Unfinished\" style=\"flex: " + str(cunfinished) + " 1 0%;\">" + str(cunfinished) + "</a>\n") if cbeaten > 0: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/" + console["shortname"].lower() + "-beaten/index.html") else: filewrite.write(variables.serverpath + "library/" + console["shortname"].lower() + "-beaten") filewrite.write("\"class=\"beaten\" title=\"Beaten\" style=\"flex: " + str(cbeaten) + " 1 0%;\">" + str(cbeaten) + "</a>\n") if ccompleted > 0: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/" + console["shortname"].lower() + "-completed/index.html") else: filewrite.write(variables.serverpath + "library/" + console["shortname"].lower() + "-completed") filewrite.write("\" class=\"completed\" title=\"Completed\" style=\"flex: " + str(ccompleted) + " 1 0%;\">" + str(ccompleted) + "</a>\n") if cendless > 0: filewrite.write(" <a href=\"") if local: filewrite.write(variables.localpath + "build/library/" + console["shortname"].lower() + "-endless/index.html") else: filewrite.write(variables.serverpath + "library/" + console["shortname"].lower() + "-endless") filewrite.write("\" class=\"endless\" title=\"Endless\" style=\"flex: " + str(cendless) + " 1 0%;\">" + str(cendless) + "</a>\n") filewrite.write(" </div>\n <a href=\"") if local: filewrite.write(variables.localpath + "build/library/" + console["shortname"].lower() + "-all/index.html") else: filewrite.write(variables.serverpath + "library/" + console["shortname"].lower() + "-all") filewrite.write("\" class=\"total\">" + str(ctotal) + "\n <span>Total</span>\n </a>\n </div>\n") filewrite.write(" </div>\n </div>\n </div>\n") filewrite.close() skeleton.footerwrite("build/backlog/index.html") if __name__ == "__main__": backlog(True)