diff --git a/360.png b/360.png
new file mode 100644
index 0000000..3a7d379
Binary files /dev/null and b/360.png differ
diff --git a/B.png b/B.png
new file mode 100644
index 0000000..a01143c
Binary files /dev/null and b/B.png differ
diff --git a/C.png b/C.png
new file mode 100644
index 0000000..ca4f592
Binary files /dev/null and b/C.png differ
diff --git a/E.png b/E.png
new file mode 100644
index 0000000..e623c80
Binary files /dev/null and b/E.png differ
diff --git a/NDS.png b/NDS.png
new file mode 100644
index 0000000..b127d65
Binary files /dev/null and b/NDS.png differ
diff --git a/PC.png b/PC.png
new file mode 100644
index 0000000..6809a28
Binary files /dev/null and b/PC.png differ
diff --git a/PS2.png b/PS2.png
new file mode 100644
index 0000000..0d84094
Binary files /dev/null and b/PS2.png differ
diff --git a/PS3.png b/PS3.png
new file mode 100644
index 0000000..d7b6c89
Binary files /dev/null and b/PS3.png differ
diff --git a/PS5.png b/PS5.png
new file mode 100644
index 0000000..06aa3b1
Binary files /dev/null and b/PS5.png differ
diff --git a/Switch.png b/Switch.png
new file mode 100644
index 0000000..5825b47
Binary files /dev/null and b/Switch.png differ
diff --git a/UF.png b/UF.png
new file mode 100644
index 0000000..a44a235
Binary files /dev/null and b/UF.png differ
diff --git a/UP.png b/UP.png
new file mode 100644
index 0000000..4e074fa
Binary files /dev/null and b/UP.png differ
diff --git a/backloggery.css b/backloggery.css
new file mode 100644
index 0000000..7ab8a06
--- /dev/null
+++ b/backloggery.css
@@ -0,0 +1,758 @@
+a,aside,body,details,div,fieldset,figcaption,figure,footer,h1,h2,h3,html,img,input,li,main,nav,ol,p,section,select,span,summary,table,textarea,ul {
+ border:0;
+ -webkit-box-sizing:border-box;
+ box-sizing:border-box;
+ font-size:100%;
+ margin:0;
+ outline:none;
+ padding:0;
+ vertical-align:baseline
+}
+
+:root {
+ --default-base:#424957;
+ --default-secondary:#272c34;
+ --default-secondary-50:rgba(40,44,52,0.5);
+ --default-accent:#f58d47;
+ --default-text:#fff;
+ --default-secondary-text:#fff;
+ --default-accent-text:#fff;
+ --default-accent-shadow:hsla(0,0%,0%,50%);
+ --retro-border:url(/img/border.png);
+ --active-base:var(--default-base);
+ --active-secondary:var(--default-secondary);
+ --active-secondary-50:var(--default-secondary-50);
+ --active-accent:var(--default-accent);
+ --active-text:var(--default-text);
+ --active-secondary-text:var(--default-secondary-text);
+ --active-secondary-text-25:hsla(0,0%,100%,0.25);
+ --active-accent-text:var(--default-accent-text);
+ --unplayed-color:#562929;
+ --unfinished-color:#bd7828;
+ --beaten-color:#d1d1d1;
+ --completed-color:#ecd579;
+ --endless-color:#573271;
+ --none-color:hsla(264,27%,11%,40%);
+ --follow-color:#17cf17;
+ --mention-color:#cf1717;
+ --dm-color:#cf17cf;
+ --news-color:#1742cf
+}
+
+html {
+ color:var(--active-text);
+ font-family:Lato,arial,helvetica,sans-serif;
+ font-size:.9rem;
+ overflow-x:hidden;
+ overflow-y:overlay;
+ scroll-behavior:smooth
+}
+
+body {
+ background-attachment:fixed;
+ background-color:var(--active-base);
+ margin:0;
+ padding:0
+}
+
+#app>div:last-of-type {
+ display:grid;
+ grid-gap:0 10px;
+ grid-template-columns:repeat(12,1fr);
+ grid-template-rows:auto;
+ grid-template-areas:"card card card card card card card card card card card card" "side side side side side side side side side side side side" "main main main main main main main main main main main main";
+ max-width:1200px;
+ margin: 0 auto;
+ padding:0 2vw 0 1vw
+}
+
+section {
+ padding:2vh 1vw 2vh
+}
+
+a {
+ text-decoration:none
+}
+
+.link,a {
+ color:var(--active-text)
+}
+
+img {
+ max-width:100%
+}
+
+h1,h2 {
+ font-family:Titillium Web,Tahoma,Arial,Helvetica,sans-serif;
+ font-variant:small-caps;
+ letter-spacing:2px
+}
+
+h1 {
+ border-bottom:1px solid var(--active-text);
+ font-size:18px;
+ margin:30px 0 10px;
+ padding-left:5px
+}
+
+h1:first-of-type {
+ margin:0 0 15px
+}
+
+svg,svg text {
+ fill:var(--active-text)
+}
+
+svg text {
+ font-family:Titillium Web,Tahoma,Arial,Helvetica,sans-serif
+}
+
+.decay {
+ opacity:.5
+}
+
+.decay:active,.decay:focus,.decay:focus-within,.decay:hover {
+ opacity:1
+}
+
+.tabs {
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ /* margin-top:3rem; */
+ padding:.3rem 0
+}
+
+.tabs a,.tabs div {
+ background-color:var(--active-secondary-50);
+ border-bottom:2px solid var(--active-text);
+ color:var(--active-secondary-text);
+ -webkit-box-flex:1;
+ -ms-flex:1;
+ flex:1;
+ font-family:Titillium Web,Tahoma,Arial,Helvetica,sans-serif;
+ font-size:1rem;
+ letter-spacing:1px;
+ opacity:.7;
+ padding:.5rem 0 .4rem;
+ text-align:center;
+ text-transform:uppercase;
+ white-space:nowrap
+}
+
+.tabs a:hover,.tabs div:hover {
+ opacity:1
+}
+
+.tabs a,.tabs a.router-link-active {
+ border-top:2px solid var(--active-text)
+}
+
+.tabs a.router-link-active {
+ background:var(--active-accent);
+ border-bottom:2px solid var(--active-text);
+ color:var(--active-accent-text);
+ font-weight:700;
+ opacity:1;
+ position:relative
+}
+
+.tabs a.router-link-active a {
+ border:none;
+ display:block;
+ padding-right:10%;
+ position:absolute;
+ top:-7px;
+ right:0;
+ text-align:right;
+ width:100%
+}
+
+@media screen and (max-width:700px) {
+ .tabs a {
+ font-size:.8rem
+ }
+}
+
+.Added,.unplayed,.Unplayed {
+ background-color:var(--unplayed-color)!important;
+ color:hsla(0,0%,100%,.75);
+ text-shadow:none
+}
+
+.Started,.unfinished,.Unfinished {
+ background-color:var(--unfinished-color)!important;
+ color:hsla(0,0%,100%,.75);
+ text-shadow:none
+}
+
+.Beat,.beaten,.Beaten {
+ background-color:var(--beaten-color)!important;
+ color:rgba(0,0,0,.75);
+ text-shadow:none
+}
+
+.completed,.Completed {
+ background-color:var(--completed-color)!important;
+ color:rgba(0,0,0,.75);
+ text-shadow:none
+}
+
+.endless,.Endless {
+ background-color:var(--endless-color)!important;
+ color:rgba(0,0,100%,.75);
+ text-shadow:none
+}
+
+.none,.None {
+ background-color:var(--none-color)!important;
+ text-shadow:none
+}
+
+.none,.None,.Playing {
+ color:hsla(0,0%,100%,.75)
+}
+
+.Playing {
+ background-color:#202020!important
+}
+
+.borderless {
+ border:none!important
+}
+
+.markdown {
+ padding:0 .25rem;
+ white-space:pre-wrap
+}
+
+div.profile main {
+ grid-area:main
+}
+
+@media screen and (min-width:800px) {
+ div.profile {
+ grid-template-areas:"card card card card card card card card card card card card" "side side side side main main main main main main main main"!important
+ }
+
+ .tabs {
+ margin-top:0
+ }
+
+
+}
+
+.game-item {
+ margin-bottom:-3px;
+ overflow:hidden;
+ position:relative
+}
+
+.game-item>div:first-child {
+ background-color:hsla(0,0%,100%,.05);
+ border:2px solid rgba(0,0,0,.5);
+ border-radius:4px;
+ cursor: default;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ margin-bottom:10px;
+ min-height:54px;
+ max-height:54px;
+ overflow:hidden;
+ position:relative;
+ text-align:center;
+ width:100%
+}
+
+.game-item>div:first-child>div {
+ -webkit-box-flex:1;
+ -ms-flex:1;
+ flex:1
+}
+
+.game-item>div:first-child>.platform {
+ background-color:var(--active-secondary);
+ border-radius:3px 0 0 3px;
+ color:var(--active-secondary-text);
+ min-height:50px;
+ max-width:50px;
+ overflow:hidden
+}
+
+.game-item>div:first-child>.platform img,.game-item>div:first-child>.platform p {
+ opacity:.85
+}
+
+.game-item>div:first-child>.platform img {
+ position:relative;
+ top:7px;
+ width:35px
+}
+
+.game-item>div:first-child>.platform img.bw {
+ -webkit-filter:var(--platform-bw);
+ filter:var(--platform-bw)
+}
+
+.game-item>div:first-child>.status {
+ max-width:48px;
+ padding:5px 9px
+}
+
+.game-item>div:first-child>.status img {
+ margin-top:3px;
+ max-width:32px
+}
+
+.game-item>div:first-child>.text {
+ -webkit-box-flex:5;
+ -ms-flex-positive:5;
+ flex-grow:5;
+ padding:3px 4px;
+ text-align:left
+}
+
+.game-item>div:first-child>.text>.title {
+ font-family:Titillium Web,sans-serif;
+ font-size:1.1rem;
+ line-height:1.1rem;
+ margin:0 0 -3px
+}
+
+@supports(-webkit-line-clamp:1) {
+ .game-item>div:first-child>.text>.title {
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:normal;
+ display:-webkit-box;
+ -webkit-line-clamp:1;
+ -webkit-box-orient:vertical
+ }
+
+
+}
+
+.game-item>div:first-child>.text>.markdown {
+ font-size:.7rem;
+ max-height:32px;
+ opacity:.75;
+ padding:2px 1px;
+ width:auto;
+ white-space:nowrap;
+ text-overflow:ellipsis;
+ overflow:hidden
+}
+
+@supports(-webkit-line-clamp:2) {
+ .game-item>div:first-child>.text>.markdown {
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:normal;
+ display:-webkit-box;
+ -webkit-line-clamp:2;
+ -webkit-box-orient:vertical
+ }
+
+
+}
+
+.game-item>div:first-child>.priority {
+ max-width:56px;
+ padding-right:10px;
+ text-align:center
+}
+
+.game-item>div:first-child>.priority img {
+ margin-top:3px;
+ max-width:32px;
+ opacity:.5
+}
+
+@media screen and (max-width:520px) {
+
+ .game-item>div:first-child>.text>.title {
+ font-size:1rem
+ }
+
+ .game-item>div:first-child>.status {
+ padding:5px
+ }
+
+}
+
+.donut {
+ display:block
+}
+
+.platform-card {
+ border:2px solid rgba(0,0,0,.5);
+ border-radius:6px;
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ font-weight:700;
+ margin:0 0 7px;
+ text-align:center;
+ width:100%
+}
+
+.platform-card a {
+ cursor: default;
+}
+
+.platform-card .bars {
+ border-radius:0 4px 4px 0;
+ display:-webkit-inline-box;
+ display:-ms-inline-flexbox;
+ display:inline-flex;
+ border-left:2px solid rgba(0,0,0,.5);
+ -webkit-box-flex:9;
+ -ms-flex:9;
+ flex:9
+}
+
+.platform-card .bars a {
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-pack:center;
+ -ms-flex-pack:center;
+ justify-content:center;
+ border-left:2px solid rgba(0,0,0,.5);
+ -webkit-box-flex:1;
+ -ms-flex:1;
+ flex:1;
+ font-size:20px;
+ margin:0;
+ min-width:2rem;
+ padding:0 3px;
+ -webkit-transition:-webkit-box-flex .5s ease-in-out;
+ transition:-webkit-box-flex .5s ease-in-out;
+ transition:flex .5s ease-in-out;
+ transition:flex .5s ease-in-out,-webkit-box-flex .5s ease-in-out,-ms-flex .5s ease-in-out
+}
+
+.platform-card .bars a:first-of-type {
+ border-left:0 solid rgba(0,0,0,.5)
+}
+
+.platform-card .bars a.remove_flex {
+ border:none;
+ -webkit-box-flex:0;
+ -ms-flex:0;
+ flex:0;
+ min-width:unset;
+ padding:0
+}
+
+.platform-card .abbr,.platform-card .title {
+ background:var(--active-secondary);
+ border-radius:4px 0 0 4px;
+ color:var(--active-secondary-text);
+ -webkit-box-pack:center;
+ -ms-flex-pack:center;
+ justify-content:center;
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:4;
+ -ms-flex:4;
+ flex:4;
+ font-size:17px;
+ font-weight:700;
+ min-width:50px;
+ overflow:hidden;
+ padding:5px;
+ white-space:nowrap
+}
+
+.platform-card .abbr {
+ display:none
+}
+
+.platform-card .total {
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ background:var(--active-secondary);
+ border-radius:0 4px 4px 0;
+ color:var(--active-secondary-text);
+ -webkit-box-pack:right;
+ -ms-flex-pack:right;
+ justify-content:right;
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:2;
+ -ms-flex:2;
+ flex:2;
+ font-size:17px;
+ font-weight:700;
+ overflow:hidden;
+ padding-right:10px;
+ white-space:nowrap;
+ width:100px
+}
+
+.platform-card .total span {
+ margin-left:6px
+}
+
+@media screen and (max-width:1024px) {
+ .platform-card .title {
+ display:none
+ }
+
+ .platform-card .abbr {
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:1;
+ -ms-flex:1;
+ flex:1;
+ min-width:80px
+ }
+
+ .platform-card .bars a:last-of-type {
+ width:50px
+ }
+
+ .platform-card .bars a:last-of-type span {
+ display:none
+ }
+
+
+}
+
+.backlog-breakdown {
+ display:block;
+ text-align:center;
+ -ms-flex-wrap:wrap;
+ flex-wrap:wrap
+}
+
+.backlog-breakdown .backlog-charts {
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ width:100%
+}
+
+.backlog-breakdown .mem-sum {
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:1;
+ -ms-flex:1;
+ flex:1
+}
+
+.backlog-breakdown .mem-sum .donut {
+ display:inline-block;
+ margin:0 4vw;
+ min-width:44%
+}
+
+.status-tally {
+ -webkit-box-flex:4;
+ -ms-flex:4;
+ flex:4;
+ font-size:18px;
+ margin:15px 0 25px 25px
+}
+
+.status-tally a:first-of-type div {
+ padding-top:8px!important
+}
+
+.status-tally a {
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ margin:-5px 20px -5px 0;
+ cursor: default;
+}
+
+.status-tally a div {
+ padding:1px 3px;
+ vertical-align:middle
+}
+
+.status-tally a div img {
+ max-width:32px
+}
+
+.status-tally a div:first-child {
+ text-align:right;
+ width:60px
+}
+
+.status-tally a div:nth-child(2) {
+ border-right:2px solid rgba(0,0,0,.5);
+ padding:4px 5px 4px 0;
+ width:40px
+}
+
+.status-tally a div:last-child {
+ -webkit-box-shadow:inset 7px 0 7px -5px rgba(0,0,0,.25);
+ box-shadow:inset 7px 0 7px -5px rgba(0,0,0,.25);
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ padding:4px 0;
+ width:99%
+}
+
+.status-tally a div:last-child div {
+ -webkit-animation:width_in 1s ease-in-out;
+ animation:width_in 1s ease-in-out;
+ border:2px solid rgba(0,0,0,.5);
+ border-left:none;
+ border-radius:0 4px 4px 0;
+ display:block;
+ font-size:14px;
+ font-weight:700;
+ overflow:hidden;
+ padding:7px 0 7px 7px;
+ text-align:left;
+ -webkit-transition:width .5s ease-in-out;
+ transition:width .5s ease-in-out;
+ white-space:nowrap
+}
+
+.status-tally img {
+ max-width:none;
+ position:relative;
+ top:2px
+}
+
+.status-tally .backlog-tally {
+ border:2px solid rgba(0,0,0,.5);
+ border-radius:4px;
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ margin-bottom:5px
+}
+
+.status-tally .backlog-tally div {
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ font-size:1rem;
+ font-weight:700;
+ height:2.35rem;
+ text-align:center;
+ -webkit-transition:width .5s ease-in-out;
+ transition:width .5s ease-in-out
+}
+
+.status-tally .backlog-tally div:first-of-type {
+ border-radius:4px 0 0 4px;
+ border-right:2px solid rgba(0,0,0,.5);
+ background-color:var(--active-accent);
+ color:var(--active-accent-text)
+}
+
+.status-tally .backlog-tally div:last-of-type {
+ border-radius:0 4px 4px 0;
+ background-color:var(--active-secondary);
+ color:var(--active-secondary-text)
+}
+
+.status-tally .backlog-tally div span {
+ width:100%
+}
+
+@media screen and (min-width:1024px) {
+ .backlog-breakdown,.backlog-breakdown .backlog-charts {
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex
+ }
+
+ .backlog-breakdown .backlog-charts {
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ width:100%
+ }
+
+ .backlog-breakdown .mem-sum {
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ min-width:160px;
+ max-width:160px
+ }
+
+ .backlog-breakdown .mem-sum .donut {
+ margin:0
+ }
+
+ .backlog-breakdown .mem-sum .donut:last-of-type {
+ position:relative;
+ top:-10px
+ }
+
+}
+
+.library .unibar {
+ border:2px solid rgba(0,0,0,.5);border-radius:8px;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}
+
+.library .unibar div {
+ border-left:2px solid rgba(0,0,0,.5);-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:1.25rem;font-weight:700;line-height:1.25rem;padding:.5rem;text-align:center}
+
+.library .unibar div:first-of-type {
+ background-color:var(--active-secondary);border:none;border-radius:6px 0 0 6px;color:var(--active-secondary-text);max-width:30%;padding:.5rem 1rem;white-space:nowrap}
+
+.library .unibar div:first-of-type span {
+ margin-right:1rem}
+
+.library .unibar div:last-of-type {
+ border-radius:0 6px 6px 0}
+
+.library .unibar div.unplayed {
+ background-color:var(--unplayed-color)}
+
+.library .unibar div.unfinished {
+ background-color:var(--unfinished-color)}
+
+.library .unibar div.beaten {
+ background-color:var(--beaten-color)}
+
+.library .unibar div.completed {
+ background-color:var(--completed-color)}
+
+.library .unibar div.endless {
+ background-color:var(--endless-color)}
+
+.library .library-list {
+ margin-top:20px}
+
+@media screen and (max-width:600px) {
+ .library .unibar div {
+ font-size:3vw}
+
+ .library .unibar div:first-of-type span {
+ margin-right:.5rem}
+}
diff --git a/games.py b/games.py
index b57f156..4f44a91 100644
--- a/games.py
+++ b/games.py
@@ -1,16 +1,26 @@
-import os, orgparse, re
+import orgparse,os,re
from pathlib import Path
-from datetime import datetime
+from datetime import datetime,timedelta
home = str(Path.home())
thisyear = datetime.now().strftime("%Y")
basedir = home + "/Documents/drive/org/journal/"
+if os.path.exists("backlog.html"):
+ os.remove("backlog.html")
+writeindex = open("backlog.html", "a")
+
+if os.path.exists("library.html"):
+ os.remove("library.html")
+writelibrary = open("library.html", "a")
+
year = 2016
concernedfiles = []
+endlessgames = ["the sims 4 (pc)","american truck simulator (pc)","civilization iv (pc)","final fantasy xiv (pc)","medieval ii: total war (pc)","tabletop simulator (pc)","train simulator 2020 (pc)"]
+
while year < int(thisyear) + 1:
month = 0
while month < 13:
@@ -49,22 +59,34 @@ for file in concernedfiles:
status = "existing"
console = (re.findall("\(.*\)",game.heading)[0])[1:-1]
if status == "new":
- games.append({"id":game.heading,"name":name,"initialdate":dateobj,"console":console,game.parent.heading:dateobj,"recent":game.body,"lastupdate":dateobj})
+ thedict = {"id":game.heading,"name":name,"initialdate":dateobj,"console":console,game.parent.heading:dateobj,"recent":game.body,"lastupdate":dateobj}
+ if game.parent.heading != "acquired":
+ thedict.update({"firstplayed":dateobj})
+ games.append(thedict)
else:
- thedict = {"id":game.heading,game.parent.heading:dateobj,"lastupdate":dateobj}
+ twodict = {"id":game.heading,game.parent.heading:dateobj,"lastupdate":dateobj}
if len(game.body) > 1:
- thedict.update({"recent":game.body})
- holding.append(thedict)
+ twodict.update({"recent":game.body})
+ for origgame in games:
+ if twodict["id"] == origgame["id"]:
+ try:
+ if origgame["firstplayed"]:
+ playedbefore = True
+ except:
+ playedbefore = False
+ if playedbefore == False:
+ twodict.update({"firstplayed":dateobj})
+ holding.append(twodict)
+ for gameupdate in holding:
+ for origgame in games:
+ if gameupdate["id"] == origgame["id"]:
+ gamemerge = {**origgame, **gameupdate}
+ games.remove(origgame)
+ games.insert(0,gamemerge)
+ holding.remove(gameupdate)
except:
pass
-for gameupdate in holding:
- for origgame in games:
- if gameupdate["id"] == origgame["id"]:
- gamemerge = {**origgame, **gameupdate}
- games.remove(origgame)
- games.insert(0,gamemerge)
-
games = sorted(games,key=lambda d: d["lastupdate"])
ps5list = []
@@ -107,8 +129,12 @@ for game in games:
if game["console"] == "nintendo 3ds":
threedslist.append(game)
+writeindex.write("\n\n
\n \n \n \n \n \n Selfhostery etc.\n \n \n \n \n
\n
\n \n \n")
+
# NOW PLAYING
+writeindex.write(" \n \n
Now Playing
\n
\n")
+
playingnow = []
def nowplaying(consolelist):
@@ -133,9 +159,12 @@ def nowplaying(consolelist):
state = "beaten"
except:
playing = True
- state = "playing"
+ if thegame["id"] in endlessgames:
+ state = "endless"
+ else:
+ state = "playing"
if playing:
- playingnow.append({"console":thegame["console"],"name":thegame["name"],"date":thegame["gameplay"],"state":state,"note":thegame["recent"]})
+ playingnow.append({"console":thegame["console"],"name":thegame["name"],"date":thegame["gameplay"],"state":state,"recent":thegame["recent"],"gameplay":thegame["gameplay"],"id":thegame["id"]})
except:
pass
@@ -150,32 +179,104 @@ nowplaying(xbox360list)
playingnow = sorted(playingnow,key=lambda d: d["date"],reverse=True)
-for game in playingnow:
- if len(game["note"]) > 1:
- print(game["console"] + " → " + game["name"] + " (" + game["state"] + "): " + game["note"])
- else:
- print(game["console"] + " → " + game["name"] + " (" + game["state"] + ")")
-
-# BACKLOG BREAKDOWN
+decay = False
-print("Total Games: " + str(len(games)))
-
-yeargames = 0
-for game in games:
- if int(game["initialdate"].year) == int(thisyear):
+def playcard(game,page):
+ cardstring = ""
+ if decay == True:
+ cardstring += "
\n"
+ else:
+ cardstring += "
\n"
+ cardstring += "
\n
\n
\n"
+ try:
+ if game["completed"]:
+ cardstring += "
\n"
+ except:
try:
- if game["completed"]:
- pass
+ if game["beaten"]:
+ cardstring += "
\n"
except:
try:
- if game["beaten"]:
- pass
+ if game["gameplay"]:
+ if game["id"] in endlessgames:
+ cardstring += "
\n"
+ else:
+ cardstring += "
\n"
except:
- yeargames += 1
-print(thisyear + " Backlog: " + str(yeargames))
+ cardstring += "
\n"
+ cardstring += "
\n
\n
" + game["name"] + "
\n"
+ try:
+ if len(game["recent"]) > 1:
+ cardstring += "
" + game["recent"] + "
\n"
+ except:
+ pass
+ try:
+ if game["gameplay"]:
+ try:
+ if game["completed"]:
+ if game["gameplay"] > game["completed"]:
+ if game["gameplay"] < (datetime.now() - timedelta(days=180)):
+ cardstring += "
\n
\n \n
\n"
+ else:
+ cardstring += "
\n
\n
\n
\n"
+ else:
+ cardstring += "
\n
\n \n
\n"
+ except:
+ try:
+ if game["beaten"]:
+ if game["gameplay"] > game["beaten"]:
+ if game["gameplay"] < (datetime.now() - timedelta(days=180)):
+ cardstring += "
\n
\n \n
\n"
+ else:
+ cardstring += "
\n
\n
\n
\n"
+ else:
+ cardstring += "
\n \n \n
\n"
+ except:
+ if game["gameplay"] < (datetime.now() - timedelta(days=180)):
+ if game["id"] in endlessgames:
+ cardstring += " \n
\n \n
\n"
+ else:
+ cardstring += "
\n \n
\n
\n"
+ else:
+ cardstring += " \n \n
\n
\n"
+ except:
+ cardstring += " \n \n \n
\n"
+ cardstring += " \n \n"
+ if page == "main":
+ writeindex.write(cardstring)
+ elif page == "library":
+ writelibrary.write(cardstring)
+
+for game in playingnow:
+ playcard(game,"main")
+ decay = True
+
+writeindex.write(" \n")
+
+# BACKLOG BREAKDOWN
+
+writeindex.write(" Backlog Breakdown
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n Active Backlog · " + str(backlog) + " · " + str(round(((backlog/total)*100),1)) + "%\n
\n
\n
\n
\n")
+
+compare = []
+compare.append(unplayed)
+compare.append(unfinished)
+compare.append(beaten)
+compare.append(completed)
+compare.append(endless)
+maxvalue = max(compare)
+
+if unplayed / maxvalue > 0.5:
+ writeindex.write("
\n " + str(unplayed) + "
\n \n
\n
\n \n
" + str(round(((unplayed/total)*100),1)) + "% Unplayed
\n
\n \n")
+else:
+ writeindex.write("
\n " + str(unplayed) + "
\n \n
\n
\n \n
\n
\n
" + str(round(((unplayed/total)*100),1)) + "% Unplayed
\n
\n \n")
+
+if unfinished / maxvalue > 0.5:
+ writeindex.write("
\n " + str(unfinished) + "
\n \n
\n
\n \n
" + str(round(((unfinished/total)*100),1)) + "% Unfinished
\n
\n \n")
+else:
+ writeindex.write("
\n " + str(unfinished) + "
\n \n
\n
\n \n
\n
\n
" + str(round(((unfinished/total)*100),1)) + "% Unfinished
\n
\n \n")
+
+if beaten / maxvalue > 0.5:
+ writeindex.write("
\n " + str(beaten) + "
\n \n
\n
\n \n
" + str(round(((beaten/total)*100),1)) + "% Beaten
\n
\n \n")
+else:
+ writeindex.write("
\n " + str(beaten) + "
\n \n
\n
\n \n
\n
\n
" + str(round(((beaten/total)*100),1)) + "% Beaten
\n
\n \n")
+
+if completed / maxvalue > 0.5:
+ writeindex.write("
\n " + str(completed) + "
\n \n
\n
\n \n
" + str(round(((completed/total)*100),1)) + "% Completed
\n
\n \n")
+else:
+ writeindex.write("
\n " + str(completed) + "
\n \n
\n
\n \n
\n
\n
" + str(round(((completed/total)*100),1)) + "% Completed
\n
\n \n")
+
+if endless / maxvalue > 0.5:
+ writeindex.write("
\n " + str(endless) + "
\n \n
\n
\n \n
" + str(round(((endless/total)*100),1)) + "% Endless
\n
\n \n")
+else:
+ writeindex.write("
\n " + str(endless) + "
\n \n
\n
\n \n
\n
\n
" + str(round(((endless/total)*100),1)) + "% Endless
\n
\n \n")
+
+writeindex.write("
\n
\n
")
# PLATFORM SUMMARY
-def liststats(console,consolelist):
+writeindex.write(" Platform Summary
\n \n \n \n \n \n \n \n \n\n")
# LIBRARY
-def theresults():
- newgames = sorted(games,key=lambda d: d["id"])
- for game in newgames:
- try:
- if (game["completed"]):
- print(game["console"] + " → " + game["name"] + " (completed)")
- if len(game["recent"]) > 1:
- print(game["recent"])
- except:
- try:
- if (game["beaten"]):
- print(game["console"] + " → " + game["name"] + " (beaten)")
- if len(game["recent"]) > 1:
- print(game["recent"])
- except:
- try:
- if (game["gameplay"]):
- print(game["console"] + " → " + game["name"] + " (unfinished)")
- if len(game["recent"]) > 1:
- print(game["recent"])
- except:
- print(game["console"] + " → " + game["name"] + " (unplayed)")
- print("")
+writelibrary.write("\n\n \n \n \n \n \n \n Selfhostery etc.\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n Total Found " + str(total) + "\n
\n")
+if unplayed > 0:
+ writelibrary.write("
" + str(unplayed) + "
\n")
+if unfinished > 0:
+ writelibrary.write("
" + str(unfinished) + "
\n")
+if beaten > 0:
+ writelibrary.write("
" + str(beaten) + "
\n")
+if completed > 0:
+ writelibrary.write("
" + str(completed) + "
\n")
+if endless > 0:
+ writelibrary.write("
" + str(endless) + "
\n")
+writelibrary.write("
\n
\n")
-theresults()
+newgames = sorted(games,key=lambda d: d["id"])
-# HISTORY
+decay = False
-# iterate backwards from this year to 2016
+for game in newgames:
+ playcard(game,"library")
-# if nothing in this year, "history has yet to be written"
+# HISTORY
-# else, for each year: initialdate, gameplay???, beaten, completed???
+theyear = int(thisyear)
+while theyear > 2016:
+ added = 0
+ started = 0
+ beat = 0
+ completed = 0
+ beatorcompleted = 0
+ for game in games:
+ if game["initialdate"].year == theyear:
+ added += 1
+ try:
+ if game["firstplayed"].year == theyear:
+ started += 1
+ except:
+ pass
+ try:
+ if game["beaten"].year == theyear:
+ beat += 1
+ beatorcompleted += 1
+ try:
+ if game["completed"].year == theyear:
+ completed += 1
+ except:
+ pass
+ except:
+ try:
+ if game["completed"].year == theyear:
+ completed += 1
+ beatorcompleted += 1
+ except:
+ pass
+ backlog = added - beatorcompleted
+ print(str(theyear) + " Summary")
+ if backlog > 0:
+ print("Backlog ▲ " + str(backlog))
+ elif backlog == 0:
+ print("Backlog 0")
+ elif backlog < 0:
+ print("Backlog ▼ " + str(backlog * -1))
+ print("Added " + str(added))
+ print("Started " + str(started))
+ print("Beat " + str(beat))
+ print("Completed " + str(completed))
+ yearlist = []
+ enddate = datetime.strptime((str(theyear) + "-12-31"),"%Y-%m-%d")
+ startdate = datetime.strptime((str(theyear) + "-01-01"),"%Y-%m-%d")
+ eachdate = enddate
+ while eachdate >= startdate:
+ for game in games:
+ if game["initialdate"] == eachdate:
+ yearlist.append({"date":eachdate,"name":game["name"],"console":game["console"],"action":"Added"})
+ try:
+ if game["firstplayed"] == eachdate:
+ yearlist.append({"date":eachdate,"name":game["name"],"console":game["console"],"action":"Started"})
+ except:
+ pass
+ try:
+ if game["beaten"] == eachdate:
+ yearlist.append({"date":eachdate,"name":game["name"],"console":game["console"],"action":"Beat"})
+ except:
+ pass
+ try:
+ if game["completed"] == eachdate:
+ yearlist.append({"date":eachdate,"name":game["name"],"console":game["console"],"action":"Completed"})
+ except:
+ pass
+ eachdate -= timedelta(days=1)
+ checkdate = enddate
+ for event in yearlist:
+ if checkdate != event["date"]:
+ print(event["date"].strftime("%Y-%-m-%-d"))
+ print(event["action"] + ": " + event["name"] + " (" + event["console"] + ")")
+ checkdate = event["date"]
+ theyear -= 1
diff --git a/nowplaying.png b/nowplaying.png
new file mode 100644
index 0000000..469fe82
Binary files /dev/null and b/nowplaying.png differ
diff --git a/paused.png b/paused.png
new file mode 100644
index 0000000..5af9a8d
Binary files /dev/null and b/paused.png differ