[ENH] Add content filters (tags, station, and PIN status)

pull/34/head
Boris 1 year ago
parent 9188290831
commit 8085120871

@ -1,90 +1,3 @@
#!/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
########################################################################
YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) && [[ ! $YOU ]] && echo "ipfs NOT RUNNING. EXIT" && exit 1
HOME=/home/$YOU
########################################################################
MY_PATH="`dirname \"$0\"`" # relative
MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized
ME="${0##*/}"
########################################################################
########################################################################
IPFSNODEID=$(ipfs id -f='<id>\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
../../ajouter_video.sh $1 1

@ -1,10 +1,23 @@
<?php
if (!ini_get('display_errors')) {
ini_set('display_errors', '1');
}
define('STATION_NAME', exec('cat ../../../ipfs/.12D*/_xbian.zuid'));
define('HOST', 'astroport');
define('THEME', 'astroport');
define('SITENAME', 'Astroport "' . STATION_NAME . '"');
exec("/bin/bash -c './get_xzuid.sh'", $xzuid);
define('XZUID', $xzuid[0]);
exec("/bin/bash -c './get_ipfs_node_id.sh'", $output);
if (isset($output)) {
define('IPFS_NODE_ID', $output[0]);
}
define('IPFS_API_PORT', 5001);
define('IPFS_HOST', '127.0.0.1');
@ -27,3 +40,10 @@ default 120x 90 Large Preview
define('YOUTUBE_THUMB', 'https://i.ytimg.com/vi/%s/mqdefault.jpg');
define ('MEDIAQR','https://'.$_SERVER['SERVER_NAME'].'/ipns/%s/QR.png');
$stations = [
'virgo',
'onelove',
'Rea-3E',
'foot1060'
];

@ -108,28 +108,123 @@ function formatDuration ($seconds) {
}
function getVideoJson ($ipnsHash) {
exec("/bin/bash -c './get_ipfs_node_id.sh'", $output);
// echo '<pre>'; var_dump($output); echo '</pre>';
$ipfsNodeId = $output[0];
$indexHTML = file_get_contents('http://' . HOST . '/ipns/' . $ipnsHash . '/index.html');
// $indexHTML = file_get_contents('http://' . HOST . '/ipns/' . $ipfsNodeId . '/.' . $ipfsNodeId . '/KEY/');
$re = '!/ipns/[^/]+/([^/]+)/!isU';
preg_match($re, $indexHTML, $matches);
$indexHTML = @file_get_contents('http://' . HOST . '/ipns/' . $ipnsHash . '/index.html');
$ipnsHiddenHash = $matches[1];
$indexHTML = file_get_contents('http://' . HOST . '/ipns/' . $ipnsHash . '/' . $ipnsHiddenHash . '/video.json');
if (empty($indexHTML)) {
return [];
} else {
// $indexHTML = @file_get_contents('http://' . HOST . '/ipns/' . $ipfsNodeId . '/.' . $ipfsNodeId . '/KEY/');
$re = '!/ipns/[^/]+/([^/]+)/!isU';
preg_match($re, $indexHTML, $matches);
$ipnsHiddenHash = $matches[1];
$indexHTML = @file_get_contents('http://' . HOST . '/ipns/' . $ipnsHash . '/' . $ipnsHiddenHash . '/video.json');
if (empty($indexHTML)) {
return [];
} else {
return json_decode($indexHTML);
}
}
if (isset($indexHTML)) {
}
function getTagsListFromTagStr ($str) {
return json_decode($indexHTML);
}
if (substr($str, 0, 1) == "[") {
$str = substr($str, 1);
$str = substr($str, 0, -1);
preg_match_all('/"([^"]+)"/isU', $str, $matches, PREG_PATTERN_ORDER);
$tags = $matches[1];
} else {
$tags = explode('|', $str);
}
if ((count($tags) == 1) and empty($tags[0])) {
return array();
} else {
return $tags;
}
}
function separateTags ($tags, $stations) {
return [
array_diff($tags, $stations),
array_intersect($tags, $stations)
];
}
function isStation ($tag) {
global $stations;
return in_array($tag, $stations);
}
function buildRequestedURI ($uri, $params, $escapeHTML = false) {
$URL = $uri;
$first = true;
foreach ($params as $k => $v) {
if ($first) {
$URL .= '?';
$first = false;
} else {
if ($escapeHTML) {
$URL .= '&amp;';
} else {
$URL .= '&';
}
}
$URL .= $k . '=' . htmlspecialchars($v);
}
return $URL;
}
function handleVideoID ($videoID) {
preg_match('/^((?P<ndd>([a-zA-Z0-9-]+\.)?[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)_)?(?P<id>.+)$/is', $videoID, $matches);
$ndd = empty($matches['ndd']) ? 'www.youtube.com' : strrev($matches['ndd']);
$id = $matches['id'];
return [
$ndd,
$id
];
}
function canReadVideoFormat ($mimeType) {
return ($mimeType == 'video/mp4');
}

@ -0,0 +1,7 @@
#!/bin/bash
YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) && [[ ! $YOU ]] && echo "ipfs NOT RUNNING. EXIT" && exit 1
ls /home/$YOU/.zen/PIN | cat

