diff --git a/iptv-check b/iptv-check index 6c817e5..cce5e68 100755 --- a/iptv-check +++ b/iptv-check @@ -17,8 +17,10 @@ then mkdir "$path/temp" >/dev/null 2>&1 fi +# Clean any files from previous run in temp folder rm -rf "$path/temp/*" >/dev/null 2>&1 +# Warning is a simple message that will display every 40 checks on streams to explain user how to quit warn() { if [[ $i -gt $wrn ]] then @@ -59,6 +61,8 @@ echo -e "$yellow" "-------------------------------------" echo -e "$blue" "http://github.com/peterpt" echo -e "$yellow" "-------------------------------------" echo "" + +# checkig for wget if it is installed which wget > /dev/null 2>&1 if [ "$?" -eq "1" ]; then echo -e "$red" "Wget Missing" @@ -68,6 +72,8 @@ exit 1 fi } +# The difference between writefile and writefile2 is that (writefile2) is to process the output from m3u files based in xml codes +# while function (writefile) is to process in output file the conventional m3u files without xml codes in it function writefile2() { if [[ -f "$wfile" ]] then @@ -86,11 +92,15 @@ echo "$chkf" >> "$wfile" echo "" >> "$wfile" fi } - + + function writefile() { +# checks if tool already created previously an m3u file if [[ -f "$wfile" ]] then +#searchs for that specific url in original file and get line number gturlline=$(grep -n "\<$chkf\>"<$path/temp/1 | tr ":" "\n" | sed -n 1p) +# This variavble will get the line number before the previous url (this is to get channel name) defline=$((gturlline-1)) stdata=$(sed -n "$defline p"< $path/temp/1) echo "$stdata" >> "$wfile" @@ -108,7 +118,10 @@ echo "" >> "$wfile" fi } +# Function for m3u files with xml content function xmlproc() { + +# Find http links only and delete all the other xml codes in the file , this works with many tests i did , but it may need more filtering for m3u files with more xml funtions in it grep -F "http" <$path/temp/1 | sed 's///g' | sed 's/^.*http/http/' | sed 's/&.*|//' | sed -e 's/\(.ts\).*\(=\)/\1\2/' | sed 's/=/ /g' | sed "s~~ ~g" > $path/temp/2 srvnmb=$(wc -l "$path/temp/2" | awk '{print$1}') rm -rf "$path/temp/stream" >/dev/null 2>&1 @@ -171,52 +184,77 @@ echo -e "$orange" "$wfile" exit 1 fi } - + +# Function that will download for specific time the test stream function teststream() { wrn="0" +# Checks if tool already created a previous m3u file if [[ -f "$wfile" ]] then exts="1" else exts="0" fi + +# checks if m3u file have xml content ckf=$(grep "" <$path/temp/1) if [[ ! -z "$ckf" ]] then xmlproc fi +#checks for the http links in m3u file glnk=$(grep -F "http" < "$path/temp/1" | sed '/EXTINF/d' | sed '/EXTM3U/d' | awk '!a[$0]++' | sed '/^$/d') + +#Write all the http links only to a new file so they can be checked ahead echo "$glnk" | tr " " "\n" > "$path/temp/2" +# Counts how many links must be checked srvnmb=$(wc -l "$path/temp/2" | awk '{print$1}') +# removes any previous temp pid files and stream captures from previous run rm -rf "$path/temp/stream" >/dev/null 2>&1 rm -rf "$path/temp/pid.tmp" >/dev/null 2>&1 echo "" echo -e "$red""Press CTRL+C To Stop or Abort IPTV list check" echo "" + +# Starts the stream checks for i in $(seq "$srvnmb") do chkf=$(sed -n "${i}p" < "$path/temp/2") +# To avoid errors in previous filter , it checks if the link starts with http , rtmp or HTTP chkurl=$(echo "$chkf" | head -c 4) case "$chkurl" in http|rtmp|HTTP) +# start the stream download with wget , creates a file with the pid from wget wget -q "$chkf" -O "$path/temp/stream" & echo $! > "$path/temp/pid.tmp" + +# reads current wget pid pid=$(sed -n 1p < "$path/temp/pid.tmp") + +# 4 seconds is the time that wget will download the stream befores gets killed sleep 4 +# checks if wget pid is still active rpid=$(ps -p "$pid" -o pid= | awk '{print$1}') + if [[ "$rpid" == "$pid" ]] then +# kills wget pid kill $pid fi + +# checks if downlaoded stream file it is in temp directory if [[ ! -f "$path/temp/stream" ]] then echo -e "$yellow" "Error reading captured file" else +# checks the size of the stream file stsz=$(wc -c "$path/temp/stream" | awk '{print$1}') +# In case stream file is less than 100 bytes then it is not valid if [[ "$stsz" -le "100" ]] then echo -e "$green" "Link:$yellow $i$green of :$yellow$srvnmb$green is$red OFF" else echo -e "$green" "Link:$yellow $i$green of :$yellow$srvnmb$green is$green ON" +#file have more than 100 bytes , then it is a valid stream , goto write file fuction writefile fi fi @@ -249,8 +287,9 @@ exit 1 fi } - +# Case user m3u file is remote (http) then run this function function remotef() { +# wil download the remote m3u file to temp folder and will check its size wget "{$file}" -O "$path/temp/1" >/dev/null 2>&1 flsz=$(wc -c "$path/temp/1" | awk '{print$1}') if [[ "$flsz" -le "10" ]] @@ -262,6 +301,8 @@ exit 0 fi teststream } + +# Local m3u file is loaded here function localf(){ if [[ ! -f "$file" ]] then @@ -297,15 +338,18 @@ echo -e "$yellow" "-------------------------------------" echo "" exit 1 fi +# If a null file name is not found then executes the script again deflecting wget errors to dev/null if [[ ! -f $path/null ]] then echo "0" > $path/null exec $sname $1 2>/dev/null exit 1 fi +# here it means that script already was loaded and restarted , so delete the null file for the next start rm -rf $path/null >/dev/null 2>&1 logo file="$1" +#check if user input is a remote or local file by searching for http word in the user input variable echo "$file" | grep "http" >/dev/null 2>&1 if [ "$?" -eq "0" ]; then remotef