added models, docker files and merged configs
This commit is contained in:
parent
1c423ae988
commit
6ac5e54b33
11 changed files with 205 additions and 55 deletions
17
.vscode/launch.json
vendored
17
.vscode/launch.json
vendored
|
@ -5,26 +5,13 @@
|
|||
"type": "pwa-node",
|
||||
"runtimeVersion": "18",
|
||||
"request": "launch",
|
||||
"name": "kannon-server",
|
||||
"name": "kannon",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"program": "${workspaceFolder}/kannon.js",
|
||||
"args": [
|
||||
"${workspaceFolder}/example_config_server.json"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "pwa-node",
|
||||
"runtimeVersion": "17",
|
||||
"request": "launch",
|
||||
"name": "kannon-library",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"program": "${workspaceFolder}/kannon.js",
|
||||
"args": [
|
||||
"${workspaceFolder}/example_config_library.json"
|
||||
"${workspaceFolder}/example_config.json"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
|
@ -74,9 +74,12 @@ class Queue {
|
|||
return;
|
||||
}
|
||||
const tags = await metadata.parseFile(file);
|
||||
const artists = await this.addArtist(tags);
|
||||
const artist = await this.addArtist(tags);
|
||||
const album = await this.addAlbum(tags);
|
||||
const track = await this.addTrack(tags, file);
|
||||
this.linkTrackToArtist(track, artist);
|
||||
this.linkTrackToAlbum(track, album);
|
||||
this.linkAlbumToArtist(album, artist);
|
||||
}
|
||||
|
||||
async eventUnlink(file) {
|
||||
|
@ -113,10 +116,10 @@ class Queue {
|
|||
const [element, created] = await database.models.Artist.findOrCreate({
|
||||
where: { name: artist }
|
||||
});
|
||||
if (!created) {
|
||||
continue;
|
||||
if (created) {
|
||||
logger.debug('created artist: ' + JSON.stringify(element));
|
||||
}
|
||||
logger.debug('created artist ' + JSON.stringify(element));
|
||||
return element;
|
||||
} catch (err) {
|
||||
logger.error('error finding or creating artist \'' + JSON.stringify(tags) + '\' > ' + err);
|
||||
}
|
||||
|
@ -133,10 +136,10 @@ class Queue {
|
|||
name: tags.common.album
|
||||
}
|
||||
});
|
||||
if (!created) {
|
||||
return;
|
||||
if (created) {
|
||||
logger.debug('created album: ' + JSON.stringify(element));
|
||||
}
|
||||
logger.debug('created album ' + JSON.stringify(element));
|
||||
return element;
|
||||
} catch (err) {
|
||||
logger.error('error finding or creating album \'' + JSON.stringify(tags) + '\' > ' + err);
|
||||
}
|
||||
|
@ -186,15 +189,75 @@ class Queue {
|
|||
const [element, created] = await database.models.Track.findOrCreate({
|
||||
where: where
|
||||
});
|
||||
if (!created) {
|
||||
return;
|
||||
if (created) {
|
||||
logger.debug('created track: ' + JSON.stringify(element));
|
||||
}
|
||||
logger.debug('created track ' + JSON.stringify(element));
|
||||
return element;
|
||||
} catch (err) {
|
||||
logger.error('error finding or creating track \'' + JSON.stringify(tags) + '\' > ' + err);
|
||||
}
|
||||
}
|
||||
|
||||
async linkTrackToArtist(track, artist) {
|
||||
if (track === undefined || artist === undefined) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const [element, created] = await database.models.TrackToArtist.findOrCreate({
|
||||
where: {
|
||||
track: track.id,
|
||||
artist: artist.id
|
||||
}
|
||||
});
|
||||
if (created) {
|
||||
logger.debug('linked track \'' + track.id + '\' to artist \'' + artist.id + '\': ' + JSON.stringify(element));
|
||||
}
|
||||
return element;
|
||||
} catch (err) {
|
||||
logger.error('error finding or creating tracktoartist entry for track \'' + track.id + '\' and album \'' + artist.id + '\' > ' + err);
|
||||
}
|
||||
}
|
||||
|
||||
async linkTrackToAlbum(track, album) {
|
||||
if (track === undefined || album === undefined) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const [element, created] = await database.models.TrackToAlbum.findOrCreate({
|
||||
where: {
|
||||
track: track.id,
|
||||
album: album.id
|
||||
}
|
||||
});
|
||||
if (created) {
|
||||
logger.debug('linked track \'' + track.id + '\' to album \'' + album.id + '\': ' + JSON.stringify(element));
|
||||
}
|
||||
return element;
|
||||
} catch (err) {
|
||||
logger.error('error finding or creating tracktoalbum entry for track \'' + track.id + '\' and album \'' + album.id + '\' > ' + err);
|
||||
}
|
||||
}
|
||||
|
||||
async linkAlbumToArtist(album, artist) {
|
||||
if (album === undefined || artist === undefined) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const [element, created] = await database.models.AlbumToArtist.findOrCreate({
|
||||
where: {
|
||||
album: album.id,
|
||||
artist: artist.id
|
||||
}
|
||||
});
|
||||
if (created) {
|
||||
logger.debug('linked album \'' + album.id + '\' to artist \'' + artist.id + '\': ' + JSON.stringify(element));
|
||||
}
|
||||
return element;
|
||||
} catch (err) {
|
||||
logger.error('error finding or creating albumtoartist entry for album \'' + album.id + '\' and artist \'' + artist.id + '\' > ' + err);
|
||||
}
|
||||
}
|
||||
|
||||
getFilter() {
|
||||
let filter = config?.library?.formats || ['.mp3'];
|
||||
for (let index = 0; index < filter.length; index++) {
|
||||
|
|
1
docker/.dockerignore
Normal file
1
docker/.dockerignore
Normal file
|
@ -0,0 +1 @@
|
|||
docker-compose.yml
|
22
docker/Dockerfile
Normal file
22
docker/Dockerfile
Normal file
|
@ -0,0 +1,22 @@
|
|||
FROM node:18-alpine3.15
|
||||
|
||||
LABEL version="1.0.0" \
|
||||
author="Daniel Sommer <daniel.sommer@velvettear.de" \
|
||||
license="MIT"
|
||||
|
||||
MAINTAINER Daniel Sommer <daniel.sommer@velvettear.de>
|
||||
|
||||
ENV LANG=C.UTF-8
|
||||
|
||||
RUN apk update --no-cache --progress \
|
||||
&& apk upgrade --no-cache --progress \
|
||||
&& apk add --no-cache --progress \
|
||||
tzdata \
|
||||
git \
|
||||
&& ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime \
|
||||
&& echo "Europe/Berlin" > /etc/timezone \
|
||||
&& git clone https://git.velvettear.de/velvettear/kannon.git /opt/kannon \
|
||||
&& cd /opt/kannon \
|
||||
&& apk del --no-cache tzdata git
|
||||
|
||||
ENTRYPOINT ["node /opt/kannon/kannon.js /opt/kannon/docker/docker_config.json"]
|
21
docker/docker-compose.yml
Normal file
21
docker/docker-compose.yml
Normal file
|
@ -0,0 +1,21 @@
|
|||
version: "3.9"
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:alpine
|
||||
container_name: kannon-postgres
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_PASSWORD: kannon
|
||||
POSTGRES_USER: kannon
|
||||
POSTGRES_DB: kannon
|
||||
ports:
|
||||
- 5432:5432
|
||||
kannon:
|
||||
build: .
|
||||
container_name: kannon
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3000:3000
|
||||
- 3001:3001
|
||||
- 3002:3002
|
41
docker/docker_config.json
Normal file
41
docker/docker_config.json
Normal file
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"server": {
|
||||
"enabled": true,
|
||||
"listen": "0.0.0.0",
|
||||
"port": 3000,
|
||||
"heartbeat": 10000
|
||||
},
|
||||
"api": {
|
||||
"enabled": true,
|
||||
"listen": "0.0.0.0",
|
||||
"port": 3002
|
||||
},
|
||||
"log": {
|
||||
"level": "debug",
|
||||
"timestamp": "DD.MM.YYYY HH:mm:ss:SS"
|
||||
},
|
||||
"library": {
|
||||
"enabled": true,
|
||||
"sources": [
|
||||
"/mnt/library"
|
||||
],
|
||||
"formats": [
|
||||
"mp3",
|
||||
"flac"
|
||||
]
|
||||
},
|
||||
"database": {
|
||||
"dialect": "postgres",
|
||||
"host": "kannon-postgres",
|
||||
"port": 5432,
|
||||
"database": "kannon",
|
||||
"username": "kannon",
|
||||
"password": "kannon"
|
||||
},
|
||||
"audio": {
|
||||
"listen": "0.0.0.0",
|
||||
"port": 3001,
|
||||
"nodelay": false,
|
||||
"threshold": 10
|
||||
}
|
||||
}
|
|
@ -15,13 +15,20 @@
|
|||
"timestamp": "DD.MM.YYYY HH:mm:ss:SS"
|
||||
},
|
||||
"library": {
|
||||
"enabled": false
|
||||
"enabled": true,
|
||||
"sources": [
|
||||
"/home/velvettear/mounts/samsung/music"
|
||||
],
|
||||
"formats": [
|
||||
"mp3",
|
||||
"flac"
|
||||
]
|
||||
},
|
||||
"database": {
|
||||
"dialect": "postgres",
|
||||
"storage": "/tmp/kannon.sqlite",
|
||||
"host": "192.168.104.136",
|
||||
"port": 5432,
|
||||
"port": 5000,
|
||||
"database": "kannon",
|
||||
"username": "kannon",
|
||||
"password": "kannon"
|
|
@ -1,28 +0,0 @@
|
|||
{
|
||||
"server": {
|
||||
"enabled": false
|
||||
},
|
||||
"log": {
|
||||
"level": "debug",
|
||||
"timestamp": "DD.MM.YYYY HH:mm:ss:SS"
|
||||
},
|
||||
"library": {
|
||||
"enabled": true,
|
||||
"sources": [
|
||||
"/home/velvettear/downloads"
|
||||
],
|
||||
"formats": [
|
||||
"mp3",
|
||||
"flac"
|
||||
]
|
||||
},
|
||||
"database": {
|
||||
"dialect": "postgres",
|
||||
"storage": "/tmp/kannon.sqlite",
|
||||
"host": "192.168.104.136",
|
||||
"port": 5432,
|
||||
"database": "kannon",
|
||||
"username": "postgres",
|
||||
"password": "$Velvet90"
|
||||
}
|
||||
}
|
12
models/AlbumToArtist.js
Normal file
12
models/AlbumToArtist.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
const { DataTypes } = require('sequelize');
|
||||
|
||||
const AlbumToArtist = database.connection.define("albumtoartist", {
|
||||
album: DataTypes.INTEGER,
|
||||
artist: DataTypes.INTEGER
|
||||
},
|
||||
{
|
||||
freezeTableName: true
|
||||
}
|
||||
);
|
||||
|
||||
module.exports = AlbumToArtist;
|
12
models/TrackToAlbum.js
Normal file
12
models/TrackToAlbum.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
const { DataTypes } = require('sequelize');
|
||||
|
||||
const TrackToAlbum = database.connection.define("tracktoalbum", {
|
||||
track: DataTypes.INTEGER,
|
||||
album: DataTypes.INTEGER
|
||||
},
|
||||
{
|
||||
freezeTableName: true
|
||||
}
|
||||
);
|
||||
|
||||
module.exports = TrackToAlbum;
|
12
models/TrackToArtist.js
Normal file
12
models/TrackToArtist.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
const { DataTypes } = require('sequelize');
|
||||
|
||||
const TrackToArtist = database.connection.define("tracktoartist", {
|
||||
track: DataTypes.INTEGER,
|
||||
artist: DataTypes.INTEGER
|
||||
},
|
||||
{
|
||||
freezeTableName: true
|
||||
}
|
||||
);
|
||||
|
||||
module.exports = TrackToArtist;
|
Loading…
Reference in a new issue