#!/bin/bash
## Το NoTails.. Tails Μενού στα Ελληνικά είναι ένα αρθρωτό (modular) Zenity
## σενάριο (script) ανοιχτού κώδικα (open source) για το Tails OS Live USB.
##
## Copyright (C) 2025  Rebelstreamers, version 1.0 από το gamelink.gr
##
## Το πρόγραμμα αυτό μεταφέρεται σε εσάς "AS IS" και χωρίς καμία υποχρέωση από 
## τον δημιουργό του και καλύπτεται απο την AGPLv3 GNU άδεια έκδοσης.

# set -x

title5="Οθόνη Κατεβάσματος Βίντεο και Αρχείων"
echo -e '\033]2;'$title5'\007'


# WGET, CURL & ΥΤ-DLP ZENITY DOWNLOADER SCRIPT ! 
# Αυτό είναι το μόνο script που δεν χρειάζεται admin rights γιατί ναι μεν τα wget
# και curl είναι προ εγκατεστημένα στο Tails και σχεδόν σε όλες τις Linux εκδόσεις
# αλλά και το yt-dlp κατεβαίνει με την χρήση των wget και curl και δουλεύει στο 
# προφίλ του χρήστη. 

# Αν αντιγράψετε αυτό το script στο Linux σας και χωρίς καν να αλλάξετε τον 
# προορισμό αντιγραφής στην από κάτω παράμετρο αφού ο φάκελος Persistent είναι 
# μοναδικός στο Tails θα διαπιστώσετε ότι μόλις αποκτήσατε ένα παραθυρικό
# πρόγραμμα κατεβάσματος βίντεο και αρχείων για το Linux του καθημερινού σας Η/Υ!
# για να δουλέψει σe Η/Υ χωρίς Tor απλά αφαιρέστε όλα τα torsocks με τον editor
# αντικαθιστώντας το με τίποτα στην εντολή replace.

# Επίσης δεν περιορίζεται η λειτουργία αυτού του script στα βίντεο με το yt-dlp.
# Μπορείτε να κατεβάσετε όλων των ειδών τα αρχεία με τα wget και curl, απλά το
# yt-dlp είναι το πρόγραμμα που χρησιμοποιεί το ffmpeg για να κατεβάζουμε video.
# Αυτό είναι σήμερα το URL για να κατεβάζετε το yt-dlp
# Αύριο μπορεί να αλλάξει όπως και άλλαξε στο παρελθόν και με αυτόν τον τρόπο 
# θα το αλλάξετε μόνο μια φορά αν αλλάξει πάλι ;)
yt_dlp_download_url="https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp"


# Κάθε μέρα να το κατεβάζουμε καλό είναι γιατί είναι μικρό πρόγραμμα και τα end
# points στα διάφορα βίντεο site αλλάζουν συχνά και αυτά και αυτός είναι ο λόγος
# που αλλάζει συχνά και αυτό! Περισσότερα στο : https://github.com/yt-dlp/yt-dlp
down_inst_updt_ytdlp=false ## ρητορική μεταβλητή :p

# Παρόλα αυτά επειδή ότι κατεβάζουμε από το ιντερνετ δεν είναι πάντα ασφαλές
# Και η εκτέλεση ενός προγράμματος που κατεβάσαμε χωρίς μετέπειτα έλεγχο είναι
# επικίνδυνη συνήθεια έβαλα έναν έλεγχο που θα σας ρωτάει αλλά και θα σας 
# υπενθυμίζει που κατεβαίνει το yt-dlp ώστε να το ελέγξετε μόνοι σας πριν το 
# εκτελέσετε. Επίσης ενδέχεται να έχετε μια δική σας εκδοση του yt-dlp και να 
# μην θέλετε να κατεβάσετε αυτήν από το internet οπότε καντε την false και 
# αυτή και την προηγούμενη για να μην ασχοληθεί το script καθόλου με το αν 
# θα κατέβει ή αν είναι ενημερωμένο.
elegxos_an_tha_katevei=true

