mirror of
https://github.com/kmein/niveum
synced 2026-03-16 10:11:08 +01:00
feat: booksplit script
This commit is contained in:
@@ -106,7 +106,8 @@
|
||||
scripts.betacode # ancient greek betacode to unicode converter
|
||||
nur.repos.kmein.daybook
|
||||
nur.repos.kmein.mahlzeit
|
||||
nur.repos.kmein.slide
|
||||
# nur.repos.kmein.slide
|
||||
nur.repos.kmein.vimv
|
||||
scripts.swallow # window swallowing
|
||||
scripts.genius
|
||||
scripts.instaget
|
||||
@@ -114,7 +115,9 @@
|
||||
scripts.nav # json navigation
|
||||
scripts.n
|
||||
scripts.notetags
|
||||
scripts.booksplit
|
||||
scripts.mansplain
|
||||
scripts.manual-sort
|
||||
scripts.vg
|
||||
scripts.fkill
|
||||
scripts.wttr
|
||||
|
||||
45
packages/scripts/booksplit.sh
Executable file
45
packages/scripts/booksplit.sh
Executable file
@@ -0,0 +1,45 @@
|
||||
#!/bin/sh
|
||||
# https://github.com/LukeSmithxyz/voidrice/blob/master/.local/bin/booksplit
|
||||
|
||||
# Requires ffmpeg (audio splitting) and my `tag` wrapper script.
|
||||
|
||||
[ ! -f "$2" ] && printf "The first file should be the audio, the second should be the timecodes.\\n" && exit
|
||||
|
||||
echo "Enter the album/book title:"; read -r booktitle
|
||||
|
||||
echo "Enter the artist/author:"; read -r author
|
||||
|
||||
echo "Enter the publication year:"; read -r year
|
||||
|
||||
inputaudio="$1"
|
||||
|
||||
# Get a safe file name from the book.
|
||||
escbook="$(echo "$booktitle" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
|
||||
|
||||
! mkdir -p "$escbook" && echo "Do you have write access in this directory?" && exit 1
|
||||
|
||||
# As long as the extension is in the tag script, it'll work.
|
||||
ext="opus"
|
||||
#ext="${1#*.}"
|
||||
|
||||
# Get the total number of tracks from the number of lines.
|
||||
total="$(wc -l < "$2")"
|
||||
|
||||
while read -r x;
|
||||
do
|
||||
end="$(echo "$x" | cut -d' ' -f1)"
|
||||
[ -n "$start" ] &&
|
||||
echo "From $start to $end; $track $title"
|
||||
file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
|
||||
[ -n "$start" ] && echo "Splitting \"$title\"..." && ffmpeg -nostdin -y -loglevel -8 -i "$inputaudio" -ss "$start" -to "$end" -vn "$file" &&
|
||||
echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"
|
||||
title="$(echo "$x" | cut -d' ' -f 2-)"
|
||||
esctitle="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
|
||||
track="$((track+1))"
|
||||
start="$end"
|
||||
done < "$2"
|
||||
# The last track must be done outside the loop.
|
||||
echo "From $start to the end: $title"
|
||||
file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
|
||||
echo "Splitting \"$title\"..." && ffmpeg -nostdin -y -loglevel -8 -i "$inputaudio" -ss "$start" -vn "$file" &&
|
||||
echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"
|
||||
@@ -11,16 +11,28 @@ let
|
||||
voidrice = pkgs.fetchFromGitHub {
|
||||
owner = "LukeSmithxyz";
|
||||
repo = "voidrice";
|
||||
rev = "dff66cd1efb36afd54dd6dcf2fdaa9475d5646c1";
|
||||
sha256 = "19f33ins2kzgiw72d62j8zz9ai3j8m4qqfqmagxkg9yhxqkdqry7";
|
||||
rev = "107a99f2743b8412d667c10998677d9ed6ca8fc5";
|
||||
sha256 = "0rahn9h66gzfjjijqs6xqwbm9hy8zl7mj0mpdyfph3841lyraxrf";
|
||||
};
|
||||
in {
|
||||
in rec {
|
||||
instaget = wrapScript {
|
||||
packages = [ pkgs.jq pkgs.curl pkgs.gnugrep ];
|
||||
script = ./instaget.sh;
|
||||
name = "instaget";
|
||||
};
|
||||
|
||||
tag = wrapScript {
|
||||
packages = [ pkgs.vorbisTools pkgs.python3Packages.eyeD3 pkgs.nur.repos.kmein.opustags ];
|
||||
script = "${voidrice}/.local/bin/tag";
|
||||
name = "tag";
|
||||
};
|
||||
|
||||
booksplit = wrapScript {
|
||||
packages = [ pkgs.ffmpeg tag ];
|
||||
script = "${voidrice}/.local/bin/booksplit";
|
||||
name = "booksplit";
|
||||
};
|
||||
|
||||
n = wrapScript {
|
||||
script = ./n.sh;
|
||||
name = "n";
|
||||
@@ -136,6 +148,36 @@ in {
|
||||
sys.stdout.write(betacode.conv.beta_to_uni(sys.stdin.read()))
|
||||
'';
|
||||
|
||||
manual-sort = pkgs.writers.writeHaskellBin "manual-sort" {} ''
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
import Data.Char (toLower)
|
||||
import System.Environment (getArgs)
|
||||
import System.IO (BufferMode(NoBuffering), hSetBuffering, stdout)
|
||||
|
||||
insertionSortM :: Monad f => (a -> a -> f Ordering) -> [a] -> f [a]
|
||||
insertionSortM cmp = foldr ((=<<) . insertByM cmp) (pure [])
|
||||
where
|
||||
insertByM cmp x = \case
|
||||
[] -> pure [x]
|
||||
yys@(y : ys) -> cmp x y >>= \case
|
||||
GT -> (y :) <$> insertByM cmp x ys
|
||||
_ -> pure (x : yys)
|
||||
|
||||
ask :: Show a => a -> a -> IO Ordering
|
||||
ask a b = do
|
||||
putStr (show a ++ " > " ++ show b ++ "? (y/n) ")
|
||||
map toLower <$> getLine >>= \case
|
||||
'y' : _ -> return GT
|
||||
_ -> return LT
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
hSetBuffering stdout NoBuffering
|
||||
argv <- getArgs
|
||||
sorted <- insertionSortM ask argv
|
||||
mapM_ (\(place, thing) -> putStrLn (show place ++ ". " ++ show thing)) $ zip [1 ..] (reverse sorted)
|
||||
'';
|
||||
|
||||
scrot-dmenu = wrapScript {
|
||||
script = ./scrot-dmenu.sh;
|
||||
name = "dmenu-scrot";
|
||||
|
||||
60
packages/scripts/tag.sh
Executable file
60
packages/scripts/tag.sh
Executable file
@@ -0,0 +1,60 @@
|
||||
#!/bin/sh
|
||||
# https://github.com/LukeSmithxyz/voidrice/blob/master/.local/bin/tag
|
||||
|
||||
err() { echo "Usage:
|
||||
tag [OPTIONS] file
|
||||
Options:
|
||||
-a: artist/author
|
||||
-t: song/chapter title
|
||||
-A: album/book title
|
||||
-n: track/chapter number
|
||||
-N: total number of tracks/chapters
|
||||
-d: year of publication
|
||||
-g: genre
|
||||
-c: comment
|
||||
You will be prompted for title, artist, album and track if not given." && exit 1 ;}
|
||||
|
||||
while getopts "a:t:A:n:N:d:g:c:f:" o; do case "${o}" in
|
||||
a) artist="${OPTARG}" ;;
|
||||
t) title="${OPTARG}" ;;
|
||||
A) album="${OPTARG}" ;;
|
||||
n) track="${OPTARG}" ;;
|
||||
N) total="${OPTARG}" ;;
|
||||
d) date="${OPTARG}" ;;
|
||||
g) genre="${OPTARG}" ;;
|
||||
c) comment="${OPTARG}" ;;
|
||||
f) file="${OPTARG}" ;;
|
||||
*) printf "Invalid option: -%s\\n" "$OPTARG" && err ;;
|
||||
esac done
|
||||
|
||||
shift $((OPTIND - 1))
|
||||
|
||||
file="$1"
|
||||
|
||||
[ ! -f "$file" ] && echo "Provide file to tag." && err
|
||||
|
||||
[ -z "$title" ] && echo "Enter a title." && read -r title
|
||||
[ -z "$artist" ] && echo "Enter an artist." && read -r artist
|
||||
[ -z "$album" ] && echo "Enter an album." && read -r album
|
||||
[ -z "$track" ] && echo "Enter a track number." && read -r track
|
||||
|
||||
case "$file" in
|
||||
*.ogg) echo "Title=$title
|
||||
Artist=$artist
|
||||
Album=$album
|
||||
Track=$track
|
||||
Total=$total
|
||||
Date=$date
|
||||
Genre=$genre
|
||||
Comment=$comment" | vorbiscomment -w "$file" ;;
|
||||
*.opus) echo "Title=$title
|
||||
Artist=$artist
|
||||
Album=$album
|
||||
Track=$track
|
||||
Total=$total
|
||||
Date=$date
|
||||
Genre=$genre
|
||||
Comment=$comment" | opustags -i -S "$file" ;;
|
||||
*.mp3) eyeD3 -Q --remove-all -a "$artist" -A "$album" -t "$title" -n "$track" -N "$total" -Y "$date" "$file" ;;
|
||||
*) echo "File type not implemented yet." ;;
|
||||
esac
|
||||
Reference in New Issue
Block a user