2022-04-07 02:14:21 +02:00
#!/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 qo-op
# ou du TestNET astrXbian, videoclub entre amis d'amis...
MY_PATH = " `dirname \" $0 \"` " # relative
MY_PATH = " `( cd \" $MY_PATH \" && pwd )` " # absolutized and normalized
ME = " ${ 0 ##*/ } "
TS = $( date -u +%s%N | cut -b1-13)
[ [ ! $( 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])/ " )
IPFSNGW = "https://tube.copylaradio.com"
IPFSNGW = "http://127.0.0.1:8080"
[ [ ! $isLAN ] ] && IPFSNGW = " https:// $( hostname) "
echo " IPFS GATEWAY $IPFSNGW "
## GET LATEST VIDEOS
VWALLURL = "https://api.crowdbunker.com/post/all"
curl -s $VWALLURL -H "Accept: application/json" > ~/.zen/bunkerbox/crowd.json
2022-04-07 16:58:11 +02:00
## LOOP THROUGH (REVERSE LIST)
cat ~/.zen/bunkerbox/crowd.json | jq -r '.posts | .[] | .video.id' > /tmp/vuid.list
for VUID in $( tac /tmp/vuid.list) ; do
2022-04-07 02:14:21 +02:00
[ [ " $VUID " = = "null" ] ] && echo "MESSAGE... Bypassing..." && echo && continue
echo " Bunker BOX : Adding $VUID "
mkdir -p ~/.zen/bunkerbox/$VUID /media
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/$VUID /$VUID .json
# STREAMING LIVE ?
echo " >>> Extracting video caracteristics from ~/.zen/bunkerbox/ $VUID / $VUID .json "
ISLIVE = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .video.isLiveType) && [ [ " $ISLIVE " = = "true" ] ] && echo "LIVE... "
LIVE = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .video.isLiveActive) && [ [ " $LIVE " = = "true" ] ] && echo "STREAMING... Bypassing..." && echo && continue
DURATION = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .video.duration) && [ [ $DURATION = = 0 ] ] && echo "NOT STARTED YET" && echo && continue
TITLE = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .video.title | sed "s/'/ /g" | sed 's/"/ /g' ) # Remove quote
CHANNEL = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .channel.name)
ORGUID = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .organization.uid)
ORGNAME = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .organization.name)
ORGBANNER = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .organization.banner.url)
HLS = $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r .video.hlsManifest.url)
MEDIASOURCE = $( echo $HLS | rev | cut -d '/' -f 2- | rev)
echo " $TITLE ( $DURATION s) "
2022-04-07 15:43:42 +02:00
## NO choice made, so ask to continue each loop
[ [ ! $( 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
2022-04-07 02:14:21 +02:00
start = ` date +%s`
echo " $HLS "
2022-04-07 15:43:42 +02:00
## Download HLS source m3u8 (contains video & audio)
2022-04-07 02:14:21 +02:00
curl -s $HLS -o ~/.zen/bunkerbox/$VUID /$VUID .m3u8
2022-04-07 15:43:42 +02:00
[ [ ! $( cat ~/.zen/bunkerbox/choice 2>/dev/null) ] ] && cat ~/.zen/bunkerbox/$VUID /$VUID .m3u8 # DEBUG
2022-04-07 02:14:21 +02:00
echo ">>>>>>>>>>>>>>>> Downloading VIDEO"
# Choose 360p or 480p or 240p
VSIZE = 360 && VIDEOHEAD = $( cat ~/.zen/bunkerbox/$VUID /$VUID .m3u8 | grep -B1 ${ VSIZE } p | head -n 1) && VIDEOSRC = $( cat ~/.zen/bunkerbox/$VUID /$VUID .m3u8 | grep ${ VSIZE } p | tail -n 1 | cut -f 1 -d '.' )
[ [ " $VIDEOSRC " = = "" ] ] && VSIZE = 480 && VIDEOHEAD = $( cat ~/.zen/bunkerbox/$VUID /$VUID .m3u8 | grep -B1 ${ VSIZE } p | head -n 1) && VIDEOSRC = $( cat ~/.zen/bunkerbox/$VUID /$VUID .m3u8 | grep ${ VSIZE } p | tail -n 1 | cut -f 1 -d '.' )
[ [ " $VIDEOSRC " = = "" ] ] && VSIZE = 240 && VIDEOHEAD = $( cat ~/.zen/bunkerbox/$VUID /$VUID .m3u8 | grep -B1 ${ VSIZE } p | head -n 1) && VIDEOSRC = $( cat ~/.zen/bunkerbox/$VUID /$VUID .m3u8 | grep ${ VSIZE } p | tail -n 1 | cut -f 1 -d '.' )
VTHUMB = " $( cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq -r --arg VSIZE " $VSIZE " '.video.thumbnails[] | select(.height == $VSIZE) | .url' ) "
echo " >>>>>>>>>>>>>>>> Downloading Video $VSIZE Thumbnail "
2022-04-07 12:29:55 +02:00
[ [ ! -f ~/.zen/bunkerbox/$VUID /media/$VUID .jpg ] ] && curl -s $VTHUMB -o ~/.zen/bunkerbox/$VUID /media/$VUID .jpg
2022-04-07 02:14:21 +02:00
[ [ ! -f ~/.zen/bunkerbox/$VUID /media/$VUID .jpg ] ] && cp ${ MY_PATH } /images/astroport.jpg ~/.zen/bunkerbox/$VUID /media/$VUID .jpg # CORRECT MISSING THUMB
echo " VIDEOSRC= $MEDIASOURCE / $VIDEOSRC "
# Downloading Video m3u8 and Video
[ [ ! -f ~/.zen/bunkerbox/$VUID /media/$VIDEOSRC .m3u8 ] ] && curl -s $MEDIASOURCE /$VIDEOSRC .m3u8 -o ~/.zen/bunkerbox/$VUID /media/$VIDEOSRC .m3u8
[ [ ! -f ~/.zen/bunkerbox/$VUID /media/$VIDEOSRC ] ] && curl $MEDIASOURCE /$VIDEOSRC -o ~/.zen/bunkerbox/$VUID /media/$VIDEOSRC
echo ">>>>>>>>>>>>>>>> Downloading AUDIO"
AUDIOLINE = $( cat ~/.zen/bunkerbox/$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/$VUID /media/$AUDIOFILE .m3u8 ] ] && curl -s $MEDIASOURCE /$AUDIOFILE .m3u8 -o ~/.zen/bunkerbox/$VUID /media/$AUDIOFILE .m3u8
[ [ ! -f ~/.zen/bunkerbox/$VUID /media/$AUDIOFILE ] ] && curl $MEDIASOURCE /$AUDIOFILE -o ~/.zen/bunkerbox/$VUID /media/$AUDIOFILE
echo " >>>>>>>>>>>>>>>> CREATING $VSIZE M3U8 "
echo " #EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
$AUDIOLINE
$VIDEOHEAD
$VIDEOSRC .m3u8
" > ~/.zen/bunkerbox/ $VUID /media/ $VUID .m3u8
2022-04-07 15:43:42 +02:00
ls ~/.zen/bunkerbox/$VUID /media/ # SHOW ALL COLLECTED MEDIA
2022-04-07 02:14:21 +02:00
##########################################################################
2022-04-07 15:43:42 +02:00
##########################################################################
2022-04-07 02:14:21 +02:00
echo "##########################################################################"
echo ">>>>>>>>>>>>>>>> ADDING index.html"
# COPY index, style, js AND data
cp -R ${ MY_PATH } /templates/styles ~/.zen/bunkerbox/$VUID /media/
cp -R ${ MY_PATH } /templates/js ~/.zen/bunkerbox/$VUID /media/
cp ${ MY_PATH } /templates/videojs.html ~/.zen/bunkerbox/$VUID /media/index.html
cp ${ MY_PATH } /images/astroport.jpg ~/.zen/bunkerbox/$VUID /media/
2022-04-07 15:43:42 +02:00
## CREATE FIRST HISTORY from TEMPLATE
[ [ ! -f ~/.zen/bunkerbox/history.json ] ] && cp ${ MY_PATH } /templates/data/history.json ~/.zen/bunkerbox/history.json
2022-04-07 11:42:42 +02:00
2022-04-07 15:43:42 +02:00
# qo-op get latest history.json
if [ [ " $( cat ~/.zen/bunkerbox/choice 2>/dev/null) " = = "qo-op" ] ] ; then
IPNSL = " /ipns/ $( cat ~/.zen/bunkerbox/qo-op) "
ipfs get -o ~/.zen/bunkerbox/history.qo-op.json $IPNSL /history.json # Get actual IPNS qo-op history.json
[ [ $( cat ~/.zen/bunkerbox/history.qo-op.json | jq .Videos[ ] .link | grep $VUID ) ] ] && echo "Video déjà dans history" && cp ~/.zen/bunkerbox/history.qo-op.json ~/.zen/bunkerbox/history.json && continue
2022-04-07 02:14:21 +02:00
# FUSION/REPLACEMENT WHAT TODO ?
2022-04-07 15:43:42 +02:00
jq -s '.[0] * .[1]' ~/.zen/bunkerbox/history.json ~/.zen/bunkerbox/history.qo-op.json | jq -M '.Videos |= unique_by(.link)' > ~/.zen/bunkerbox/history.fusion.json
mv ~/.zen/bunkerbox/history.fusion.json ~/.zen/bunkerbox/history.json ## REPLACE LOCAL HISTORY CACHE
2022-04-07 02:14:21 +02:00
else
2022-04-07 15:43:42 +02:00
IPNSL = "./"
2022-04-07 02:14:21 +02:00
fi
2022-04-07 15:43:42 +02:00
# Add current/latest reversed history to media
echo ' {
"Videos" :' > ~/.zen/bunkerbox/$VUID /media/history.json
cat ~/.zen/bunkerbox/history.json | jq '.[] | reverse' >> ~/.zen/bunkerbox/$VUID /media/history.json
echo '}' >> ~/.zen/bunkerbox/$VUID /media/history.json
2022-04-07 02:14:21 +02:00
# Using relative links
sed "s/_IPFSROOT_/./g" ${ MY_PATH } /templates/videojs.html > ~/.zen/bunkerbox/$VUID /media/index.html
sed -i " s/_VUID_/ $VUID /g " ~/.zen/bunkerbox/$VUID /media/index.html
# sed -i s/_DATE_/$(date -u "+%Y-%m-%d#%H:%M:%S")/g ~/.zen/bunkerbox/$VUID/media/index.html # Different Copy Makes Different Chains !
sed -i " s~_TITLE_~ $TITLE ~g " ~/.zen/bunkerbox/$VUID /media/index.html
sed -i " s~_CHANNEL_~ $CHANNEL ~g " ~/.zen/bunkerbox/$VUID /media/index.html
2022-04-07 11:42:42 +02:00
sed -i " s~_IPNSL_~ $IPNSL ~g " ~/.zen/bunkerbox/$VUID /media/index.html #MAJ IPNS link
2022-04-07 02:14:21 +02:00
echo " >>>>> ADDING TO IPFS : ipfs add -rwH ~/.zen/bunkerbox/ $VUID /media/* "
echo
IPFSROOT = $( ipfs add -rwHq ~/.zen/bunkerbox/$VUID /media/* | tail -n 1)
INDEX = " /ipfs/ $IPFSROOT "
VMAIN = " /ipfs/ $IPFSROOT / $VUID .m3u8 "
2022-04-07 15:43:42 +02:00
# UPDATING original JSON - TODO inform crowdbunker that IPFS copy is available.
2022-04-07 02:14:21 +02:00
cat ~/.zen/bunkerbox/$VUID /$VUID .json | jq " .video.hlsManifest.url = \" $VMAIN \" " > ~/.zen/bunkerbox/$VUID /media/$VUID .json
echo " M3U8 : $IPFSNGW $VMAIN "
## UPDATE GLOCAL HISTORY ?
IsThere = $( cat ~/.zen/bunkerbox/history.json | jq .Videos[ ] .link | grep $VUID )
if [ [ ! $IsThere ] ] ; then
echo " Add $INDEX to ~/.zen/bunkerbox/ $VUID /media/history.json "
2022-04-08 02:47:03 +02:00
## history.json Videos.link is the HTML code displayed in index.html with pagination.js (related to)
2022-04-07 02:14:21 +02:00
cat ~/.zen/bunkerbox/history.json | jq '.Videos += [{"link": "<a href=' "'_INDEX_'" '><img src=' "'_INDEX_/_VUID_.jpg'" ' height=80 ></a><br>' "'_TITLE_'" '"}]' > ~/.zen/bunkerbox/$VUID /media/history.json
echo $INDEX
sed -i " s~_INDEX_~ $INDEX ~g " ~/.zen/bunkerbox/$VUID /media/history.json
echo $VUID
sed -i " s~_VUID_~ $VUID ~g " ~/.zen/bunkerbox/$VUID /media/history.json
echo $TITLE
sed -i " s~_TITLE_~ $TITLE ~g " ~/.zen/bunkerbox/$VUID /media/history.json
# COULD BE DONE LIKE THAT
# cat ~/.zen/bunkerbox/$VUID/media/history.json | jq --arg INDEX "$INDEX" --arg TITLE "$TITLE" '.Videos += [{"link": "<a href='''$INDEX''' >'''$TITLE'''</a>"}]' > ~/.zen/bunkerbox/history.json
echo "Mise à jour ~/.zen/bunkerbox/history.json"
2022-04-08 02:47:03 +02:00
[ [ " $( cat ~/.zen/bunkerbox/$VUID /media/history.json) " = = "" ] ] && echo "FATAL ERROR" && exit 1
# Upgrade local history.json with latest one
2022-04-07 02:14:21 +02:00
[ [ -f ~/.zen/bunkerbox/$VUID /media/history.json ] ] && cp -f ~/.zen/bunkerbox/$VUID /media/history.json ~/.zen/bunkerbox/history.json
fi
2022-04-08 02:47:03 +02:00
# Create local index.html redirecting to current latest IPFS video
echo " <meta http-equiv=\"refresh\" content=\"0;URL= $IPFSNGW $INDEX \"> " > ~/.zen/bunkerbox/index.html
2022-04-07 15:43:42 +02:00
echo " ===== INDEX ===== $IPFSNGW /ipfs/ $IPFSROOT "
echo " HISTORY : $IPFSNGW /ipfs/ $IPFSROOT /history.json "
2022-04-07 02:14:21 +02:00
2022-04-07 15:43:42 +02:00
PS3 = "Comment voulez-vous continuer et publier votre collecte ? "
2022-04-07 02:14:21 +02:00
choices = ( "debug" "local" "qo-op" "astrXbian" )
2022-04-07 16:00:19 +02:00
fav = $( cat ~/.zen/bunkerbox/choice 2>/dev/null)
2022-04-07 02:14:21 +02:00
[ [ ! $fav ] ] && select fav in " ${ choices [@] } " ; do [ [ $fav ] ] && break; done
case $fav in
"local" )
echo 'local' > ~/.zen/bunkerbox/choice
2022-04-07 15:43:42 +02:00
echo "MODE LOCAL Historique = ~/.zen/bunkerbox/history.json"
2022-04-07 02:14:21 +02:00
continue
; ;
"astrXbian" )
[ [ ! -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/
2022-04-07 15:43:42 +02:00
echo " BALISE Station :: $IPFSNGW /ipns/ $IPFSNODEID /. $IPFSNODEID /astroport/bunkerbox/ "
echo "Propagation lors du prochain cycle astrXbian"
2022-04-07 02:14:21 +02:00
continue
; ;
"qo-op" )
2022-04-07 15:43:42 +02:00
echo "ACTIVATION qo-op"
2022-04-07 02:14:21 +02:00
if [ [ ! $( ipfs key list | grep 'qo-op' ) ] ] ; then
2022-04-07 15:43:42 +02:00
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' de DEV ? ENTRER pour OUI. Saisissez un caractère avant si NON."
2022-04-07 02:14:21 +02:00
read KDEV
2022-04-07 15:43:42 +02:00
if [ [ " $KDEV " != "" ] ] ; then
echo "La confiance est dans la CLEF (Confidence is in the KEY)."
echo "Voici la votre (here is yours): "
publishkey = $( ipfs key gen qo-op)
echo "~/.ipfs/keystore/key_ofxs233q"
echo "Partagez cette clef avec vos amis pour créer une chaine video en commun..."
echo " $IPFSNGW /ipns/ $publishkey "
echo " $publishkey " > ~/.zen/bunkerbox/qo-op
echo 'qo-op' > ~/.zen/bunkerbox/choice
else
## USE DEV KEY
echo "k51qzi5uqu5djt17zonkpg1cb8hrxhahpesybusz8q57j4ocqm0qlc6s99z60x" > ~/.zen/bunkerbox/qo-op
cp ${ MY_PATH } /key_ofxs233q ~/.ipfs/keystore/
fi
############################################
## FIRST PUBLISH index.html (REDIRECT) + history.json + ts
2022-04-07 02:14:21 +02:00
mkdir -p /tmp/$VUID
2022-04-08 02:47:03 +02:00
2022-04-08 03:14:24 +02:00
cp ${ MY_PATH } /templates/homepage.html /tmp/$VUID /index.html
cp ${ MY_PATH } /templates/crowbunkerbox.png /tmp/$VUID /
sed -i " s~_IPNSL_~ $IPNSL ~g " /tmp/$VUID /index.html
2022-04-07 02:21:11 +02:00
cp ~/.zen/bunkerbox/history.json /tmp/$VUID /history.json
2022-04-07 02:14:21 +02:00
echo " $TS " > /tmp/$VUID /ts # TimeStamping
2022-04-08 02:47:03 +02:00
2022-04-07 02:14:21 +02:00
VROOT = $( ipfs add -wHq /tmp/$VUID /* | tail -n 1)
ipfs name publish --key= qo-op /ipfs/$VROOT
2022-04-07 15:43:42 +02:00
echo " qo-op : $IPFSNGW /ipns/ $IPNS /history.json REDIRECT TO /ipfs/ $VROOT "
2022-04-07 02:14:21 +02:00
else
2022-04-07 15:43:42 +02:00
## qo-op KEY IS ALREADY THERE. WRITE qo-op IPNS key
2022-04-07 02:14:21 +02:00
ipfs key list -l | grep 'qo-op' | cut -f 1 -d ' ' > ~/.zen/bunkerbox/qo-op
fi
echo 'qo-op' > ~/.zen/bunkerbox/choice
IPNS = $( cat ~/.zen/bunkerbox/qo-op)
echo " Votre chaine vidéo qo-op /ipns/ $IPNS "
echo
InHere = $( cat ~/.zen/bunkerbox/history.qo-op.json | jq .Videos[ ] .link | grep $VUID )
if [ [ ! $InHere ] ] ; then
echo "NOUVELLE VIDEO."
mkdir -p /tmp/$VUID
2022-04-08 03:11:35 +02:00
## 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\">" > /tmp/$VUID/index.html
2022-04-08 02:47:03 +02:00
# echo "<meta http-equiv=\"refresh\" content=\"0;URL=$INDEX\">" > /tmp/$VUID/index.html
2022-04-08 03:14:24 +02:00
cp ${ MY_PATH } /templates/homepage.html /tmp/$VUID /index.html
2022-04-08 03:11:35 +02:00
cp ${ MY_PATH } /templates/crowbunkerbox.png /tmp/$VUID /
sed -i " s~_IPNSL_~ $IPNSL ~g " /tmp/$VUID /index.html
2022-04-07 02:14:21 +02:00
cp ~/.zen/bunkerbox/history.json /tmp/$VUID /history.json
echo " $TS " > /tmp/$VUID /ts # TimeStamping
VROOT = $( ipfs add -wHq /tmp/$VUID /* | tail -n 1)
ipfs name publish --key= qo-op /ipfs/$VROOT
echo " qo-op : $IPFSNGW /ipns/ $IPNS / "
echo " qo-op : $IPFSNGW /ipns/ $IPNS /history.json "
fi
#[[ $VUID != "" ]] && rm -Rf /tmp/$VUID # Cleaning
continue
; ;
"debug" )
echo "debug"
> ~/.zen/bunkerbox/choice
break
; ;
esac
##########################################################################
# cat ~/.zen/bunkerbox/$VUID/media/$VUID.json | jq -r .video.hlsManifest.url
end = ` date +%s` ; echo Duration ` expr $end - $start ` seconds.
done