diff --git a/.gitignore b/.gitignore
index 092a929..4006f99 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@
huso
nuts/*
+mm.cred
diff --git a/build.sh b/build.sh
index a250805..8fc9e19 100755
--- a/build.sh
+++ b/build.sh
@@ -1,2 +1,3 @@
+#!/bin/bash
date=$(date '+%Y-%m-%dT%H:%M:%S')
-go build -ldflags "-X main.buildTime=$date"
\ No newline at end of file
+go build -ldflags "-X main.buildTime=$date"
diff --git a/go.mod b/go.mod
index 633ec92..e0a9048 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ go 1.18
require (
github.com/allegro/bigcache/v3 v3.0.2
github.com/fasthttp/router v1.4.10
+ github.com/go-sql-driver/mysql v1.6.0
github.com/gookit/color v1.5.1
github.com/valyala/fasthttp v1.38.0
github.com/valyala/quicktemplate v1.7.0
diff --git a/go.sum b/go.sum
index 66ddff6..4f14043 100644
--- a/go.sum
+++ b/go.sum
@@ -11,6 +11,8 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fasthttp/router v1.4.10 h1:C8z6K1pTqhLjSv97/qCY9tZiiPT8JuFwDoO9E2HJFWQ=
github.com/fasthttp/router v1.4.10/go.mod h1:FGSUOg9SQ/tU864SfD23kG/HwfD0akXqOqhTQ27gTFQ=
+github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ=
diff --git a/huso.go b/huso.go
index 4b511e6..f7ed983 100644
--- a/huso.go
+++ b/huso.go
@@ -1,6 +1,7 @@
package main
import (
+ "database/sql"
"flag"
"fmt"
"log"
@@ -11,6 +12,7 @@ import (
"time"
"github.com/allegro/bigcache/v3"
+ _ "github.com/go-sql-driver/mysql"
"github.com/gookit/color"
"github.com/xujiajun/nutsdb"
"golang.org/x/time/rate"
@@ -45,12 +47,16 @@ var (
jikanApiBaseUri = flag.String("jikanApiBaseUri", "https://api.jikan.moe/v4/", "Jikan API base URL")
malApiId = flag.String("malApiId", "cc17dcf40581b9dfc8a5a12dba458153", "MyAnimeList API Client ID")
localServer = flag.Bool("localServer", false, "Set varius headers for running locally")
+ mmDbServer = flag.String("mmDbServer", "hanami.family:3306", "MovieManager db server")
+ mmDbUser = flag.String("mmDbUser", "yui", "MovieManager db user")
animeCache *bigcache.BigCache
seasoncache *bigcache.BigCache
userCache *bigcache.BigCache
searchCache *bigcache.BigCache
animeListCache *bigcache.BigCache
+ mmCache *bigcache.BigCache
db *nutsdb.DB
+ mmDb *sql.DB
jikanLimiter *rate.Limiter
logOut *RingBuf
buildTime string
@@ -66,7 +72,7 @@ func main() {
logOut = NewRingBuf(10101)
color.Notice.Printf("huso %s built on %s with %s\n", husoVersion, buildTime, runtime.Version())
- logOut.WriteLine(fmt.Sprintf("🎉 huso %s built on %s with %s\n", husoVersion, buildTime, runtime.Version()))
+ logOut.WriteLine(fmt.Sprintf("🎉 huso %s built on %s with %s", husoVersion, buildTime, runtime.Version()))
jikanLimiter = rate.NewLimiter(rate.Every(time.Second), 1)
@@ -97,6 +103,11 @@ func main() {
log.Fatal(err)
}
defer animeListCache.Close()
+ mmCache, err = bigcache.NewBigCache(bigcache.DefaultConfig(time.Minute))
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer mmCache.Close()
nutsOpt := nutsdb.DefaultOptions
nutsOpt.Dir = "nuts"
@@ -106,6 +117,32 @@ func main() {
}
defer db.Close()
+ color.Infoln("NutsDB connected")
+ logOut.WriteLine("🗃️ NutsDB connected")
+
+ conns, err := GetMmConnString()
+ if err != nil {
+ color.Errorln(err.Error())
+ } else {
+ mmDb, err = sql.Open("mysql", conns)
+ if err != nil || mmDb == nil {
+ color.Errorln(err.Error())
+ } else {
+ mmDb.SetConnMaxLifetime(time.Minute * 3)
+ mmDb.SetMaxOpenConns(10)
+ mmDb.SetMaxIdleConns(10)
+ defer mmDb.Close()
+
+ err = mmDb.Ping()
+ if err != nil {
+ color.Errorln(err.Error())
+ } else {
+ color.Infoln("MovieManager DB connected")
+ logOut.WriteLine("🗃️ MovieManager DB connected")
+ }
+ }
+ }
+
Arbeit()
LangeArbeit()
diff --git a/klotz.go b/klotz.go
index 67bd59b..272dcb6 100644
--- a/klotz.go
+++ b/klotz.go
@@ -310,3 +310,10 @@ type SeasonJikan struct {
} `json:"pagination"`
Data []SeasonAnimeJikan `json:"data"`
}
+
+type MmOracle struct {
+ Id int `json:"id"`
+ Title string `json:"title"`
+ Anime int64 `json:"anime"`
+ AvgScore int `json:"avgScore"`
+}
diff --git a/ober.go b/ober.go
index 5767378..39679d9 100644
--- a/ober.go
+++ b/ober.go
@@ -44,7 +44,13 @@ func Start(ctx *fasthttp.RequestCtx) {
return
}
- WriteIndex(ctx, season, logOut.String())
+ oracles, err := MmReadOracle()
+ if err != nil {
+ addErrorToCtx(ctx, err)
+ return
+ }
+
+ WriteIndex(ctx, season, oracles, logOut.String())
ctx.SetContentType("text/html; charset=utf-8")
ctx.SetStatusCode(fasthttp.StatusOK)
diff --git a/rechner.go b/rechner.go
index ee2a7bb..e68558f 100644
--- a/rechner.go
+++ b/rechner.go
@@ -43,3 +43,7 @@ func BytesToInt64AndDate(bytes []byte) (int64, time.Time, error) {
func Int64AndDateToBytes(num int64, appoint time.Time) []byte {
return []byte(fmt.Sprintf("%d%s%s", num, AppointSplit, appoint.Format(time.RFC3339)))
}
+
+func PrintDate(t time.Time) string {
+ return t.Format("2006-01-02")
+}
diff --git a/season.qtpl b/season.qtpl
index b1df9a6..e649b8b 100644
--- a/season.qtpl
+++ b/season.qtpl
@@ -1,5 +1,5 @@
{% package main %}
-{% func Index(animes []Anime, log string) %}
+{% func Index(animes []Anime, oracles []MmOracle, log string) %}
{% collapsespace %}
@@ -19,6 +19,8 @@ body { background-color: #1a1a1a; color: #fff; }
HUSO - Hanami universeller Serien Organizer
+ Log
+ {%s log %}
Anime
@@ -30,16 +32,24 @@ body { background-color: #1a1a1a; color: #fff; }
{% for _, anime := range animes %}
+ | {%dl anime.Anime %} |
{%s anime.Title %} |
- {%dl anime.Anime %} |
{%d anime.Episodes %} |
+ {%f anime.Score %} |
+
+ {% endfor %}
+
+ MovieManager Oracle
+
+ {% for _, oracle := range oracles %}
+
+ | {%d oracle.Id %} |
+ {%d oracle.AvgScore %} |
+ {%s oracle.Title %} |
+ {%dl oracle.Anime %} |
{% endfor %}
- Log
-
- {%s log %}
-