]> git.plutz.net Git - serve0/blob - db_meta.sh
Merge commit 'b931bbd0c30907b9cc956d3707b26b449bf41f76'
[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     { printf '%s\n' "$pfx"
159       dbmeta_autogroup "$meta"
160     } | sed -E '
161       1{ h; d; }
162       G;
163       s;^([^\t]+        [^\t]+  [^\t]+  [^\t]+  [^\t]+  )([^\n]+)\n(.*)$;\1\3\2;
164     '
165   done
166 }
167
168 dbmeta_autogroup(){
169   sed -E '
170     # strip empty group field
171     s;\r        \\$;\r;;
172     h;  # save original dataset
173
174     # strip common suffixes of web video sites
175     s;-([0-9a-zA-Z_-]{11}|ph[0-9a-f]{13}|xh[0-9a-zA-Z]{5}|[0-9]{6,})\r;-\r;;
176
177     # perform auto grouping if group id is missing or empty
178     /\r$/bAUTOGROUP;
179   
180     # only perform ordering if manual group id is present
181     /\r .+$/bAUTOORDER;
182
183     b;  # pass invalid records without processing
184
185     :AUTOORDER
186     # strip all fields but the name
187     s;^([^\t]+  [^\t]+  [^\t]+  [^\t]+  [^\t]+  )([^\r]+)\r     (.+)$;\2;
188
189     # reduce to numerals
190     s;[^0-9]+;;g;
191
192     # append ordering field to dataset
193     H; g; s;\n;\t;;
194     b;
195   
196     :AUTOGROUP
197     # strip all fields but the name
198     s;^[^\t]+   [^\t]+  [^\t]+  [^\t]+  [^\t]+  ;;
199   
200     # replace all numeric parts and append numerals to an ordering field
201     # the group id will be made up of only the non-numeric character frame
202     # the ordering field will hold all numbers from the name
203     :X s;^([^0-9]*)([0-9]+)([^\r]*)\r\t?([0-9]*)$;\1\r\3\r      \4\2;; tX;
204   
205     # append group id and ordering field to dataset
206     H; g; s;\n;\t;;
207   ' "$@"
208 }