Works, CI/CD still busted tho
This commit is contained in:
parent
2173760523
commit
30e64861c7
|
@ -27,10 +27,10 @@ RUN true \
|
||||||
moreutils \
|
moreutils \
|
||||||
cowsay
|
cowsay
|
||||||
|
|
||||||
COPY sucker.py /usr/bin
|
COPY src/* /app/
|
||||||
COPY abcde.conf httpd.conf /etc/
|
COPY abcde.conf httpd.conf /etc/
|
||||||
COPY --chown=linuxserver:linuxserver www /www
|
COPY --chown=linuxserver:linuxserver www /www
|
||||||
USER linuxserver
|
USER linuxserver
|
||||||
ENTRYPOINT ["/usr/bin/sucker.py"]
|
ENTRYPOINT ["python3", "/app/sucker.py"]
|
||||||
|
|
||||||
# vi: ts=2 sw=2 et ai
|
# vi: ts=2 sw=2 et ai
|
||||||
|
|
38
README.md
38
README.md
|
@ -16,40 +16,10 @@ At the time I'm writing this README, it will:
|
||||||
|
|
||||||
## How To Run This
|
## How To Run This
|
||||||
|
|
||||||
First you have to build it.
|
You need a place to store your stuff.
|
||||||
It will build on a raspberry pi.
|
Mine is `/srv/ext/incoming`.
|
||||||
|
|
||||||
docker build --tag=media-sucker .
|
docker run -d -p 8080:8080 --device /dev/sr0 -v /srv/ext/incoming:/incoming registry.gitlab.com/dartcatcher/media-sucker/media-sucker
|
||||||
|
|
||||||
You'll need a place to store all your precious media:
|
|
||||||
|
|
||||||
incoming=/path/to/incoming
|
|
||||||
mkdir -P $incoming
|
|
||||||
chown 911:911 $incoming
|
|
||||||
|
|
||||||
Then you can run it:
|
|
||||||
|
|
||||||
docker run -d --restart=unless-stopped \
|
|
||||||
--name=sucker \
|
|
||||||
--device cdrom --device dvd --device sr0 \
|
|
||||||
-v $incoming:/incoming \
|
|
||||||
-p 5880:8080 \
|
|
||||||
media-sucker
|
|
||||||
|
|
||||||
Or you can put it in a `docker-compose.yaml` file:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
services:
|
|
||||||
sucker:
|
|
||||||
image: media-sucker
|
|
||||||
volumes:
|
|
||||||
- type: bind
|
|
||||||
source: /path/to/incoming
|
|
||||||
target: /incoming
|
|
||||||
ports:
|
|
||||||
- published: 5880
|
|
||||||
target: 8080
|
|
||||||
```
|
|
||||||
|
|
||||||
Stick a video DVD or audio CD in,
|
Stick a video DVD or audio CD in,
|
||||||
and the drive should spin up for a while,
|
and the drive should spin up for a while,
|
||||||
|
@ -57,7 +27,7 @@ then spit your media back out.
|
||||||
Then, eventually, you'll have a new `.mkv` file (for video)
|
Then, eventually, you'll have a new `.mkv` file (for video)
|
||||||
or a new directory of `.mp3` files (for audio).
|
or a new directory of `.mp3` files (for audio).
|
||||||
|
|
||||||
You can watch what it's doing at http://localhost:5880/
|
You can watch what it's doing at http://localhost:8080/
|
||||||
|
|
||||||
## A note on filenames and tags
|
## A note on filenames and tags
|
||||||
|
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
. $(dirname $0)/common.sh
|
|
||||||
|
|
||||||
discid=$(getenv discid)
|
|
||||||
|
|
||||||
abcde -C $discid -o mp3:-V2
|
|
||||||
cp -r mp3/* $OUTDIR
|
|
||||||
|
|
||||||
# vi: sw=2 ts=2 et ai
|
|
|
@ -1,12 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
setenv status "ripping"
|
|
||||||
abcde -N -a cddb,read
|
|
||||||
|
|
||||||
discid=$(cd-discid | awk '{print $1}')
|
|
||||||
setenv discid "$discid"
|
|
||||||
now=$(getenv time)
|
|
||||||
|
|
||||||
sed -i s/'Unknown Album$'/"Unknown Album $now"/ abcde.$discid/cddbread.0
|
|
||||||
|
|
||||||
# vi: sw=2 ts=2 et ai
|
|
|
@ -1,28 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
# If you haven't set OUTDIR, set it to the default
|
|
||||||
: ${OUTDIR:=/incoming}
|
|
||||||
export OUTDIR
|
|
||||||
|
|
||||||
# This gets set to the directory containing what's currently running
|
|
||||||
: ${SCRIPTS:=$(dirname $0)}
|
|
||||||
|
|
||||||
log () {
|
|
||||||
printf "\033[36m=== [%s] \033[0m %s\n" "$0" "$*"
|
|
||||||
}
|
|
||||||
|
|
||||||
getenv () {
|
|
||||||
jq -r --arg key "$1" '.[$key]' < env.json
|
|
||||||
}
|
|
||||||
|
|
||||||
setenv () {
|
|
||||||
(cat env.json 2>/dev/null || echo '{}') \
|
|
||||||
| jq --arg key "$1" --arg val "$2" '.[$key] = $val' \
|
|
||||||
> env.json.new \
|
|
||||||
&& mv env.json.new env.json
|
|
||||||
}
|
|
||||||
|
|
||||||
status () {
|
|
||||||
echo "$2" > status.$1.new
|
|
||||||
mv status.$1.new status.$1
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
#! /bin/sh -e
|
|
||||||
|
|
||||||
. $(dirname $0)/common.sh
|
|
||||||
|
|
||||||
log "Scanning for DVD title"
|
|
||||||
title=$(dvdbackup -I | awk -F \" '/DVD with title/ {print $2}')
|
|
||||||
setenv title "$title"
|
|
||||||
|
|
||||||
# How big is this DVD?
|
|
||||||
totalSize=$(dvdbackup -I | awk '/[MK]iB$/ { b += $2 } END { print b }')
|
|
||||||
|
|
||||||
dvdbackup -p -F -n DVD \
|
|
||||||
| tr '\r' '\n' \
|
|
||||||
| awk -v total=$totalSize -F '[ /:()]+' '
|
|
||||||
function update(bytes) {
|
|
||||||
pct = 100 * bytes / total
|
|
||||||
if (pct >= nextpct) {
|
|
||||||
print pct
|
|
||||||
fflush()
|
|
||||||
nextpct = pct + 0.5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/[MK]iB.$/ {
|
|
||||||
read = $(NF-3) * 1024
|
|
||||||
if ($(NF-1) == "MiB") {
|
|
||||||
read *= 1024
|
|
||||||
}
|
|
||||||
if (read < last) {
|
|
||||||
totalRead += last
|
|
||||||
}
|
|
||||||
update(totalRead + read)
|
|
||||||
last = read
|
|
||||||
}
|
|
||||||
' \
|
|
||||||
| while read val; do
|
|
||||||
setenv complete "$val"
|
|
||||||
done
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
. $(dirname $0)/common.sh
|
|
||||||
|
|
||||||
while sleep 2; do
|
|
||||||
status encoder idle
|
|
||||||
for mtype in audio video; do
|
|
||||||
ls $mtype | while read d; do
|
|
||||||
encode=$SCRIPTS/$mtype.encode.sh
|
|
||||||
workdir=$mtype/$d
|
|
||||||
status=$(cd $workdir && getenv status)
|
|
||||||
case "$status" in
|
|
||||||
"encoding")
|
|
||||||
(cd $workdir && setenv status "encode interrupted")
|
|
||||||
;;
|
|
||||||
"read finished")
|
|
||||||
status encoder encoding
|
|
||||||
(cd $workdir && setenv status "encoding")
|
|
||||||
if ! (cd $workdir && $encode); then
|
|
||||||
log "$encode failed"
|
|
||||||
(cd $workdir && setenv status "encode failed")
|
|
||||||
else
|
|
||||||
rm -rf $workdir
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
# vi: ts=2 sw=2 et ai
|
|
|
@ -1,12 +0,0 @@
|
||||||
#! /bin/sh -e
|
|
||||||
|
|
||||||
cd /incoming
|
|
||||||
|
|
||||||
mkdir -p audio video
|
|
||||||
|
|
||||||
busybox httpd -p 8080 -h /www
|
|
||||||
nice /scripts/reader.sh &
|
|
||||||
nice /scripts/encoder.sh &
|
|
||||||
nice /scripts/status.sh &
|
|
||||||
|
|
||||||
wait
|
|
|
@ -1,44 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
. $(dirname $0)/common.sh
|
|
||||||
|
|
||||||
with_time_dir () {
|
|
||||||
mtype=$1; shift
|
|
||||||
now=$(date --rfc-3339=s | tr ' ' T)
|
|
||||||
dir="$mtype/$now"
|
|
||||||
mkdir -p "$dir"
|
|
||||||
cd "$dir"
|
|
||||||
|
|
||||||
setenv time "$now"
|
|
||||||
setenv mtype "$mtype"
|
|
||||||
setenv directory "$dir"
|
|
||||||
setenv status "reading"
|
|
||||||
|
|
||||||
tatusreader "$mtype"
|
|
||||||
if ! "$@"; then
|
|
||||||
log "$1 failed"
|
|
||||||
setenv status "read failed"
|
|
||||||
else
|
|
||||||
log "$1 succeeded"
|
|
||||||
setenv status "read finished"
|
|
||||||
eject
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
while sleep 2; do
|
|
||||||
status reader idle
|
|
||||||
case $(setcd -i) in
|
|
||||||
*"Disc found in drive: audio"*)
|
|
||||||
log "Found audio disc"
|
|
||||||
( with_time_dir audio /scripts/cd.audio.read.sh )
|
|
||||||
;;
|
|
||||||
*"Disc found in drive: data"*)
|
|
||||||
log "Found DVD"
|
|
||||||
( with_time_dir video /scripts/dvd.video.read.sh )
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# vi: sw=2 ts=2 et ai
|
|
|
@ -1,29 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
set -x # Why the heck is this eating 100% CPU in an unkillable state?
|
|
||||||
|
|
||||||
. $(dirname $0)/common.sh
|
|
||||||
|
|
||||||
queue () {
|
|
||||||
find audio video -name env.json \
|
|
||||||
| while read envjson # This is the line that's dying at 100% CPU
|
|
||||||
do
|
|
||||||
dir=${envjson%/env.json}
|
|
||||||
cat $envjson \
|
|
||||||
| jq --arg dir "$dir" '.directory = $dir'
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
cat <<EOD
|
|
||||||
{
|
|
||||||
"finished": {
|
|
||||||
"video": $(ls *.mkv 2>/dev/null | jq -nR '[inputs]'),
|
|
||||||
"audio": $(ls */*/.mp3 2>/dev/null | jq -nR '[inputs]')
|
|
||||||
},
|
|
||||||
"queue": $(queue | jq --slurp),
|
|
||||||
"status": {
|
|
||||||
"reader": $(cat status.reader | jq -nR '[inputs][0]'),
|
|
||||||
"encoder": $(cat status.encoder | jq -nR '[inputs][0]')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EOD
|
|
|
@ -1,13 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
|
|
||||||
. $(dirname $0)/common.sh
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
if ! /scripts/status.json.sh > /www/status.json.new; then
|
|
||||||
log "Unable to render status!"
|
|
||||||
else
|
|
||||||
mv /www/status.json.new /www/status.json
|
|
||||||
fi
|
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
#! /bin/sh -e
|
|
||||||
|
|
||||||
. $(dirname $0)/common.sh
|
|
||||||
|
|
||||||
title=$(getenv title)
|
|
||||||
|
|
||||||
HandBrakeCLI \
|
|
||||||
--json \
|
|
||||||
-i DVD/VIDEO_TS \
|
|
||||||
--main-feature \
|
|
||||||
--native-language eng \
|
|
||||||
-Z "Chromecast 1080p30 Surround" \
|
|
||||||
-o "${title}.mkv" \
|
|
||||||
2>/dev/null \
|
|
||||||
| sed 's/^[A-Za-z]*: //' \
|
|
||||||
| sed '/^[A-Z]/ d' \
|
|
||||||
| jq --unbuffered '(.Working.Progress // 0) * 100' \
|
|
||||||
| while read pct; do
|
|
||||||
setenv complete "$pct"
|
|
||||||
done
|
|
||||||
|
|
||||||
mv "${title}.mkv" "$OUTDIR"
|
|
||||||
|
|
||||||
# vi: sw=2 ts=2 et ai
|
|
Loading…
Reference in New Issue