From 6051609dab3a919465e37aa01d563b29a405109e Mon Sep 17 00:00:00 2001 From: Boris Paing Date: Fri, 12 Mar 2021 19:41:24 +0100 Subject: [PATCH] first commit --- .gitignore | 4 + README.md | 0 ajouter_video_youtube.sh | 89 +++++++++++ cat.php | 5 + conf/conf.php | 22 +++ conf/home_dir.txt | 1 + erreurs/droits-d-ecriture.log | 13 ++ erreurs/permissions-2.log | 10 ++ erreurs/permissions.log | 4 + erreurs/succes.log | 50 +++++++ functions.php | 66 +++++++++ get_youtube_videos.sh | 4 + index.php | 2 + install/install_web_ui.sh | 66 +++++++++ ipns_self_publish.sh | 21 +++ new_youtube_video_in_astroport.sh | 230 +++++++++++++++++++++++++++++ styles/crowdbunker/astrobunker.png | Bin 0 -> 25297 bytes styles/crowdbunker/crowdbunker.css | 133 +++++++++++++++++ swarm_files.php | 79 ++++++++++ test.txt | 1 + youtube.php | 90 +++++++++++ youtube_add_video.php | 44 ++++++ youtube_add_video_aux.php | 16 ++ youtube_watch.php | 57 +++++++ 24 files changed, 1007 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 ajouter_video_youtube.sh create mode 100644 cat.php create mode 100644 conf/conf.php create mode 100644 conf/home_dir.txt create mode 100644 erreurs/droits-d-ecriture.log create mode 100644 erreurs/permissions-2.log create mode 100644 erreurs/permissions.log create mode 100644 erreurs/succes.log create mode 100644 functions.php create mode 100755 get_youtube_videos.sh create mode 100644 index.php create mode 100755 install/install_web_ui.sh create mode 100755 ipns_self_publish.sh create mode 100755 new_youtube_video_in_astroport.sh create mode 100644 styles/crowdbunker/astrobunker.png create mode 100644 styles/crowdbunker/crowdbunker.css create mode 100644 swarm_files.php create mode 100644 test.txt create mode 100644 youtube.php create mode 100644 youtube_add_video.php create mode 100644 youtube_add_video_aux.php create mode 100644 youtube_watch.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e6459eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +astroport +astrXbian +me +swarm diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/ajouter_video_youtube.sh b/ajouter_video_youtube.sh new file mode 100755 index 0000000..4619013 --- /dev/null +++ b/ajouter_video_youtube.sh @@ -0,0 +1,89 @@ +#!/bin/bash +######################################################################## +# Author: Fred (support@qo-op.com) +# Version: 0.1 +# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) +######################################################################## +# SCRIPT INTERACTIF POUR AJOUTER UN FICHIER à ASTROPORT/KODI +# +# 1. CAT: film, serie, anime +# 2. TMDB: ID de la fiche sur https://www.themoviedb.org/ +# 3. TITLE: Titre de la vidéo +# 4. YEAR: Année de la vidéo +# 5. RES: Résolution 1080p, 4K, SD, 720, HD +# 6. SAISON: Pour les séries et animes, c'est le numéro de saison. +# Pour un film, le champ SAISON est utilisé pour renseigner la Saga +# 7. GENRES: Action, Aventure, Fantastique, Animation, etc (choix multiple). +# 8. GROUPES: Permet de regrouper des films. (choix multiple) +# +# https://github.com/Kodi-vStream/venom-xbmc-addons/wiki/Voir-et-partager-sa-biblioth%C3%A8que-priv%C3%A9e#d%C3%A9clarer-des-films +######################################################################## +HOME=`cat conf/home_dir.txt` +######################################################################## +MY_PATH="`dirname \"$0\"`" # relative +MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized +ME="${0##*/}" +######################################################################## + + +######################################################################## +IPFSNODEID=$(ipfs id -f='\n') +[[ -f ~/.zen/ipfs/.$IPFSNODEID/G1SSB/_g1.gchange_title ]] && XZUID=$(cat ~/.zen/ipfs/.$IPFSNODEID/G1SSB/_g1.gchange_title) || XZUID=$(cat /etc/hostname) + + +######################################################################## +# CASE ## YOUTUBE +######################################################################## + +#YTURL=$(zenity --entry --width 300 --title "Lien ou identifiant à copier" --text "Indiquez le lien (URL) ou l'ID de la vidéo" --entry-text="") +YTURL=$1 +[[ $YTURL == "" ]] && exit 1 + +# Create TEMP directory to copy $YID_$TITLE.$FILE_EXT +YTEMP="/tmp/$(date -u +%s%N | cut -b1-13)" +mkdir -p ${YTEMP} + +# youtube-dl $YTURL +echo "VIDEO $YTURL" +/usr/local/bin/youtube-dl -f '[height=720]/best' \ +--write-info-json --write-annotations \ +--no-mtime -o "${YTEMP}/%(id)s_%(title)s.%(ext)s" $YTURL + +# Get filename, extract ID, make destination dir and move copy. +YFILE=$(ls -t ${YTEMP} | head -n 1) +FILE_NAME="$(basename "${YFILE}")" +FILE_EXT="${FILE_NAME##*.}" + +YID=$(echo "${FILE_NAME}" | cut -d "_" -f 1) +YNAME=$(echo "${FILE_NAME}" | cut -d "_" -f 2-) +TMDB="${YID}" + +FILE_PATH="$HOME/astroport/youtube/$YID" +echo "Creating directory $FILE_PATH" +mkdir -p -v --mode=775 $FILE_PATH || echo "Directory creation failed :-(" +echo "Moving files there..." +mv -f ${YTEMP}/* ${FILE_PATH}/ + +## CORRECT PARAMETERS to Make Kodi compatible YASTRXBIAN FILE +TITLE="${YNAME%.*}" +GENRES="[Youtube]" +GROUPES="_IPNSKEY_" +FILE_RES=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "${FILE_PATH}/${FILE_NAME}" | cut -d "x" -f 2) +RES=${FILE_RES%?}0p + +## CREATE "~/astroport/${CAT}/${TMDB}/ajouter_video.txt" (with film CAT !!!) +URLENCODE_FILE_NAME=$(echo ${FILE_NAME} | jq -Rr @uri) +echo "film;${TMDB};${YEAR};${TITLE};${SAISON};${GENRES};${GROUPES};${RES};/ipfs/_IPFSREPFILEID_/$URLENCODE_FILE_NAME" > ~/astroport/youtube/${TMDB}/ajouter_video.txt +# _IPFSREPFILEID_ is replaced later + +rm -Rf ${YTEMP} + + +######################################################################## +# ADD $FILE to IPFS / ASTROPORT / KODI +######################################################################## +./new_youtube_video_in_astroport.sh "$HOME/astroport/youtube/${TMDB}/" "${FILE_NAME}" > /tmp/youtube_${TMDB}.log 2>&1 +######################################################################## +######################################################################## + +exit 0 diff --git a/cat.php b/cat.php new file mode 100644 index 0000000..b770b89 --- /dev/null +++ b/cat.php @@ -0,0 +1,5 @@ +'; print_r($files); echo ''; diff --git a/conf/conf.php b/conf/conf.php new file mode 100644 index 0000000..9a5d4a2 --- /dev/null +++ b/conf/conf.php @@ -0,0 +1,22 @@ +Astrobunker'); +define('USP', 'Votre caverne remplie des trésors que vous avez découverts sur le web, votre forteresse de contenu imprenable, votre palais informationnel.'); diff --git a/conf/home_dir.txt b/conf/home_dir.txt new file mode 100644 index 0000000..b3abcca --- /dev/null +++ b/conf/home_dir.txt @@ -0,0 +1 @@ +/home/boris diff --git a/erreurs/droits-d-ecriture.log b/erreurs/droits-d-ecriture.log new file mode 100644 index 0000000..ab279ae --- /dev/null +++ b/erreurs/droits-d-ecriture.log @@ -0,0 +1,13 @@ +$ ./ajouter_video_youtube.sh https://www.youtube.com/watch?v=2JYJF9L5YW4 +Error: error loading plugins: open /home/boris/.ipfs/config: permission denied +./ajouter_video_youtube.sh: ligne 31:  XZUID=boris-ThinkPad-T420 : commande introuvable +VIDEO https://www.youtube.com/watch?v=2JYJF9L5YW4 +[youtube] 2JYJF9L5YW4: Downloading webpage +WARNING: There are no annotations to write. +[info] Writing video description metadata as JSON to: /tmp/1615547666114/2JYJF9L5YW4_NPC rides his bike into the mayor.info.json +[download] Destination: /tmp/1615547666114/2JYJF9L5YW4_NPC rides his bike into the mayor.mp4 +[download] 100% of 988.39KiB in 00:00 +mkdir: impossible de créer le répertoire «~»: Permission non accordée +~/astroport/youtube/2JYJF9L5YW4/2JYJF9L5YW4_NPC rides his bike into the mayor.mp4: No such file or directory +./ajouter_video_youtube.sh: ligne 73: /home/boris/astroport/youtube/2JYJF9L5YW4/ajouter_video.txt: Aucun fichier ou dossier de ce type +./ajouter_video_youtube.sh: ligne 82: /tmp/youtube_2JYJF9L5YW4.log: Permission non accordée diff --git a/erreurs/permissions-2.log b/erreurs/permissions-2.log new file mode 100644 index 0000000..f1de3ff --- /dev/null +++ b/erreurs/permissions-2.log @@ -0,0 +1,10 @@ +Error: error loading plugins: open /home/boris/.ipfs/config: permission denied +cat: /home/boris/.zen/secret.dunikey: Permission denied +~/.zen/www/new_youtube_video_in_astroport.sh PATH/ "/home/boris/astroport/youtube/2JYJF9L5YW4/" FILE "2JYJF9L5YW4_NPC rides his bike into the mayor.mp4" +./new_youtube_video_in_astroport.sh: line 45: $'\302\240XZUID=boris-ThinkPad-T420': command not found +SEARCH for ;2JYJF9L5YW4; in YASTRXBIAN +ADDING /home/boris/astroport/youtube/2JYJF9L5YW4/2JYJF9L5YW4_NPC rides his bike into the mayor.mp4 to IPFS and create YASTRXBIAN INDEX +~/.zen/ipfs/./astroport/kodi/vstream/YASTRXBIAN +----------------------------------------------------------------- +Error: error loading plugins: open /home/boris/.ipfs/config: permission denied +ipfs add ERROR diff --git a/erreurs/permissions.log b/erreurs/permissions.log new file mode 100644 index 0000000..797abce --- /dev/null +++ b/erreurs/permissions.log @@ -0,0 +1,4 @@ +Error: error loading plugins: open /home/boris/.ipfs/config: permission denied +cat: /home/boris/.zen/secret.dunikey: Permission denied +./astrXbian/zen/new_file_in_astroport.sh PATH/ "/home/boris/astroport/youtube/KaqC5FnvAEc/" FILE "KaqC5FnvAEc_Trolling Saruman.mp4" +NO FILE diff --git a/erreurs/succes.log b/erreurs/succes.log new file mode 100644 index 0000000..5a8a9ec --- /dev/null +++ b/erreurs/succes.log @@ -0,0 +1,50 @@ +Checking if the file exists at : +/home/boris/astroport/youtube/hpjV962DLWs/hpjV962DLWs_Vladimir Cauchemar - Aulos (Official Music Video).mp4 +in ~/.zen/www/new_youtube_video_in_astroport.sh +SEARCH for ;hpjV962DLWs; in YASTRXBIAN +ADDING /home/boris/astroport/youtube/hpjV962DLWs/hpjV962DLWs_Vladimir Cauchemar - Aulos (Official Music Video).mp4 to IPFS and create YASTRXBIAN INDEX +~/.zen/ipfs/.12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/astroport/kodi/vstream/YASTRXBIAN +----------------------------------------------------------------- +----------------------------------------------------------------- +IPFS: hpjV962DLWs_Vladimir Cauchemar - Aulos (Official Music Video).mp4 : ipfs ls /ipfs/QmZMTghrSQgi45Xm8Pt7Vg2ShigdsCYvCurVqY7fUU7qGS +----------------------------------------------------------------- +New youtube INDEX ~/.zen/ipfs/.12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/astroport/kodi/vstream/YASTRXBIAN +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv62juoffwws2yo5rwuqi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv66tlkrtdatdniryuwsi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6v3rnnhdowdenrgvkui': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv64kbmjsgsnbznfguqsi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_krguiqs7gy4dm': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_krguiqs7gezdomi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6ntjkryvi6bwpblxmui': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6wskkntvg6kxne3dc3y': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6qjslf5ewv3vivexq4y': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6wldn5jxunbrpfmukma': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6ykvgbxgc6svkvjuiqi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv65rtjrsgw33sinbwuti': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6sligfghk3swnjreizy': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6msgorrs2r2xjjdtcvi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv632wgjnfavjnnbvtgwi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6ucrjbifszlmofzdari': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv62lviy3eg4cnjqzusui': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv633bozgxivkxirbfiti': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6r3kii3ggy2wonyfena': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv633ige2davkonrbucma': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6njzom2fm5trkbrequi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6v2ggm2e4ndhjjauwri': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6nrtjm2xmtl2pfwge3y': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_pbrgsylo': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv62dqnjldsnrsirgfo4y': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv62keo5yuorzq': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv643pgjbfqljynz3fqzy': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6tbzizvucytxmfxw6qi': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6mdso5shatkvn54tqzy': Permission denied +ls: cannot access '/home/boris/.ipfs/keystore/key_lfhvkvcvijcv6odflbvdsn3torreooa': Permission denied +./new_youtube_video_in_astroport.sh: line 149: /home/boris/.zen/webui/tools/natools.py: No such file or directory +./new_youtube_video_in_astroport.sh: line 158: /home/boris/.zen/webui/tools/natools.py: No such file or directory +-------------------- UPDATE MY INDEX ----------------------------- +film;hpjV962DLWs;;Vladimir Cauchemar - Aulos (Official Music Video);;[Youtube];k51qzi5uqu5dk28g6cg9s58eesfg0r94zupduir4hsme7dyc4x793w0kfluqdm;360p;/ipfs/QmZMTghrSQgi45Xm8Pt7Vg2ShigdsCYvCurVqY7fUU7qGS/hpjV962DLWs_Vladimir%20Cauchemar%20-%20Aulos%20(Official%20Music%20Video).mp4 +----------------- REFRESH GLOBAL KODI INDEX ---------------------- +PUBLISHING ~/.zen/ipfs SELF /ipns/12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY +NEW youtube (hpjV962DLWs_Vladimir Cauchemar - Aulos (Official Music Video).mp4) ADDED. +INDEX UPDATED : http://127.0.0.1:8181/ipns/12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/.12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/YASTRXBIAN +VIDEO IPNS LINK : http://127.0.0.1:8181/ipns/k51qzi5uqu5dk28g6cg9s58eesfg0r94zupduir4hsme7dyc4x793w0kfluqdm/8WydxZg8kZbYnj9GAUGbEbwfz55fk1MsZJWYQRfTpjZc/ diff --git a/functions.php b/functions.php new file mode 100644 index 0000000..578aa54 --- /dev/null +++ b/functions.php @@ -0,0 +1,66 @@ +=200 && $httpcode<300); +} + +function guessTypeFromFilename ($filename) { + + $ext = substr($filename, (strrpos($filename, '.') + 1)); + + switch ($ext) { + + case 'mkv': + $type = 'video/mkv'; + break; + + case 'flv': + $type = 'video/flv'; + break; + + case 'avi': + $type = 'video/x-msvideo'; + break; + + case 'webm': + $type = 'video/webm'; + break; + + case 'mkv': + $type = 'video/x-matroska'; + break; + + case '3gp': + $type = 'video/3gp'; + break; + + case 'ogv': + $type = 'video/ogv'; + break; + + default: + $type = 'video/mp4'; + break; + } + + return $type; +} diff --git a/get_youtube_videos.sh b/get_youtube_videos.sh new file mode 100755 index 0000000..a206864 --- /dev/null +++ b/get_youtube_videos.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +HOME=`cat conf/home_dir.txt` +cat $HOME/.zen/ipfs*/.*/astroport/kodi/vstream/YASTRXBIAN | sort | uniq | tail -n +2 diff --git a/index.php b/index.php new file mode 100644 index 0000000..cba55aa --- /dev/null +++ b/index.php @@ -0,0 +1,2 @@ +\n') + +######################################################################## +echo "PUBLISHING ~/.zen/ipfs SELF /ipns/$IPFSNODEID" +MIPFS=$(ipfs add -rHq ~/.zen/ipfs | tail -n 1) +OLDCHAIN=$(cat ~/.zen/ipfs/.${IPFSNODEID}/.chain) +if [[ "$OLDCHAIN" != "$MIPFS" ]] # MODIFY CHAIN only if something was changed +then + echo "$(date -u +%s%N | cut -b1-13)" > ~/.zen/ipfs/.${IPFSNODEID}/.timestamp + echo $MIPFS > ~/.zen/ipfs/.${IPFSNODEID}/.chain +fi +NODEIPNS=$(ipfs name publish --quieter /ipfs/$MIPFS) +######################################################################## diff --git a/new_youtube_video_in_astroport.sh b/new_youtube_video_in_astroport.sh new file mode 100755 index 0000000..60ad10a --- /dev/null +++ b/new_youtube_video_in_astroport.sh @@ -0,0 +1,230 @@ +#!/bin/bash +######################################################################## +# Author: Fred (support@qo-op.com) +# Version: 0.3 +# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) +######################################################################## +# COPY ~/astroport/* files to IPFS +# Publish INDEX ~/.zen/ipfs/.*/${PREFIX}ASTRXBIAN +######## #### ### ## # +HOME=`cat conf/home_dir.txt` +######################################################################## +MY_PATH="`dirname \"$0\"`" # relative +MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized +ME="${0##*/}" +YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1); +IPFSNODEID=$(ipfs id -f='\n') +G1PUB=$(cat ~/.zen/secret.dunikey | grep 'pub:' | cut -d ' ' -f 2) +# ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/${PREFIX}ASTRXBIAN +# Astropot/Kodi/Vstream source reads ${PREFIX}ASTRXBIAN from http://127.0.0.1:8181/.$IPFNODEID/ +# Index File Format (could be enhanced) is using Kodi TMDB enhancement +# https://github.com/Kodi-vStream/venom-xbmc-addons/wiki/Voir-et-partager-sa-biblioth%C3%A8que-priv%C3%A9e#d%C3%A9clarer-des-films +######################################################################## +## RUN inotifywait process ~/astroport/ NEW FILE DETECT +# /usr/bin/inotifywait -r -e close_write -m /home/$YOU/astroport | while read dir flags file; do ~/.zen/astrXbian/zen/new_file_in_astroport.sh "$dir" "$file"; done & +# mkdir -p ~/astroport/youtube +# mkdir -p ~/astroport/mp3 +######################################################################## +path="$1" +# Add trailing / if needed +length=${#path} +last_char=${path:length-1:1} +[[ $last_char != "/" ]] && path="$path/"; : + +file="$2" + +extension="${file##*.}" +TITLE="${file%.*}" + + +#echo "~/.zen/www/new_youtube_video_in_astroport.sh PATH/ \"$path\" FILE \"$file\"" +echo "Checking if the file exists at :" +echo "$path$file" +echo "in ~/.zen/www/new_youtube_video_in_astroport.sh" +# .part file false flag correcting (inotify mode) +[[ ! -f "${path}${file}" ]] && file="${TITLE%.*}" && extension="${TITLE##*.}" && [[ ! -f "${path}${file}" ]] && echo "NO FILE" && exit 1 + +# GET XZUID +[[ -f ~/.zen/ipfs/.$IPFSNODEID/G1SSB/_g1.gchange_title ]] && XZUID=$(cat ~/.zen/ipfs/.$IPFSNODEID/G1SSB/_g1.gchange_title) || XZUID=$(cat /etc/hostname) +[[ ! $(echo "$path" | cut -d '/' -f 4 | grep 'astroport') ]] && echo "Les fichiers sont à placer dans ~/astroport/ MERCI" && exit 1 +TYPE=$(echo "$path" | cut -d '/' -f 5 ) # ex: /home/$YOU/astroport/... TYPE(film, youtube, mp3)/ REFERENCE / +CAT=$(echo "$TYPE" | awk '{ print tolower($0) }') + +PREFIX=$(echo "$TYPE" | head -c 1 | awk '{ print toupper($0) }' ) # ex: F, Y, M ou Y +# File is placed in ROOT ~/astroport ? +if [[ $PREFIX == "" ]] +then + [[ "$USER" != "xbian" ]] && zenity --warning --width 300 --text "Désolé votre fichier ne peut pas être traité" + echo "WARNING. $TYPE is root file UNTREATED" && exit 1 +fi + +######################################################################## +# EXTRACT INDEX REFERENCE : TMDB or YOUTUBE (can be extended with new ) +######################################################################## +case ${CAT} in + youtube) + INDEXPREFIX="YOUTUBE_" + REFERENCE=$(echo "$file" | cut -d "_" -f 1) # Youtube filename starts with ID_ + TITLE=$(echo "$TITLE" | cut -d "_" -f 2-) + ;; + mp3) + ## DIFFERENT TREATMENT + INDEXPREFIX="MP3_" + REFERENCE=$(echo "$file" | cut -d "_" -f 1) # Youtube filename starts with ID_ + echo "Please use new_mp3_in_astroport.sh ... EXIT" + exit 1 + ;; + film | serie | anime) + INDEXPREFIX="TMDB_" + REFERENCE=$(echo "$path" | cut -d '/' -f 6 ) # Path contains TMDB id + if ! [[ "$REFERENCE" =~ ^[0-9]+$ ]] # ${REFERENCE} NOT A NUMBER + then + echo "ERROR: $path BAD TMDB code. Get it from https://www.themoviedb.org/ " + exit 1 + fi + ;; + *) + echo "$CAT inconnu" && exit 1 + ;; +esac + +######################################################################## +## CHECK if ${INDEXPREFIX}${REFERENCE} KEY exists +######################################################################## +echo "SEARCH for ;$REFERENCE; in ${PREFIX}ASTRXBIAN" +isREFERENCEinINDEX=$(grep ";$REFERENCE;" ~/.zen/ipfs*/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN) +if [[ ${isREFERENCEinINDEX} ]] +then + if [[ -d ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB} ]] + then + # FILE IS MINE, NEW VERSION?! replacing it in INDEX + ipnslink=$(cat ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipns.link) + echo "FOUND IPNS ${INDEXPREFIX}${REFERENCE} = $ipnslink" + + # DELETING GCHANGE AD, WILL BE CREATED AGAIN + gchangeAD=$(cat ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.gchange.ad) + ~/.zen/astrXbian/zen/jaklis/jaklis.py deleteoffer -i $gchangeAD + rm ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.gchange.ad + else + echo "FILE IS ALREADY EXISTING FROM ANOTHER FRIEND" + echo ${isREFERENCEinINDEX} | head -n 1 | cut -d ":" -f 2- + # I could send message to my friend, PIN, exchange contract... WHAT IS BEST TODO ?? + fi + + # DELETING OLD LINE FROM INDEX + sed -i "/;$REFERENCE;/d" ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/${PREFIX}ASTRXBIAN + + # [[ "$USER" != "xbian" ]] && zenity --warning --width 300 --text "DOUBLON ${isREFERENCEinINDEX}" +fi + +######################################################################## +echo "ADDING ${path}${file} to IPFS and create ${PREFIX}ASTRXBIAN INDEX" +echo "~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/${PREFIX}ASTRXBIAN" +echo "-----------------------------------------------------------------" + +IPFSREPFILEID=$(ipfs add -wq "${path}${file}" | tail -n 1) +[[ $IPFSREPFILEID == "" ]] && echo "ipfs add ERROR" && exit 1 +echo "-----------------------------------------------------------------" +echo "IPFS: $file : ipfs ls /ipfs/$IPFSREPFILEID" +echo "-----------------------------------------------------------------" +echo "New $TYPE INDEX ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/${PREFIX}ASTRXBIAN " +[[ ! -d ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/ ]] && mkdir -p ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/ + +URLENCODE_FILE_NAME=$(echo ${file} | jq -Rr @uri) + +######################################################################## +## CREATE NEW ipns KEY : ${INDEXPREFIX}${REFERENCE} +######################################################################## +######################################################################## +[[ ! -d ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB} ]] && mkdir -p ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB} && KEY=$(ipfs key gen "${INDEXPREFIX}${REFERENCE}") && KEYFILE=$(ls -t ~/.ipfs/keystore/ | head -n 1) +## INIT ipns +if [[ $KEY ]]; then + # memorize IPNS key filename for easiest exchange + echo "$KEYFILE" > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipns.key.keystore_filename + # Publishing IPNS key + echo "$KEY" > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipns.link + # .zen could contain ZEN for economic value + touch ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.zen + ################ ENCRYPT keystore/$KEYFILE + $MY_PATH/tools/natools.py encrypt -p $G1PUB -i ~/.ipfs/keystore/$KEYFILE -o ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipns.key.natools.encrypt +else + KEY=$(cat ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipns.link) + KEYFILE=$(cat ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipns.key.keystore_filename) +fi + +# CLEAR ipfs link (is then cyphered to manage exchange regulation) +echo "/ipfs/$IPFSREPFILEID/${file}" > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipfs.filelink +################ ENCRYPT .ipfs.filelink +$MY_PATH/tools/natools.py encrypt -p $G1PUB -i ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipfs.filelink -o ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipfs.filelink.natools.encrypt +rm ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipfs.filelink + +echo "${file}" > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.ipfs.filename +echo "${TITLE}" > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.title +echo "$(date -u +%s%N | cut -b1-13)" > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.timestamp + +# COPY "ajouter_video.txt" later used +[[ -f ~/astroport/${TYPE}/${REFERENCE}/ajouter_video.txt ]] && cp -f ~/astroport/${TYPE}/${REFERENCE}/ajouter_video.txt ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/ + +# IPNS index.html Redirect to ipfs streaming link (could be contract or anything else !!) +echo "" > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/index.html + +IPNSLINK=$(ipfs key list -l | grep ${INDEXPREFIX}${REFERENCE} | cut -d ' ' -f 1) +echo " +

