2024-03-18 20:19:04 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-03-23 18:02:11 +00:00
|
|
|
"arimelody.me/arimelody.me/api/v1/music"
|
2024-03-18 20:19:04 +00:00
|
|
|
|
2024-03-23 18:02:11 +00:00
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"time"
|
2024-03-18 20:19:04 +00:00
|
|
|
|
2024-03-23 18:02:11 +00:00
|
|
|
_ "github.com/lib/pq"
|
|
|
|
"github.com/jmoiron/sqlx"
|
2024-03-18 20:19:04 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var schema =
|
2024-03-20 10:50:37 +00:00
|
|
|
`CREATE TABLE IF NOT EXISTS artists (
|
2024-03-23 18:02:11 +00:00
|
|
|
id TEXT PRIMARY KEY,
|
|
|
|
name TEXT,
|
|
|
|
website TEXT
|
2024-03-18 20:19:04 +00:00
|
|
|
);
|
|
|
|
|
2024-03-20 10:50:37 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS musicreleases (
|
2024-03-23 18:02:11 +00:00
|
|
|
id VARCHAR(64) PRIMARY KEY,
|
|
|
|
title TEXT NOT NULL,
|
|
|
|
type TEXT,
|
|
|
|
release_date DATE NOT NULL,
|
|
|
|
artwork TEXT,
|
|
|
|
buyname TEXT,
|
2024-03-23 22:20:51 +00:00
|
|
|
buylink TEXT
|
2024-03-18 20:19:04 +00:00
|
|
|
);
|
|
|
|
|
2024-03-20 10:50:37 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS musiclinks (
|
2024-03-23 22:20:51 +00:00
|
|
|
release VARCHAR(64) REFERENCES musicreleases(id) ON DELETE CASCADE ON UPDATE CASCADE,
|
2024-03-23 18:02:11 +00:00
|
|
|
name TEXT,
|
|
|
|
url TEXT,
|
2024-03-23 22:20:51 +00:00
|
|
|
CONSTRAINT musiclinks_pk PRIMARY KEY (release, name)
|
2024-03-18 20:19:04 +00:00
|
|
|
);
|
|
|
|
|
2024-03-20 10:50:37 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS musiccredits (
|
2024-03-23 22:20:51 +00:00
|
|
|
release VARCHAR(64) REFERENCES musicreleases(ID) ON DELETE CASCADE,
|
2024-03-23 18:02:11 +00:00
|
|
|
artist TEXT REFERENCES artists(id) ON DELETE CASCADE,
|
|
|
|
role TEXT,
|
|
|
|
meta BOOLEAN,
|
2024-03-23 22:20:51 +00:00
|
|
|
constraint musiccredits_pk PRIMARY KEY (release, artist)
|
|
|
|
);
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS musictracks (
|
|
|
|
release VARCHAR(64) REFERENCES musicreleases(ID) ON DELETE CASCADE,
|
|
|
|
number INT NOT NULL,
|
|
|
|
title TEXT NOT NULL,
|
|
|
|
description TEXT,
|
|
|
|
lyrics TEXT,
|
|
|
|
preview_url TEXT,
|
|
|
|
CONSTRAINT musictracks_pk PRIMARY KEY (release, number)
|
2024-03-18 20:19:04 +00:00
|
|
|
);`
|
|
|
|
|
|
|
|
func PushArtist(db *sqlx.DB, artist music.Artist) {
|
2024-03-23 18:02:11 +00:00
|
|
|
fmt.Printf("syncing artist [%s] to database...", artist.Name)
|
|
|
|
|
|
|
|
db.MustExec("INSERT INTO artists (id, name, website) VALUES ($1, $2, $3) ON CONFLICT (id) DO UPDATE SET name=$2, website=$3",
|
|
|
|
&artist.Id,
|
|
|
|
&artist.Name,
|
|
|
|
&artist.Website,
|
|
|
|
)
|
|
|
|
|
|
|
|
fmt.Printf("done!\n")
|
2024-03-18 20:19:04 +00:00
|
|
|
}
|
|
|
|
|
2024-03-20 10:50:37 +00:00
|
|
|
func PushRelease(db *sqlx.DB, release music.MusicRelease) {
|
2024-03-23 18:02:11 +00:00
|
|
|
fmt.Printf("syncing release [%s] to database...", release.Id)
|
2024-03-18 23:09:54 +00:00
|
|
|
|
2024-03-23 18:02:11 +00:00
|
|
|
tx := db.MustBegin()
|
2024-03-23 22:20:51 +00:00
|
|
|
tx.MustExec("INSERT INTO musicreleases (id, title, type, release_date, artwork, buyname, buylink) VALUES ($1, $2, $3, $4, $5, $6, $7) "+
|
|
|
|
"ON CONFLICT (id) DO UPDATE SET title=$2, type=$3, release_date=$4, artwork=$5, buyname=$6, buylink=$7",
|
|
|
|
&release.Id, &release.Title, &release.Type, release.ReleaseDate.Format("2-Jan-2006"), &release.Artwork, &release.Buyname, &release.Buylink)
|
2024-03-20 03:17:34 +00:00
|
|
|
|
2024-03-23 18:02:11 +00:00
|
|
|
for _, link := range release.Links {
|
2024-03-23 22:20:51 +00:00
|
|
|
tx.MustExec("INSERT INTO musiclinks (release, name, url) VALUES ($1, $2, $3) ON CONFLICT (release, name) DO UPDATE SET url=$3",
|
2024-03-23 18:02:11 +00:00
|
|
|
&release.Id, &link.Name, &link.Url)
|
|
|
|
}
|
|
|
|
for _, credit := range release.Credits {
|
2024-03-23 22:20:51 +00:00
|
|
|
tx.MustExec("INSERT INTO musiccredits (release, artist, role, meta) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING",
|
2024-03-23 18:02:11 +00:00
|
|
|
&release.Id, &credit.Artist.Id, &credit.Role, &credit.Meta)
|
|
|
|
}
|
2024-03-23 22:20:51 +00:00
|
|
|
for _, track := range release.Tracks {
|
|
|
|
tx.MustExec("INSERT INTO musictracks (release, number, title, description, lyrics, preview_url) VALUES ($1, $2, $3, $4, $5, $6) "+
|
|
|
|
"ON CONFLICT (release, number) DO UPDATE SET title=$3, description=$4, lyrics=$5, preview_url=$6",
|
|
|
|
&release.Id, &track.Number, &track.Title, &track.Description, &track.Lyrics, &track.PreviewUrl)
|
|
|
|
}
|
2024-03-20 03:17:34 +00:00
|
|
|
|
2024-03-23 18:02:11 +00:00
|
|
|
tx.Commit()
|
2024-03-18 20:19:04 +00:00
|
|
|
|
2024-03-23 18:02:11 +00:00
|
|
|
fmt.Printf("done!\n")
|
2024-03-18 20:19:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func InitDatabase() *sqlx.DB {
|
2024-03-23 18:02:11 +00:00
|
|
|
db, err := sqlx.Connect("postgres", "user=arimelody dbname=arimelody password=fuckingpassword sslmode=disable")
|
|
|
|
if err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, "unable to create database connection pool: %v\n", err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
db.SetConnMaxLifetime(time.Minute * 3)
|
|
|
|
db.SetMaxOpenConns(10)
|
|
|
|
db.SetMaxIdleConns(10)
|
|
|
|
|
|
|
|
db.MustExec(schema)
|
|
|
|
fmt.Printf("database schema synchronised.\n")
|
|
|
|
|
|
|
|
return db
|
2024-03-18 20:19:04 +00:00
|
|
|
}
|