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",
|
"type": "pwa-node",
|
||||||
"runtimeVersion": "18",
|
"runtimeVersion": "18",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"name": "kannon-server",
|
"name": "kannon",
|
||||||
"skipFiles": [
|
"skipFiles": [
|
||||||
"<node_internals>/**"
|
"<node_internals>/**"
|
||||||
],
|
],
|
||||||
"program": "${workspaceFolder}/kannon.js",
|
"program": "${workspaceFolder}/kannon.js",
|
||||||
"args": [
|
"args": [
|
||||||
"${workspaceFolder}/example_config_server.json"
|
"${workspaceFolder}/example_config.json"
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "pwa-node",
|
|
||||||
"runtimeVersion": "17",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "kannon-library",
|
|
||||||
"skipFiles": [
|
|
||||||
"<node_internals>/**"
|
|
||||||
],
|
|
||||||
"program": "${workspaceFolder}/kannon.js",
|
|
||||||
"args": [
|
|
||||||
"${workspaceFolder}/example_config_library.json"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
@ -74,9 +74,12 @@ class Queue {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const tags = await metadata.parseFile(file);
|
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 album = await this.addAlbum(tags);
|
||||||
const track = await this.addTrack(tags, file);
|
const track = await this.addTrack(tags, file);
|
||||||
|
this.linkTrackToArtist(track, artist);
|
||||||
|
this.linkTrackToAlbum(track, album);
|
||||||
|
this.linkAlbumToArtist(album, artist);
|
||||||
}
|
}
|
||||||
|
|
||||||
async eventUnlink(file) {
|
async eventUnlink(file) {
|
||||||
|
@ -113,10 +116,10 @@ class Queue {
|
||||||
const [element, created] = await database.models.Artist.findOrCreate({
|
const [element, created] = await database.models.Artist.findOrCreate({
|
||||||
where: { name: artist }
|
where: { name: artist }
|
||||||
});
|
});
|
||||||
if (!created) {
|
if (created) {
|
||||||
continue;
|
logger.debug('created artist: ' + JSON.stringify(element));
|
||||||
}
|
}
|
||||||
logger.debug('created artist ' + JSON.stringify(element));
|
return element;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('error finding or creating artist \'' + JSON.stringify(tags) + '\' > ' + err);
|
logger.error('error finding or creating artist \'' + JSON.stringify(tags) + '\' > ' + err);
|
||||||
}
|
}
|
||||||
|
@ -133,10 +136,10 @@ class Queue {
|
||||||
name: tags.common.album
|
name: tags.common.album
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (!created) {
|
if (created) {
|
||||||
return;
|
logger.debug('created album: ' + JSON.stringify(element));
|
||||||
}
|
}
|
||||||
logger.debug('created album ' + JSON.stringify(element));
|
return element;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('error finding or creating album \'' + JSON.stringify(tags) + '\' > ' + 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({
|
const [element, created] = await database.models.Track.findOrCreate({
|
||||||
where: where
|
where: where
|
||||||
});
|
});
|
||||||
if (!created) {
|
if (created) {
|
||||||
return;
|
logger.debug('created track: ' + JSON.stringify(element));
|
||||||
}
|
}
|
||||||
logger.debug('created track ' + JSON.stringify(element));
|
return element;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('error finding or creating track \'' + JSON.stringify(tags) + '\' > ' + 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() {
|
getFilter() {
|
||||||
let filter = config?.library?.formats || ['.mp3'];
|
let filter = config?.library?.formats || ['.mp3'];
|
||||||
for (let index = 0; index < filter.length; index++) {
|
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"
|
"timestamp": "DD.MM.YYYY HH:mm:ss:SS"
|
||||||
},
|
},
|
||||||
"library": {
|
"library": {
|
||||||
"enabled": false
|
"enabled": true,
|
||||||
|
"sources": [
|
||||||
|
"/home/velvettear/mounts/samsung/music"
|
||||||
|
],
|
||||||
|
"formats": [
|
||||||
|
"mp3",
|
||||||
|
"flac"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"database": {
|
"database": {
|
||||||
"dialect": "postgres",
|
"dialect": "postgres",
|
||||||
"storage": "/tmp/kannon.sqlite",
|
"storage": "/tmp/kannon.sqlite",
|
||||||
"host": "192.168.104.136",
|
"host": "192.168.104.136",
|
||||||
"port": 5432,
|
"port": 5000,
|
||||||
"database": "kannon",
|
"database": "kannon",
|
||||||
"username": "kannon",
|
"username": "kannon",
|
||||||
"password": "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