[ "$include_dbmeta" ] && return 0
include_dbmeta="$0"
+. "$_EXEC/cgilite/storage.sh"
+
# == FILE FORMAT ==
-# LENGTH WIDTH HEIGHT TAGS COMMENT NAME
+# LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP
# == GLOBALS ==
UNSET_META='unset \
- META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME
+ META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME META_GROUP
'
LOCAL_META='local \
- META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME
+ META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME META_GROUP
'
-eval "$UNSET_VIDEO"
+eval "$UNSET_META"
read_meta() {
local name="$1" meta_db="$_DATA/.index/meta"
# Global exports
META_LENGTH='' META_WIDTH='' META_HEIGHT='' META_TAGS=''
- META_COMMENT='' META_NAME=''
+ META_COMMENT='' META_NAME='' META_GROUP='' META_GROUPORDER=''
if [ $# -eq 0 ]; then
- read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME
+ read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT \
+ META_NAME META_GROUP META_GROUPORDER
elif [ "$name" -a -f "$meta_db" -a -r "$meta_db" ]; then
- while read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME; do
- [ "${META_NAME%${CR}}" = "$name" ] && break
- done <"${meta_db}"
- [ "${META_NAME%${CR}}" = "$name" ] || eval "$UNSET_META"
+ read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT \
+ META_NAME META_GROUP META_GROUPORDER <<-EOF
+ $(grep -F " ${name}${CR}" "$meta_db" |dbmeta_autogroup)
+ EOF
fi
if [ "$META_NAME" ]; then
META_NAME="$(UNSTRING "${META_NAME%${CR}}")"
META_COMMENT="$(UNSTRING "${META_COMMENT#comment=}")"
META_TAGS="$(UNSTRING "${META_TAGS#tags=}")"
+ META_GROUP="${META_GROUP#\\}"
else
eval "$UNSET_META"
return 1
}
update_meta(){
- local name="${1:=${META_NAME}}" tags comment length width height
- eval LENGTH WIDTH HEIGH TAGS COMMENT NAME
+ local name="${1:=${META_NAME}}" tags comment length width height group
+ local LENGTH WIDTH HEIGH TAGS COMMENT NAME GROUP
local arg cnt meta_db="$_DATA/.index/meta"
[ "${name%%/*}" != "$name" ] \
lenght=*) lenght="${arg#*=}";;
width=*) width="${arg#*=}";;
height=*) height="${arg#*=}";;
+ group=*) group="${arg#*=}";;
esac; done
if LOCK "$meta_db"; then
- while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
- if [ "$name" = "${NAME%${CR}}" ]; then
- printf '%i %i %i tags=%s comment=%s %s\r\n' \
- "${length:-${length-${LENGTH}}${length+0}}" \
- "${width:-${width-${WIDTH}}${width+0}}" \
- "${height:-${height-${HEIGHT}}${height+0}}" \
- "$(STRING "${tags-$(UNSTRING "${TAGS#tags=}")}")" \
- "$(STRING "${comment-$(UNSTRING "${COMMENT#comment=}")}")" \
- "$(STRING "${name-$(UNSTRING "${NAME%${CR}}")}")"
- else
- printf '%i %i %i tags=%s comment=%s %s\r\n' \
- "$length" "$width" "$height" "${TAGS#tags=}" \
- "${COMMENT#comment=}" "${NAME%${CR}}"
- fi
- done <"$meta_db" >"${meta_db}.$$"
+ read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP <<-EOF
+ $(grep -F " ${name}${CR}" "$meta_db")
+ EOF
+ if [ ! "$NAME" ]; then
+ RELEASE "$meta_db"
+ return 1
+ fi
+ printf '%i %i %i tags=%s comment=%s %s\r %s\n' \
+ "${length:-${length-${LENGTH}}${length+0}}" \
+ "${width:-${width-${WIDTH}}${width+0}}" \
+ "${height:-${height-${HEIGHT}}${height+0}}" \
+ "$(STRING "${tags-$(UNSTRING "${TAGS#tags=}")}")" \
+ "$(STRING "${comment-$(UNSTRING "${COMMENT#comment=}")}")" \
+ "${NAME%${CR}}" "${group:-${GROUP:-\\}}" \
+ >"${meta_db}.$$"
+
+ grep -vF " ${name}${CR}" "$meta_db" >>"${meta_db}.$$"
+
mv -- "${meta_db}.$$" "${meta_db}"
RELEASE "$meta_db"
else
new_meta(){
local name="$1" meta_db="$_DATA/.index/meta"
- local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
+ local LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP
[ "${name%%/*}" != "$name" ] \
&& meta_db="$_DATA/${name%%/*}/.index/meta"
name="$(STRING "${name##*/}")"
if LOCK "$meta_db"; then
- while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
+ while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP; do
if [ "$name" = "${NAME%${CR}}" ]; then
RELEASE "$vid_db"
return 1
fi
done <"$meta_db"
- printf '0 0 0 tags=\\ comment=\\ %s\r\n' \
+ printf '0 0 0 tags=\\ comment=\\ %s\r \\\n' \
"${name}" >>"$meta_db"
RELEASE "$meta_db"
else
delete_meta() {
local name="$1" meta_db="$_DATA/.index/meta"
- local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
+ local LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP
[ "${name%%/*}" != "$name" ] \
&& meta_db="$_DATA/${name%%/*}/.index/meta"
name="$(STRING "${name##*/}")"
if LOCK "$meta_db"; then
- while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
+ while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP; do
[ "$name" = "${NAME%${CR}}" ] \
- || printf '%i %i %i tags=%s comment=%s %s\r\n' \
+ || printf '%i %i %i tags=%s comment=%s %s\r %s\n' \
"$length" "$width" "$height" "${TAGS#tags=}" \
- "${COMMENT#comment=}" "${NAME%${CR}}"
+ "${COMMENT#comment=}" "${NAME%${CR}}" "${GROUP:-\\}"
done <"$meta_db" >"${meta_db}.$$"
mv -- "${meta_db}.$$" "$meta_db"
list_meta(){
local meta pfx
- local LENGTH WIDTH HEIGHT TAGS COMMENT NAME
+ local LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP
if [ "$#" -eq 0 ]; then
find "$_DATA" -path '*/.index/meta'
pfx="$(STRING "${pfx#/}")"
[ "$pfx" = '\' ] && pfx='' || pfx="${pfx}/"
- while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME; do
- printf '%i %i %i tags=%s comment=%s %s%s\r\n' \
- $LENGTH $WIDTH $HEIGHT "${TAGS#tags=}" \
- "${COMMENT#comment=}" "${pfx}" "${NAME%${CR}}"
- done <"$meta"
+ { printf '%s\n' "$pfx"
+ dbmeta_autogroup "$meta"
+ } | sed -E '
+ 1{ h; d; }
+ G;
+ s;^([^\t]+ [^\t]+ [^\t]+ [^\t]+ [^\t]+ )([^\n]+)\n(.*)$;\1\3\2;
+ '
done
}
+
+dbmeta_autogroup(){
+ sed -E '
+ # strip empty group field
+ s;\r \\$;\r;;
+ h; # save original dataset
+
+ # strip common suffixes of web video sites
+ s;-([0-9a-zA-Z_-]{11}|ph[0-9a-f]{13}|xh[0-9a-zA-Z]{5}|[0-9]{6,})\r;-\r;;
+
+ # perform auto grouping if group id is missing or empty
+ /\r$/bAUTOGROUP;
+
+ # only perform ordering if manual group id is present
+ /\r .+$/bAUTOORDER;
+
+ b; # pass invalid records without processing
+
+ :AUTOORDER
+ # strip all fields but the name
+ s;^([^\t]+ [^\t]+ [^\t]+ [^\t]+ [^\t]+ )([^\r]+)\r (.+)$;\2;
+
+ # reduce to numerals
+ s;[^0-9]+;;g;
+
+ # append ordering field to dataset
+ H; g; s;\n;\t;;
+ b;
+
+ :AUTOGROUP
+ # strip all fields but the name
+ s;^[^\t]+ [^\t]+ [^\t]+ [^\t]+ [^\t]+ ;;
+
+ # replace all numeric parts and append numerals to an ordering field
+ # the group id will be made up of only the non-numeric character frame
+ # the ordering field will hold all numbers from the name
+ :X s;^([^0-9]*)([0-9]+)([^\r]*)\r\t?([0-9]*)$;\1\r\3\r \4\2;; tX;
+
+ # append group id and ordering field to dataset
+ H; g; s;\n;\t;;
+ ' "$@"
+}