ASTROPORT/KODI

+Pour regarder ${TITLE}, rejoignez notre video-club et devenons amis...

+Installez astrXbian" > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/index.html + +NEWIPFS=$(ipfs add -rHq ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/ | tail -n 1 ) +IPNS=$(ipfs name publish --quieter --key="${INDEXPREFIX}${REFERENCE}" $NEWIPFS) +######################################################################## + +######################################################################## +# PUBLISH GCHANGE AD for TMDB film/serie/anime ONLY +######################################################################## +if [[ "${CAT}" =~ ^(film|serie|anime)$ ]] +then + if [[ ! -f ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.gchange.ad ]] + then + GOFFER=$(~/.zen/astrXbian/zen/jaklis/jaklis.py setoffer -t "${TITLE} #astroport #${INDEXPREFIX}${REFERENCE}" -d "https://aries.copylaradio.com/ipns/$IPNS/" -p ~/.zen/astrXbian/disk.png) + echo $GOFFER > ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.gchange.ad + NEWIPFS=$(ipfs add -rHq ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/ | tail -n 1 ) + IPNS=$(ipfs name publish --quieter --key="${INDEXPREFIX}${REFERENCE}" $NEWIPFS) + fi + echo "Annonce gchange : $(cat ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/.gchange.ad)" +fi + +######################################################################## +# NEW ${PREFIX}ASTRXBIAN FILE : Add header +[[ ! -f ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/${PREFIX}ASTRXBIAN ]] \ +&& echo "CAT;TMDB;YEAR;TITLE;SAISON;GENRES;GROUPES;RES;URLS=http://127.0.0.1:8181" > ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/${PREFIX}ASTRXBIAN + +# MEMORIZE NEW PIN +mkdir -p ~/.zen/ipfs/.${IPFSNODEID}/PIN/${IPFSREPFILEID}/ +touch ~/.zen/ipfs/.${IPFSNODEID}/PIN/${IPFSREPFILEID}/${G1PUB} + +# ADD NEW LINE TO INDEX +if [[ -f ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/ajouter_video.txt ]] +then + line=$(cat ~/.zen/KEY/${INDEXPREFIX}${REFERENCE}/${G1PUB}/ajouter_video.txt | sed "s/_IPFSREPFILEID_/$IPFSREPFILEID/g" | sed "s/_IPNSKEY_/$IPNS/g" ) +else + FILE_RES=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "${path}${file}" | cut -d "x" -f 2) + RES=${FILE_RES%?}0p + line="$CAT;${REFERENCE};$YEAR;$TITLE;$SAISON;;${IPNS};$RES;/ipfs/$IPFSREPFILEID/$URLENCODE_FILE_NAME" +fi +echo "-------------------- UPDATE MY INDEX -----------------------------" +echo "$line" +echo "$line" >> ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/${PREFIX}ASTRXBIAN + +echo "----------------- REFRESH GLOBAL KODI INDEX ----------------------" +cat ~/.zen/ipfs/.${IPFSNODEID}/astroport/kodi/vstream/${PREFIX}ASTRXBIAN ~/.zen/ipfs_swarm/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | sort | uniq > ~/.zen/ipfs/.${IPFSNODEID}/${PREFIX}ASTRXBIAN + +######################################################################## +# REFRESH IPNS SELF PUBLISH +######################################################################## +./ipns_self_publish.sh +######################################################################## + +echo "NEW $TYPE ($file) ADDED." +echo "INDEX UPDATED : http://127.0.0.1:8181/ipns/${IPFSNODEID}/.${IPFSNODEID}/${PREFIX}ASTRXBIAN" +echo "VIDEO IPNS LINK : http://127.0.0.1:8181/ipns/$KEY/$G1PUB/" +exit 0 diff --git a/styles/crowdbunker/astrobunker.png b/styles/crowdbunker/astrobunker.png new file mode 100644 index 0000000000000000000000000000000000000000..21e530dfc8a0a029913252814d36150ef1661db7 GIT binary patch literal 25297 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 literal 0 HcmV?d00001 diff --git a/styles/crowdbunker/crowdbunker.css b/styles/crowdbunker/crowdbunker.css new file mode 100644 index 0000000..d925234 --- /dev/null +++ b/styles/crowdbunker/crowdbunker.css @@ -0,0 +1,133 @@ +:root { + + --pink: hsl(338.5, 72.8%, 36.1%); + --light-pink: hsl(338.5, 72.8%, 56.1%); + --canard: hsl(200.8, 100%, 9.6%); +} + +body { + + background: #121212; + color: white; + margin: 0; + padding: 0; + font-family: Roboto,sans-serif; +} + +header { + + background: var(--canard); + overflow: hidden; + padding: 1rem 0.666rem 1.333rem; + margin-bottom: 2rem; + +} + +header a, +header a:visited { + + color: white; + text-decoration: none; +} + +header a:active { + + outline: 0; +} + +header > * { + + font-size: 1.5rem; + margin: 0; + padding: 0; +} + +header > .sitetitle { + + margin-bottom: 0.25rem; +} + +header > .sitetitle span { + + border-bottom: 0.125rem solid var(--pink); +} + +header .usp { + color: white; + font-size: 0.95rem; +} + +header .usp strong { + + font-size: 1em; + font-weight: inherit; + color: var(--light-pink); +} + +main { + + width: 95%; + margin: auto; +} + +#videosList { + + display: grid; + grid-gap: 1rem 1rem; + grid-auto-flow: row; + grid-template-columns: 322px 322px 322px; + + list-style: none; + margin: 0; + padding: 0; + justify-content: center; +} + +#videosList li { + + background: var(--canard); + border-color: var(--pink); + border-radius: 0.25rem; + border-width: 1px; + border-style: solid; + overflow: hidden; +} + +#videosList .video-title { + + padding: 0.5rem 1rem; +} + +.video-title, +.video-title a, +.video-title a:visited { + + color: white; + font-weight: bold; + text-decoration: none; +} + +article { + + border-radius: 0.25rem; + background: hsl(200.8, 100%, 9.6%); + width: 58.3%; + margin: auto; + overflow: hidden; + +} + +article video { + + width: 100%; + max-height: calc(100vh - 14rem); + background: black; +} + +article .video-title { + + font-weight: bold; + padding: 1rem 1rem; + font-size: 1.25rem; + margin: 0; +} diff --git a/swarm_files.php b/swarm_files.php new file mode 100644 index 0000000..b751ea5 --- /dev/null +++ b/swarm_files.php @@ -0,0 +1,79 @@ +'; print_r($dir); echo ''; +array_pop($dir); // . +array_pop($dir); // .. +// echo '
'; print_r($dir); echo '
'; + +$swarm = array(); + +foreach ($dir as $d) { + + $fst = substr($d, 0, 1); + + if ($fst == '.') { + + $swarm[] = $d; + } +} + + + +foreach ($swarm as $peer) { + + $peerName = file_get_contents('swarm/' . $peer . '/G1SSB/_g1.astroport_title'); + + echo '