# Φάκελος προορισμού για το yt-dlp αλλά και τα κατεβασμένα αρχεία και βίντεο.
ytdlp_base="$HOME/.local/bin"
base_directory="$HOME/Persistent"
fakelos_arxeiwn="$base_directory/VIDEOS"

#
# ------------ ΑΠΟ ΕΔΩ ΚΑΙ ΚΑΤΩ ΟΤΙ ΠΕΙΡΑΖΕΤΕ ΕΧΕΙ ΕΠΙΔΡΑΣΗ ------------ 
# ----------------- ΣΤΗΝ ΑΡΧΙΚΗ ΛΕΙΤΟΥΡΓΙΑ ΤΟΥ SCRIPT ------------------
#

# Χρώματα για τις οθόνες των τερματικών, 
# Με true έχετε τα χρώματα που έχω βάλει εγώ, με ble τα κάνετε όλα μπλε, με gre 
# όλα πράσινα, με yel όλα κίτρινα, με red όλα κόκκινα και με οτιδήποτε εκτός από 
# αυτές τις 5 ονομασίες δεν θα εμφανίζονται καθόλου χρώματα!
# Σημείωση: οι μεταβλητές του κάθε script ορίζουν τα χρώματα στο script του & μόνο
use_color="true"
NC='\033[0m'


# Βάλτε το δικό σας χρώμα αν θέλετε σαν ένα νέο elif αλλά αλλάξτε και την use_color
if [[ "$use_color" == "true" ]]; then 
    RED='\033[1;31m'; GRE='\033[1;32m'; YEL='\033[1;33m'; BLE='\033[1;36m'
elif [[ "$use_color" == "ble" ]]; then 
    RED='\033[1;36m'; GRE='\033[1;36m'; YEL='\033[1;36m'; BLE='\033[1;36m'
elif [[ "$use_color" == "gre" ]]; then
    RED='\033[1;32m'; GRE='\033[1;32m'; YEL='\033[1;32m'; BLE='\033[1;32m'
elif [[ "$use_color" == "yel" ]]; then
    RED='\033[1;33m'; GRE='\033[1;33m'; YEL='\033[1;33m'; BLE='\033[1;33m'
elif [[ "$use_color" == "red" ]]; then
    RED='\033[1;31m'; GRE='\033[1;31m'; YEL='\033[1;31m'; BLE='\033[1;31m'
else
    #χωρίς χρώματα καθόλου
    unset -v RED; unset -v GRE; unset -v YEL; unset -v BLE; unset -v NC
fi


###  μια αναμονή (sleep) με στύλ
anamoni_ektelesis(){
    if [ ! -n "$1" ]; then
        local endz=12 
    else 
        local endz=$1
    fi
    for i in $(seq 1 $endz); do sleep 1 2>&1 && echo -ne "$BLE.$NC\033[K"; done
}


# Πρέπει να έχουμε και έναν φάκελο να βάζουμε τα βίντεο μας μέσα στο Persistent
# Αυτή η εντολή δεν πρόκειται να αλλοιώσει τίποτα στο Desktop του καθημερινού Η/Υ
if [ ! -d $fakelos_arxeiwn ]; then
    if [ ! -d $base_directory ]; then
        mkdir -p $base_directory && mkdir -p $fakelos_arxeiwn
    else
        mkdir -p $fakelos_arxeiwn
    fi  
fi

# Για να δουλεύουν τα σενάρια ακόμα και αν δεν έχει tor service ο Η/Υ 
yparxi_tor(){
    local tor_exist=false
    if [ "$(command -v tor)" != "" ]; then
        local tor_exist=true 
    fi
    echo "$tor_exist"
}

# αντικαθιστούμε την εντολή torsocks 
entoli_tor="torsocks"
if [ "$(yparxi_tor)" == "false" ];then
    unset -v entoli_tor
fi