@ -5,10 +5,17 @@
# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/)
########################################################################
PREFIX="$1"
FILTER="$2"
[[ $PREFIX == "" ]] && PREFIX="*"
FILTER="$2"
YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) && [[ ! $YOU ]] && echo "ipfs NOT RUNNING. EXIT" && exit 1
# Filter no ipns link
[[ ! $FILTER ]] && cat /home/$YOU/.zen/{ipfs,ipfs_swarm}/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | sort | uniq | tail -n +2 && exit 0
cat /home/$YOU/.zen/{ipfs,ipfs_swarm}/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | grep "$FILTER" | sort | uniq | tail -n +2
if [[ ! $FILTER ]]; then
# We use `grep -Ev "];;` to filter out videos without an ipns link
MY_VIDEOS=`cat /home/$YOU/.zen/ipfs/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | tail -n +2`
SWARM_VIDEOS=`cat /home/$YOU/.zen/ipfs_swarm/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | tail -n +2`
(echo "$SWARM_VIDEOS" && echo "$MY_VIDEOS") | tac
else
MY_VIDEOS=`cat /home/$YOU/.zen/ipfs/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | tail -n +2 | grep "$FILTER"`
SWARM_VIDEOS=`cat /home/$YOU/.zen/ipfs_swarm/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | tail -n +2 | grep "$FILTER"`
(echo "$SWARM_VIDEOS" && echo "$MY_VIDEOS") | tac
fi

@ -0,0 +1,6 @@
#!/bin/bash
YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) && [[ ! $YOU ]] && echo "ipfs NOT RUNNING. EXIT" && exit 1
cat /home/$YOU/.zen/ipfs/.12D*/_xbian.zuid

@ -1,15 +1,17 @@
<?php
require_once('conf.php');
$bodyClasses = isset($bodyClasses) ? $bodyClasses : '';
$bodyClasses .= $home ? 'home' : '';
?><!DOCTYPE html>
<html>
<head>
<title>Astroport "<?php echo STATION_NAME; ?></title>
<title>Astroport "<?php echo STATION_NAME; ?>"</title>
<link rel="stylesheet" href="styles/<?php echo THEME; ?>/style.css" type="text/css" />
<link rel="icon" type="image/png" href="./styles/<?php echo THEME; ?>/logo.png" />
</head>
<body>
<body class="<?php echo $bodyClasses; ?>">
<header>
<?php $elt = isset($home) ? 'h1' : 'h6'; ?>

@ -0,0 +1,18 @@
<?php
require_once('conf.php');
require_once('functions.php');
// require('php-ipfs-api/vendor/autoload.php');
// use Cloutier\PhpIpfsApi\IPFS;
// $ipfs = new IPFS("astroport", "8181", IPFS_API_PORT);
// echo 'IPFS id : ' . $ipfs->id() . '<br />';
$videosList = array();
exec("/bin/bash -c './get_astrxbian_index.sh'", $videos);
// exec("/bin/bash -c './get_youtube_videos.sh'", $videos);
// echo file_get_contents("http://youtube2.com/ipns/12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/.12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/FASTRXBIAN");
// echo shell_exec('whoami'); // Pour savoir quel utilisateur système exécute les scripts PHP
$videos = array_reverse($videos);

@ -0,0 +1 @@
../default/9gag_logo.png

