]> git.plutz.net Git - rawnet/blob - page_channel.sh
b1fd4c50d000448ea7b00312c399a8d94ae6fe29
[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 DESCR_CACHE FUTUREUSE; then
138     thumb="${_BASE}/${CID}/thumb_${ID}.jpg"
139     [ "$NAME" = \\ ] && NAME="(Unnamed Video)"
140     printf '[div .video .thumb
141               [h3 [a href="%s/" . %s]]
142               [figure [img src="%s" alt=""]]
143               [div .description . %s]
144             ]' "$ID" "$(UNSTRING "$NAME" |HTML)" "$thumb" "$(UNSTRING "$DESCR_CACHE")"
145   else
146     return 1
147   fi
148 }
149
150 w_channel(){
151   local vid_db
152   local ID NAME DESCRIPTION LOGO THEME AUTHORS DESCR_CACHE FUTUREUSE
153   if read -r ID NAME DESCRIPTION LOGO THEME AUTHORS DESCR_CACHE FUTUREUSE; then
154     vid_db="${_DATA}/${ID}/videos.db"
155     [ "$NAME" = \\ ] && NAME="(UNNAMED CHANNEL)"
156     cat <<-EOF
157         [div .channel
158           [div .description
159             [h2 [a href="${_BASE}/channel/${ID}/" $(UNSTRING "${NAME}" |HTML)]]
160             $(UNSTRING "$DESCR_CACHE")
161           ]$(
162             [ -f "$vid_db" -a -r "$vid_db" ] \
163             && while w_video "$ID"; do :; done <"$vid_db"
164           )
165         ]
166         EOF
167   else
168     return 1
169   fi
170 }
171
172 w_channel_list(){
173   if [ $USER_ID ]; then
174     printf '
175     [form .channel .newchannel method=POST
176       [hidden "channel" "%s"]
177       [submit "action" "newchannel" New Channel]
178     ]' "$(timeid)"
179   fi
180   [ -f "$chan_db" -a -r "$chan_db" ] \
181   && while w_channel; do :; done <"$chan_db"
182 }
183
184 if [ "$channel" -a "$video" ]; then
185   . ${_EXEC}/page_video.sh
186 elif [ "$channel" -a "$action" = edit ]; then
187   [ "$USER_ID" -a ! "${CHANNEL_AUTHORS##*${USER_ID}*}" ] \
188   || REDIRECT "${_BASE}/${channel}/#ERROR_EDIT_NOTALLOWED"
189   yield_page "$CHANNEL_NAME - Edit" "channel edit" <<-EOF
190         [form .channel .edit method=POST
191           [input name="name" value="$(HTML "$CHANNEL_NAME")" placeholder="Channel Name"]
192           [textarea name="description" placeholder="Description" . $(HTML "$CHANNEL_DESCRIPTION")]
193           [submit "action" "update_channel" . Update]
194           [submit "action" "update_channel_cancel" . Cancel]
195         ]
196         EOF
197 elif [ "$channel" ]; then
198   yield_page "$CHANNEL_NAME" "channel" <<-EOF
199         [nav [a href="../" Channels] - [span $(HTML "${CHANNEL_NAME:-(Unnamed Channel)}")]
200           $( [ "$USER_ID" -a ! "${CHANNEL_AUTHORS##*${USER_ID}*}" ] \
201              && printf ' - [a href="edit" edit]'
202           )
203         ]
204         [h1 .name $(HTML "$CHANNEL_NAME")]
205         [div .description . ${CHANNEL_DESCR_CACHE}]
206         [h1 .videos Videos]
207         [div .videos . $(
208           [ "$USER_ID" -a ! "${CHANNEL_AUTHORS##*${USER_ID}*}" ] \
209           && printf '
210              [form .video .newvideo method=POST
211                [hidden "video" "%s"]
212                [submit "action" "newvideo" New Video]
213              ]' "$(timeid)"
214           [ -f "$vid_db" -a -r "$vid_db" ] \
215           && while w_video "$ID"; do :; done <"$vid_db"
216         )]
217         EOF
218 else
219   yield_page "Channels" "channels" <<-EOF
220         $(w_channel_list)
221         EOF
222 fi