# Μετά το Tails 7.0 εμφανίστηκαν και μπορεί να εμφανιστούν και στα δικά σας ...
# script ta GtK-Warnings και για να μην εμφανίζονται πλέον πρέπει τα stderr
# να στέλνονται στο ... /dev/null . Είναι ένα πρόβλημα που επηρεάζει ως επί το
# τις εντολές που εμφανιζονται στις οθόνες των τερμαντικών γιατί προέρχεται απο
# το compile του GNOME με το debug να είναι ενεργό!
# Σε αυτό το script δεν χρειάστηκε να την χρησιμοποιήσω την συνάρτηση τελικά!
zen_no_gtkwarnings(){
    zenity "$@" 2>/dev/null
}


# YT-DLP ... Μια κατηγορία από μόνο του μιας και είναι αυτό που ενημερώνεται -
# αλλάζει συνέχεια αλλά πρώτα πρέπει να βεβαιωθούμε ότι έχουν την δυνατότητα να 
# το κατεβάσουμε.

download_url(){
   downloading_url=$(zenity --entry \
    --title="Τελικό Παράθυρο για το Αρχείο ή το Βίντεο σας" --width=770 --height=120 \
    --text="Επικολλήστε την διεύθυνση του αρχείου ή του βίντεο και μετά πατήστε το ΟΚ για να κατέβει."
    )
}


check_download_utility(){
    if [ "$(command -v wget)" != ""  ]; then
        local down_utils="wget"
    elif [ "$(command -v curl)" != "" ]; then
        local down_utils="curl"
    else 
        local down_utils=""
    fi
    echo "$down_utils"
}

# μας δίνει αλλά και ελέγχει αν έχουμε τα 2 βασικά εργαλεία για κατέβασμα αρχείων
down_util="$(check_download_utility)"



if [[ "$down_util" == "" ]]; then
    echo -e "\r\nΔεν βρήκα ούτε το$BLE wget$NC ούτε το$BLE curl$NC εγκατεστημένα!"
    echo -e "\rΧωρίς τουλάχιστον του ενός εκ των 2 είναι αδύνατο "
    echo -e "\rνα κατέβει το$BLE yt-dlp$NC στο$BLE Tails OS$NC ή στο Desktop σας! \n"
    echo -e "\r\nΕγκαταστήστε τα αν θέλετε να ενημερώνεται και το yt-dlp. \n"
    echo -ne "\r\n $YEL Τέλος $NC! Εις το Επανιδείν "
    export -f anamoni_ektelesis
    anamoni_ektelesis "20"
    down_inst_updt_ytdlp=false
    elegxos_an_tha_katevei=false
    exit
fi


check_ytdlp_downloaded(){
    if [ ! -f $fakelos_arxeiwn/ytdlp_last_download_day.txt ]; then
        echo "$(date +%d-%m-%Y)" > $fakelos_arxeiwn/ytdlp_last_download_day.txt
        local to_ytdlp_prepei_na_katevei=true
    else
        read -r linez < $fakelos_arxeiwn/ytdlp_last_download_day.txt
        todayz="$(date +%d-%m-%Y)"
        if [ "$linez" == "$todayz" ]; then
            local to_ytdlp_prepei_na_katevei=false
        else
            local to_ytdlp_prepei_na_katevei=true
        fi
    fi
    echo "$to_ytdlp_prepei_na_katevei"
}

# πρέπει να ξέρουμε κάθε φορά αν είναι να κατέβει ή όχι ...
prepei_na_katevei="$(check_ytdlp_downloaded)"


check_ytdlp_local_bin(){
    local ytdlp_leipei=false
    if [ ! -e $ytdlp_base/yt-dlp ] || [ "$(ls -lha $ytdlp_base/yt-dlp | awk '{print $5}')" == "0" ]; then
        local ytdlp_leipei=true
    fi
    if [ ! -d $ytdlp_base/ ]; then
        mkdir -p $ytdlp_base/
    fi
    echo "$ytdlp_leipei"
}

to_ytdlp_leipei="$(check_ytdlp_local_bin)"

