diff --git a/.idea/MusicServer.iml b/.idea/MusicServer.iml index 7ee078d..eeb7bce 100644 --- a/.idea/MusicServer.iml +++ b/.idea/MusicServer.iml @@ -1,4 +1,8 @@ + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 9a5fffc..e7ae04f 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -1,11 +1,11 @@ - + postgresql true org.postgresql.Driver - jdbc:postgresql://localhost:5432/music_dev_local + jdbc:postgresql://192.168.86.181:9432/music_prod \ No newline at end of file diff --git a/cmd/frontend/dist/index.html b/cmd/frontend/dist/index.html new file mode 100644 index 0000000..266e188 --- /dev/null +++ b/cmd/frontend/dist/index.html @@ -0,0 +1,10 @@ + + + + + Title + + +

Här kan en webbsida vara

+ + \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 57aa742..8bdd07c 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1,8 +1,8 @@ openapi: 3.0.3 info: - version: "2.2.0" + version: "2.3.0" title: "Music Server" - description: "Changed the structure of the whole application, should be no changes to functionality." + description: "Images should not be included in the database, removes songs where the path doesn't work." contact: email: "zarnor91@gmail.com" servers: diff --git a/pkg/conf/conf.go b/pkg/conf/conf.go index ebaf095..1fc62ee 100644 --- a/pkg/conf/conf.go +++ b/pkg/conf/conf.go @@ -56,6 +56,7 @@ func SetupRestServer() { r.HandleFunc("/music/{func}", api.MusicHandler) r.HandleFunc("/music/{func}/{func2}", api.MusicHandler) r.HandleFunc("/{func}", api.IndexHandler) + r.Handle("/", http.FileServer(http.FS(os.DirFS("frontend/dist")))) http.Handle("/", r) port := os.Getenv("PORT") diff --git a/pkg/db/song.go b/pkg/db/song.go index 4e847e1..3524949 100644 --- a/pkg/db/song.go +++ b/pkg/db/song.go @@ -5,6 +5,7 @@ import ( "fmt" "music-server/pkg/models" "os" + "strings" ) func ClearSongs(gameId int) { @@ -66,3 +67,49 @@ func AddSongPlayed(id int, name string) { _, _ = fmt.Fprintf(os.Stderr, "Exec failed: %v\n", err) } } + +func FetchAllSongs() []models.SongData { + rows, err := pool.Query(context.Background(), + "SELECT song_name, path FROM song") + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err) + return nil + } + + var songDataList []models.SongData + for rows.Next() { + var songName string + var path string + + err := rows.Scan(&songName, &path) + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err) + } + + songDataList = append(songDataList, models.SongData{ + SongName: songName, + Path: path, + }) + } + return songDataList +} + +func RemoveBrokenSong(song models.SongData) { + _, err := pool.Exec(context.Background(), "DELETE FROM song where path=$1", song.Path) + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Exec failed: %v\n", err) + } +} + +func RemoveBrokenSongs(songs []models.SongData) { + joined := "" + for _, song := range songs { + joined += "'" + song.Path + "'," + } + joined = strings.TrimSuffix(joined, ",") + + _, err := pool.Exec(context.Background(), "DELETE FROM song where path in ($1)", joined) + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "Exec failed: %v\n", err) + } +} diff --git a/pkg/server/index.go b/pkg/server/index.go index 05ddba2..442abf7 100644 --- a/pkg/server/index.go +++ b/pkg/server/index.go @@ -8,9 +8,13 @@ import ( func GetVersionHistory() models.VersionData { db.Testf() - data := models.VersionData{Version: "2.2.0", - Changelog: "Changed the structure of the whole application, should be no changes to functionality.", + data := models.VersionData{Version: "2.3.0", + Changelog: "Images should not be included in the database, removes songs where the path doesn't work.", History: []models.VersionData{ + { + Version: "2.2.0", + Changelog: "Changed the structure of the whole application, should be no changes to functionality.", + }, { Version: "2.1.4", Changelog: "Game list should now be sorted, a new endpoint with the game list in random order have been added.", diff --git a/pkg/server/music.go b/pkg/server/music.go index ee4c04d..37fa48f 100644 --- a/pkg/server/music.go +++ b/pkg/server/music.go @@ -198,7 +198,8 @@ func getSongFromList(games []models.GameData) models.SongData { openFile, err := os.Open(song.Path) if err != nil { //File not found - log.Fatal("Song not found, maybe delete song and/or game" + song.SongName + " songPath: " + song.Path) + db.RemoveBrokenSong(song) + log.Fatal("Song not found, song '" + song.SongName + "' deleted from game '" + game.GameName + "' songPath: " + song.Path) } else { songFound = true } diff --git a/pkg/server/sync.go b/pkg/server/sync.go index 8f111d9..7eb629d 100644 --- a/pkg/server/sync.go +++ b/pkg/server/sync.go @@ -2,6 +2,7 @@ package server import ( "fmt" + "io/fs" "io/ioutil" "log" "music-server/pkg/db" @@ -24,6 +25,7 @@ func SyncGames() { foldersToSkip := []string{".sync"} fmt.Println(foldersToSkip) db.SetGameDeletionDate() + checkBrokenSongs() files, err := ioutil.ReadDir(dir) if err != nil { @@ -116,9 +118,11 @@ func checkSongs(gameDir string, gameId int) { } for _, entry := range files { path := gameDir + entry.Name() - songName := entry.Name() - if !entry.IsDir() && !strings.HasSuffix(songName, ".id") { - songs = append(songs, models.SongData{GameId: gameId, SongName: songName, Path: path}) + fileName := entry.Name() + if isSong(entry) { + songs = append(songs, models.SongData{GameId: gameId, SongName: fileName, Path: path}) + } else if isCoverImage(entry) { + //TODO: Later add cover art image here in db } } if len(songs) != len(findSongsFromGame) { @@ -127,6 +131,34 @@ func checkSongs(gameDir string, gameId int) { db.AddSong(song) } } + //TODO: Add number of songs here +} + +func checkBrokenSongs() { + allSongs := db.FetchAllSongs() + var brokenSongs []models.SongData + for _, song := range allSongs { + //Check if file exists and open + openFile, err := os.Open(song.Path) + if err != nil { + //File not found + brokenSongs = append(brokenSongs, song) + } + err = openFile.Close() + if err != nil { + log.Fatal(err) + } + } + db.RemoveBrokenSongs(brokenSongs) +} + +func isSong(entry fs.FileInfo) bool { + return !entry.IsDir() && strings.HasSuffix(entry.Name(), ".mp3") || strings.HasSuffix(entry.Name(), ".wav") +} + +func isCoverImage(entry fs.FileInfo) bool { + return !entry.IsDir() && strings.Contains(entry.Name(), "cover") && + (strings.HasSuffix(entry.Name(), ".jpg") || strings.HasSuffix(entry.Name(), ".png")) } func contains(s []string, searchTerm string) bool {