From 5667597778145b23dc04aa65e1e9ea3ac0b7fd97 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 12 Jan 2017 00:58:19 +0000 Subject: [PATCH] basics for indexed browsing svn path=/trunk/; revision=167 --- actions/dirindex.sh | 23 +++++ pages/browse.sh | 182 +++++++++++++++++++++++++++++++++++ templates/browse.html.sh | 95 ++++++++++++++++++ templates/list.html.sh | 2 +- templates/playctl.html.sh | 4 +- templates/quicklinks.html.sh | 4 +- templates/view.html.sh | 4 +- 7 files changed, 307 insertions(+), 7 deletions(-) create mode 100755 actions/dirindex.sh create mode 100755 pages/browse.sh create mode 100755 templates/browse.html.sh diff --git a/actions/dirindex.sh b/actions/dirindex.sh new file mode 100755 index 0000000..baf99bb --- /dev/null +++ b/actions/dirindex.sh @@ -0,0 +1,23 @@ +#!/bin/zsh + +# Copyright 2017 Paul Hänsch +# +# This file is part of Serve0. +# +# Serve0 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Serve0 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with Serve0. If not, see . + +directory="$(invalidate "${_GET[d]}" '(.*/)?\.\.(/.*)?|' /)" +mkdir -p "${treeroot}/${directory#/}/.index" + +redirect "?p=browse&d=$(urlsafe "${directory%/}")" diff --git a/pages/browse.sh b/pages/browse.sh new file mode 100755 index 0000000..95741af --- /dev/null +++ b/pages/browse.sh @@ -0,0 +1,182 @@ +#!/bin/zsh + +# Copyright 2014 - 2017 Paul Hänsch +# +# This file is part of Serve0. +# +# Serve0 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Serve0 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with Serve0. If not, see . + +. $_EXEC/pages/common.sh + +LF=' +' +directory="$(invalidate "${_GET[d]}" '(.*/)?\.\.(/.*)?|' /)" +[ -d "${treeroot}/${directory#/}/.index" ] && indexed=true || indexed=false +filters="${_GET[f]}" +debug "FILTERS: $filters" + +present_filter(){ + printf %s\\n "$*" \ + | sed -r 's;(^|!|\^|\|)([^!\^\|:]+:);\1;g;s;\^;\n;g' \ + | sort -r \ + | sed -r '$q;s;$; \&\; ;g' +} + +if [ -n "$search" ]; then + TITLE="$search by $order" +elif [ -n $filter ]; then + TITLE="$(present_filter "$filter") by $order" +else + TITLE="List by $order" +fi + +category_selected(){ + cat="${1}:" + filter="$2" + [ "$cat" = "none:" ] && cat='' + + printf %s "$taglist_filter" \ + | sed -r 's;^('"$filter"')$;1 &;;t;s;^;0 ;' \ + | sed -rn 's;^(0|1) '"$cat"'([^:]+)$;\1 \2;p' \ + | sed 's;^0 ;;' +} + +_printVideo(){ + info="$1" + cache="${info%/*}/.index/${info##*/}.cache" + meta="${info%/*}/.index/${info##*/}.meta" + + if [ "$cache" -ont "$meta" ]; then + cat "$cache" + else + videofile="$info" + thumb="${info%/*}/.index/${info##*/}.jpg" + [ -f "$thumb" ] || genthumb "$videofile" "$thumb" + [ -f "$meta" ] || genmeta "$videofile" "$meta" + + { read -r length width height filename + read -r tags + } <"$meta" + length=$(validate "$length" '[0-9]+' 0) + width=$(validate "$width" '[0-9]+' 0) + height=$(validate "$height" '[0-9]+' 0) + + video="$(urlsafe "$info")" + thumb="$(urlsafe "$directory/.index/${info##*/}.jpg")" + linkinfo="$(urlsafe "${directory%/}/${info##*/}")" + htmlinfo="$(htmlsafe "${info##*/}")" + attrinfo="$(attribsafe "$info")" + + minutes="$(printf "%d:%02d" $(($length / 60)) $(($length % 60)) )" + + tee "$cache" < + +

${htmlinfo}

