Add beets and update dev env

This commit is contained in:
cstaelen committed 2023-08-16 09:28:10 +02:00
1 parent 92fc11a6af
commit c21b766f8f
15 files changed
+298 -29

No files matched your search

+1 -1
View File
@@ -10,5 +10,5 @@ Makefile
.cache
.env
dist
settings
settings/.tidal-dl.token.json
download
+1 -1
View File
@@ -2,7 +2,7 @@
#project
/download
/settings
/settings/.tidal-dl.token.json
# dependencies
/node_modules
+6 -1
View File
@@ -1,16 +1,21 @@
IMAGE=cstaelen/tidarr
VERSION=0.0.1a
DOCKERFILE=./docker/DockerfileBuilder
build-docker:
docker build --platform=linux/amd64 -t ${IMAGE}:${VERSION} -t ${IMAGE}:latest .
docker build --platform=linux/amd64 -f ${DOCKERFILE} -t ${IMAGE}:${VERSION} -t ${IMAGE}:latest .
run-docker:
docker run \
--rm \
--name tidarr \
-p 3000:3000 \
-f ${DOCKERFILE} \
-v .:/usr/tidarr \
-v ${PWD}/settings/.tidal-dl.token.json:/root/.tidal-dl.token.json \
-v ${PWD}/settings/.tidal-dl.json:/root/.tidal-dl.json \
-v ${PWD}/download:/usr/tidarr/download \
${IMAGE}
dev:
docker-compose build && docker-compose up
+15 -13
View File
@@ -1,6 +1,11 @@
# Tidal Media Downloader web client using docker
# Selfhosted Tidal media downloader web client
<img src="https://github.com/cstaelen/tidarr/blob/main/screenshot.png?raw=true" />
- UI build with **Next JS**
- Self-hostable using **Docker**
- Download from **Tidal** with Tidal Media Downloader (python)
- Tag import using **Beets.io** (python)
## Getting Started
Example docker-compose.yml :
@@ -14,22 +19,20 @@ services:
volumes:
- /any/folder/to/tidarr/config/.tidal-dl.token.json:/root/.tidal-dl.token.json
- /any/folder/to/tidarr/config/.tidal-dl.json:/root/.tidal-dl.json
- /any/folder/to/music:/usr/tidarr/download
- /any/folder/to/tidarr/config/beets-config.yml:/root/beets-config.yml
- /download/albums:/home/app/standalone/download/albums
- /download/tracks:/home/app/standalone/download/tracks
restart: 'unless-stopped'
environment:
- ENABLE_BEETS=true
- NEXT_PUBLIC_TIDAL_SEARCH_TOKEN=<search_token> #optional
- NEXT_PUBLIC_TIDAL_COUNTRY_CODE=<country-code> #optional
- NEXT_PUBLIC_TIDAL_BINARY=<path_to_tidaldl_bin> #optional
```
## Proceed to Tidal Authentication :
```bash
docker-compose exec tidarr tidal-dl
```
## How to get search token :
- https://github.com/lucaslg26/TidalAPI/issues/23
- https://github.com/lucaslg26/TidalAPI
## Tidal DL configuration :
Tidal Album options in `.tidal-dl.json`:
```json
@@ -56,15 +59,14 @@ Tidal Album options in `.tidal-dl.json`:
}
```
## OPTIONAL - How to get search token :
- https://github.com/lucaslg26/TidalAPI/issues/23
- https://github.com/lucaslg26/TidalAPI
First, run the development server:
## Be my guest, fork and dev <3
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
make dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
+2 -2
View File
@@ -85,7 +85,7 @@ const Pager = ({ page, itemPerPage, totalItems, setPage }: { page: number; itemP
return (
<Box sx={{ textAlign: "center", width: "100%", margin: "1rem" }}>
<Button variant="contained" size="large" onClick={() => setPage(page + 1)}>
LOAD MORE (page: {page})
LOAD MORE (page: {page}/{Math.floor(totalItems / itemPerPage)})
</Button>
</Box>
)
@@ -153,7 +153,7 @@ export const Results = () => {
<TabContent type="artists" setTabIndex={handleChangeIndex} />
</TabPanel>
<TabPanel value={value} index={2} dir={theme.direction}>
<TabContent type="tracks" />
<TabContent type="tracks" />
</TabPanel>
</SwipeableViews>
</Box>
+9 -1
View File
@@ -8,7 +8,7 @@ import React, {
import { useRouter, useSearchParams } from "next/navigation";
import { TidalResponseType } from "../types";
import { tidalDL } from "./server";
import { beets, moveSingleton, tidalDL } from "./server";
type TidalContextType = {
searchResults: TidalResponseType;
@@ -94,6 +94,14 @@ export function TidalProvider({ children }: { children: ReactNode }) {
try {
const response = await tidalDL(urlToSave);
if (type !== "track") {
const responsebeets = await beets();
console.log(`Beets response :\r\n ${responsebeets}`)
} else {
const responsetrack = await moveSingleton();
console.log(`Beets response :\r\n ${responsetrack}`)
}
setProcessingList([...(processingList || []), {
...item,
loading: false,
+55 -4
View File
@@ -1,18 +1,69 @@
"use server";
import { spawnSync } from "child_process";
import { spawnSync, execSync } from "child_process";
export async function tidalDL(urlToSave: string) {
try {
const binary = process.env.NEXT_PUBLIC_TIDAL_BINARY || '/usr/bin/tidal-dl';
const binary = '/usr/bin/tidal-dl';
const command = `${binary} -l ${urlToSave}`;
console.log(`=== Tidal-DL ===`);
console.log(`Executing: ${command}`);
const output = spawnSync(binary, ['-l', urlToSave], {encoding: 'utf-8'});
console.log('output', output);
return {save: true, output: output}
} catch (err: any) {
console.log('error', err);
console.log('Error using Tidal DL : ', err);
return {save: false}
}
}
}
export async function beets() {
try {
if (process.env.ENABLE_BEETS === "true") {
const binary = `beet`;
console.log(`=== Beets ===`);
console.log(`Executing: ${binary}`);
const output = spawnSync(binary, [
'-c', "/root/beets-config.yml",
"-l", "./settings/beets/beets-library.blb" ,
"-d", "./download/albums" ,
"import", "-qC" , "./download/incomplete"
], {encoding: 'utf-8'});
console.log('Beets output:\r\n', output);
return {save: true, output: output}
} else {
const output_move = execSync("cp -rf ./download/incomplete/* ./download/albums/", {encoding: "utf-8"});
console.log('- Move complete album', output_move);
const output_clean = execSync("rm -rf ./download/incomplete/*", {encoding: "utf-8"});
console.log('- Clean folder', output_clean);
return {save: true, output: output_move}
}
} catch (err: any) {
console.log('Error during beets tagging : ', err);
return {save: false}
} finally {
const output_clean = execSync("rm -rf ./download/incomplete/*", {encoding: "utf-8"});
console.log('- Clean folder', output_clean);
}
}
export async function moveSingleton() {
try {
console.log(`=== Move track ===`);
const output_move = execSync("cp -rf ./download/incomplete/* ./download/tracks/", {encoding: "utf-8"});
console.log('- Move tracks', output_move);
const output_clean = execSync("rm -rf ./download/incomplete/*", {encoding: "utf-8"});
console.log('- Clean folder', output_clean);
return {save: true, output: output_move}
} catch (err: any) {
console.log('Error track moving : ', err);
return {save: false}
}
}
+9 -5
View File
@@ -1,8 +1,8 @@
version: "3"
services:
node:
build: '.'
tidarr:
build: './docker'
container_name: 'tidarr'
ports:
- 3000:3000
@@ -10,10 +10,14 @@ services:
volumes:
- ./settings/.tidal-dl.token.json:/root/.tidal-dl.token.json
- ./settings/.tidal-dl.json:/root/.tidal-dl.json
- ./download:/home/app/standalone/download
- ./settings/beets-config.yml:/root/beets-config.yml
- ./download/albums:/home/app/standalone/download/albums
- ./download/tracks:/home/app/standalone/download/tracks
- .:/home/app/standalone # only used in dev environment
restart: 'unless-stopped'
environment:
- NEXT_PUBLIC_TIDAL_SEARCH_TOKEN=
- NEXT_PUBLIC_TIDAL_COUNTRY_CODE=
- ENABLE_BEETS=true
- NEXT_PUBLIC_TIDAL_SEARCH_TOKEN= # optional
- NEXT_PUBLIC_TIDAL_COUNTRY_CODE= # optional
+35
View File
@@ -0,0 +1,35 @@
FROM node:20-alpine
# update and install dependency
RUN apk update && apk upgrade
RUN apk add git
RUN apk add build-base
# BUILDER
WORKDIR /home/app/standalone
ENV NEXT_TELEMETRY_DISABLED 1
ARG NODE_ENV
ENV NODE_ENV="${NODE_ENV}"
# RUNNER
FROM node:20-alpine AS runner
WORKDIR /home/app/standalone
ENV NEXT_TELEMETRY_DISABLED 1
RUN echo "*** install tidal-dl ***"
ENV PYTHONUNBUFFERED=1
RUN apk add --update --no-cache python3 py3-pip && ln -sf python3 /usr/bin/python
RUN python3 -m pip install --no-cache --upgrade pip wheel setuptools
RUN python3 -m pip install --no-cache --upgrade tidal-dl
RUN echo "*** install beets ***"
RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/community beets
RUN yarn install
EXPOSE 3000
ENV PORT 3000
CMD ["yarn", "dev"]
+5 -1
View File
@@ -33,11 +33,15 @@ WORKDIR /home/app
ENV NEXT_TELEMETRY_DISABLED 1
RUN echo "*** install tidal-dl ***"
ENV PYTHONUNBUFFERED=1
RUN apk add --update --no-cache python3 py3-pip && ln -sf python3 /usr/bin/python
RUN python3 -m pip install --no-cache --upgrade pip setuptools wheel
RUN python3 -m pip install --no-cache --upgrade pip wheel setuptools
RUN python3 -m pip install --no-cache --upgrade tidal-dl
RUN echo "*** install beets ***"
RUN apk add --no-cache -X http://dl-cdn.alpinelinux.org/alpine/edge/community beets
COPY --from=builder /home/app/.next/standalone ./standalone
COPY --from=builder /home/app/.next/standalone ./standalone
COPY --from=builder /home/app/public /home/app/standalone/public
+21
View File
@@ -0,0 +1,21 @@
{
"albumFolderFormat": "{ArtistName}/{AlbumYear} - {AlbumTitle}",
"apiKeyIndex": 4,
"audioQuality": "HiFi",
"checkExist": true,
"downloadDelay": true,
"downloadPath": "./download/incomplete",
"includeEP": true,
"language": 0,
"lyricFile": false,
"multiThread": false,
"playlistFolderFormat": "Playlist/{PlaylistName} [{PlaylistUUID}]",
"saveAlbumInfo": false,
"saveCovers": true,
"showProgress": true,
"showTrackInfo": true,
"trackFileFormat": "{TrackNumber} - {TrackTitle}",
"usePlaylistFolder": true,
"videoFileFormat": "{VideoNumber} - {ArtistName} - {VideoTitle}{ExplicitFlag}",
"videoQuality": "P360"
}
+122
View File
@@ -0,0 +1,122 @@
plugins: fetchart embedart ftintitle permissions convert scrub missing mbsync plexupdate
directory: /music
library: /config/musiclibrary.blb
art_filename: albumart
threaded: yes
original_date: no
per_disc_numbering: no
convert:
auto: no
ffmpeg: /usr/bin/ffmpeg
opts: -ab 320k -ac 2 -ar 48000
max_bitrate: 320
threads: 1
paths:
default: %asciify{$albumartist}/$original_year - %asciify{$album}%aunique{}/$track - %asciify{$title}
singleton: Non-Album/%asciify{$artist} - %asciify{$title}
comp: Compilations/%asciify{$album}%aunique{}/$track - %asciify{$title}
albumtype_soundtrack: Soundtracks/%asciify{$album}%aunique{}/$track - %asciify{$title}
import:
write: yes
copy: no
duplicate_action: remove
move: yes
resume: ask
incremental: no
quiet_fallback: skip
timid: no
from_scratch: yes
log: /home/app/standalone/settings/beets/beet.log
match:
strong_rec_thresh: 0.1
medium_rec_thresh: 0.25
rec_gap_thresh: 0.25
max_rec:
missing_tracks: medium
unmatched_tracks: medium
distance_weights:
source: 2.0
artist: 3.0
album: 3.0
media: 1.0
mediums: 1.0
year: 1.0
country: 0.5
label: 0.5
catalognum: 0.5
albumdisambig: 0.5
album_id: 5.0
tracks: 2.0
missing_tracks: 0.9
unmatched_tracks: 0.6
track_title: 3.0
track_artist: 2.0
track_index: 1.0
track_length: 2.0
track_id: 5.0
preferred:
countries: []
media: []
original_year: no
ignored: []
track_length_grace: 10
track_length_max: 30
chroma:
auto: yes
lastgenre:
auto: yes
fallback: ''
source: album
embedart:
auto: yes
remove_art_file: yes
permissions:
file: 644
dir: 755
missing:
format: $albumartist - $album - $track - $title
count: no
total: no
mpd:
host: 192.168.0.50
port: 6600
# password:
replaygain:
auto: yes
overwrite: yes
scrub:
auto: yes
replace:
'[\\/]': _
'^\.': _
'[\x00-\x1f]': _
'[<>:"\?\*\|]': _
'[\xE8-\xEB]': e
'[\xEC-\xEF]': i
'[\xE2-\xE6]': a
'[\xF2-\xF6]': o
'[\xF8]': o
'\.$': _
'\s+$': ''
web:
host: 0.0.0.0
port: 8337
plex:
host: 192.168.1.20
port: 32400
token: 544czRJ-En3odTw2VQic
+8
View File
@@ -0,0 +1,8 @@
import started Tue Aug 15 22:18:18 2023
skip /home/app/standalone/download/incomplete/Nirvana/1993 - In Utero - 20th Anniversary Remaster (96k)
import started Tue Aug 15 22:19:50 2023
skip /home/app/standalone/download/incomplete/Nirvana/1993 - In Utero - 20th Anniversary Remaster (96k)
import started Tue Aug 15 22:59:11 2023
skip /home/app/standalone/download/incomplete/Nirvana/1991 - Nevermind
import started Tue Aug 15 22:59:36 2023
skip /home/app/standalone/download/incomplete/Nirvana/1991 - Nevermind
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
import started Tue Aug 15 21:28:38 2023
import started Tue Aug 15 21:30:32 2023
import started Tue Aug 15 21:30:53 2023
skip /home/app/download/Nirvana/1991 - Nevermind
import started Tue Aug 15 21:42:54 2023
skip /home/app/standalone/download/incomplete/Nirvana/1991 - Nevermind
skip /home/app/standalone/download/incomplete/Nirvana/1993 - In Utero - 20th Anniversary Remaster (96k)
import started Tue Aug 15 22:02:27 2023
skip /home/app/standalone/download/incomplete/Nirvana/1993 - In Utero - 20th Anniversary Remaster (96k)