]> git.plutz.net Git - serve0/blob - db_meta.sh
improved auto grouping
[serve0] / db_meta.sh
1 #!/bin/sh
2
3 [ "$include_dbmeta" ] && return 0
4 include_dbmeta="$0"
5
6 . "$_EXEC/cgilite/storage.sh"
7
8 # == FILE FORMAT ==
9 # LENGTH        WIDTH   HEIGHT  TAGS    COMMENT NAME    GROUP
10
11 # == GLOBALS ==
12 UNSET_META='unset \
13   META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME META_GROUP
14 '
15
16 LOCAL_META='local \
17   META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT META_NAME META_GROUP
18 '
19
20 eval "$UNSET_META"
21
22 read_meta() {
23   local name="$1" meta_db="$_DATA/.index/meta"
24
25   [ "${name%%/*}" != "$name" ] \
26   && meta_db="$_DATA/${name%%/*}/.index/meta"
27   name="$(STRING "${name##*/}")"
28
29   # Global exports
30   META_LENGTH='' META_WIDTH='' META_HEIGHT='' META_TAGS=''
31   META_COMMENT='' META_NAME='' META_GROUP='' META_GROUPORDER=''
32
33   if [ $# -eq 0 ]; then
34     read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT \
35             META_NAME META_GROUP META_GROUPORDER
36   elif [ "$name" -a -f "$meta_db" -a -r "$meta_db" ]; then
37     read -r META_LENGTH META_WIDTH META_HEIGHT META_TAGS META_COMMENT \
38             META_NAME META_GROUP META_GROUPORDER <<-EOF
39         $(grep -F "     ${name}${CR}" "$meta_db" |dbmeta_autogroup)
40         EOF
41   fi
42   if [ "$META_NAME" ]; then
43        META_NAME="$(UNSTRING "${META_NAME%${CR}}")"
44     META_COMMENT="$(UNSTRING "${META_COMMENT#comment=}")"
45        META_TAGS="$(UNSTRING "${META_TAGS#tags=}")"
46       META_GROUP="${META_GROUP#\\}"
47   else
48     eval "$UNSET_META"
49     return 1
50   fi
51 }
52
53 update_meta(){
54   local name="${1:=${META_NAME}}" tags comment length width height group
55   local LENGTH WIDTH HEIGH TAGS COMMENT NAME GROUP
56   local arg cnt meta_db="$_DATA/.index/meta"
57
58   [ "${name%%/*}" != "$name" ] \
59   && meta_db="$_DATA/${name%%/*}/.index/meta"
60   name="$(STRING "${name##*/}")"
61
62   for arg in "$@"; do case $arg in
63     comment=*) comment="${arg#*=}";;
64        tags=*)    tags="${arg#*=}";;
65      lenght=*)  lenght="${arg#*=}";;
66       width=*)   width="${arg#*=}";;
67      height=*)  height="${arg#*=}";;
68       group=*)   group="${arg#*=}";;
69   esac; done
70
71   if LOCK "$meta_db"; then
72     read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP <<-EOF
73         $(grep -F "     ${name}${CR}" "$meta_db")
74         EOF
75     if [ ! "$NAME" ]; then
76       RELEASE "$meta_db"
77       return 1
78     fi
79     printf '%i  %i      %i      tags=%s comment=%s      %s\r    %s\n' \
80            "${length:-${length-${LENGTH}}${length+0}}" \
81            "${width:-${width-${WIDTH}}${width+0}}" \
82            "${height:-${height-${HEIGHT}}${height+0}}" \
83            "$(STRING "${tags-$(UNSTRING "${TAGS#tags=}")}")" \
84            "$(STRING "${comment-$(UNSTRING "${COMMENT#comment=}")}")" \
85            "${NAME%${CR}}" "${group:-${GROUP:-\\}}" \
86     >"${meta_db}.$$"
87
88     grep -vF "  ${name}${CR}" "$meta_db" >>"${meta_db}.$$"
89
90     mv -- "${meta_db}.$$" "${meta_db}"
91     RELEASE "$meta_db"
92   else
93     return 1
94   fi
95 }
96
97 new_meta(){
98   local name="$1" meta_db="$_DATA/.index/meta"
99   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP
100
101   [ "${name%%/*}" != "$name" ] \
102   && meta_db="$_DATA/${name%%/*}/.index/meta"
103   name="$(STRING "${name##*/}")"
104
105   if LOCK "$meta_db"; then
106     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP; do
107       if [ "$name" = "${NAME%${CR}}" ]; then
108         RELEASE "$vid_db"
109         return 1
110       fi
111     done <"$meta_db"
112     printf '0   0       0       tags=\\ comment=\\      %s\r    \\\n' \
113            "${name}" >>"$meta_db"
114     RELEASE "$meta_db"
115   else
116     return 1
117   fi
118 }
119
120 delete_meta() {
121   local name="$1" meta_db="$_DATA/.index/meta"
122   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP
123
124   [ "${name%%/*}" != "$name" ] \
125   && meta_db="$_DATA/${name%%/*}/.index/meta"
126   name="$(STRING "${name##*/}")"
127
128   if LOCK "$meta_db"; then
129     while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP; do
130       [ "$name" = "${NAME%${CR}}" ] \
131       || printf '%i     %i      %i      tags=%s comment=%s      %s\r    %s\n' \
132                 "$length" "$width" "$height" "${TAGS#tags=}" \
133                 "${COMMENT#comment=}" "${NAME%${CR}}" "${GROUP:-\\}"
134     done <"$meta_db" >"${meta_db}.$$"
135
136     mv -- "${meta_db}.$$" "$meta_db"
137     RELEASE "$meta_db"
138   else
139     return 1
140   fi
141 }
142
143 list_meta(){
144   local meta pfx
145   local LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP
146
147   if [ "$#" -eq 0 ]; then
148     find "$_DATA" -path '*/.index/meta'
149   else
150     printf %s\\n "$@"
151   fi \
152   | while read meta; do
153     pfx="${meta#$_DATA}"
154     pfx="${pfx%/.index/meta}"
155     pfx="$(STRING "${pfx#/}")"
156     [ "$pfx" = '\' ] && pfx='' || pfx="${pfx}/"
157
158     dbmeta_autogroup "$meta" \
159     | while read -r LENGTH WIDTH HEIGHT TAGS COMMENT NAME GROUP; do
160       printf '%i        %i      %i      tags=%s comment=%s      %s%s\r  %s\n' \
161              $LENGTH $WIDTH $HEIGHT "${TAGS#tags=}" \
162              "${COMMENT#comment=}" "${pfx}" "${NAME%${CR}}" "${GROUP:-\\}"
163     done
164   done
165 }
166
167 dbmeta_autogroup(){
168   sed -E '
169     # perform auto grouping if group id is missing or empty
170     /\r$/bAUTOGROUP; s;\r       \\$;\r;; tAUTOGROUP;
171   
172     # skip auto grouping if manual group id is present
173     /\r .+$/b;
174   
175     :AUTOGROUP
176     # save original dataset
177     h;
178   
179     # strip all fields but the name
180     s;^[^\t]+   [^\t]+  [^\t]+  [^\t]+  [^\t]+  ;;
181     # strip common suffixes of web video sites
182     s;-([0-9a-zA-Z_-]{11}|ph[0-9a-f]{13}|[0-9]{6,})\r$;-\r;;
183   
184     # replace all numeric parts and append numerals to an ordering field
185     # the group id will be made up of only the non-numeric character frame
186     # the ordering field will hold all numbers from the name
187     :X s;^([^\r0-9]*)([0-9]+)([^\r0-9]*)\r\t?([0-9]*)$;\1\r\3\r \4\2;; tX;
188   
189     # append group id and ordering field to dataset
190     H; g; s;\n;\t;;
191   ' "$@"
192 }