# για να γίνει εκτελέσιμο
ytdlp_download_rest_commands(){
    # για να εκτελείται Make executable 
    chmod a+rx $ytdlp_base/yt-dlp 2> /dev/null 
    # πρεπει να είναι ο φάκελος στο .bashrc . creating PATH
    path_in_bashrc="export PATH="${ytdlp_base}:\$PATH""
    # echo $path_in_bashrc
    if [[ -z $(grep -i "^${path_in_bashrc}" "$HOME/.bashrc") ]]; then
        echo $path_in_bashrc >> $HOME/.bashrc
        source $HOME/.bashrc
    fi    
    if [ -f $ytdlp_base/yt-dlp ] && [ "$(ls -lha $ytdlp_base/yt-dlp | awk '{print $5}')" != "0" ]; then
        echo "$(date +%d-%m-%Y)" > $fakelos_arxeiwn/ytdlp_last_download_day.txt
        echo -e "\r\nΤο$BLE yt-dlp$NC είναι πλέον στον τοπικό φάκελο!\n"
        return 0
    else 
        echo -e "\r\nΤο$BLE yt-dlp$NC δεν είναι στον τοπικό φάκελο πια!\n"
        return 1
    fi
    sleep 3
}


final_wget_curl_download(){
        export -f anamoni_ektelesis
        if [ "$down_util" == "wget" ]; then
            # το wget και να υπαρχει το παλιό αρχείο θα το κατεβασει με νέα
            # όνομασια και θα το κανει ... yt-dlp.1, οποτε αφαιρούμε το παλιό
            # αλλά αν δεν υπάρχει θα βγάλει αδυναμια εκτελεσης που δεν θελουμε
            # να εμφανίζεται στην οθόνη
            rm -rf $ytdlp_base/yt-dlp 2> /dev/null 
            echo -ne "\r\nΚατεβάζω το$BLE yt-dlp$NC με το$BLE wget $NC "
            $entoli_tor /usr/bin/wget "$yt_dlp_download_url" -P $ytdlp_base
            anamoni_ektelesis 
            export -f ytdlp_download_rest_commands
            ytdlp_download_rest_commands
        elif [ "$down_util" == "curl" ]; then
            echo -e "\r\nΚατεβάζω το$BLE yt-dlp$NC με το$BLE curl $NC "
            $entoli_tor /usr/bin/curl -L "$yt_dlp_download_url" -O --output-dir $ytdlp_base
            anamoni_ektelesis
            export -f ytdlp_download_rest_commands
            ytdlp_download_rest_commands
        else
           echo -ne "\r\nΔεν μπορώ να κατεβάσω το$BLE yt-dlp$NC, ούτε με το$BLE wget$NC ούτε με το$BLE curl$NC ! "
           anamoni_ektelesis "5"
           return 1
        fi
}



# αν υπάρχει το yt-dlp στο σύστημα αλλά όχι στον φάκελο του χρήστη πρέπει να τον
# ρωτήσουμε τον χρήστη τι θέλει να χρησιμοποιήσει.
if [ "$down_inst_updt_ytdlp" = true ] && [ "$elegxos_an_tha_katevei" = true ] && \
    [ "$(command -v yt-dlp)" != "" ] && [ "$to_ytdlp_leipei" == "true" ]; then
    echo -e "\r\n Το${BLE} yt-dlp${NC} υπάρχει στον$YEL Η/Υ$NC αλλά όχι στο προφίλ του χρήστη \n"
    read -p " Αν θέλετε να κατεβάσετε το ενημερωμένο πατήστε το κουμπί y + enter
αλλιώς με οποιοδήποτε κουμπί + enter ή απλά enter συνεχίζει χωρίς αυτό  " ADEIES ;
    if ! [[ $ADEIES == "y" || $ADEIES  == "Y" || $ADEIES  == "Υ" || $ADEIES  == "υ" ]]; then
        down_inst_updt_ytdlp=false
        elegxos_an_tha_katevei=false
    fi
fi