+ + + ${minutes}min + ${width}x${height} + $(printf %s "$tags" |sed -r 's:\|*([^|]+)\|*: \1:g') + +VIDEOend + fi +} + +genlist(){ + case "$order" in + Date) find "${_DATA}"/videos/ -maxdepth 1 -mindepth 1 -printf '%T@ %f\n' |sort -r |cut -d\ -f2- |egrep -i "$file_pattern";; + Length) sed -sn 1p "${_DATA}"/meta/*.meta |sort -n |sed -r 's;^[0-9\t]+\t;;';; + Name) find "${_DATA}"/videos/ -maxdepth 1 -mindepth 1 -printf '%f\n' |sort |egrep -i "$file_pattern";; + esac +} + +selectionlist() { + cachebase="?o=${order}&s=${search//\//}&f=${filter//\//}" + cache="${_DATA}/cache/${cachebase}" + if [ -s "$cache" -a "$cache" -nt ${_DATA}/videos -a "$cache" -nt ${_DATA}/meta ]; then + cat "$cache" + else + filterex="s;^([0-9]+\t){3}(.+)\n.*$;\2;p" + printf '%s\n' "$filter" |tr '^' '\n' \ + | sed -r 's;[]\/\(\)\\\^\$\?\.\+\*\;\[\{\}];\\\\&;g' \ + | while read each; do + [ "${each:0:1}" = '!' ] && filterex="/^[^\n]+\n(.*\|)?(${each#?})(\|.*)?$/d;{${filterex}}" \ + || filterex="/^[^\n]+\n(.*\|)?(${each})(\|.*)?$/{${filterex}}" + done + + genlist \ + | if [ -n "$search" ] ; then + debug "Applying search: ${search}" + xargs -d '\n' printf "${_DATA}/meta/%s.meta\n" \ + | xargs -d '\n' egrep -sil "$search" \ + | sed -r 's;^.*/;;;s;\.meta$;;' + elif [ -n "$filter" ]; then + debug "Applying filters: ${filter} ++ ${filterex}" + xargs -d '\n' printf "${_DATA}/meta/%s.meta\n" \ + | xargs -d '\n' sed -srn ":a;N;2!ba;{${filterex}}" + else + debug "No search or filtering" + cat + fi \ + | tee "$cache" + fi +} + +thumblist() { + selectionlist \ + | sed -n "$page,$(($page + $pagesize - 1))p" \ + | while read line; do + _printVideo "$line" + done +} + +pagecount() { + printf "$(( $(selectionlist | wc -l) / $pagesize + 1 ))" +} + +filelist(){ + debug "Filelist with dir = $directory" + + [ -n "${directory#/}" ] && printf %s ".." + + find -L "${treeroot%/}/${directory#/}" -mindepth 1 -maxdepth 1 -type d \ + | grep -v '.index' \ + | sort \ + | while read dir; do + name="${dir##*/}" + printf %s "$(htmlsafe "$name")" + done + + find -L "${treeroot%/}/${directory#/}" -mindepth 1 -maxdepth 1 -type f \ + | grep -E "$file_pattern" \ + | sort \ + | while read -r file; do + name="${file##*/}" + $indexed && _printVideo "$file" \ + || printf '%s' \ + "$(urlsafe "${directory%/}/$name")" "$(htmlsafe "$name")" + done + + find -L "${treeroot%/}/${directory#/}" -mindepth 1 -maxdepth 1 -type f \ + | grep -vE "$file_pattern" \ + | sort \ + | while read -r file; do + name="${file##*/}" + printf '%s' "$(htmlsafe "$name")" + done +} + diff --git a/templates/browse.html.sh b/templates/browse.html.sh new file mode 100755 index 0000000..8bf29a3 --- /dev/null +++ b/templates/browse.html.sh @@ -0,0 +1,95 @@ +# Copyright 2017 Paul Hänsch +# +# This file is part of Serve0 +# +# Serve0 is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Serve0 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with Serve0 If not, see . + +cat < + + + + $(. $_EXEC/templates/advfilter.html.sh) + + + $(. $_EXEC/templates/preferences.html.sh) + + + + +
+ + + + + +
    +EOF + + filelist + + pages="$( + seq 1 $(pagecount) \ + | while read pn; do + plink="$(($pn * $pagesize - $pagesize + 1))" + + case "$plink" in + $(($page - $pagesize))) class=previous;; + $page) class=current;; + $(($page + $pagesize))) class=next;; + * ) class='';; + esac + + printf '%s\n' "$class" "$page_link" "$plink" "$pn" + done + )" + +cat < + $(. $_EXEC/templates/tagger.html.sh) + + + + +EOF + +# vi:set filetype=html: diff --git a/templates/list.html.sh b/templates/list.html.sh index e6552fd..ed41b3a 100755 --- a/templates/list.html.sh +++ b/templates/list.html.sh @@ -42,7 +42,7 @@ cat < Hide - Browse Folders + Browse Folders Player diff --git a/templates/playctl.html.sh b/templates/playctl.html.sh index e43beed..9152db4 100755 --- a/templates/playctl.html.sh +++ b/templates/playctl.html.sh @@ -29,7 +29,7 @@ cat < - Dismiss + Dismiss @@ -55,7 +55,7 @@ cat <Hide Index view - Browse Folders + Browse Folders diff --git a/templates/quicklinks.html.sh b/templates/quicklinks.html.sh index 099916c..92dfdda 100755 --- a/templates/quicklinks.html.sh +++ b/templates/quicklinks.html.sh @@ -42,7 +42,7 @@ cat <Hide Index view - Browse Folders + Browse Folders Player @@ -53,7 +53,7 @@ cat < Preferences - Browse Folders + Browse Folders $(. $_EXEC/templates/preferences.html.sh) diff --git a/templates/view.html.sh b/templates/view.html.sh index 8c22d6a..c0a4119 100755 --- a/templates/view.html.sh +++ b/templates/view.html.sh @@ -28,7 +28,7 @@ cat < - Dismiss + Dismiss @@ -39,7 +39,7 @@ cat <Hide Index view - Browse Folders + Browse Folders -- 2.39.2