'. $peerName . ' ['. substr($peer, 0, 5) . '…' . substr($peer, -4) . ']

'; + + $files = scandir('swarm/' . $peer . '/astroport/kodi/vstream', SCANDIR_SORT_DESCENDING); + array_pop($files); // . + array_pop($files); // .. + + foreach ($files as $f) { + + echo '

' . getCollectionType($f) . '

'; + + $collection = file_get_contents('swarm/' . $peer . '/astroport/kodi/vstream/' . $f); + $collection = trim($collection); + + $videos = explode("\n", $collection); + $videos = array_reverse($videos); + array_pop($videos); + + echo '
    '; + + foreach ($videos as $v) { + + list($a, $b, $c, $videoName, $e, $g, $h, $m, $videoURI) = explode(";", $v); + + + $videoURL = 'http://'. HOST. $videoURI; + $mimeType = guessTypeFromFilename($videoURL); + + if ($mimeType == 'video/mp4') { + + echo '
  • '; + echo ' + ' . $videoName . '
    + ('. $mimeType . ')
    + + '; + + echo '
  • '; + } + } + + echo ' + +
'; + + } +} diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..28d0af9 --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +coucou diff --git a/youtube.php b/youtube.php new file mode 100644 index 0000000..bb4ee88 --- /dev/null +++ b/youtube.php @@ -0,0 +1,90 @@ + $mimeType, + 'url' => $videoURL, + 'uri' => $videoURI, + 'name' => $videoName, + 'youtubeID' => $youtubeID + ]; + } + +} + + +?> + + + Astrobunker + + + + + +
+

