X-Git-Url: http://git.plutz.net/?a=blobdiff_plain;f=db_meta.sh;h=572ebbd30b4bfc0411b736dc5cffd395dc797852;hb=refs%2Fheads%2Fmaster;hp=f1eec4d237db1c97ab890b7f71c92a4564c70f71;hpb=a2cd32dfe7f8c4fa0051ae5823552ac5c4cf4cf6;p=serve0 diff --git a/db_meta.sh b/db_meta.sh index f1eec4d..572ebbd 100755 --- a/db_meta.sh +++ b/db_meta.sh @@ -6,15 +6,15 @@ 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_META" @@ -28,19 +28,22 @@ read_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 - read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME <<-EOF - $(grep -F " ${name}${CR}" "$meta_db") + 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 @@ -48,8 +51,8 @@ read_meta() { } update_meta(){ - local name="${1:=${META_NAME}}" tags comment length width height - local 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" ] \ @@ -62,23 +65,24 @@ update_meta(){ lenght=*) lenght="${arg#*=}";; width=*) width="${arg#*=}";; height=*) height="${arg#*=}";; + group=*) group="${arg#*=}";; esac; done if LOCK "$meta_db"; then - read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME <<-EOF + 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\n' \ + 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}}" \ + "${NAME%${CR}}" "${group:-${GROUP:-\\}}" \ >"${meta_db}.$$" grep -vF " ${name}${CR}" "$meta_db" >>"${meta_db}.$$" @@ -92,20 +96,20 @@ update_meta(){ 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 @@ -115,18 +119,18 @@ new_meta(){ 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" @@ -138,7 +142,7 @@ delete_meta() { 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' @@ -151,10 +155,54 @@ list_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;; + ' "$@" +}