X-Git-Url: http://git.plutz.net/?a=blobdiff_plain;f=db_meta.sh;h=572ebbd30b4bfc0411b736dc5cffd395dc797852;hb=refs%2Fheads%2Fmaster;hp=e78bcc51dcb11ab7a9446390661cb9f5da4400c0;hpb=6cd76fcea5aad8585f307b4fc5b75bd2da746993;p=serve0 diff --git a/db_meta.sh b/db_meta.sh index e78bcc5..572ebbd 100755 --- a/db_meta.sh +++ b/db_meta.sh @@ -3,19 +3,21 @@ [ "$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" @@ -26,20 +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 - 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 @@ -47,8 +51,8 @@ read_meta() { } 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" ] \ @@ -61,24 +65,28 @@ update_meta(){ 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 @@ -88,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 @@ -111,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" @@ -134,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' @@ -147,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;; + ' "$@" +}