bunkerbox/crowdbunker.sh

527 lines
32 KiB
Bash
Executable File

#!/bin/bash
################################################################################
# Author: Fred (support@qo-op.com)
# Version: 0.1
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
################################################################################
mkdir -p ~/.zen/bunkerbox # BunkerBOX temp directory
# Fred MadeInZion, [20/03/2022 23:03]
# Script qui capture et transfert dans IPFS le flux des nouvelles vidéos de https://crowdbunker.com/
# le resultat est inscrit dans une chaine video accessible localement ou publiée au travers de la clef paratgée entre toutes les station scraper "qo-op"
# ~/.zen/bunkerbox/ contient les fichiers publiés sur le CDN
# ~/.zen/bunkerbox/cache/$VUID/media (cache de la copie)
# ~/.zen/bunkerbox/history.json et history_${hier}.json permettent de parcourir les captures de chaque jour
# ~/.zen/bunkerbox/history_qo-op.json : Historique diffusé actuellement par 'qo-op'
# ~/.zen/bunkerbox/history.${CHANNEL}.json : Historique des channels crowdbunker
# ~/.zen/bunkerbox/homepage/ : Zone de publication des fichiers publiés sur "qo-op"
MY_PATH="`dirname \"$0\"`" # relative
MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized
ME="${0##*/}"
countMErunning=$(ps auxf --sort=+utime | grep -w "$ME" | grep -v -E 'color=auto|grep' | wc -l)
[[ $countMErunning -gt 2 ]] && \
echo "$ME already running. Killing old process" && \
mekill=$(ps auxf --sort=+utime | grep -w "$ME" | grep -v -E 'color=auto|grep' | head -n 1 | awk '{ print $2 }') && \
kill -9 $mekill && \
exit 0
TS=$(date -u +%s%N | cut -b1-13)
MOATS=$(date -u +"%Y%m%d%H%M%S%4N")
[[ ! $(which ipfs) ]] && echo "EXIT. Vous devez avoir installé ipfs CLI sur votre ordinateur" && echo "RDV sur https://dist.ipfs.io/#go-ipfs" && exit 1
YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) || echo " warning ipfs daemon not running"
isLAN=$(hostname -I | awk '{print $1}' | head -n 1 | cut -f3 -d '/' | grep -E "(^127\.)|(^192\.168\.)|(^fd42\:)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^::1$)|(^[fF][cCdD])/")
IPFSNODEID=$(ipfs id --timeout=12s | jq -r .ID)
howmany=$(cat /tmp/ipfsbunk.timeout)
if [[ ! $IPFSNODEID ]]; then
## wait a howmany timeout before restarting ipfs
howmany=$((howmany + 1)) && echo $howmany > /tmp/ipfsbunk.timeout
[ $howmany -gt 3 ] && [[ -f /etc/sudoers.d/systemctl ]] && echo "IPFS NOT RUNNING $(date)" && rm /tmp/ipfsbunk.timeout && sudo systemctl stop ipfs && rm /config/ipfs/repo.lock && sudo systemctl start ipfs
exit 1
else
echo 0 > /tmp/ipfsbunk.timeout
fi
IPFSNGW="https://tube.copylaradio.com"
IPFSNGW="http://127.0.0.1:8080"
[[ ! $isLAN ]] && IPFSNGW="https://$(hostname)"
echo "IPFS GATEWAY $IPFSNGW"
###########################################################################
## Global parsing History Rotation ~/.zen/tmp/calendar.json (used with pagination.js)
###########################################################################
hier=$(date --date="yesterday" +"%Y-%m-%d")
# New day! 00:00 is passed...
if [[ ! -f ~/.zen/bunkerbox/history_${hier}.json && -f ~/.zen/bunkerbox/homepage/chain ]]; then
NUMBER=$(cat ~/.zen/bunkerbox/history.json | jq '.Videos[].link' | wc -l) && echo ".ROTATION. Hier historique de $NUMBER Videos."
[[ -f ~/.zen/bunkerbox/history.json ]] && mv ~/.zen/bunkerbox/history.json ~/.zen/bunkerbox/history_${hier}.json
## CREATE/UPDATE calendar.json
[[ ! -f ~/.zen/bunkerbox/calendar.json || $(cat ~/.zen/bunkerbox/calendar.json 2>/dev/null) == "" ]] && cp ${MY_PATH}/templates/data/calendar.json ~/.zen/bunkerbox/calendar.json
cat ~/.zen/bunkerbox/calendar.json | jq '.History += [{"link": "<a href='"'_INDEX_'"'>_HIER_</a>"}]' > ~/.zen/tmp/calendar.json
sed -i "s~_INDEX_~/ipfs/$(cat ~/.zen/bunkerbox/homepage/chain)~g" ~/.zen/tmp/calendar.json
sed -i "s~_HIER_~${hier} ($NUMBER)~g" ~/.zen/tmp/calendar.json
[[ "$(cat ~/.zen/tmp/calendar.json)" == "" ]] && echo "NO calendar.json FATAL ERROR" && exit 1
cp ~/.zen/tmp/calendar.json ~/.zen/bunkerbox/calendar.json
# RESET IPNS HISTORY FILE ( reset history_qo-op.json )
cp ${MY_PATH}/templates/data/history.json ~/.zen/bunkerbox/homepage/history.json
VROOT=$(ipfs add -rwHq ~/.zen/bunkerbox/homepage/* | tail -n 1)
echo "'qo-op' update with /ipfs/$VROOT"
ipfs name publish --key=qo-op /ipfs/$VROOT
fi
###########################################################################
## SCRAP LATEST CROWDBUNKER VIDEOS
VWALLURL="https://api.crowdbunker.com/post/all"
curl -s $VWALLURL -H "Accept: application/json" > ~/.zen/bunkerbox/crowd.json
[[ ! -f ~/.zen/bunkerbox/crowd.json ]] && echo "ERROR GET VIDEO SOURCE LIST FROM $VWALLURL" && exit 1
## LOOP THROUGH VIDEO ID ($VUID) (REVERSE LIST)
cat ~/.zen/bunkerbox/crowd.json | jq -r '.posts | .[] | .video.id' > /tmp/vuid.list
# loop starts with older videos (tac is reversing cat)
for VUID in $(tac /tmp/vuid.list); do
echo "====================== =========================== ==========================="
[[ "$VUID" == "null" ]] && echo "MESSAGE... Bypassing..." && echo && continue
echo "====================== =========================== ==========================="
[[ $(cat ~/.zen/bunkerbox/choice 2>/dev/null) == "qo-op" ]] && [[ $(cat ~/.zen/bunkerbox/history_qo-op.json | jq .Videos[].link | grep $VUID) ]] && echo "VIDEO DEJA DANS LE CACHE... CONTINUE" && continue
echo "Bunker BOX : Adding $VUID"
mkdir -p ~/.zen/bunkerbox/cache/$VUID/media
## GET VIDEO DETAIL JSON
URL="https://api.crowdbunker.com/post/$VUID/details"
# echo "WISHING TO EXPLORE $URL ?"; read TEST; [[ "$TEST" != "" ]] && echo && continue
curl -s $URL -H "Accept: application/json" -o ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json
# FILTERING STREAMING LIVE
echo ">>> Extracting video caracteristics from ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json"
ISLIVE=$(cat ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json | jq -r .video.isLiveType)&& [[ "$ISLIVE" == "true" ]] && echo "LIVE... "
LIVE=$(cat ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json | jq -r .video.isLiveActive) && [[ "$LIVE" == "true" ]] && echo "STREAMING... Bypassing..." && echo && continue
DURATION=$(cat ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json | jq -r .video.duration) && [[ $DURATION == 0 ]] && echo "NOT STARTED YET" && echo && continue
TITLE=$(cat ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json | jq -r .video.title | sed "s/'/ /g" | sed 's/"/ /g' | sed "s/&/ /g") # Remove quote
CHANNEL=$(cat ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json | jq -r .channel.organization.uid)
## GET MORE DATA FROM JSON, or get it from web page loading $VUID.json
## EXTRACT HLS LINK and MEDIA SOURCE
HLS=$(cat ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json | jq -r .video.hlsManifest.url)
MEDIASOURCE=$(echo $HLS | rev | cut -d '/' -f 2- | rev)
echo "$HLS"
echo "===> $TITLE ($DURATION s)"
## VERIFIY choice made, empty means debug mode
[[ ! $(cat ~/.zen/bunkerbox/choice 2>/dev/null) ]] && echo "READY TO PROCESS ? ENTER. Any character sent means next." && read TEST && [[ "$TEST" != "" ]] && echo && continue ## NO CHOICE MADE
## Download HLS source m3u8 (contains video & audio)
curl -s $HLS -o ~/.zen/bunkerbox/cache/$VUID/$VUID.m3u8
[[ ! $(cat ~/.zen/bunkerbox/choice 2>/dev/null) ]] && cat ~/.zen/bunkerbox/cache/$VUID/$VUID.m3u8 # DEBUG
# Choose 360p or 480p or 720p or 240p
echo ">>>>>>>>>>>>>>>> Selecting VIDEO"
VIDEOHEAD=""; VIDEOSRC=""
for VSIZE in 360 480 720 240; do
[[ "$VIDEOHEAD" == "" ]] && VIDEOHEAD=$(cat ~/.zen/bunkerbox/cache/$VUID/$VUID.m3u8 | grep -B1 ${VSIZE}p | head -n 1)
[[ "$VIDEOSRC" == "" ]] && VIDEOSRC=$(cat ~/.zen/bunkerbox/cache/$VUID/$VUID.m3u8 | grep ${VSIZE}p | tail -n 1 | cut -f 1 -d '.') && vsize="${VSIZE}p"
VTHUMB="$(cat ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json | jq -r --arg VSIZE "$VSIZE" '.video.thumbnails[] | select(.height == $VSIZE) | .url')"
[[ ! -f ~/.zen/bunkerbox/cache/$VUID/media/$VUID.jpg ]] && echo "Downloading $VSIZE thumbnail" && curl -s $VTHUMB -o ~/.zen/bunkerbox/cache/$VUID/media/$VUID.jpg
done
## NO VIDEO FOUND ?
[[ "$VIDEOSRC" == "" ]] && echo "NO COMPATIBLE RESOLUTION VIDEO FOUND." && cat ~/.zen/bunkerbox/cache/$VUID/$VUID.m3u8 && continue
echo "VIDEOSRC=$MEDIASOURCE/$VIDEOSRC"
# CORRECT MISSING THUMB
[[ ! -f ~/.zen/bunkerbox/cache/$VUID/media/$VUID.jpg ]] && cp ${MY_PATH}/images/astroport.jpg ~/.zen/bunkerbox/cache/$VUID/media/$VUID.jpg
echo ">>>>>>>>>>>>>>>> Downloading VIDEO"
# Downloading Video m3u8 and Video
[[ ! -f ~/.zen/bunkerbox/cache/$VUID/media/$VIDEOSRC.m3u8 ]] && curl -s $MEDIASOURCE/$VIDEOSRC.m3u8 -o ~/.zen/bunkerbox/cache/$VUID/media/$VIDEOSRC.m3u8
[[ ! -f ~/.zen/bunkerbox/cache/$VUID/media/$VIDEOSRC ]] && curl $MEDIASOURCE/$VIDEOSRC -o ~/.zen/bunkerbox/cache/$VUID/media/$VIDEOSRC
echo ">>>>>>>>>>>>>>>> Downloading AUDIO"
AUDIOLINE=$(cat ~/.zen/bunkerbox/cache/$VUID/$VUID.m3u8 | grep '=AUDIO')
AUDIOFILE=$(echo $AUDIOLINE | rev | cut -d '.' -f 2- | cut -d '"' -f 1 | rev)
echo "AUDIO=$MEDIASOURCE/$AUDIOFILE"
# Downloading Audio m3u8 and Audio
[[ ! -f ~/.zen/bunkerbox/cache/$VUID/media/$AUDIOFILE.m3u8 ]] && curl -s $MEDIASOURCE/$AUDIOFILE.m3u8 -o ~/.zen/bunkerbox/cache/$VUID/media/$AUDIOFILE.m3u8
[[ ! -f ~/.zen/bunkerbox/cache/$VUID/media/$AUDIOFILE ]] && curl $MEDIASOURCE/$AUDIOFILE -o ~/.zen/bunkerbox/cache/$VUID/media/$AUDIOFILE
echo ">>>>>>>>>>>>>>>> CREATING $vsize M3U8"
echo "#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
$AUDIOLINE
$VIDEOHEAD
$VIDEOSRC.m3u8
" > ~/.zen/bunkerbox/cache/$VUID/media/$VUID.m3u8
# ls ~/.zen/bunkerbox/cache/$VUID/media/ # SHOW ALL COLLECTED MEDIA
##########################################################################
## ADD YOUR HTML TEMPLATING WITH MEDIA
##########################################################################
start=`date +%s`
echo "##########################################################################"
echo ">>>>>>>>>>>>>>>> ADDING index.html"
# COPY index, style, js AND data
cp -R ${MY_PATH}/templates/styles ~/.zen/bunkerbox/cache/$VUID/media/
cp -R ${MY_PATH}/templates/js ~/.zen/bunkerbox/cache/$VUID/media/
cp ${MY_PATH}/templates/videojs.html ~/.zen/bunkerbox/cache/$VUID/media/index.html
cp ${MY_PATH}/images/astroport.jpg ~/.zen/bunkerbox/cache/$VUID/media/
## NO OR EMPTY HISTORY? COPY from TEMPLATE (PROGRAM START)
[[ ! -f ~/.zen/bunkerbox/history.json || $(cat ~/.zen/bunkerbox/history.json 2>/dev/null) == "" ]] && cp ${MY_PATH}/templates/data/history.json ~/.zen/bunkerbox/history.json
# get latest history.json. Please publish with conscienciously privately shared 'qo-op' IPNS key.
# Use DNSLink to integrate into your DNS plan
if [[ "$(cat ~/.zen/bunkerbox/choice 2>/dev/null)" == "qo-op" ]]; then
[[ $(cat ~/.zen/bunkerbox/history_qo-op.json | jq .Videos[].link | grep $VUID) ]] && echo "VIDEO DEJA DANS LE CACHE... CONTINUE" && continue
IPNS="$(ipfs key list -l | grep -w 'qo-op' | cut -f 1 -d ' ')"
IPNSL="/ipns/$IPNS"
ipfs get -o ~/.zen/bunkerbox/history_qo-op.json $IPNSL/history.json # Get actual IPNS qo-op history.json
# Missing file ? reseting
[[ ! -f ~/.zen/bunkerbox/history_qo-op.json || $(cat ~/.zen/bunkerbox/history_qo-op.json 2>/dev/null) == "" ]] && cp ${MY_PATH}/templates/data/history.json ~/.zen/bunkerbox/history_qo-op.json
[[ $(cat ~/.zen/bunkerbox/history_qo-op.json | jq .Videos[].link | grep $VUID) ]] && echo "VIDEO DEJA DANS LE RESEAU... CONTINUE" && echo && cp ~/.zen/bunkerbox/history_qo-op.json ~/.zen/bunkerbox/history.json && continue
# JSON FUSION
jq -s '.[0] * .[1]' ~/.zen/bunkerbox/history_qo-op.json ~/.zen/bunkerbox/history.json | jq -M '.Videos |= unique_by(.link)' > ~/.zen/bunkerbox/history.fusion.json
mv ~/.zen/bunkerbox/history.fusion.json ~/.zen/bunkerbox/history.json
echo "## FUSIONNING 'qo-op' HISTORIES"
else
IPNS="."
IPNSL="./"
fi
# Add previous CHANNEL History
[[ -f ~/.zen/bunkerbox/history.${CHANNEL}.json ]] && cp ~/.zen/bunkerbox/history.${CHANNEL}.json ~/.zen/bunkerbox/cache/$VUID/media/
# Add latest history.json within media directory
cp ~/.zen/bunkerbox/history.json ~/.zen/bunkerbox/cache/$VUID/media/history.json
# COPY videojs.html TEMPLATE & Updating it
sed "s/_IPFSROOT_/./g" ${MY_PATH}/templates/videojs.html > ~/.zen/bunkerbox/cache/$VUID/media/index.html
sed -i "s/_VUID_/$VUID/g" ~/.zen/bunkerbox/cache/$VUID/media/index.html
# sed -i s/_DATE_/$(date -u "+%Y-%m-%d#%H:%M:%S")/g ~/.zen/bunkerbox/cache/$VUID/media/index.html # !! Different Copy Makes Different Chains !
sed -i "s~_TITLE_~$TITLE~g" ~/.zen/bunkerbox/cache/$VUID/media/index.html
sed -i "s~_CHANNEL_~$CHANNEL~g" ~/.zen/bunkerbox/cache/$VUID/media/index.html
sed -i "s~_IPNSL_~$IPNSL~g" ~/.zen/bunkerbox/cache/$VUID/media/index.html #MAJ IPNS link
echo ">>>>> NOW ADDING MEDIA TO IPFS : ipfs add -rwH ~/.zen/bunkerbox/cache/$VUID/media/* "
################################################################# #########
# IPFS WRITING. All that is prepared above in ~/.zen/bunkerbox/cache/$VUID/media/ will become permanent !
################################################################# #########
IPFSROOT=$(ipfs add -rwHq ~/.zen/bunkerbox/cache/$VUID/media/* | tail -n 1)
INDEX="/ipfs/$IPFSROOT"
echo "DONE : $INDEX"
echo
#################################################################
# IPFS WRITING DONE. Doing after is to UPDATE local history(s).json in ~/.zen/bunkerbox/
# $INDEX/$VUID.m3u8 is ready + videojs.html + json's
# Publishing on IPNS 'qo-op' all dynamic data needed by above 'index.html' (homepage)
#################################################################
#################
# Take care about CHANNEL history
echo "++ MANAGE $CHANNEL HISTORY"
[[ ! -f ~/.zen/bunkerbox/history.${CHANNEL}.json || $(cat ~/.zen/bunkerbox/history.${CHANNEL}.json 2>/dev/null) == "" ]] && cp ${MY_PATH}/templates/data/history.json ~/.zen/bunkerbox/history.${CHANNEL}.json
if [[ ! $(cat ~/.zen/bunkerbox/history.${CHANNEL}.json | jq .Videos[].link | grep $VUID) ]]; then ## This is a new video !!!
echo "NEW VIDEO ADDED TO ~/.zen/bunkerbox/history.${CHANNEL}.json"
# cat ~/.zen/bunkerbox/history.${CHANNEL}.json | jq --arg INDEX "$INDEX" --arg TITLE "$TITLE" --arg VUID "$VUID" --arg TSVUID "TSVUID" '.Videos += [{"link": "<a id="'"$TSVUID"'" href="'"$INDEX"'"><img src="'"$INDEX/$VUID.jpg"'" height=80 ></a><br>"'"$TITLE"'" "}]' > ~/.zen/tmp/history.${CHANNEL}.json
cat ~/.zen/bunkerbox/history.${CHANNEL}.json | jq '.Videos += [{"link": "<a id='"'_TS_'"' href='"'_INDEX_'"'><img src='"'_INDEX_/_VUID_.jpg'"' height=80 ></a><br>'"'_TITLE_'"'"}]' > ~/.zen/bunkerbox/cache/$VUID/media/history.${CHANNEL}.json
sed -i "s~_INDEX_~$INDEX~g" ~/.zen/bunkerbox/cache/$VUID/media/history.${CHANNEL}.json
sed -i "s~_VUID_~$VUID~g" ~/.zen/bunkerbox/cache/$VUID/media/history.${CHANNEL}.json
sed -i "s~_TS_~$MOATS~g" ~/.zen/bunkerbox/cache/$VUID/media/history.${CHANNEL}.json
sed -i "s~_TITLE_~$TITLE~g" ~/.zen/bunkerbox/cache/$VUID/media/history.${CHANNEL}.json
# SECURE
[[ "$(cat ~/.zen/bunkerbox/cache/$VUID/media/history.${CHANNEL}.json)" == "" ]] && echo "NO history.${CHANNEL}.json FATAL ERROR" && exit 1
# REFRESH ${CHANNEL}'s HISTORY ~/.zen/bunkerbox/
cp ~/.zen/bunkerbox/cache/$VUID/media/history.${CHANNEL}.json ~/.zen/bunkerbox/history.${CHANNEL}.json
######################### ######################### #########################
## CONSTRUCT 'MOA' CHANNEL PUBLICATION ZONE ```rm -Rf ~/.zen/bunkerbox/channels/${CHANNEL} to reset```
AmIBootStrap=$(cat ~/.zen/astrXbian/A_boostrap_nodes.txt 2>/dev/null | grep $IPFSNODEID)
if [[ ! -f ~/.zen/bunkerbox/homepage/tw/${CHANNEL}/index.html ]]; then
mkdir -p ~/.zen/bunkerbox/homepage/tw/${CHANNEL}/
mkdir -p ~/.zen/bunkerbox/channels/${CHANNEL}/
# New tiddlywiki with moa key
# if [[ ! $(ipfs key list | grep -w qo-op_${CHANNEL}) ]]; then
channelfilename=$(${MY_PATH}/tools/give_me_keystore_filename.py qo-op_${CHANNEL})
# (Re)Creating IPNS Key & TiddlyWiki for channel
[[ $AmIBootStrap ]] &&\
ipfs key rm qo-op_${CHANNEL}; channelkey=$(ipfs key gen qo-op_${CHANNEL}) || \
channelkey='k2k4r8opmmyeuee0xufn6txkxlf3qva4le2jlbw6da7zynhw46egxwp2'
# Create first tiddlywiki and inject some values (_PLAYER_ from Astroport.ONE)
sed "s~_BIRTHDATE_~${MOATS}~g" ${MY_PATH}/templates/ipfstiddlywiki.html > ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html
sed -i "s~_PSEUDO_~${CHANNEL}~g" ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html
sed -i "s~_MOAID_~${channelkey}~g" ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html
sed -i "s~_QOOP_~${IPNSL}~g" ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html
sed -i "s~_MOAKEY_~qo-op_${CHANNEL}~g" ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html
sed -i "s~k2k4r8opmmyeuee0xufn6txkxlf3qva4le2jlbw6da7zynhw46egxwp2~${channelkey}~g" ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html
sed -i "s~ipfs.infura.io~tube.copylaradio.com~g" ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html ## Open 5001
sed -i "s~_IPFSNODEID_~${IPFSNODEID}~g" ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html
# Create caroussel.html !!! NOT WORKING WITH M3U8 !!!! SO DOING IT WITH astrXbian ;)
XBIANJSON=$(${MY_PATH}/tools/get_astrXbian_youtube.sh) ## Replace old way with external caroussel.json
if [[ $XBIANJSON == '' ]]; then
echo "<meta http-equiv=\"refresh\" content=\"0;URL=twindex.html\">" > ~/.zen/bunkerbox/channels/${CHANNEL}/index.html
else
sed "s~_IPNSL_~$IPNSL~g" ${MY_PATH}/templates/caroussel.html > ~/.zen/bunkerbox/channels/${CHANNEL}/index.html
sed -i "s~_VUID_~$INDEX/$VUID~g" ~/.zen/bunkerbox/channels/${CHANNEL}/index.html
sed -i "s~_TITLE_~$TITLE~g" ~/.zen/bunkerbox/channels/${CHANNEL}/index.html
sed -i "s~_CHANNEL_~$CHANNEL~g" ~/.zen/bunkerbox/channels/${CHANNEL}/index.html
sed -i "s~_CAROUSSELJSON_~$XBIANJSON~g" ~/.zen/bunkerbox/channels/${CHANNEL}/index.html
cp -R ${MY_PATH}/templates/styles ~/.zen/bunkerbox/channels/${CHANNEL}/
cp -R ${MY_PATH}/templates/js ~/.zen/bunkerbox/channels/${CHANNEL}/
fi
## BACKUP IPNS KEY qo-op_${CHANNEL}.key WILL BE SENT BY OTHER MEAN
# cp ~/.ipfs/keystore/${channelfilename} ~/.zen/bunkerbox/channels/${CHANNEL}/qo-op_${CHANNEL}.key
echo $channelkey > ~/.zen/bunkerbox/channels/${CHANNEL}/channelkey
cp -f ~/.zen/bunkerbox/channels/${CHANNEL}/twindex.html ~/.zen/bunkerbox/homepage/tw/${CHANNEL}/index.html
fi
#~ echo "LINK TW into HOMEPAGE "
#~ echo "<meta http-equiv=\"refresh\" content=\"0;URL=/ipns/$channelkey\">" > ~/.zen/bunkerbox/homepage/tw/${CHANNEL}/index.html
#~ echo "DONE ###"
TWINDEX="$HOME/.zen/bunkerbox/homepage/tw/${CHANNEL}/index.html"
TWMODEL="/ipfs/bafybeieqeozaj4nplyh7dmr2lecbzzrgt2mqs3rzbgdxlb43erhfzc37oq"
## OLD index style REPLACE
[[ $(cat ${TWINDEX} | head -n 1 | grep -w '"refresh"') ]] \
&& echo "============= NEW TW MODEL ="
ipfs cat $TWMODEL | sed \
-e "s~_BIRTHDATE_~${MOATS}~g" \
-e "s~_PSEUDO_~${CHANNEL}~g" \
-e "s~_MOAID_~${channelkey}~g" \
-e "s~_QOOP_~${IPNSL}~g" \
-e "s~_IPFSNODEID_~${IPFSNODEID}~g" \
-e "s~_MOAKEY_~qo-op_${CHANNEL}~g" \
-e "s~k2k4r8kxfnknsdf7tpyc46ks2jb3s9uvd3lqtcv9xlq9rsoem7jajd75~${channelkey}~g" \
> ${TWINDEX}
echo "$CHANNEL IS UP. KEY IS CREATED. WAITING FOR SYNCING. PRINTING KNOWN MOA KEY."
ipfs key list -l | grep -w "qo-op_${CHANNEL}"
echo "TODO: ADD MP4 VIDEO TIIDDLER INTO TW"
if [[ $(which tiddlywiki) ]]; then
MOATS=$(date -u +"%Y%m%d%H%M%S%4N")
FILE_BSIZE=$(du -b "$HOME/.zen/bunkerbox/cache/$VUID/media/" | awk '{print $1}' | tail -n 1)
FILE_SIZE=$(echo "${FILE_BSIZE}" | awk '{ split( "B KB MB GB TB PB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } printf "%.2f %s", $1, v[s] }')
## LET'S DO THAT : MAKE A TIDDLER
TEXT="<video controls preload='none' width='100%' height='360' poster='/ipfs/$IPFSROOT/$VUID.jpg'><source src='/ipfs/$IPFSROOT/$VUID.m3u8' type='application/x-mpegURL' /></video>"
echo '[
{
"text": "'${TEXT}'",
"title": "'${TITLE}'",
"created": "'${MOATS}'",
"resolution": "'${VSIZE}'",
"duration": "'${DURATION}'",
"mime": "'${MIME}'",
"channel": "'${CHANNEL}'",
"filesize": "'${FILE_SIZE}'",
"size": "'${FILE_BSIZE}'",
"poster": "'/ipfs/${IPFSROOT}/${VUID}.jpg'",
"ipfsroot": "'/ipfs/${IPFSROOT}'",
"ipfs": "'/ipfs/${IPFSROOT}/${VUID}.m3u8'",
"mediakey": "'${VUID}'",
"modified": "'${MOATS}'",
"tags": "'BunkerBOX Astroport.ONE ipfs'"
}
]' > ~/.zen/bunkerbox/homepage/tw/${CHANNEL}/tiddler.${VUID}.json
echo " ~/.zen/bunkerbox/homepage/tw/${CHANNEL}/tiddler.${VUID}.json READY"
tiddlywiki --load ${TWINDEX} \
--import ~/.zen/bunkerbox/homepage/tw/${CHANNEL}/tiddler.${VUID}.json "application/json" \
--output ~/.zen/tmp --render "$:/core/save/all" "newindex.html" "text/plain"
if [[ -s ~/.zen/tmp/newindex.html ]]; then
echo "OK TIDDLER. PUBLISHING. WAIT ..."
cp ~/.zen/tmp/newindex.html ${TWINDEX}
#~ TW5=$(ipfs add -rwHq ~/.zen/bunkerbox/channels/${CHANNEL}/* | tail -n 1)
#~ echo "## PUBLISHING qo-op_${CHANNEL} /ipfs/$TW5"
#~ ipfs name publish --key=qo-op_${CHANNEL} /ipfs/$TW5
else
echo "ERROR INSERTING TIDDLER"
fi
fi
######################### ######################### #########################
else
echo "VIDEO ALREADY THERE"
fi
#############################
## UPDATE GLOBAL LOCAL HISTORY
IsThere=$(cat ~/.zen/bunkerbox/history.json | jq .Videos[].link | grep $VUID)
if [[ ! $IsThere ]]; then
echo "Add $INDEX to ~/.zen/bunkerbox/cache/$VUID/media/history.json"
## history.json Videos.link is the HTML code displayed in index.html with pagination.js (related to)
cat ~/.zen/bunkerbox/history.json | jq '.Videos += [{"link": "<a id='"'_VUID_'"' href='"'_INDEX_'"'><img src='"'_INDEX_/_VUID_.jpg'"' height=80 ></a><br>'"'_TITLE_'"'"}]' > ~/.zen/bunkerbox/cache/$VUID/media/history.json
sed -i "s~_INDEX_~$INDEX~g" ~/.zen/bunkerbox/cache/$VUID/media/history.json
sed -i "s~_VUID_~$VUID~g" ~/.zen/bunkerbox/cache/$VUID/media/history.json
sed -i "s~_TITLE_~$TITLE~g" ~/.zen/bunkerbox/cache/$VUID/media/history.json
# COULD BE DONE LIKE THAT
# cat ~/.zen/bunkerbox/cache/$VUID/media/history.json | jq --arg INDEX "$INDEX" --arg TITLE "$TITLE" '.Videos += [{"link": "<a href='''$INDEX''' >'''$TITLE'''</a>"}]' > ~/.zen/bunkerbox/history.json
echo "MISE A JOUR ~/.zen/bunkerbox/history.json"
[[ "$(cat ~/.zen/bunkerbox/cache/$VUID/media/history.json)" == "" ]] && echo "NO $VUID/media/history.json FATAL ERROR" && exit 1
# Upgrade local history.json with new one
if [[ -f ~/.zen/bunkerbox/cache/$VUID/media/history.json ]]; then
cp ~/.zen/bunkerbox/cache/$VUID/media/history.json ~/.zen/bunkerbox/history.json
fi
fi
#############################
#################
VMAIN="/ipfs/$IPFSROOT/$VUID.m3u8"
# UPDATING original JSON - TODO inform crowdbunker that IPFS copy is available.
cat ~/.zen/bunkerbox/cache/$VUID/media/$VUID.json | jq ".video.hlsManifest.url = \"$VMAIN\"" > ~/.zen/bunkerbox/cache/$VUID/$VUID.json
echo "New HLS = $IPFSNGW$VMAIN"
#################
# Create local index.html simple redirect to current IPFS video
echo "<meta http-equiv=\"refresh\" content=\"0;URL=$IPFSNGW$INDEX\">" > ~/.zen/bunkerbox/index.html
echo "===== INDEX ===== $IPFSNGW/ipfs/$IPFSROOT"
echo "HISTORY : $IPFSNGW/ipfs/$IPFSROOT/history.json"
################# ################# #################
## GESTION CHOICE
PS3="Comment voulez-vous publier votre collecte ? "
choices=("debug" "local" "qo-op" "astrXbian")
fav=$(cat ~/.zen/bunkerbox/choice 2>/dev/null)
[[ ! $fav ]] && select fav in "${choices[@]}"; do [[ $fav ]] && break; done
case $fav in
"local")
echo 'local' > ~/.zen/bunkerbox/choice
echo "MODE 'local'"
continue
;;
"astrXbian")
echo "MODE 'astrXbian' (DEV ZONE)"
[[ ! -d ~/.zen/astrXbian ]] && echo "DEV ZONE - Installez astrXbian SVP ... P2P VideoClub DEMO - DEV ZONE !" && exit 1
[[ ! $IPFSNODEID ]] && echo "Missing IPFSNODEID. Exit" && exit 1
echo 'astrXbian' > ~/.zen/bunkerbox/choice
mkdir -p ~/.zen/ipfs/.$IPFSNODEID/astroport/bunkerbox
echo "<meta http-equiv=\"refresh\" content=\"0;URL=$INDEX\">" > ~/.zen/ipfs/.$IPFSNODEID/astroport/bunkerbox/index.html
cp ~/.zen/bunkerbox/history.json ~/.zen/ipfs/.$IPFSNODEID/astroport/bunkerbox/
echo "BALISE Station :: $IPFSNGW/ipns/$IPFSNODEID/.$IPFSNODEID/astroport/bunkerbox/"
echo "Propagation lors du prochain cycle astrXbian"
continue
;;
"qo-op")
echo "MODE 'qo-op'"
if [[ ! $(ipfs key list | grep -w 'qo-op') ]]; then
echo "Clef qo-op manquante! (Missing qo-op key!)"
echo "Récupérez la auprès de votre meilleur ami. Et ne brisez pas la chaine de confiance!"
echo "(Get it from your best friend and do not break confidence ring!)"
sleep 2
echo
echo "Envoyez un email pour obtenir assistance. (Contact support@qo-op.com) ? HELP !"
sleep 1
echo
echo "Utiliser la clef 'qo-op' par défaut ? ENTRER pour OUI. Saisissez un caractère avant si NON."
read KDEV
if [[ "$KDEV" != "" ]]; then
echo "La confiance est dans la CLEF (Confidence is in the KEY)."
echo "Génération de la votre (here is yours): "
publishkey=$(ipfs key gen qo-op)
echo "~/.ipfs/keystore/key_ofxs233q"
echo "$IPFSNGW/ipns/$publishkey"
echo
echo "$publishkey" > ~/.zen/bunkerbox/qo-op
echo 'qo-op' > ~/.zen/bunkerbox/choice
else
## USE DEV KEY
echo "Activation clef 'qo-op' par défaut."
echo "k51qzi5uqu5djt17zonkpg1cb8hrxhahpesybusz8q57j4ocqm0qlc6s99z60x" > ~/.zen/bunkerbox/qo-op
cp ${MY_PATH}/key_ofxs233q ~/.ipfs/keystore/
fi
echo "Cette clef est destinée aux passerelles de vos amis pour y publier vos chaines videos en commun..."
else
## qo-op KEY IS ALREADY THERE. WRITE 'qo-op' IPNS key
# Refreshing actual 'qo-op' key
ipfs key list -l | grep -w 'qo-op' | cut -f 1 -d ' ' > ~/.zen/bunkerbox/qo-op
fi
echo 'qo-op' > ~/.zen/bunkerbox/choice
IPNS=$(cat ~/.zen/bunkerbox/qo-op)
IPNSL="/ipns/$IPNS"
echo
echo "Chaine Vidéo 'qo-op' => $IPFSNGW/ipns/$IPNS"
echo
##### NEW HOMEPAGE / NEW DYNAMIC DATA ###### HERE TIMESTAMPING IS OK
InHere=$(cat ~/.zen/bunkerbox/history_*.json | jq .Videos[].link | grep $VUID)
if [[ ! $InHere ]]; then
echo "BunkerBOX - NOUVELLE VIDEO - Mise à jour homepage & dynamic history(s).json"
mkdir -p ~/.zen/bunkerbox/homepage/
## This is the welcome page of your qo-op channel.
# Could be redirect, or ... Your homepage is introduced there !!
# echo "<meta http-equiv=\"refresh\" content=\"0;URL=$INDEX\">" > ~/.zen/bunkerbox/homepage/index.html
## Preparing homepage
cp -R ${MY_PATH}/templates/styles ~/.zen/bunkerbox/homepage/
cp -R ${MY_PATH}/templates/js ~/.zen/bunkerbox/homepage/
cp ${MY_PATH}/templates/homepage.html ~/.zen/bunkerbox/homepage/index.html
cp ${MY_PATH}/templates/crowbunkerbox.png ~/.zen/bunkerbox/homepage/
sed -i "s~_IPNSL_~$IPNSL~g" ~/.zen/bunkerbox/homepage/index.html
sed -i "s~_VUID_~$INDEX/$VUID~g" ~/.zen/bunkerbox/homepage/index.html
sed -i "s/_WHO_/$(date -u "+%Y-%m-%d#%H:%M:%S")@$IPFSNODEID/g " ~/.zen/bunkerbox/homepage/index.html
sed -i "s~_TITLE_~$TITLE~g" ~/.zen/bunkerbox/homepage/index.html
${MY_PATH}/tools/get_tagcloud_data.sh $IPNS
TAGS=$(cat ~/.zen/tmp/chan_cloud.json | jq -c .[])
sed -i "s~_TAGCLOUD_~$TAGS~g" ~/.zen/bunkerbox/homepage/index.html
# Copy json's
cp ~/.zen/bunkerbox/history.json ~/.zen/bunkerbox/homepage/history.json
cp ~/.zen/bunkerbox/calendar.json ~/.zen/bunkerbox/homepage/calendar.json
cp ~/.zen/bunkerbox/history.${CHANNEL}.json ~/.zen/bunkerbox/homepage/history.${CHANNEL}.json
## ACTIVATE CONTROL
rm -Rf ~/.zen/bunkerbox/homepage/time
mkdir -p ~/.zen/bunkerbox/homepage/time/
echo "$TS" > ~/.zen/bunkerbox/homepage/ts # TimeStamping
echo "$IPFSNODEID" > ~/.zen/bunkerbox/homepage/time/$TS # (could be signed) Put my Station ID into time/$TS for control #astrXbian (whitelist swarm control) or blacklisting extension here)
# (UNCOMMENT THIS CODE AND protect history_qo-op.json corruption the way you want to (*white or black listing)
# BALISE=$(echo $TS | ipfs add -q)
# ipfs name publish $BALISE ##### $IPFSNODEID IS now confirming it recognizes this TS as last publishing !!
# TIME=$(ipfs cat /ipns/$IPNS/ts)
# WHO=$(ipfs cat /ipns/$IPNS/time/$TIME)
# ISTRUE=$(ipfs cat /ipns/$WHO)
# TIME == ISTRUE ? ####### Et voilà ;)
echo "Adding ~/.zen/bunkerbox/homepage/* to IPFS "
VROOT=$(ipfs add -rwHq ~/.zen/bunkerbox/homepage/* | tail -n 1)
echo "'qo-op' update with /ipfs/$VROOT"
ipfs name publish --key=qo-op /ipfs/$VROOT
echo "$VROOT" > ~/.zen/bunkerbox/homepage/chain # Memorize chain ipfs reference
echo "HOME : $IPFSNGW/ipns/$IPNS/"
echo "HISTORY : $IPFSNGW/ipns/$IPNS/history.${CHANNEL}.json"
echo
fi
continue
;;
"debug")
echo "debug"
> ~/.zen/bunkerbox/choice
continue
;;
esac
end=`date +%s`; echo ___Duration `expr $end - $start` seconds___
done