From f32fc6740d4fb20e35cc3f6be9a3d5a75082d901 Mon Sep 17 00:00:00 2001
From: peterpt <7487321+peterpt@users.noreply.github.com>
Date: Tue, 11 Apr 2023 14:10:38 +0100
Subject: [PATCH] Version 2.0
Added OCR detection for streaming channels that are on but are only streaming a login error .
---
iptv-check | 403 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 403 insertions(+)
create mode 100644 iptv-check
diff --git a/iptv-check b/iptv-check
new file mode 100644
index 0000000..63d4689
--- /dev/null
+++ b/iptv-check
@@ -0,0 +1,403 @@
+#!/bin/bash
+#variables
+path=$(pwd)
+sname=$0
+wfile="$path/oklist.m3u"
+strmvld=""
+
+#setup colors
+cyan='\e[0;36m'
+green='\033[92m'
+red='\e[1;31m'
+yellow='\e[0;33m'
+orange='\e[38;5;166m'
+
+# Check if temp directory exists
+if [[ ! -d $path/temp ]]
+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
+wrn=$((wrn+40))
+else
+if [[ $i == "$wrn" ]]
+then
+echo ""
+echo -e "$red""Press CTRL+C To Stop or Abort IPTV list check"
+echo ""
+fi
+fi
+}
+
+#Ctrl+C Interrupt to stop the script
+trap ctrl_c INT
+function ctrl_c() {
+if [[ -f "$path/temp/pid.tmp" ]]
+then
+pid=$(sed -n 1p < "$path/temp/pid.tmp")
+rpid=$(ps -p "$pid" -o pid= | awk '{print$1}')
+if [[ "$rpid" == "$pid" ]]
+then
+kill $pid >/dev/null 2>&1
+exit 1
+else
+exit 1
+fi
+else
+exit 1
+fi
+
+}
+
+logo() {
+echo -e "$green" "IPTV-Check Tool 2.0"
+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"
+echo ""
+echo -e "$yellow" "Try : apt-get install wget"
+exit 1
+fi
+which ffmpeg > /dev/null 2>&1
+ if [ "$?" -eq "1" ]; then
+ echo -e "$red" "ffmpeg Missing"
+echo ""
+echo -e "$yellow" "Try : apt-get install ffmpeg"
+exit 1
+fi
+which tesseract > /dev/null 2>&1
+ if [ "$?" -eq "1" ]; then
+ echo -e "$red" "OCR Missing"
+echo ""
+echo -e "$yellow" "Try : apt-get install tesseract-ocr libtesseract-dev tesseract-ocr-eng"
+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
+gturlline=$(grep -n "\<$chkf\>"<$path/temp/2 | tr ":" "\n" | sed -n 1p)
+stdata=$(sed -n "$gturlline p"< $path/temp/2 | awk '{$1=""; print $0}')
+echo "#EXTINF:-1 ,$stdata" >> "$wfile"
+echo "$chkf" >> "$wfile"
+echo "" >> "$wfile"
+else
+echo "#EXTM3U" > "$wfile"
+echo "" >> "$wfile"
+gturlline=$(grep -n "\<$chkf\>"<$path/temp/2 | tr ":" "\n" | sed -n 1p)
+stdata=$(sed -n "$gturlline p"< $path/temp/2 | awk '{$1=""; print $0}')
+echo "#EXTINF:-1 ,$stdata" >> "$wfile"
+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"
+echo "$chkf" >> "$wfile"
+echo "" >> "$wfile"
+else
+echo "#EXTM3U" > "$wfile"
+echo "" >> "$wfile"
+gturlline=$(grep -n "$chkf"<$path/temp/1 | tr ":" "\n" | sed -n 1p)
+defline=$((gturlline-1))
+stdata=$(sed -n "$defline p"< $path/temp/1)
+echo "$stdata" >> "$wfile"
+echo "$chkf" >> "$wfile"
+echo "" >> "$wfile"
+fi
+}
+
+#Checking if valid streams are really valid or have a bad login
+function ocr () {
+ffmpeg -ss 00:00:02 -i "$path/temp/stream" -frames:v 1 "$path/temp/stream.png"
+tesseract -l eng "$path/temp/stream.png" "$path/temp/test"
+chktxt=$(grep -i "error" "$path/temp/test.txt")
+if [[ -z "$chktxt" ]]
+then
+strmvld="1"
+else
+strmvld="0"
+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
+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 ""
+for i in $(seq "$srvnmb")
+do
+chkf=$(sed -n "${i}p" < "$path/temp/2" | awk {'print$1}')
+chkurl=$(echo "$chkf" | head -c 4)
+case "$chkurl" in
+http|rtmp|HTTP)
+wget -q "$chkf" -O "$path/temp/stream" & echo $! > "$path/temp/pid.tmp"
+pid=$(sed -n 1p < "$path/temp/pid.tmp")
+sleep 4
+rpid=$(ps -p "$pid" -o pid= | awk '{print$1}')
+if [[ "$rpid" == "$pid" ]]
+then
+kill $pid
+fi
+if [[ ! -f "$path/temp/stream" ]]
+then
+echo -e "$yellow" "Error reading captured file"
+else
+stsz=$(wc -c "$path/temp/stream" | awk '{print$1}')
+if [[ "$stsz" -le "100" ]]
+then
+echo -e "$green" "Link:$yellow $i$green of :$yellow$srvnmb$green is$red OFF"
+else
+ocr
+if [[ "$strmvld" == "1" ]]
+then
+echo -e "$green" "Link:$yellow $i$green of :$yellow$srvnmb$green is$green ON"
+writefile2
+else
+echo -e "$green" "Link:$yellow $i$green of :$yellow$srvnmb$green is$red OFF (Bad Login)"
+strmvld=""
+fi
+fi
+fi
+;;
+*)
+;;
+esac
+rm -rf $path/temp/*.png >/dev/null 2>&1
+rm -rf $path/temp/stream >/dev/null 2>&1
+rm -rf $path/temp/*.txt >/dev/null 2>&1
+rm -rf $path/temp/pid.tmp >/dev/null 2>&1
+warn
+done
+if [[ "$exts" == "0" ]]
+then
+if [[ -f "$wfile" ]]
+then
+echo ""
+echo -e "$green" "Job Finished"
+echo ""
+echo -e "$yellow" "You can find your new iptv list in :"
+echo -e "$orange" "$wfile"
+exit 1
+fi
+else
+echo ""
+echo -e "$green" "Job Finished"
+echo ""
+echo -e "$yellow" "Your iptv list was update in :"
+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
+ocr
+if [[ "$strmvld" == "1" ]]
+then
+echo -e "$green" "Link:$yellow $i$green of :$yellow$srvnmb$green is$green ON"
+writefile
+else
+echo -e "$green" "Link:$yellow $i$green of :$yellow$srvnmb$green is$red OFF (Bad Login)"
+strmvld=""
+fi
+fi
+fi
+;;
+*)
+;;
+esac
+rm -rf $path/temp/*.png >/dev/null 2>&1
+rm -rf $path/temp/stream >/dev/null 2>&1
+rm -rf $path/temp/*.txt >/dev/null 2>&1
+rm -rf $path/temp/pid.tmp >/dev/null 2>&1
+warn
+done
+if [[ "$exts" == "0" ]]
+then
+if [[ -f "$wfile" ]]
+then
+echo ""
+echo -e "$green" "Job Finished"
+echo ""
+echo -e "$yellow" "You can find your new iptv list in :"
+echo -e "$orange" "$wfile"
+exit 1
+fi
+else
+echo ""
+echo -e "$green" "Job Finished"
+echo ""
+echo -e "$yellow" "Your iptv list was update in :"
+echo -e "$orange" "$wfile"
+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" ]]
+then
+echo -e "$yellow" "The remote link is down or the file size of it"
+echo -e "$yellow" " is too small to be an m3u iptv list file"
+echo ""
+exit 0
+fi
+teststream
+}
+
+# Local m3u file is loaded here
+function localf(){
+if [[ ! -f "$file" ]]
+then
+echo -e "$yellow" "The file you specified does not exist"
+echo -e "$yellow" "in :$green $file "
+echo ""
+echo -e "$yellow" "Make sure you wrote the right path of it"
+exit 1
+fi
+cp "$file" "$path/temp/1" >/dev/null 2>&1
+flsz=$(wc -c "$path/temp/1" | awk '{print$1}')
+if [[ "$flsz" -le "10" ]]
+then
+echo -e "$yellow" "The file you specified is too small to be an m3u iptv file"
+exit 0
+fi
+teststream
+}
+if [[ -z $1 ]]
+then
+echo -e "$green" "IPTV-Check Tool 1.0"
+echo -e "$yellow" "-------------------------------------"
+echo -e "$blue" "http://github.com/peterpt"
+echo -e "$yellow" "-------------------------------------"
+echo ""
+echo -e "$orange" "Example for remote list to check :"
+echo -e "$green" "$0 http://someurl/somelist.m3u"
+echo ""
+echo -e "$orange" "Example for local list to check :"
+echo -e "$green" "$0 /root/mylist.m3u"
+echo ""
+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
+else
+localf
+fi