mirror of
https://github.com/navidrome/navidrome.git
synced 2025-06-04 01:21:19 +03:00
Basic scanning working. Time to retrofit some tests....
This commit is contained in:
parent
14e52576a7
commit
515279606a
13
models/index.go
Normal file
13
models/index.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
type ArtistInfo struct {
|
||||||
|
ArtistId string
|
||||||
|
Artist string
|
||||||
|
}
|
||||||
|
|
||||||
|
type ArtistIndex struct {
|
||||||
|
Id string
|
||||||
|
Artists []ArtistInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -14,14 +14,4 @@ type MediaFile struct {
|
|||||||
Compilation bool
|
Compilation bool
|
||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
UpdatedAt time.Time
|
UpdatedAt time.Time
|
||||||
}
|
|
||||||
|
|
||||||
func (m*MediaFile) RealArtist() string {
|
|
||||||
if (m.Compilation) {
|
|
||||||
return "Various Artists"
|
|
||||||
}
|
|
||||||
if (m.AlbumArtist != "") {
|
|
||||||
return m.AlbumArtist
|
|
||||||
}
|
|
||||||
return m.Artist
|
|
||||||
}
|
}
|
@ -14,7 +14,7 @@ func NewArtistRepository() *Artist {
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Artist) Put(m *models.Artist) (*models.Artist, error) {
|
func (r *Artist) Put(m *models.Artist) (*models.Artist, error) { // TODO Return only error
|
||||||
if m.Id == "" {
|
if m.Id == "" {
|
||||||
m.Id = r.NewId(m.Name)
|
m.Id = r.NewId(m.Name)
|
||||||
}
|
}
|
||||||
|
26
repositories/index_repository.go
Normal file
26
repositories/index_repository.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package repositories
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/deluan/gosonic/models"
|
||||||
|
"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ArtistIndex struct {
|
||||||
|
BaseRepository
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewArtistIndexRepository() *ArtistIndex {
|
||||||
|
r := &ArtistIndex{}
|
||||||
|
r.key = "index"
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ArtistIndex) Put(m *models.ArtistIndex) error {
|
||||||
|
if m.Id == "" {
|
||||||
|
return errors.New("Id is not set")
|
||||||
|
}
|
||||||
|
return r.saveOrUpdate(m.Id, m)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -6,12 +6,15 @@ import (
|
|||||||
"github.com/deluan/gosonic/models"
|
"github.com/deluan/gosonic/models"
|
||||||
"strings"
|
"strings"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"encoding/json"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Scanner interface {
|
type Scanner interface {
|
||||||
LoadFolder(path string) []Track
|
LoadFolder(path string) []Track
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type tempIndex map[string]*models.ArtistInfo
|
||||||
|
|
||||||
func StartImport() {
|
func StartImport() {
|
||||||
go doImport(beego.AppConfig.String("musicFolder"), &ItunesScanner{})
|
go doImport(beego.AppConfig.String("musicFolder"), &ItunesScanner{})
|
||||||
}
|
}
|
||||||
@ -27,20 +30,24 @@ func importLibrary(files []Track) {
|
|||||||
mfRepo := repositories.NewMediaFileRepository()
|
mfRepo := repositories.NewMediaFileRepository()
|
||||||
albumRepo := repositories.NewAlbumRepository()
|
albumRepo := repositories.NewAlbumRepository()
|
||||||
artistRepo := repositories.NewArtistRepository()
|
artistRepo := repositories.NewArtistRepository()
|
||||||
var artistIndex = make(map[string]map[string]string)
|
var artistIndex = make(map[string]tempIndex)
|
||||||
|
|
||||||
for _, t := range files {
|
for _, t := range files {
|
||||||
mf, album, artist := processTrack(&t)
|
mf, album, artist := processTrack(&t)
|
||||||
mergeInfo(mfRepo, mf, albumRepo, album, artistRepo, artist)
|
mergeInfo(mfRepo, mf, albumRepo, album, artistRepo, artist)
|
||||||
fmt.Printf("%#v\n", album)
|
fmt.Printf("%#v\n", album)
|
||||||
fmt.Printf("%#v\n\n", artist)
|
fmt.Printf("%#v\n\n", artist)
|
||||||
collectIndex(mf, artistIndex)
|
collectIndex(artist, artistIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
//j,_ := json.MarshalIndent(artistIndex, "", " ")
|
if err := saveIndex(artistIndex); err != nil {
|
||||||
//fmt.Println(string(j))
|
beego.Error(err)
|
||||||
c, _ := mfRepo.CountAll()
|
}
|
||||||
|
|
||||||
|
j,_ := json.MarshalIndent(artistIndex, "", " ")
|
||||||
|
fmt.Println(string(j))
|
||||||
|
|
||||||
|
c, _ := mfRepo.CountAll()
|
||||||
beego.Info("Total mediafiles in database:", c)
|
beego.Info("Total mediafiles in database:", c)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,7 +71,7 @@ func processTrack(t *Track) (*models.MediaFile, *models.Album, *models.Artist) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
artist := &models.Artist{
|
artist := &models.Artist{
|
||||||
Name: t.Artist,
|
Name: t.RealArtist(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return mf, album, artist
|
return mf, album, artist
|
||||||
@ -89,7 +96,7 @@ func mergeInfo(mfRepo *repositories.MediaFile, mf *models.MediaFile, albumRepo *
|
|||||||
beego.Error(err)
|
beego.Error(err)
|
||||||
}
|
}
|
||||||
artist.AddAlbums(sAlbum, sArtist.Albums)
|
artist.AddAlbums(sAlbum, sArtist.Albums)
|
||||||
sArtist, err = artistRepo.Put(artist)
|
_, err = artistRepo.Put(artist)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
beego.Error(err)
|
beego.Error(err)
|
||||||
}
|
}
|
||||||
@ -99,8 +106,8 @@ func mergeInfo(mfRepo *repositories.MediaFile, mf *models.MediaFile, albumRepo *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func collectIndex(m *models.MediaFile, artistIndex map[string]map[string]string) {
|
func collectIndex(a *models.Artist, artistIndex map[string]tempIndex) {
|
||||||
name := m.RealArtist()
|
name := a.Name
|
||||||
indexName := strings.ToLower(models.NoArticle(name))
|
indexName := strings.ToLower(models.NoArticle(name))
|
||||||
if indexName == "" {
|
if indexName == "" {
|
||||||
return
|
return
|
||||||
@ -108,8 +115,25 @@ func collectIndex(m *models.MediaFile, artistIndex map[string]map[string]string)
|
|||||||
initial := strings.ToUpper(indexName[0:1])
|
initial := strings.ToUpper(indexName[0:1])
|
||||||
artists := artistIndex[initial]
|
artists := artistIndex[initial]
|
||||||
if artists == nil {
|
if artists == nil {
|
||||||
artists = make(map[string]string)
|
artists = make(tempIndex)
|
||||||
artistIndex[initial] = artists
|
artistIndex[initial] = artists
|
||||||
}
|
}
|
||||||
artists[indexName] = name
|
artists[indexName] = &models.ArtistInfo{ArtistId: a.Id, Artist: a.Name}
|
||||||
|
}
|
||||||
|
|
||||||
|
func saveIndex(artistIndex map[string]tempIndex) error {
|
||||||
|
idxRepo := repositories.NewArtistIndexRepository()
|
||||||
|
|
||||||
|
for k, temp := range artistIndex {
|
||||||
|
idx := &models.ArtistIndex{Id: k}
|
||||||
|
for _, v := range temp {
|
||||||
|
idx.Artists = append(idx.Artists, *v)
|
||||||
|
}
|
||||||
|
err := idxRepo.Put(idx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
@ -15,4 +15,14 @@ type Track struct {
|
|||||||
Compilation bool
|
Compilation bool
|
||||||
CreatedAt time.Time
|
CreatedAt time.Time
|
||||||
UpdatedAt time.Time
|
UpdatedAt time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Track) RealArtist() string {
|
||||||
|
if (m.Compilation) {
|
||||||
|
return "Various Artists"
|
||||||
|
}
|
||||||
|
if (m.AlbumArtist != "") {
|
||||||
|
return m.AlbumArtist
|
||||||
|
}
|
||||||
|
return m.Artist
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user