added models, docker files and merged configs

This commit is contained in:
Daniel Sommer 2022-06-01 16:20:25 +02:00
parent 1c423ae988
commit 6ac5e54b33
11 changed files with 205 additions and 55 deletions

17
.vscode/launch.json vendored
View file

@ -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"
]
}
]

View file

@ -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
View file

@ -0,0 +1 @@
docker-compose.yml

22
docker/Dockerfile Normal file
View 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
View 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
View 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
}
}

View file

@ -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"

View file

@ -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
View 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
View 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
View 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;