@ -1,9 +1,16 @@
:root {
--rouge: hsl(0, 98.8%, 33.5%);
--rouge-fonce: hsl(0, 75%, 33.5%);
--noir-complet: black;
--noir-fonce: hsl(0, 30%, 2.1%);
--noir-moyen: hsl(0, 15%, 3.1%);
--noir-clair: hsl(0, 5%, 7.1%);
--blanc: hsla(0, 0%, 100%, 1);
--blanc-fort: hsla(0, 0%, 100%, 0.75);
--blanc-semi-transparent: hsla(0, 0%, 100%, 0.25);
}
@ -31,7 +38,90 @@ header span {
color: white;
}
#videosList li {
#pinFilter ul li a {
background-color: var(--blanc);
}
#pinFilter ul li.selected a {
background-color: var(--rouge);
}
ul#tagsList,
ul#narrowingTags {
list-style: none;
margin-left: 0;
padding-left: 0;
}
ul#tagsList li,
ul#narrowingTags li {
display: inline-block;
}
ul#tagsList a,
ul#tagsList a:visited {
text-decoration: none;
color: var(--rouge-fonce);
}
#narrowingTags a,
#narrowingTags a:visited {
text-decoration: none;
color: inherit;
}
#narrowingTags li {
border-radius: 1rem;
}
#narrowingTags li.selected {
background-color: var(--rouge-fonce);
color: var(--blanc);
border: 0.125rem solid var(--noir-clair);
}
#tagsList,
#narrowingTags {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
#tagsList li.station,
#narrowingTags li.station {
order: 1;
}
#tagsList li.station,
#narrowingTags li.station {
background-image: url("logo.png");
background-repeat: no-repeat;
background-position: left middle;
background-size: contain;
padding-left: 2em;
order: 1;
}
#narrowingTags li.selectable {
background-color: var(--noir-fonce);
color: var(--rouge-fonce);
border: 0.125rem solid var(--noir-clair);
}
#videosList > li {
background: var(--noir-clair);
border-color: var(--rouge);
@ -45,6 +135,35 @@ header span {
color: white;
font-weight: bold;
text-decoration: none;
word-break: break-all;
}
#videosList .thumbnail {
background-color: var(--noir-complet);
}
#videosList > li ul.tags li a,
#videosList > li ul.tags li a:visited {
text-decoration: none;
}
#videosList > li ul.tags li.selectable a,
#videosList > li ul.tags li.selectable a:visited {
color: var(--blanc-semi-transparent);
}
#videosList > li ul.tags li.selectable a:hover {
color: var(--blanc-fort);
}
#videosList > li ul.tags li.selected a,
#videosList > li ul.tags li.selected a:visited {
color: var(--blanc-fort);
}
article {

@ -0,0 +1 @@
../../default/font-awesome/address-book.svg

@ -0,0 +1 @@
../../default/font-awesome/anchor.svg

@ -0,0 +1 @@
../../default/font-awesome/arrow-down.svg

@ -0,0 +1 @@
../../default/font-awesome/bars.svg

@ -0,0 +1 @@
../../default/font-awesome/book.svg

@ -0,0 +1 @@
../../default/font-awesome/bookmark.svg

@ -0,0 +1 @@
../../default/font-awesome/bullhorn.svg

@ -0,0 +1 @@
../../default/font-awesome/cloud.svg

@ -0,0 +1 @@
../../default/font-awesome/film.svg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1 @@
../../default/font-awesome/film.white.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M576 304v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48zm-48-80a79.557 79.557 0 0 1 30.777 6.165L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L17.223 230.165A79.557 79.557 0 0 1 48 224h480zm-48 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm-96 0c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z"/></svg>

After

Width:  |  Height:  |  Size: 525 B

@ -0,0 +1 @@
../../default/font-awesome/laptop.svg

@ -0,0 +1 @@
../../default/font-awesome/play-circle.svg

@ -0,0 +1 @@
../../default/font-awesome/play.svg

@ -0,0 +1 @@
../../default/font-awesome/qrcode.svg

@ -0,0 +1 @@
../../default/font-awesome/save.svg

@ -0,0 +1 @@
../../default/font-awesome/share-alt-square.svg

@ -0,0 +1 @@
../../default/font-awesome/share-alt.svg

@ -0,0 +1 @@
../../default/font-awesome/share-square.svg

@ -0,0 +1 @@
../../default/font-awesome/share.svg

@ -0,0 +1 @@
../../default/font-awesome/sliders-h.svg

@ -0,0 +1 @@
../../default/font-awesome/tag.svg

@ -0,0 +1 @@
../../default/font-awesome/tags.svg

@ -0,0 +1 @@
../../default/font-awesome/tv.svg

@ -0,0 +1 @@
../../default/font-awesome/unlink.svg

@ -0,0 +1 @@
../../default/font-awesome/upload.svg

@ -0,0 +1 @@
../../default/font-awesome/user-alt.svg

@ -0,0 +1 @@
../../default/font-awesome/user-astronaut.svg

@ -0,0 +1 @@
../../default/font-awesome/user-friends.svg

@ -0,0 +1 @@
../../default/font-awesome/user-tag.svg

@ -0,0 +1 @@
../../default/font-awesome/user.svg

@ -0,0 +1 @@
../../default/font-awesome/wallet.svg

@ -0,0 +1 @@
../../default/font-awesome/wrench.svg

@ -46,7 +46,7 @@ header .usp strong {
}
#videosList li {
#videosList > li {
background: var(--canard);
border-color: var(--pink);

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M436 160c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20V48c0-26.5-21.5-48-48-48H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h320c26.5 0 48-21.5 48-48v-48h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-20v-64h20zm-228-32c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H118.4C106 384 96 375.4 96 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2z"/></svg>

After

Width:  |  Height:  |  Size: 593 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M12.971 352h32.394C67.172 454.735 181.944 512 288 512c106.229 0 220.853-57.38 242.635-160h32.394c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0l-67.029 67.029c-7.56 7.56-2.206 20.485 8.485 20.485h35.146c-20.29 54.317-84.963 86.588-144.117 94.015V256h52c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-52v-5.47c37.281-13.178 63.995-48.725 64-90.518C384.005 43.772 341.605.738 289.37.01 235.723-.739 192 42.525 192 96c0 41.798 26.716 77.35 64 90.53V192h-52c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h52v190.015c-58.936-7.399-123.82-39.679-144.117-94.015h35.146c10.691 0 16.045-12.926 8.485-20.485l-67.029-67.029c-4.686-4.686-12.284-4.686-16.971 0L4.485 331.515C-3.074 339.074 2.28 352 12.971 352zM288 64c17.645 0 32 14.355 32 32s-14.355 32-32 32-32-14.355-32-32 14.355-32 32-32z"/></svg>

After

Width:  |  Height:  |  Size: 905 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M413.1 222.5l22.2 22.2c9.4 9.4 9.4 24.6 0 33.9L241 473c-9.4 9.4-24.6 9.4-33.9 0L12.7 278.6c-9.4-9.4-9.4-24.6 0-33.9l22.2-22.2c9.5-9.5 25-9.3 34.3.4L184 343.4V56c0-13.3 10.7-24 24-24h32c13.3 0 24 10.7 24 24v287.4l114.8-120.5c9.3-9.8 24.8-10 34.3-.4z"/></svg>

After

Width:  |  Height:  |  Size: 328 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z"/></svg>

After

Width:  |  Height:  |  Size: 421 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 360V24c0-13.3-10.7-24-24-24H96C43 0 0 43 0 96v320c0 53 43 96 96 96h328c13.3 0 24-10.7 24-24v-16c0-7.5-3.5-14.3-8.9-18.7-4.2-15.4-4.2-59.3 0-74.7 5.4-4.3 8.9-11.1 8.9-18.6zM128 134c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm0 64c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm253.4 250H96c-17.7 0-32-14.3-32-32 0-17.6 14.4-32 32-32h285.4c-1.9 17.1-1.9 46.9 0 64z"/></svg>

After

Width:  |  Height:  |  Size: 518 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path d="M0 512V48C0 21.49 21.49 0 48 0h288c26.51 0 48 21.49 48 48v464L192 400 0 512z"/></svg>

After

Width:  |  Height:  |  Size: 156 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M576 240c0-23.63-12.95-44.04-32-55.12V32.01C544 23.26 537.02 0 512 0c-7.12 0-14.19 2.38-19.98 7.02l-85.03 68.03C364.28 109.19 310.66 128 256 128H64c-35.35 0-64 28.65-64 64v96c0 35.35 28.65 64 64 64h33.7c-1.39 10.48-2.18 21.14-2.18 32 0 39.77 9.26 77.35 25.56 110.94 5.19 10.69 16.52 17.06 28.4 17.06h74.28c26.05 0 41.69-29.84 25.9-50.56-16.4-21.52-26.15-48.36-26.15-77.44 0-11.11 1.62-21.79 4.41-32H256c54.66 0 108.28 18.81 150.98 52.95l85.03 68.03a32.023 32.023 0 0 0 19.98 7.02c24.92 0 32-22.78 32-32V295.13C563.05 284.04 576 263.63 576 240zm-96 141.42l-33.05-26.44C392.95 311.78 325.12 288 256 288v-96c69.12 0 136.95-23.78 190.95-66.98L480 98.58v282.84z"/></svg>

After

Width:  |  Height:  |  Size: 736 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4z"/></svg>

After

Width:  |  Height:  |  Size: 334 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M488 64h-8v20c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12V64H96v20c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12V64h-8C10.7 64 0 74.7 0 88v336c0 13.3 10.7 24 24 24h8v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h320v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h8c13.3 0 24-10.7 24-24V88c0-13.3-10.7-24-24-24zM96 372c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm272 208c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm0-168c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm112 152c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="white" d="M488 64h-8v20c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12V64H96v20c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12V64h-8C10.7 64 0 74.7 0 88v336c0 13.3 10.7 24 24 24h8v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h320v-20c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v20h8c13.3 0 24-10.7 24-24V88c0-13.3-10.7-24-24-24zM96 372c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12H44c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm272 208c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm0-168c0 6.6-5.4 12-12 12H156c-6.6 0-12-5.4-12-12v-96c0-6.6 5.4-12 12-12h200c6.6 0 12 5.4 12 12v96zm112 152c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40zm0-96c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M576 304v96c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48v-96c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48zm-48-80a79.557 79.557 0 0 1 30.777 6.165L462.25 85.374A48.003 48.003 0 0 0 422.311 64H153.689a48 48 0 0 0-39.938 21.374L17.223 230.165A79.557 79.557 0 0 1 48 224h480zm-48 96c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zm-96 0c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z"/></svg>

After

Width:  |  Height:  |  Size: 525 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M624 416H381.54c-.74 19.81-14.71 32-32.74 32H288c-18.69 0-33.02-17.47-32.77-32H16c-8.8 0-16 7.2-16 16v16c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64v-16c0-8.8-7.2-16-16-16zM576 48c0-26.4-21.6-48-48-48H112C85.6 0 64 21.6 64 48v336h512V48zm-64 272H128V64h384v256z"/></svg>

After

Width:  |  Height:  |  Size: 343 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm115.7 272l-176 101c-15.8 8.8-35.7-2.5-35.7-21V152c0-18.4 19.8-29.8 35.7-21l176 107c16.4 9.2 16.4 32.9 0 42z"/></svg>

After

Width:  |  Height:  |  Size: 257 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z"/></svg>

After

Width:  |  Height:  |  Size: 191 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M0 224h192V32H0v192zM64 96h64v64H64V96zm192-64v192h192V32H256zm128 128h-64V96h64v64zM0 480h192V288H0v192zm64-128h64v64H64v-64zm352-64h32v128h-96v-32h-32v96h-64V288h96v32h64v-32zm0 160h32v32h-32v-32zm-64 0h32v32h-32v-32z"/></svg>

After

Width:  |  Height:  |  Size: 299 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM224 416c-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64zm96-304.52V212c0 6.627-5.373 12-12 12H76c-6.627 0-12-5.373-12-12V108c0-6.627 5.373-12 12-12h228.52c3.183 0 6.235 1.264 8.485 3.515l3.48 3.48A11.996 11.996 0 0 1 320 111.48z"/></svg>

After

Width:  |  Height:  |  Size: 521 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 80v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V80c0-26.51 21.49-48 48-48h352c26.51 0 48 21.49 48 48zM304 296c-14.562 0-27.823 5.561-37.783 14.671l-67.958-40.775a56.339 56.339 0 0 0 0-27.793l67.958-40.775C276.177 210.439 289.438 216 304 216c30.928 0 56-25.072 56-56s-25.072-56-56-56-56 25.072-56 56c0 4.797.605 9.453 1.74 13.897l-67.958 40.775C171.823 205.561 158.562 200 144 200c-30.928 0-56 25.072-56 56s25.072 56 56 56c14.562 0 27.823-5.561 37.783-14.671l67.958 40.775a56.088 56.088 0 0 0-1.74 13.897c0 30.928 25.072 56 56 56s56-25.072 56-56C360 321.072 334.928 296 304 296z"/></svg>

After

Width:  |  Height:  |  Size: 671 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z"/></svg>

After

Width:  |  Height:  |  Size: 536 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M568.482 177.448L424.479 313.433C409.3 327.768 384 317.14 384 295.985v-71.963c-144.575.97-205.566 35.113-164.775 171.353 4.483 14.973-12.846 26.567-25.006 17.33C155.252 383.105 120 326.488 120 269.339c0-143.937 117.599-172.5 264-173.312V24.012c0-21.174 25.317-31.768 40.479-17.448l144.003 135.988c10.02 9.463 10.028 25.425 0 34.896zM384 379.128V448H64V128h50.916a11.99 11.99 0 0 0 8.648-3.693c14.953-15.568 32.237-27.89 51.014-37.676C185.708 80.83 181.584 64 169.033 64H48C21.49 64 0 85.49 0 112v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48v-88.806c0-8.288-8.197-14.066-16.011-11.302a71.83 71.83 0 0 1-34.189 3.377c-7.27-1.046-13.8 4.514-13.8 11.859z"/></svg>

After

Width:  |  Height:  |  Size: 739 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z"/></svg>

After

Width:  |  Height:  |  Size: 397 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M496 384H160v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h80v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h336c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160h-80v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h336v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h80c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160H288V48c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h208v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16z"/></svg>

After

Width:  |  Height:  |  Size: 689 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M0 252.118V48C0 21.49 21.49 0 48 0h204.118a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882L293.823 497.941c-18.745 18.745-49.137 18.745-67.882 0L14.059 286.059A48 48 0 0 1 0 252.118zM112 64c-26.51 0-48 21.49-48 48s21.49 48 48 48 48-21.49 48-48-21.49-48-48-48z"/></svg>

After

Width:  |  Height:  |  Size: 370 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M497.941 225.941L286.059 14.059A48 48 0 0 0 252.118 0H48C21.49 0 0 21.49 0 48v204.118a48 48 0 0 0 14.059 33.941l211.882 211.882c18.744 18.745 49.136 18.746 67.882 0l204.118-204.118c18.745-18.745 18.745-49.137 0-67.882zM112 160c-26.51 0-48-21.49-48-48s21.49-48 48-48 48 21.49 48 48-21.49 48-48 48zm513.941 133.823L421.823 497.941c-18.745 18.745-49.137 18.745-67.882 0l-.36-.36L527.64 323.522c16.999-16.999 26.36-39.6 26.36-63.64s-9.362-46.641-26.36-63.64L331.397 0h48.721a48 48 0 0 1 33.941 14.059l211.882 211.882c18.745 18.745 18.745 49.137 0 67.882z"/></svg>

After

Width:  |  Height:  |  Size: 630 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M592 0H48A48 48 0 0 0 0 48v320a48 48 0 0 0 48 48h240v32H112a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H352v-32h240a48 48 0 0 0 48-48V48a48 48 0 0 0-48-48zm-16 352H64V64h512z"/></svg>

After

Width:  |  Height:  |  Size: 293 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M304.083 405.907c4.686 4.686 4.686 12.284 0 16.971l-44.674 44.674c-59.263 59.262-155.693 59.266-214.961 0-59.264-59.265-59.264-155.696 0-214.96l44.675-44.675c4.686-4.686 12.284-4.686 16.971 0l39.598 39.598c4.686 4.686 4.686 12.284 0 16.971l-44.675 44.674c-28.072 28.073-28.072 73.75 0 101.823 28.072 28.072 73.75 28.073 101.824 0l44.674-44.674c4.686-4.686 12.284-4.686 16.971 0l39.597 39.598zm-56.568-260.216c4.686 4.686 12.284 4.686 16.971 0l44.674-44.674c28.072-28.075 73.75-28.073 101.824 0 28.072 28.073 28.072 73.75 0 101.823l-44.675 44.674c-4.686 4.686-4.686 12.284 0 16.971l39.598 39.598c4.686 4.686 12.284 4.686 16.971 0l44.675-44.675c59.265-59.265 59.265-155.695 0-214.96-59.266-59.264-155.695-59.264-214.961 0l-44.674 44.674c-4.686 4.686-4.686 12.284 0 16.971l39.597 39.598zm234.828 359.28l22.627-22.627c9.373-9.373 9.373-24.569 0-33.941L63.598 7.029c-9.373-9.373-24.569-9.373-33.941 0L7.029 29.657c-9.373 9.373-9.373 24.569 0 33.941l441.373 441.373c9.373 9.372 24.569 9.372 33.941 0z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"/></svg>

After

Width:  |  Height:  |  Size: 533 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 288c79.5 0 144-64.5 144-144S335.5 0 256 0 112 64.5 112 144s64.5 144 144 144zm128 32h-55.1c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16H128C57.3 320 0 377.3 0 448v16c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48v-16c0-70.7-57.3-128-128-128z"/></svg>

After

Width:  |  Height:  |  Size: 324 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M64 224h13.5c24.7 56.5 80.9 96 146.5 96s121.8-39.5 146.5-96H384c8.8 0 16-7.2 16-16v-96c0-8.8-7.2-16-16-16h-13.5C345.8 39.5 289.6 0 224 0S102.2 39.5 77.5 96H64c-8.8 0-16 7.2-16 16v96c0 8.8 7.2 16 16 16zm40-88c0-22.1 21.5-40 48-40h144c26.5 0 48 17.9 48 40v24c0 53-43 96-96 96h-48c-53 0-96-43-96-96v-24zm72 72l12-36 36-12-36-12-12-36-12 36-36 12 36 12 12 36zm151.6 113.4C297.7 340.7 262.2 352 224 352s-73.7-11.3-103.6-30.6C52.9 328.5 0 385 0 454.4v9.6c0 26.5 21.5 48 48 48h80v-64c0-17.7 14.3-32 32-32h128c17.7 0 32 14.3 32 32v64h80c26.5 0 48-21.5 48-48v-9.6c0-69.4-52.9-125.9-120.4-133zM272 448c-8.8 0-16 7.2-16 16s7.2 16 16 16 16-7.2 16-16-7.2-16-16-16zm-96 0c-8.8 0-16 7.2-16 16v48h32v-48c0-8.8-7.2-16-16-16z"/></svg>

After

Width:  |  Height:  |  Size: 787 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M192 256c61.9 0 112-50.1 112-112S253.9 32 192 32 80 82.1 80 144s50.1 112 112 112zm76.8 32h-8.3c-20.8 10-43.9 16-68.5 16s-47.6-6-68.5-16h-8.3C51.6 288 0 339.6 0 403.2V432c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48v-28.8c0-63.6-51.6-115.2-115.2-115.2zM480 256c53 0 96-43 96-96s-43-96-96-96-96 43-96 96 43 96 96 96zm48 32h-3.8c-13.9 4.8-28.6 8-44.2 8s-30.3-3.2-44.2-8H432c-20.4 0-39.2 5.9-55.7 15.4 24.4 26.3 39.7 61.2 39.7 99.8v38.4c0 2.2-.5 4.3-.6 6.4H592c26.5 0 48-21.5 48-48 0-61.9-50.1-112-112-112z"/></svg>

After

Width:  |  Height:  |  Size: 583 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M630.6 364.9l-90.3-90.2c-12-12-28.3-18.7-45.3-18.7h-79.3c-17.7 0-32 14.3-32 32v79.2c0 17 6.7 33.2 18.7 45.2l90.3 90.2c12.5 12.5 32.8 12.5 45.3 0l92.5-92.5c12.6-12.5 12.6-32.7.1-45.2zm-182.8-21c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24c0 13.2-10.7 24-24 24zm-223.8-88c70.7 0 128-57.3 128-128C352 57.3 294.7 0 224 0S96 57.3 96 128c0 70.6 57.3 127.9 128 127.9zm127.8 111.2V294c-12.2-3.6-24.9-6.2-38.2-6.2h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 287.9 0 348.1 0 422.3v41.6c0 26.5 21.5 48 48 48h352c15.5 0 29.1-7.5 37.9-18.9l-58-58c-18.1-18.1-28.1-42.2-28.1-67.9z"/></svg>

After

Width:  |  Height:  |  Size: 668 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z"/></svg>

After

Width:  |  Height:  |  Size: 336 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M461.2 128H80c-8.84 0-16-7.16-16-16s7.16-16 16-16h384c8.84 0 16-7.16 16-16 0-26.51-21.49-48-48-48H64C28.65 32 0 60.65 0 96v320c0 35.35 28.65 64 64 64h397.2c28.02 0 50.8-21.53 50.8-48V176c0-26.47-22.78-48-50.8-48zM416 336c-17.67 0-32-14.33-32-32s14.33-32 32-32 32 14.33 32 32-14.33 32-32 32z"/></svg>

After

Width:  |  Height:  |  Size: 370 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"/></svg>

After

Width:  |  Height:  |  Size: 533 B

@ -1,4 +1,3 @@
body {
margin: 0;
@ -42,6 +41,87 @@ main {
margin: auto;
}
body.home main {
display: grid;
grid-gap: 1rem 1rem;
grid-auto-flow: row;
grid-template-columns: 998px auto;
grid-template-areas: "c m";
}
body.home main > #menu {
grid-area: m;
}
body.home main > ul#videosList {
grid-area: c;
}
aside#menu > div {
position: sticky;
top: 2rem;
}
#pinFilter ul {
margin: 0;
padding: 0;
list-style: none;
font-size: 3rem;
display: flex;
}
#pinFilter ul li a span {
display: none;
}
#pinFilter ul li a {
display: inline-block;
height: 3rem;
width: 3rem;
border: 1px solid red;
background-repeat: no-repeat;
}
#pinFilter ul li#filter_pinned a {
background-image: url("font-awesome/hdd.svg");
background-position: center center;
background-size: 2.5rem;
}
#pinFilter ul li#filter_notpinned a {
background-image: url("font-awesome/cloud.svg");
background-position: center center;
background-size: 2.5rem;
}
#pinFilter ul li#filter_both a {
background-image: url("font-awesome/hdd.svg"),
url("font-awesome/cloud.svg");
background-position: bottom 0.25rem left 0.25rem,
top 0.25rem right 0.25rem;
background-size: 1.75rem,
1.75rem;
}
#tagsList li,
#narrowingTags li {
padding: 0.125rem 0.5rem;
margin: 0.25rem 0.25rem;
}
#videosList {
display: grid;
@ -53,20 +133,59 @@ main {
margin: 0;
padding: 0;
justify-content: center;
align-content: start
}
#videosList li {
#videosList > li {
border-radius: 0.25rem;
border-width: 1px;
overflow: hidden;
}
#videosList .thumbnail {
text-align: center;
height: 180px;
margin-top: 0;
display: flex;
justify-content: center;
align-items: center;
}
#videosList .thumbnail img {
max-height: 180px;
width: auto;
}
#videosList .video-title {
padding: 0.5rem 1rem;
}
#videosList > li ul.tags {
padding: 0;
margin: 0;
list-style: none;
}
#videosList > li ul.tags li {
display: inline-block;
}
#videosList > li ul.tags li:after {
content: ", ";
}
#videosList > li ul.tags li:last-of-type:after {
content: "";
}
article {
border-radius: 0.25rem;

@ -54,9 +54,7 @@ foreach ($swarm as $peer) {
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') {
@ -64,12 +62,12 @@ foreach ($swarm as $peer) {
echo '
<li>
<a href="'. $videoURL . '">' . $videoName . '</a><br />
<a href="'. $videoURI . '">' . $videoName . '</a><br />
('. $mimeType . ')<br />
<video controls width="320" height="240">
<source src="'. $videoURL .'" type="'. $mimeType .'">
<a href="'. $videoURL . '">' . $videoName . '</a>
<source src="'. $videoURI .'" type="'. $mimeType .'">
<a href="'. $videoURI . '">' . $videoName . '</a>
</video>
</li>
';

@ -8,47 +8,101 @@ require_once('functions.php');
// echo 'IPFS id : ' . $ipfs->id() . '<br />';
$uriParams = [];
$videosList = array();
exec("/bin/bash -c './get_astrxbian_index.sh'", $videos);
$search = isset($_GET['search']) ? urldecode($_GET['search']) : "";
exec("/bin/bash -c './get_astrxbian_index.sh \"*\" \"". $search . "\"'", $videos);
exec("/bin/bash -c './get_PIN.sh'", $pinnedVideos);
$videos = array_unique($videos);
// exec("/bin/bash -c './get_youtube_videos.sh'", $videos);
// echo file_get_contents("http://youtube2.com/ipns/12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/.12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/FASTRXBIAN");
// echo shell_exec('whoami'); // Pour savoir quel utilisateur système exécute les scripts PHP
// echo '<pre>'; var_dump($videos); echo '</pre>'; exit;
$videos = array_reverse($videos);
$i = 0;
$div = 9;
$r = rand(0, ($div - 1));
$j = 0;
$tagsMenu = array();
$narrowingTags = array();
$show = isset($_GET['show']) ? $_GET['show'] : 'pinned';
foreach ($videos as $v) {
if (isset($_GET['tags']) and !empty($_GET['tags'])) {
++$i;
if ($i > 10) {
break;
}
$tagFilter = explode('|', $_GET['tags']);
} else {
$tagFilter = array();
}
foreach ($videos as $v) {
list($contentType, $videoID, $year, $videoName, $saison, $tags, $ipnsHash, $definition, $videoURI) = explode(";", $v);
list($contentType, $videoID, $year, $filename, $saison, $tagsStr, $ipnsHash, $definition, $videoURI) = explode(";", $v);
list($videoSource, $videoID) = handleVideoID($videoID);
$ipfsHash = preg_replace('!^/ipfs/([^/]+)/.*$!isU', '$1', $videoURI);
$mimeType = guessTypeFromFilename($videoURI);
$duration = NULL;
$thumbURL = '';
if ($mimeType == 'video/mp4') {
$videoTags = getTagsListFromTagStr($tagsStr);
if (canReadVideoFormat($mimeType)) {
$tagsMenu = array_merge($tagsMenu, $videoTags);
}
$keepVideo = true;
$keepVideo = ($keepVideo and canReadVideoFormat($mimeType));
$keepVideo = ($keepVideo and (in_array($ipfsHash, $pinnedVideos) or ($show != 'pinned')));
$keepVideo = ($keepVideo and (!in_array($ipfsHash, $pinnedVideos) or ($show != 'notpinned')));
$keepVideo = ($keepVideo and (empty($tagFilter) or (array_intersect($tagFilter, $videoTags) == $tagFilter)));
if ($keepVideo) {
$narrowingTags = array_merge($narrowingTags, $videoTags);
/*
++$i;
if ($i % $div != $r) {
continue;
}
++$j;
if ($j > 9) {
break;
}
*/
$duration = NULL;
$thumbURL = '';
$videoTitle = NULL;
switch ($contentType) {
if (($contentType == 'youtube') and ($videoSource == 'www.youtube.com')) {
$thumbURL = sprintf(YOUTUBE_THUMB, $videoID);
case 'youtube':
$thumbURL = sprintf(YOUTUBE_THUMB, $videoID);
$json = getVideoJson($ipnsHash);
// $json = getVideoJson($ipnsHash);
if (!empty($json)) {
// echo '<pre>'; var_dump($json); echo '</pre>';
$videoName = $json->title;
$videoTitle = $json->title;
$duration = $json->duration;
break;
}
} elseif (($contentType == 'youtube') and ($videoSource == '9gag.com')) {
$thumbURL = 'styles/'. THEME .'/9gag_logo.png';
case 'film':
$thumbURL = 'styles/astroport/logo.png';
break;
} else {
$thumbURL = 'styles/'. THEME .'/font-awesome/film.white.90x90.png';
}
$videosList[] = [
@ -56,45 +110,229 @@ foreach ($videos as $v) {
'thumbURL' => $thumbURL,
'category' => $contentType,
'mime' => $mimeType,
'eco' => '/ipns/' . $ipnsHash,
'tags' => $videoTags,
'ipnsHash' => $ipnsHash,
'uri' => $videoURI,
'name' => $videoName,
'youtubeID' => $videoID
'title' => $videoTitle,
'filename' => $filename,
'videoId' => $videoID,
'videoSource' => $videoSource
];
}
}
$tagsMenu = array_unique($tagsMenu);
$narrowingTags = empty($narrowingTags) ? $tagFilter : array_unique($narrowingTags);
$home = true;
include('inc/header.php');
echo '
<aside id="menu">
<div>';
$tagFilterQuery = implode('|', $tagFilter);
$uriParams = [
'pinned' => [
'tags' => $tagFilterQuery,
'show' => 'pinned',
'search' => $search
],
'notpinned' => [
'tags' => $tagFilterQuery,
'show' => 'notpinned',
'search' => $search
],
'both' => [
'tags' => $tagFilterQuery,
'show' => 'both',
'search' => $search
]
];
$classes = [
'pinned' => ($show == 'pinned' ? ' selected' : ''),
'both' => ($show == 'both' ? ' selected' : ''),
'notpinned' => ($show == 'notpinned' ? ' selected' : ''),
];
echo '
<nav id="pinFilter">
<ul>
<li id="filter_pinned" class="'. $classes['pinned'] . '">
<a href="'. buildRequestedURI('/youtube.php', $uriParams['pinned'], true) .'">
<span>Épinglé localement</span>
</a>
</li>
<li id="filter_both" class="'. $classes['both'] . '">
<a href="'. buildRequestedURI('/youtube.php', $uriParams['both'], true) .'">
<span>Épinglé ou non</span>
</a>
</li>
<li id="filter_notpinned" class="'. $classes['notpinned'] . '">
<a href="'. buildRequestedURI('/youtube.php', $uriParams['notpinned'], true) .'">
<span>Non épinglé</span>
</a>
</li>
</ul>
</nav>
';
if (!empty($tagFilter)) {
echo '
<nav id="tagfilter">
<h3>Filtrer davantage</h3>
<ul id="narrowingTags">';
// list($narrowingTags, $stationsTags) = separateTags($narrowingTags, $stations);
foreach ($narrowingTags as $tag) {
$tagArray = array($tag);
if (!in_array($tag, $tagFilter)) {
$selectedTag = false;
$tagQueryArray = array_merge($tagFilter, $tagArray);
} else {
$selectedTag = true;
$tagQueryArray = array_diff($tagFilter, $tagArray);
}
$classes = $selectedTag ? ' selected' : ' selectable';
$classes .= isStation($tag) ? ' station' : '';
$uriParams = [
'tags' => (empty($tagQueryArray) ? '' : implode('|', $tagQueryArray)),
'show' => $show,
'search' => $search
];
echo '
<li class="'. $classes . '">
<a href="'. buildRequestedURI('/youtube.php', $uriParams, true) .'">
' . $tag .'
</a>
</li>';
}
echo '
</ul>
</nav>';
}
echo '
<nav id="browse">
<h3>Parcourir</h3>
<ul id="tagsList">';
foreach ($tagsMenu as $tag) {
$uriParams = [
'tags' => $tag,
'show' => $show
];
$classes = isStation($tag) ? ' station' : '';
echo '
<li class="'. $classes . '">
<a href="'. buildRequestedURI('/youtube.php', $uriParams, true) .'">
' . $tag .'
</a>
</li>';
}
echo '
</ul>
</nav>
</div>
</aside>';
// echo '<pre>'; var_dump($videosList); echo '</pre>';
echo '<ul id="videosList">';
echo '
<ul id="videosList">';
foreach ($videosList as $video) {
echo '<li>';
$displayTitle = isset($video['title']) ? $video['title'] : $video['filename'];
$href = 'youtube_watch.php?uri='. $video['uri'] . '&amp;name='. urlencode($video['name']) .'&mime='. $video['mime'];
$href = 'youtube_watch.php?uri='. $video['uri'] . '&amp;name='. urlencode($displayTitle) .'&mime='. $video['mime'];
echo '
<p class="thumbnail">
<a href="/ipns/'. $video['ipnsHash'] .'">
<img src="'. $video['thumbURL'] . '" alt="'. $displayTitle . '" />
</a>
</p>
';
<a href="'. $video['eco'] .'">
<img src="'. $video['thumbURL'] . '" alt="'. $video['name'] . '" />
</a>