mirror of
https://github.com/JuLi0n21/pwa-player.git
synced 2026-04-19 23:40:05 +00:00
add collection endpoint impl
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/juli0n21/go-osu-parser/parser"
|
"github.com/juli0n21/go-osu-parser/parser"
|
||||||
@@ -372,18 +373,55 @@ func getFavorites(db *sql.DB, q string, limit, offset int) ([]Song, error) {
|
|||||||
return scanSongs(rows)
|
return scanSongs(rows)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCollection(db *sql.DB, index int) (Collection, error) {
|
func getCollection(db *sql.DB, limit, offset, index int) (Collection, error) {
|
||||||
rows, err := db.Query("SELECT * FROM Collection WHERE rowid = ? GROUP BY NAME", index)
|
rows, err := db.Query(`
|
||||||
|
WITH cols AS (
|
||||||
|
SELECT
|
||||||
|
c.Name,
|
||||||
|
ROW_NUMBER() OVER (ORDER BY c.Name) AS RowNumber
|
||||||
|
FROM Collection c
|
||||||
|
GROUP BY c.Name
|
||||||
|
)
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
c.Name, b.BeatmapId, b.MD5Hash, b.Title, b.Artist,
|
||||||
|
b.Creator, b.Folder, b.File, b.Audio, b.TotalTime
|
||||||
|
FROM Collection c
|
||||||
|
Join Beatmap b ON c.MD5Hash = b.MD5Hash
|
||||||
|
WHERE c.Name = (SELECT Name FROM cols WHERE RowNumber = ?)
|
||||||
|
LIMIT ?
|
||||||
|
OFFSET ?;`, index, limit, offset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Collection{}, err
|
return Collection{}, err
|
||||||
}
|
}
|
||||||
defer rows.Close()
|
defer rows.Close()
|
||||||
return scanCollection(rows)
|
|
||||||
|
var c Collection
|
||||||
|
for rows.Next() {
|
||||||
|
s := Song{}
|
||||||
|
if err := rows.Scan(&c.Name, &s.BeatmapID, &s.MD5Hash, &s.Title, &s.Artist, &s.Creator, &s.Folder, &s.File, &s.Audio, &s.TotalTime); err != nil {
|
||||||
|
return Collection{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
s.Image = extractImageFromFile(fileName, s.Folder, s.File)
|
||||||
|
|
||||||
|
c.Songs = append(c.Songs, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
row := db.QueryRow(`SELECT COUNT(*) FROM Collection WHERE Name = ?`, c.Name)
|
||||||
|
var count string
|
||||||
|
row.Scan(&count)
|
||||||
|
|
||||||
|
if i, err := strconv.Atoi(count); err == nil {
|
||||||
|
c.Items = i
|
||||||
|
}
|
||||||
|
|
||||||
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCollections(db *sql.DB, q string, limit, offset int) ([]Collection, error) {
|
func getCollections(db *sql.DB, q string, limit, offset int) ([]Collection, error) {
|
||||||
//not correct
|
//not correct
|
||||||
rows, err := db.Query("SELECT * FROM Collections WHERE name = ? LIMIT ? OFFSET ?", q, limit, offset)
|
rows, err := db.Query("SELECT Name, FROM Collections WHERE name = ? LIMIT ? OFFSET ?", q, limit, offset)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []Collection{}, err
|
return []Collection{}, err
|
||||||
}
|
}
|
||||||
@@ -428,18 +466,23 @@ func scanSong(row *sql.Row) (Song, error) {
|
|||||||
return Song{}, err
|
return Song{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
bm, err := parser.ParseOsuFile(fmt.Sprintf("%sSongs/%s/%s", fileName, s.Folder, s.File))
|
s.Image = extractImageFromFile(fileName, s.Folder, s.File)
|
||||||
|
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func extractImageFromFile(osuRoot, folder, file string) string {
|
||||||
|
bm, err := parser.ParseOsuFile(fmt.Sprintf("%sSongs/%s/%s", osuRoot, folder, file))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
s.Image = fmt.Sprintf("404.png")
|
return "404.png"
|
||||||
return s, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(bm.Events) > 1 && len(bm.Events[0].EventParams) > 1 {
|
if len(bm.Events) > 1 && len(bm.Events[0].EventParams) > 1 {
|
||||||
s.Image = fmt.Sprintf("%s/%s", s.Folder, strings.Trim(bm.Events[0].EventParams[0], "\""))
|
return fmt.Sprintf("%s/%s", folder, strings.Trim(bm.Events[0].EventParams[0], "\""))
|
||||||
}
|
}
|
||||||
|
|
||||||
return s, nil
|
return "404.png"
|
||||||
}
|
}
|
||||||
|
|
||||||
func scanCollections(rows *sql.Rows) ([]Collection, error) {
|
func scanCollections(rows *sql.Rows) ([]Collection, error) {
|
||||||
@@ -455,20 +498,6 @@ func scanCollections(rows *sql.Rows) ([]Collection, error) {
|
|||||||
return collection, nil
|
return collection, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func scanCollection(rows *sql.Rows) (Collection, error) {
|
|
||||||
|
|
||||||
var c Collection
|
|
||||||
for rows.Next() {
|
|
||||||
var s Song
|
|
||||||
if err := rows.Scan(&c.Name, &s.MD5Hash); err != nil {
|
|
||||||
return Collection{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c.Songs = append(c.Songs, s)
|
|
||||||
}
|
|
||||||
return c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func scanCollectionPreviews(rows *sql.Rows) ([]CollectionPreview, error) {
|
func scanCollectionPreviews(rows *sql.Rows) ([]CollectionPreview, error) {
|
||||||
|
|
||||||
var collection []CollectionPreview
|
var collection []CollectionPreview
|
||||||
|
|||||||
@@ -182,9 +182,9 @@ func (s *Server) collection(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO
|
limit, offset := pagination(r)
|
||||||
|
|
||||||
recent, err := getCollection(s.Db, index)
|
recent, err := getCollection(s.Db, limit, offset, index)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user