Initial commit - migration from music repo to own repo
This commit is contained in:
commit
48d5fb91af
13 changed files with 337 additions and 0 deletions
18
src/clean_target
Normal file
18
src/clean_target
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Cleans target of all FLAC files that are owned by IMAGEID that exist in TARGET directory
|
||||||
|
###
|
||||||
|
|
||||||
|
clean_target() {
|
||||||
|
local TARGET="${1}"
|
||||||
|
local IMAGEID="${2}"
|
||||||
|
local MANIFEST="${3}"
|
||||||
|
|
||||||
|
for old_file in $(grep ${IMAGEID} ${MANIFEST} | cut -d'=' -f1); do
|
||||||
|
rm ${TARGET}/${old_file}
|
||||||
|
done
|
||||||
|
sed -i "/${IMAGEID}/d" ${MANIFEST}
|
||||||
|
find ${TARGET}/* -empty -type d -delete >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
28
src/cmd_deploy
Normal file
28
src/cmd_deploy
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Deploys image ID using deploy_imageid function
|
||||||
|
###
|
||||||
|
|
||||||
|
cmd_deploy() {
|
||||||
|
local TARGET="${1}"; shift
|
||||||
|
local imageidList=(${@})
|
||||||
|
local MANIFEST="${TARGET}/${MANIFEST}"
|
||||||
|
local LAST_COMMIT="${TARGET}/${LAST_COMMIT}"
|
||||||
|
local EXCLUDE="${TARGET}/${EXCLUDE}"
|
||||||
|
if [[ ! -f "${MANIFEST}" ]] || [[ ! -f "${LAST_COMMIT}" ]] || [[ ! -f "${EXCLUDE}" ]]; then return 1; fi
|
||||||
|
|
||||||
|
|
||||||
|
for imageid in ${imageidList[@]}; do
|
||||||
|
_msg ECHO "Cleaning ${imageid} of ${TARGET}"
|
||||||
|
clean ${TARGET} ${imageid} ${MANIFEST} >${STDERR} 2>&1
|
||||||
|
[[ $? -ne 0 ]] && local ERRORS=true
|
||||||
|
if [[ -f "${imageid}.tags" ]] && is_not_excluded ${imageid} ${EXCLUDE}; then
|
||||||
|
deploy ${imageid} ${TARGET} ${MANIFEST}
|
||||||
|
[[ $? -ne 0 ]] && local ERRORS=true
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
[[ ${ERRORS} ]] && return 2
|
||||||
|
|
||||||
|
}
|
||||||
|
|
28
src/cmd_exclude
Normal file
28
src/cmd_exclude
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Command used to ADD or DELete an exception rule in OPT_EXCLUDE_FILE
|
||||||
|
###
|
||||||
|
|
||||||
|
cmd_exclude() {
|
||||||
|
local TARGET="${1}"
|
||||||
|
local EXCLUDE="${TARGET}/${EXCLUDE}"
|
||||||
|
local CMD="${2}"; shift 2
|
||||||
|
local fieldList=("${@}")
|
||||||
|
|
||||||
|
case ${CMD} in
|
||||||
|
add)
|
||||||
|
printf "%s\n" ${fieldList[@]} >> ${EXCLUDE}
|
||||||
|
;;
|
||||||
|
|
||||||
|
del)
|
||||||
|
for field in ${fieldList[@]}; do
|
||||||
|
sed -i "/${field}/d" ${EXCLUDE}
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
|
||||||
|
ls)
|
||||||
|
cat ${EXCLUDE}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
20
src/cmd_init
Normal file
20
src/cmd_init
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Command initializes TARGET directory by creating OPT_FILE_MANIFEST and OPT_FILE_EXCLUDE
|
||||||
|
# OPT_FILE_COMMIT
|
||||||
|
###
|
||||||
|
|
||||||
|
cmd_init() {
|
||||||
|
local TARGET="${1}"
|
||||||
|
local MANIFEST="${TARGET}/${MANIFEST}"
|
||||||
|
local LAST_COMMIT="${TARGET}/${LAST_COMMIT}"
|
||||||
|
local EXCLUDE="${TARGET}/${EXCLUDE}"
|
||||||
|
|
||||||
|
[[ -z "$(ls -A "${TARGET}")" ]] || return 1
|
||||||
|
touch "${MANIFEST}"
|
||||||
|
touch "${EXCLUDE}"
|
||||||
|
echo "COMMIT=$(git rev-list HEAD | tail -n 1)" > ${LAST_COMMIT}
|
||||||
|
[[ $? -eq 0 ]] && return 0 || return 2
|
||||||
|
}
|
||||||
|
|
60
src/deploy_imageid
Normal file
60
src/deploy_imageid
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Deploys IMAGEID to TARGET and then updates MANIFEST file
|
||||||
|
##
|
||||||
|
|
||||||
|
|
||||||
|
deploy_imageid() {
|
||||||
|
local IMAGEID="${1}"
|
||||||
|
local TARGET="${2}"
|
||||||
|
local MANIFEST="${3}"
|
||||||
|
local TOTALTRACKS="$(grep -e TITLE ${IMAGEID}.tags | wc -l)"
|
||||||
|
|
||||||
|
if [[ ! -e "${IMAGEID}.flac" ]]; then
|
||||||
|
_msg EXEC "Downloading data for ${IMAGEID}"
|
||||||
|
git annex get ${IMAGEID}.* >${STDERR} 2>&1
|
||||||
|
[[ $? -ne 0 ]] && _msg WARN || _msg OK
|
||||||
|
local DELETE=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
_msg EXEC "Generating data for ${IMAGEID}"
|
||||||
|
gen_flac ${IMAGEID}.flac ${IMAGEID}.cue >${STDERR} 2>&1
|
||||||
|
local EXIT_CODE=$?
|
||||||
|
[[ ${EXIT_CODE} -eq 0 ]] && _msg OK || _msg WARN
|
||||||
|
|
||||||
|
_msg EXEC "Parsing metadata for ${IMAGEID}"
|
||||||
|
local COUNT=1
|
||||||
|
while [[ ${COUNT} -le ${TOTALTRACKS} ]]; do
|
||||||
|
metaList[${COUNT}]="$(gen_meta ${IMAGEID}.tags ${COUNT})"
|
||||||
|
local COUNT=$(( ${COUNT} + 1 ))
|
||||||
|
done
|
||||||
|
_msg OK
|
||||||
|
|
||||||
|
_msg EXEC "Applying metadata for ${IMAGEID}"
|
||||||
|
local COUNT=1
|
||||||
|
while [[ ${COUNT} -le ${TOTALTRACKS} ]]; do
|
||||||
|
awk 'BEGIN {RS=";"}{print $0}' <<< ${metaList[${COUNT}]} | head -n -1 | metaflac --import-tags-from=- --import-picture-from="${IMAGEID}.jpg" $(printf 'split-track%02d.flac' ${COUNT})
|
||||||
|
[[ $? -ne 0 ]] && local GEN_META_ERR=true
|
||||||
|
local COUNT=$(( ${COUNT} + 1 ))
|
||||||
|
done
|
||||||
|
[[ ${GEN_META_ERR} ]] && _msg WARN || _msg OK
|
||||||
|
|
||||||
|
_msg EXEC "Deploying ${IMAGEID} to ${TARGET}"
|
||||||
|
local COUNT=1
|
||||||
|
while [[ ${COUNT} -le ${TOTALTRACKS} ]]; do
|
||||||
|
local DIR=$(gen_dir ${metaList[${COUNT}]} | sed s'|:|_|g')
|
||||||
|
mkdir -p "${TARGET}/$(dirname "${DIR}")"
|
||||||
|
mv $(printf 'split-track%02d.flac' ${COUNT}) "${TARGET}/${DIR}.flac"
|
||||||
|
echo "${DIR}.flac=${IMAGEID};" >> ${MANIFEST}
|
||||||
|
local COUNT=$(( ${COUNT} + 1 ))
|
||||||
|
done
|
||||||
|
_msg OK
|
||||||
|
|
||||||
|
if [[ ${DELETE} ]]; then
|
||||||
|
_msg EXEC "Dropping data for ${IMAGEID}"
|
||||||
|
git annex drop ${IMAGEID}.* >${STDERR} 2>&1
|
||||||
|
_msg OK
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
13
src/env
Normal file
13
src/env
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Sets environment variables necessary for the functioning of this script
|
||||||
|
###
|
||||||
|
|
||||||
|
source /usr/lib/bash/bunc
|
||||||
|
IFS='
|
||||||
|
'
|
||||||
|
MANIFEST=".manifest"
|
||||||
|
LAST_COMMIT=".last_commit"
|
||||||
|
EXCLUDE=".exclude"
|
||||||
|
|
21
src/is_not_excluded
Normal file
21
src/is_not_excluded
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Returns true if IMAGEID is not excluded from the OPT_EXCLUDE_FILE.
|
||||||
|
###
|
||||||
|
|
||||||
|
is_not_excluded() {
|
||||||
|
local IMAGEID="${1}"
|
||||||
|
local EXCLUDE="${2}"
|
||||||
|
local excludeList=($(cat ${EXCLUDE}))
|
||||||
|
|
||||||
|
[[ -z ${excludeList[@]} ]] && return 0
|
||||||
|
|
||||||
|
for exclude in ${excludeList[@]}; do
|
||||||
|
local FIELD=$(echo ${exclude} | cut -d'=' -f1)
|
||||||
|
local VALUE=$(echo ${exclude} | cut -d'=' -f2)
|
||||||
|
[[ -z "$(grep -i -l "\"${FIELD}\" : \"${VALUE}\"" ${IMAGEID}.tags)" ]] || return 1
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
54
src/parser
Normal file
54
src/parser
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#!
|
||||||
|
|
||||||
|
###
|
||||||
|
# Parses arguments and commands from shell
|
||||||
|
###
|
||||||
|
|
||||||
|
case "${1}" in
|
||||||
|
exclude)
|
||||||
|
shift
|
||||||
|
cmd_exclude ${@}
|
||||||
|
;;
|
||||||
|
|
||||||
|
init)
|
||||||
|
shift
|
||||||
|
cmd_init ${@}
|
||||||
|
;;
|
||||||
|
|
||||||
|
deploy)
|
||||||
|
shift
|
||||||
|
TARGET="${1}"; shift
|
||||||
|
imageidList=($(printf '%s\n' ${@} | sed 's/\(.*\)\..*/\1/'))
|
||||||
|
cmd_deploy ${TARGET} ${imageidList[@]}
|
||||||
|
;;
|
||||||
|
|
||||||
|
update)
|
||||||
|
shift
|
||||||
|
TARGET="${1}"; shift
|
||||||
|
LAST_COMMIT="${TARGET}/${LAST_COMMIT}"
|
||||||
|
NEW_COMMIT=$(git rev-parse HEAD)
|
||||||
|
OLD_COMMIT=$(grep COMMIT "${LAST_COMMIT}" | cut -d'=' -f2)
|
||||||
|
imageidList=($(sed 's/\(.*\)\..*/\1/' <<< $(git diff --name-only ${NEW_COMMIT} ${OLD_COMMIT}) | awk '!seen[$0]++' | grep SHA256))
|
||||||
|
echo $LAST_COMMIT
|
||||||
|
echo $NEW_COMMIT
|
||||||
|
echo $OLD_COMMIT
|
||||||
|
echo ${imageidList[@]}
|
||||||
|
|
||||||
|
cmd_deploy ${TARGET} ${imageidList[@]}
|
||||||
|
case $? in
|
||||||
|
0)
|
||||||
|
_msg ECHO "Update completed succesfully"
|
||||||
|
sed -i "s/COMMIT=.*/COMMIT=${NEW_COMMIT}/" ${LAST_COMMIT}
|
||||||
|
;;
|
||||||
|
|
||||||
|
1)
|
||||||
|
_msg ECHO "Missing exclude, manifest or exclude file. Please make sure you init"
|
||||||
|
;;
|
||||||
|
|
||||||
|
2)
|
||||||
|
_msg ECHO "Update completed with errors. Please review and deploy problematic images manually."
|
||||||
|
sed -i "s/COMMIT=.*/COMMIT=${NEW_COMMIT}/" ${LAST_COMMIT}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
esac
|
||||||
|
|
13
src/print_deployed_ids
Normal file
13
src/print_deployed_ids
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Prints IDs that are already deployed by parsing the IMAGEID field in all of the FLAC files
|
||||||
|
# that are present in the TARGET directory.
|
||||||
|
###
|
||||||
|
|
||||||
|
print_deployed_ids() {
|
||||||
|
local TARGET="${@}"
|
||||||
|
for flac in $(find "${TARGET}" -name '*.flac' -not -path '*/\.*' -printf "%P\t"); do
|
||||||
|
echo "${flac}=$(metaflac --list ${TARGET}/${flac} | grep IMAGEID | cut -d= -f2);"
|
||||||
|
done
|
||||||
|
}
|
27
src/print_meta
Normal file
27
src/print_meta
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Prints metadata of specified TRACKNUMBER, from textfile following the MTAG specification. Outputs as standard FIELD=VALUE that can then be pipped into metaflac.
|
||||||
|
###
|
||||||
|
|
||||||
|
|
||||||
|
print_meta() {
|
||||||
|
local MTAG=${1}
|
||||||
|
local TRACKNUMBER="${2}"
|
||||||
|
local TAGS=$(cat ${MTAG} | sed -e 's/^[[:space:]]*\"//')
|
||||||
|
local tagList=($(echo ${TAGS} | awk 'BEGIN {RS="\", ";FS="\" : \""}{if($1!~"{"){print $1}}' | awk '!seen[$0]++'))
|
||||||
|
|
||||||
|
for tag in ${tagList[@]}; do
|
||||||
|
local COUNT=1
|
||||||
|
while [[ ${COUNT} -le ${TRACKNUMBER} ]]; do
|
||||||
|
local PRTVAR=$(print_meta_track ${COUNT} ${tag} ${TAGS})
|
||||||
|
[[ ! -z ${PRTVAR} ]] && local CURVAR=${PRTVAR}
|
||||||
|
local COUNT=$(( ${COUNT} + 1 ))
|
||||||
|
done
|
||||||
|
echo -n "${tag}=${CURVAR};"
|
||||||
|
unset CURVAR
|
||||||
|
unset PRTVAR
|
||||||
|
done
|
||||||
|
echo -n "IMAGEID=$(sed 's|.tags||g' <<< ${MTAG})"
|
||||||
|
}
|
||||||
|
|
14
src/print_meta_field
Normal file
14
src/print_meta_field
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Prints VALUE of FIELD, for specific TRACK NUMBER out of a JSON string. Expects to be used
|
||||||
|
# by print_meta()
|
||||||
|
###
|
||||||
|
|
||||||
|
print_meta_field() {
|
||||||
|
local TRACK_NO="${1}"
|
||||||
|
local FIELD="${2}"; shift 2
|
||||||
|
local TAGS="${@}"
|
||||||
|
|
||||||
|
awk -v track="${TRACK_NO}" 'BEGIN {RS="\" * }"}{if(NR==track){print $0}}' <<< ${TAGS} | awk -v field="${FIELD}" 'BEGIN {RS="\", ";FS="\" : \"";}{if($1==field){print $2}}'
|
||||||
|
}
|
25
src/print_target_dir
Normal file
25
src/print_target_dir
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Prints output dir based on provided metadata TAGS. Expects input from print_meta function.
|
||||||
|
###
|
||||||
|
|
||||||
|
print_target_dir() {
|
||||||
|
local TAGS="${@}"
|
||||||
|
local tagList=(GENRE COMPOSER ALBUM ARTIST PERFORMER DATE DISCNUMBER TOTALDISCS TRACKNUMBER TITLE)
|
||||||
|
|
||||||
|
for tag in ${tagList[@]}; do
|
||||||
|
CURTAG="$(awk -v field=${tag} 'BEGIN{RS=";";FS="="}{if($1==field){printf $2}}' <<< ${TAGS})"
|
||||||
|
eval local ${tag}='${CURTAG}'
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "${GENRE}" == "Classical" ]]; then
|
||||||
|
echo -n "${GENRE}/${COMPOSER}/${ALBUM}/${ARTIST}/${DATE} - ${PERFORMER}/"
|
||||||
|
else
|
||||||
|
echo -n "${GENRE}/${ARTIST}/${DATE} - ${ALBUM}/"
|
||||||
|
fi
|
||||||
|
[[ ${TOTALDISCS} -gt 1 ]] && echo -n "${DISCNUMBER}."
|
||||||
|
printf "%02d" ${TRACKNUMBER}
|
||||||
|
echo -n " - $(sed 's|/|-|g' <<< ${TITLE} | sed 's|?||g')"
|
||||||
|
}
|
||||||
|
|
16
src/split_flac
Normal file
16
src/split_flac
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
###
|
||||||
|
# Splits specified FLAC image into multiple flac files using a text file formatted under the
|
||||||
|
# CUE specification
|
||||||
|
###
|
||||||
|
|
||||||
|
split_flac() {
|
||||||
|
local FLAC="${1}"
|
||||||
|
local CUE="${2}"
|
||||||
|
|
||||||
|
[[ -z "$(cuebreakpoints ${CUE} 2>/dev/null)" ]] && { cat ${FLAC} > split-track01.flac; return 0; }
|
||||||
|
cuebreakpoints ${CUE} 2>/dev/null | shntool split ${FLAC} -o flac -O always
|
||||||
|
[[ $? -ne 0 ]] && { cuebreakpoints ${CUE} 2>/dev/null | sed s/$/0/ | shntool split ${FLAC} -o flac -O always; return 2; } || return 0
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue