]> git.plutz.net Git - rawnet/blob - page_channel.sh
video file upload
[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 AUTHOR(){
63   if [ "$channel" -a "$USER_ID" -a ! "${CHANNEL_AUTHORS##*${USER_ID}*}" ]; then
64     return 0
65   else
66     return 1
67   fi
68 }
69
70 # Video
71 # ID    NAME    DESCRIPTION     RESX    RESY    LENGTH  COVER   STATUS  UPLOADER        HITS
72
73 [ "$REQUEST_METHOD" = POST ] && case "$(POST action)" in
74   newchannel)
75     channel="$(POST channel |checkid)"
76     if [ ! "$USER_ID" ]; then
77       REDIRECT "${_BASE}/channel/#ERROR_NEWCHANNEL_NOTALLOWED"
78     elif LOCK "$chan_db"; then
79       if grep -q '^${channel}   ' "$chan_db"; then
80         RELEASE "$chan_db"
81         REDIRECT "${_BASE}/channel/#ERROR_NEWCHANNEL_EXISTS"
82       else
83         printf '%s      \\      \\      \\      \\      %s      \\      \\\n' \
84                "$channel" "$(STRING "$USER_ID")" \
85                >>"$chan_db"
86         RELEASE "$chan_db"
87         REDIRECT "${_BASE}/channel/${channel}/edit"
88       fi
89     else
90       REDIRECT "${_BASE}/channel/#ERROR_NEWCHANNEL_NOLOCK"
91     fi
92     ;;
93   update_channel)
94     if [ ! "$channel" ]; then
95       REDIRECT "${_BASE}/channel/#ERROR_NOCHANNEL"
96     elif [ ! "$USER_ID" ]; then
97       REDIRECT "${_BASE}/channel/${channel}/#ERROR_NOTLOGGEDIN"
98     elif ! AUTHOR; then
99       REDIRECT "${_BASE}/channel/${channel}/#ERROR_UPDATE_NOTALLOWED"
100     elif update_channel "$channel" "$(POST name)" "$(POST description)" \
101                         "" "" "$USER_ID" "" ""; then
102       REDIRECT "${_BASE}/channel/${channel}/"
103     else
104       REDIRECT "${_BASE}/channel/${channel}/#ERROR_UPDATE_NOLOCK"
105     fi
106     ;;
107   update_channel_cancel)
108     REDIRECT "${_BASE}/channel/${channel}/"
109     ;;
110   newvideo)
111     video="$(POST video |checkid)"
112
113     AUTHOR \
114     && mkdir -p -- "${_DATA}/${channel}/"
115
116     if [ ! "$video" ]; then
117       REDIRECT "${_BASE}/channel/${channel}/#ERROR_INVALID_ID"
118     elif [ ! "$channel" ]; then
119       REDIRECT "${_BASE}/channel/#ERROR_NOCHANNEL"
120     elif [ ! "$USER_ID" ]; then
121       REDIRECT "${_BASE}/channel/${channel}/#ERROR_NOTLOGGEDIN"
122     elif ! AUTHOR; then
123       REDIRECT "${_BASE}/channel/${channel}/#ERROR_UPDATE_NOTALLOWED"
124     elif LOCK "$vid_db"; then
125       if grep -q '^${video}     ' "$vid_db"; then
126         RELEASE "$vid_db"
127         REDIRECT "${_BASE}/channel/${channel}/#ERROR_NEWVIDEO_EXISTS"
128       else
129                 # ID    NAME    DESC    RESX    RESY    LENGTH  COVER   STATUS  UPLOADER HITS   FUTUREUSE
130         printf '%s      \\      \\      \\      \\      \\      \\      private %s      \\      \\\n' \
131                "$video" "$(STRING "$USER_ID")" \
132                >>"$vid_db"
133         RELEASE "$vid_db"
134         REDIRECT "${_BASE}/channel/${channel}/${video}/edit"
135       fi
136     else
137       REDIRECT "${_BASE}/channel/${channel}/#ERROR_NEWVIDEO_NOLOCK"
138     fi
139     ;;
140 esac
141
142 w_video(){
143   local CID="$1" thumb
144   local ID NAME DESCRIPTION RESX RESY LENGTH COVER STATUS UPLOADER HITS DESCR_CACHE FUTUREUSE
145   if read -r ID NAME DESCRIPTION RESX RESY LENGTH COVER STATUS UPLOADER HITS DESCR_CACHE FUTUREUSE; then
146     thumb="${_BASE}/${CID}/thumb_${ID}.jpg"
147     [ "$NAME" = \\ ] && NAME="(Unnamed Video)"
148     printf '[div .video .thumb
149               [h3 [a href="%s/channel/%s/%s/" . %s]]
150               [figure [img src="%s" alt=""]]
151               [div .description . %s]
152             ]' "$_BASE" "$CID" "$ID" "$(UNSTRING "$NAME" |HTML)" "$thumb" "$(UNSTRING "$DESCR_CACHE")"
153   else
154     return 1
155   fi
156 }
157
158 w_channel(){
159   local vid_db
160   local ID NAME DESCRIPTION LOGO THEME AUTHORS DESCR_CACHE FUTUREUSE
161   if read -r ID NAME DESCRIPTION LOGO THEME AUTHORS DESCR_CACHE FUTUREUSE; then
162     vid_db="${_DATA}/${ID}/videos.db"
163     [ "$NAME" = \\ ] && NAME="(UNNAMED CHANNEL)"
164     cat <<-EOF
165         [div .channel
166           [div .description
167             [h2 [a href="${_BASE}/channel/${ID}/" $(UNSTRING "${NAME}" |HTML)]]
168             $(UNSTRING "$DESCR_CACHE")
169           ]$(
170             [ -f "$vid_db" -a -r "$vid_db" ] \
171             && while w_video "$ID"; do :; done <"$vid_db"
172           )
173         ]
174         EOF
175   else
176     return 1
177   fi
178 }
179
180 w_channel_list(){
181   if [ $USER_ID ]; then
182     printf '
183     [form .channel .newchannel method=POST
184       [hidden "channel" "%s"]
185       [submit "action" "newchannel" New Channel]
186     ]' "$(timeid)"
187   fi
188   [ -f "$chan_db" -a -r "$chan_db" ] \
189   && while w_channel; do :; done <"$chan_db"
190 }
191
192 if [ "$channel" -a "$video" ]; then
193   . ${_EXEC}/page_video.sh
194 elif [ "$channel" -a "$action" = edit ]; then
195   AUTHOR || REDIRECT "${_BASE}/${channel}/#ERROR_EDIT_NOTALLOWED"
196   yield_page "$CHANNEL_NAME - Edit" "channel edit" <<-EOF
197         [form .channel .edit method=POST
198           [input name="name" value="$(HTML "$CHANNEL_NAME")" placeholder="Channel Name"]
199           [textarea name="description" placeholder="Description" . $(HTML "$CHANNEL_DESCRIPTION")]
200           [submit "action" "update_channel" . Update]
201           [submit "action" "update_channel_cancel" . Cancel]
202         ]
203         EOF
204 elif [ "$channel" ]; then
205   yield_page "$CHANNEL_NAME" "channel" <<-EOF
206         [nav [a href="../" Channels] - [span $(HTML "${CHANNEL_NAME:-(Unnamed Channel)}")]
207           $(AUTHOR && printf ' - [a href="edit" edit]')
208         ]
209         [h1 .name $(HTML "$CHANNEL_NAME")]
210         [div .description . ${CHANNEL_DESCR_CACHE}]
211         [h1 .videos Videos]
212         [div .videos . $(
213           AUTHOR && printf '
214              [form .video .newvideo method=POST
215                [hidden "video" "%s"]
216                [submit "action" "newvideo" New Video]
217              ]' "$(timeid)"
218           [ -f "$vid_db" -a -r "$vid_db" ] \
219           && while w_video "$ID"; do :; done <"$vid_db"
220         )]
221         EOF
222 else
223   yield_page "Channels" "channels" <<-EOF
224         $(w_channel_list)
225         EOF
226 fi