+ +

+

+ +

+
+ +
+ + +
+ + +
+ +'; + +foreach ($videosList as $video) { + + echo '
  • '; + + $href = 'youtube_watch.php?uri='. urlencode($video['uri']) . '&name='. urlencode($video['name']) .'&mime='. $video['mime']; + + echo ' + + + '. $video['name'] . ' + + +

    + + ' . $video['name'] . ' + +

    '; + + echo '
  • '; +} + +echo ''; +?> +
    + + + + diff --git a/youtube_add_video.php b/youtube_add_video.php new file mode 100644 index 0000000..486c2f3 --- /dev/null +++ b/youtube_add_video.php @@ -0,0 +1,44 @@ + + + + Astrobunker + + + + + +
    +

    + +

    +

    + +

    +
    + +
    +
    + Votre vidéo est en cours de téléchargement. +
    +
    + + + + + + diff --git a/youtube_add_video_aux.php b/youtube_add_video_aux.php new file mode 100644 index 0000000..373b834 --- /dev/null +++ b/youtube_add_video_aux.php @@ -0,0 +1,16 @@ +'; print_r($output); echo ''; diff --git a/youtube_watch.php b/youtube_watch.php new file mode 100644 index 0000000..6c22dee --- /dev/null +++ b/youtube_watch.php @@ -0,0 +1,57 @@ + + + + Astrobunker + + + + + +
    +
    + +
    +

    + +

    +
    + +
    + + + +

    + ' . $videoName . ' +

    +

    + Télécharger +

    + '; +?> +
    + + + + +