Initial commit - migration from music repo to own repo

This commit is contained in:
ayakael 2018-03-19 15:09:06 -04:00
commit 48d5fb91af
No known key found for this signature in database
GPG key ID: 575626A4AE5F4026
13 changed files with 337 additions and 0 deletions

18
src/clean_target Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
}