]> git.plutz.net Git - rawnet/blob - page_channel.sh
Merge commit 'c4c012d9542c4b266fa701c3aced3b97f11a4797'
[rawnet] / page_channel.sh
1 #!/bin/sh
2
3 chan_db="$_DATA/channels.db"
4
5 channel='' video='' action=''
6 path_info="$PATH_INFO"
7 path_info="${path_info#/channel/}"
8 if [ "$(checkid "${path_info%%/*}")" ]; then
9   channel="${path_info%%/*}"
10   path_info="${path_info#*/}"
11 fi
12 if [ "$(checkid "${path_info%%/*}")" ]; then
13   video="${path_info%%/*}"
14   path_info="${path_info#*/}"
15 fi
16 action="${path_info}"
17 unset path_info
18
19 # Channel
20 # ID    NAME    DESCRIPTION     LOGO    THEME   AUTHORS DESCR_CACHE FUTUREUSE
21
22 if [ "$channel" -a -f "$chan_db" -a -r "$chan_db" ]; then
23   read -r CHANNEL_ID CHANNEL_NAME CHANNEL_DESCRIPTION CHANNEL_LOGO \
24           CHANNEL_THEME CHANNEL_AUTHORS CHANNEL_DESCR_CACHE \
25           CHANNEL_FUTUREUSE <<-EOF
26         $(grep "^${channel}     " "${chan_db}")
27         EOF
28   if [ "$CHANNEL_ID" ]; then
29            CHANNEL_NAME="$(UNSTRING "${CHANNEL_NAME}")"
30     CHANNEL_DESCRIPTION="$(UNSTRING "$CHANNEL_DESCRIPTION")"
31         CHANNEL_AUTHORS="$(UNSTRING "$CHANNEL_AUTHORS")"
32     CHANNEL_DESCR_CACHE="$(UNSTRING "$CHANNEL_DESCR_CACHE")"
33     vid_db="${_DATA}/${CHANNEL_ID}/videos.db"
34   else
35     channel=''
36   fi
37 fi
38
39 update_channel(){
40   local id="${1}" name="${2}" description="${3}" logo="${4}" theme="${5}" \
41         authors="${6}" descr_cache="${7}" futureuse="${8}"
42   local ID INFO
43   if LOCK "$chan_db"; then
44     while read -r ID INFO; do
45       if [ "$id" = "$ID" ]; then
46         printf '%s      %s      %s      %s      %s      %s      %s      %s\n' \
47                "$id" "$(STRING "$name")" "$(STRING "$description")" \
48                "${logo:-\\}" "${theme:-\\}" "$(STRING "$authors")" \
49                "$(printf %s "$description" |markdown |STRING)" \
50                "${futureuse:-\\}"
51       else
52         printf '%s      %s\n' "$ID" "$INFO"
53       fi
54     done <"$chan_db" >"${chan_db}.$$"
55     mv -- "${chan_db}.$$" "${chan_db}"
56     RELEASE "$chan_db"
57   else
58     return 1
59   fi
60 }
61
62 # Video
63 # ID    NAME    DESCRIPTION     RESX    RESY    LENGTH  COVER   STATUS  UPLOADER        HITS
64
65 [ "$REQUEST_METHOD" = POST ] && case "$(POST action)" in
66   newchannel)
67     channel="$(POST channel |checkid)"
68     if [ ! "$USER_ID" ]; then
69       REDIRECT "${_BASE}/channel/#ERROR_NEWCHANNEL_NOTALLOWED"
70     elif LOCK "$chan_db"; then
71       if grep -q '^${channel}   ' "$chan_db"; then
72         RELEASE "$chan_db"
73         REDIRECT "${_BASE}/channel/#ERROR_NEWCHANNEL_EXISTS"
74       else
75         printf '%s      \\      \\      \\      \\      %s      \\      \\\n' \
76                "$channel" "$(STRING "$USER_ID")" \
77                >>"$chan_db"
78         RELEASE "$chan_db"
79         REDIRECT "${_BASE}/channel/${channel}/edit"
80       fi
81     else
82       REDIRECT "${_BASE}/channel/#ERROR_NEWCHANNEL_NOLOCK"
83     fi
84     ;;
85   update_channel)
86     if [ ! "$channel" ]; then
87       REDIRECT "${_BASE}/channel/#ERROR_NOCHANNEL"
88     elif [ ! "$USER_ID" ]; then
89       REDIRECT "${_BASE}/channel/${channel}/#ERROR_NOTLOGGEDIN"
90     elif [ "${CHANNEL_AUTHORS##*${USER_ID}*}" ]; then
91       REDIRECT "${_BASE}/channel/${channel}/#ERROR_UPDATE_NOTALLOWED"
92     elif update_channel "$channel" "$(POST name)" "$(POST description)" \
93                         "" "" "$USER_ID" "" ""; then
94       REDIRECT "${_BASE}/channel/${channel}/"
95     else
96       REDIRECT "${_BASE}/channel/${channel}/#ERROR_UPDATE_NOLOCK"
97     fi
98     ;;
99   update_channel_cancel)
100     REDIRECT "${_BASE}/channel/${channel}/"
101     ;;
102   newvideo)
103     video="$(POST video |checkid)"
104
105     [ "$channel" -a "$USER_ID" -a ! "${CHANNEL_AUTHORS##*${USER_ID}*}" ] \
106     && mkdir -p -- "${_DATA}/${channel}/"
107
108     if [ ! "$video" ]; then
109       REDIRECT "${_BASE}/channel/${channel}/#ERROR_INVALID_ID"
110     elif [ ! "$channel" ]; then
111       REDIRECT "${_BASE}/channel/#ERROR_NOCHANNEL"
112     elif [ ! "$USER_ID" ]; then
113       REDIRECT "${_BASE}/channel/${channel}/#ERROR_NOTLOGGEDIN"
114     elif [ "${CHANNEL_AUTHORS##*${USER_ID}*}" ]; then
115       REDIRECT "${_BASE}/channel/${channel}/#ERROR_UPDATE_NOTALLOWED"
116     elif LOCK "$vid_db"; then
117       if grep -q '^${video}     ' "$vid_db"; then
118         RELEASE "$vid_db"
119         REDIRECT "${_BASE}/channel/${channel}/#ERROR_NEWVIDEO_EXISTS"
120       else
121                 # ID    NAME    DESC    RESX    RESY    LENGTH  COVER   STATUS  UPLOADER HITS   FUTUREUSE
122         printf '%s      \\      \\      \\      \\      \\      \\      private %s      \\      \\\n' \
123                "$video" "$(STRING "$USER_ID")" \
124                >>"$vid_db"
125         RELEASE "$vid_db"
126         REDIRECT "${_BASE}/channel/${channel}/${video}/edit"
127       fi
128     else
129       REDIRECT "${_BASE}/channel/${channel}/#ERROR_NEWVIDEO_NOLOCK"
130     fi
131     ;;
132 esac
133
134 w_video(){
135   local CID="$1" thumb
136   local ID NAME DESCRIPTION RESX RESY LENGTH COVER STATUS UPLOADER HITS DESCR_CACHE FUTUREUSE
137   if read -r ID NAME DESCRIPTION RESX RESY LENGTH COVER STATUS UPLOADER HITS FUTUREUSE; then
138     thumb="${_BASE}/${CID}/thumb_${ID}.jpg"
139     [ "$NAME" = \\ ] && NAME="(Unnamed Video)"
140     cat <<-EOF
141         [div .video
142           [h3 [a href="${ID}/" . $(UNSTRING "$NAME" |HTML)]]
143           [img href="${thumb}" alt="$(UNSTRING "$DESCR_CACHE")"]
144         ]
145         EOF
146   else
147     return 1
148   fi
149 }
150
151 w_channel(){
152   local vid_db
153   local ID NAME DESCRIPTION LOGO THEME AUTHORS DESCR_CACHE FUTUREUSE
154   if read -r ID NAME DESCRIPTION LOGO THEME AUTHORS DESCR_CACHE FUTUREUSE; then
155     vid_db="${_DATA}/${ID}/videos.db"
156     [ "$NAME" = \\ ] && NAME="(UNNAMED CHANNEL)"
157     cat <<-EOF
158         [div .channel
159           [h2 [a href="${_BASE}/channel/${ID}/" $(UNSTRING "${NAME}" |HTML)]]
160           [div .description . $(UNSTRING "$DESCR_CACHE")]
161           $( [ -f "$vid_db" -a -r "$vid_db" ] \
162              && while w_video "$ID"; do :; done <"$vid_db"
163           )
164         ]
165         EOF
166   else
167     return 1
168   fi
169 }
170
171 w_channel_list(){
172   if [ $USER_ID ]; then
173     printf '
174     [form .channel .newchannel method=POST
175       [hidden "channel" "%s"]
176       [submit "action" "newchannel" New Channel]
177     ]' "$(timeid)"
178   fi
179   [ -f "$chan_db" -a -r "$chan_db" ] \
180   && while w_channel; do :; done <"$chan_db"
181 }
182
183 if [ "$channel" -a "$video" ]; then
184   . ${_EXEC}/page_video.sh
185 elif [ "$channel" -a "$action" = edit ]; then
186   [ "$USER_ID" -a ! "${CHANNEL_AUTHORS##*${USER_ID}*}" ] \
187   || REDIRECT "${_BASE}/${channel}/#ERROR_EDIT_NOTALLOWED"
188   yield_page "$CHANNEL_NAME - Edit" "channel edit" <<-EOF
189         [form .channel .edit method=POST
190           [input name="name" value="$(HTML "$CHANNEL_NAME")" placeholder="Channel Name"]
191           [textarea name="description" placeholder="Description" . $(HTML "$CHANNEL_DESCRIPTION")]
192           [submit "action" "update_channel" . Update]
193           [submit "action" "update_channel_cancel" . Cancel]
194         ]
195         EOF
196 elif [ "$channel" ]; then
197   yield_page "$CHANNEL_NAME" "channel" <<-EOF
198         [nav [a href="../" Channels] - [span $(HTML "${CHANNEL_NAME:-(Unnamed Channel)}")]
199           $( [ "$USER_ID" -a ! "${CHANNEL_AUTHORS##*${USER_ID}*}" ] \
200              && printf ' - [a href="edit" edit]'
201           )
202         ]
203         [h1 .name $(HTML "$CHANNEL_NAME")]
204         [div .description . ${CHANNEL_DESCR_CACHE}]
205         [h1 .videos Videos]
206         [div .videos
207           $( [ "$USER_ID" -a ! "${CHANNEL_AUTHORS##*${USER_ID}*}" ] \
208              && printf '
209                 [form .video .newvideo method=POST
210                   [hidden "video" "%s"]
211                   [submit "action" "newvideo" New Video]
212                 ]' "$(timeid)"
213           )
214           $( [ -f "$vid_db" -a -r "$vid_db" ] \
215              && while w_video "$ID"; do :; done <"$vid_db"
216           )
217         ]
218         EOF
219 else
220   yield_page "Channels" "channels" <<-EOF
221         $(w_channel_list)
222         EOF
223 fi