# αν έχουμε ενεργοποιήσει τα updates και τον έλεγχο να μας ρωτάει για update
if [ "$down_inst_updt_ytdlp" = true ] && [ "$elegxos_an_tha_katevei" = true ]; then
    if [ "$to_ytdlp_leipei" == "true" ]  || [ "$prepei_na_katevei" == "true" ]; then
        echo -e "\r\n      Το ${BLE} yt-dlp${NC} χρειάζεται ενημέρωση \n"
        echo -e "\r Η διεύθυνση ενημέρωσης του${BLE} yt-dlp${NC} είναι η εξής : \n"
        echo -e "\r\n${BLE}https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp${NC}"
        echo -e "\r\n Αφού κατέβει και πριν το τρέξετε συνιστώ να το ελέγξετε."
        echo -e "\r Θα το βρείτε όταν τελειώσει η διαδικασία στον φάκελο : ${BLE}.local/bin/${NC} \n"
        read -p " Για να κατέβει το yt-dlp πατήστε το κουμπί y + enter, αλλιώς ...
 με σκέτο enter δεν θα κατεβάσει την νέα έκδοση του yt-dlp !   " ADEIA;
        if ! [[ $ADEIA == "y" || $ADEIA == "Y" || $ADEIA == "Υ" || $ADEIA == "υ" ]]; then
            echo -e "\r\n Δεν κατεβάζω το${BLE} yt-dlp${NC}... Συνεχίζω στο πρόγραμμα :) "
            if [ "$prepei_na_katevei" == "true" ]; then
                echo "" > $fakelos_arxeiwn/ytdlp_last_download_day.txt
            fi
            down_inst_updt_ytdlp=false
            export -f anamoni_ektelesis
            anamoni_ektelesis "3"
        fi
    fi
fi

# clear

if [ "$down_inst_updt_ytdlp" == true ]; then
    if [ "$prepei_na_katevei" == "true" ] || [ "$to_ytdlp_leipei" == "true" ]; then
        echo -e "\r\n   Το$BLE yt-dlp$NC λείπει ή είναι ανενημέρωτο ή και τα δυο \n"
        export -f final_wget_curl_download
        final_wget_curl_download 
        if [ "$?" == "0" ]; then
            echo -e "\r\n Tο κατέβασμα του $BLE yt-dlp$NC ολοκληρώθηκε! \n"
            ytdlp_updated=true
        else
            echo -e "\r\n Tο κατέβασμα του $BLE yt-dlp$NC απέτυχε! \n"
            ytdlp_updated=false
        fi
    else
        # και το $prepei_na_katevei είναι false αλλά τα ευκόλως εννοούμενα 
        # παραλείπονται 
        if [ "$to_ytdlp_leipei" == "true" ]; then
            echo -e "\r\n  Tο$BLE yt-dlp$NC δεν είναι πλέον στον φάκελο$BLE .local/bin$NC \n"
            export -f final_wget_curl_download
            final_wget_curl_download 
            if [ "$?" == "0" ]; then
                echo -e "\r\n Tο κατέβασμα του $BLE yt-dlp$NC ολοκληρώθηκε!!! \n"
                ytdlp_updated=true
            else
                echo -e "\r\n Tο κατέβασμα του $BLE yt-dlp$NC απέτυχε!!! \n"
                ytdlp_updated=false
            fi        
        else
            echo -e "\r\n  Το$BLE yt-dlp$NC είναι ενημερωμένο, συνεχίζω \n"
            ytdlp_updated=true
        fi
    fi
    export -f anamoni_ektelesis
    anamoni_ektelesis "3"
fi

# αν θέλουμε να κρατήσουμε το yt-dlp που κατεβάσαμε παλιά, απλά βάλτε το μέσα 
# στον φάκελο VIDEOS του PERSISTENT και ο επόμενος έλεγχος θα το μεταφέρει μόνο
# στην περίπτωση που δεν κατεβάσαμε καινούργια έκδοση !
if [ "$ytdlp_updated" != "true" ]; then
    if [ -e $fakelos_arxeiwn/yt-dlp ]; then
        cp $fakelos_arxeiwn/yt-dlp $ytdlp_base
    fi
