]> git.plutz.net Git - rawnet/blob - db_video.sh
78d108551af1c120f64cdf9f502ee5f74ae871d0
[rawnet] / db_video.sh
1 #!/bin/sh
2
3 [ "$include_dbvideo" ] && return 0
4 include_dbvideo="$0"
5
6 # == FILE FORMAT ==
7 # ID    NAME    DESCRIPTION     RESX    RESY    LENGTH  COVER   STATUS  UPLOADER        HITS    DESCR_CACHE     FUTUREUSE
8 #                                                               (void|private|hidden|public)
9
10 # == GLOBALS ==
11 unset VIDEO_ID VIDEO_NAME VIDEO_DESCRIPTION VIDEO_RESX VIDEO_RESY \
12       VIDEO_LENGTH VIDEO_COVER VIDEO_STATUS VIDEO_UPLOADER VIDEO_HITS \
13       VIDEO_DESCR_CACHE VIDEO_FUTUREUSE
14
15 LOCAL_VIDEO='local \
16   VIDEO_ID VIDEO_NAME VIDEO_DESCRIPTION VIDEO_RESX VIDEO_RESY \
17   VIDEO_LENGTH VIDEO_COVER VIDEO_STATUS VIDEO_UPLOADER VIDEO_HITS \
18   VIDEO_DESCR_CACHE VIDEO_FUTUREUSE
19 '
20
21 read_video() {
22   local video="$1" vid_db="$_DATA/$CHANNEL_ID/videos.db"
23   [ "$CHANNEL_ID" ] || return 1
24
25   # Global exports
26   VIDEO_ID='' VIDEO_NAME='' VIDEO_DESCRIPTION='' VIDEO_RESX='' VIDEO_RESY=''
27   VIDEO_LENGTH='' VIDEO_COVER='' VIDEO_STATUS='' VIDEO_UPLOADER=''
28   VIDEO_HITS='' VIDEO_DESCR_CACHE='' VIDEO_FUTUREUSE=''
29
30   if [ $# -eq 0 ]; then
31     read -r VIDEO_ID VIDEO_NAME VIDEO_DESCRIPTION VIDEO_RESX VIDEO_RESY \
32             VIDEO_LENGTH VIDEO_COVER VIDEO_STATUS VIDEO_UPLOADER VIDEO_HITS \
33             VIDEO_DESCR_CACHE VIDEO_FUTUREUSE
34   elif [ "$video" -a -f "$vid_db" -a -r "$vid_db" ]; then
35     read -r VIDEO_ID VIDEO_NAME VIDEO_DESCRIPTION VIDEO_RESX VIDEO_RESY \
36             VIDEO_LENGTH VIDEO_COVER VIDEO_STATUS VIDEO_UPLOADER VIDEO_HITS \
37             VIDEO_DESCR_CACHE VIDEO_FUTUREUSE <<-EOF
38         $(grep "^${video}       " "${vid_db}")
39         EOF
40   fi
41   if [ "$VIDEO_ID" ]; then
42            VIDEO_NAME="$(UNSTRING "$VIDEO_NAME")"
43     VIDEO_DESCRIPTION="$(UNSTRING "$VIDEO_DESCRIPTION")"
44           VIDEO_COVER="$(UNSTRING "$VIDEO_COVER")"
45     VIDEO_DESCR_CACHE="$(UNSTRING "$VIDEO_DESCR_CACHE")"
46   else
47     unset VIDEO_ID VIDEO_NAME VIDEO_DESCRIPTION VIDEO_RESX VIDEO_RESY \
48           VIDEO_LENGTH VIDEO_COVER VIDEO_STATUS VIDEO_UPLOADER VIDEO_HITS \
49           VIDEO_DESCR_CACHE VIDEO_FUTUREUSE
50     return 1
51   fi
52 }
53
54 update_video(){
55   local id="${1}" name description resx resy length cover status uploader \
56         hits descr_cache futureuse
57   local ID NAME DESCRIPTION RESX RESY LENGTH COVER STATUS UPLOADER HITS \
58         DESCR_CACHE FUTUREUSE
59   local arg video thumb cnt vid_db="$_DATA/$CHANNEL_ID/videos.db"
60   [ "$CHANNEL_ID" ] || return 1
61
62   video="${_DATA}/${CHANNEL_ID}/${VIDEO_ID}.upload.mp4"
63   thumb="${_DATA}/${CHANNEL_ID}/${VIDEO_ID}.thumb.jpg"
64
65   for arg in "$@"; do case $arg in
66     name=*) name="${arg#*=}";;
67     description=*) description="${arg#*=}";;
68     cover=*) cover="${arg#*=}";;
69     status=*) status="${arg#*=}";;
70     uploader=*) uploader="${arg#*=}";;
71     hits=*) hits="${arg#*=}";;
72   esac; done
73
74   if [ -f "$video" -a -r "$video" ]; then
75     arg="$(echo; ffprobe -show_entries format=duration:stream=width,height "$video" 2>&-)"
76     resx="${arg#*width=}"; resx="${resx%%${BR}*}"
77     resy="${arg#*height=}"; resy="${resy%%${BR}*}"
78     length="${arg#*duration=}"; length="${length%%${BR}*}"
79   fi
80   if [ "${length%.*}" -a ! "${thumb}" -nt "${video}" ]; then
81     for cnt in 1 2 3 4 5 6 7 8 9 10; do
82       ffmpeg -nostdin -y -ss "$((cnt * ${length%.*} / 11))" -i "$video" \
83              -frames 1 "${thumb%.jpg}_$((cnt - 1)).jpg"
84     done 2>&-
85     montage "${thumb%.jpg}"_[0-9].jpg \
86             -background "#000000" \
87             -tile 10x1 -geometry 320x180+0+0 \
88             -interlace line -quality 85 "${thumb}"
89     rm -- "${thumb%.jpg}"_[0-9].jpg
90   fi
91
92   if LOCK "$vid_db"; then
93     while read -r ID NAME DESCRIPTION RESX RESY LENGTH COVER STATUS UPLOADER HITS \
94                   DESCR_CACHE FUTUREUSE; do
95       if [ "$id" = "$ID" ]; then
96         printf '%s      %s      %s      %i      %i      %f      %s      %s      %s      %i      %s      %s\n' \
97                "$id" "$(STRING "${name-$(UNSTRING "$NAME")}")" \
98                "$(STRING "${description-$(UNSTRING "$DESCRIPTION")}")" \
99                "${resx:-${resx-${RESX}}${resx+0}}" \
100                "${resy:-${resy-${RESY}}${resy+0}}" \
101                "${length:-${length-${LENGTH}}${length+0}}" \
102                "$(STRING "${cover-$(UNSTRING "$COVER")}")" \
103                "${status:-${status-${STATUS}}${status+void}}" \
104                "${uploader:-${uploader-${UPLOADER}}${uploader+\\}}" \
105                "${hits:-${hits-${HITS}}${hits+0}}" \
106                "$(printf %s "${description-$(UNSTRING "$DESCRIPTION")}" |markdown |STRING)" \
107                "${FUTUREUSE:-\\}"
108       else
109         printf '%s      %s      %s      %i      %i      %f      %s      %s      %s      %i      %s      %s\n' \
110                 "$ID" "$NAME" "$DESCRIPTION" "$RESX" "$RESY" "$LENGTH" \
111                 "$COVER" "$STATUS" "$UPLOADER" "$HITS" "$DESCR_CACHE" \
112                 "$FUTUREUSE"
113       fi
114     done <"$vid_db" >"${vid_db}.$$"
115     mv -- "${vid_db}.$$" "${vid_db}"
116     RELEASE "$vid_db"
117   else
118     return 1
119   fi
120 }
121
122 new_video(){
123   local video="${1:-$(randomid)}" vid_db="$_DATA/$CHANNEL_ID/videos.db"
124   [ "$CHANNEL_ID" ] || return 1
125
126   if LOCK "$vid_db"; then
127     if grep -q "^${video}       " "$vid_db"; then
128       RELEASE "$vid_db"
129       return 1
130     fi
131     #       ID  NAME    DESC    RESX    RESY    LENGTH  COVER   STATUS  UPLDR   HITS    FUTUREUSE
132     printf '%s  \\      \\      0       0       0       \\      void    %s      0       \\\n' \
133            "$video" "$(STRING "$USER_ID")" >>"$vid_db"
134     RELEASE "$vid_db"
135   else
136     return 1
137   fi
138 }
139
140 delete_video() {
141   local video="$1" vid_db="$_DATA/$CHANNEL_ID/videos.db"
142   [ "$CHANNEL_ID" ] || return 1
143
144   if LOCK "$vid_db"; then
145     grep -v "^${video}  " <"$vid_db" >"${vid_db}.$$"
146     mv -- "${vid_db}.$$" "$vid_db"
147     RELEASE "$vid_db"
148   else
149     return 1
150   fi
151 }