fi


clear


while true; do
    echo -e "\r\n\n Το κατέβασμα των$BLE Αρχείων$NC ή των$BLE Video$NC \
γίνεται μόνο μέσω του$BLE  Zenity$NC  παραθύρου.\n Σε αυτήν την οθόνη εμφανίζονται μόνο η πρόοδος και τα μηνύματα του κατεβάσματος!\n"
    download_vid=$(zenity --title "Κατεβάστε Αρχεία ή Βίντεο" --width=400 --height=120 \
    --forms \
    --text '<span foreground="#ef172f">  Επιλέξτε το εργαλείο που θα χρησιμοποιήσετε και επικολλήστε\
την διεύθυνση των αρχείων-βίντεο ή της σελίδας αν είναι το yt-dlp.</span>' \
    --add-combo 'Επιλογή εργαλείου κατεβάσματος :          ' \
    --combo-values "yt-dlp|wget|curl" \
    --add-entry="Εισάγετε παράμετρο αν χρειάζεται :"
    )
    if [[ "$?" != "0" ]]; then
        clear
        echo -ne "\r\n $YEL Τέλος $NC! Εις το Επανιδείν "
        cd -P ~/Persistent
        export -f anamoni_ektelesis
        anamoni_ektelesis "2"
        break
    else
        clear
        if [[ "$( cut -d '|' -f1 <<< $download_vid )" != "" && "$( cut -d '|' -f2 <<< $download_vid )" != "" ]]; then
            epilogi="$( cut -d '|' -f1 <<< $download_vid )"
            echo -e "\r\n Επέλεξες το${BLE} $epilogi${NC} ως εργαλείο κατεβάσματος\n"
            down_parameter="$( cut -d '|' -f2 <<< $download_vid )"
            echo -e "\r Και η παράμετρος του είναι :${GRE} $down_parameter ${NC} \n"
        else 
            epilogi="$( cut -d '|' -f1 <<< $download_vid )"
            echo -e "\r\n Επέλεξες το${BLE} $epilogi${NC} ως εργαλείο κατεβάσματος\n"
        fi
        export -f download_url
        download_url
        if [ "$epilogi" == "curl" ]; then    
            if [ "$down_parameter" == "" ]; then
                $entoli_tor /usr/bin/curl "$downloading_url" -O --output-dir $fakelos_arxeiwn 
            else
                if [ "$down_parameter" == "notor" ]; then
                    unset -v down_parameter
                    unset -v entoli_tor
                fi
                $entoli_tor /usr/bin/curl $down_parameter "$downloading_url" -O --output-dir $fakelos_arxeiwn
                unset down_parameter
                entoli_tor="torsocks"
            fi
        elif [ "$epilogi" == "wget" ]; then
            if [ "$down_parameter" == "" ]; then
                $entoli_tor /usr/bin/wget "$downloading_url" -P $fakelos_arxeiwn
            else
                if [ "$down_parameter" == "notor" ]; then
                    unset -v down_parameter
                    unset -v entoli_tor
                fi
                $entoli_tor /usr/bin/wget $down_parameter "$downloading_url" -P $fakelos_arxeiwn
                unset down_parameter
                entoli_tor="torsocks"
            fi
        else # αυτή που έμεινε απο την --combo-values
            if [ "$down_parameter" == "" ]; then
                $entoli_tor $ytdlp_base/yt-dlp -P $fakelos_arxeiwn  "$downloading_url"
            else
                if [ "$down_parameter" == "notor" ]; then
                    unset -v down_parameter
                    unset -v entoli_tor
                fi
                $entoli_tor $ytdlp_base/yt-dlp $down_parameter -P $fakelos_arxeiwn  "$downloading_url"
                unset down_parameter
                entoli_tor="torsocks"
            fi
        fi

    fi
done


