iptv/check-pls.sh

70 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
#################################################
#
# IPTV Playlist check tool
#
# Usage:
# ./check-pls.sh local/pls.m3u
# ./check-pls.sh https://example.com/pls.m3u
#
# Both *.m3u and *.m3u8 are supported.
#
# If argument is link to playlist it will be
# saved in /tmp and then check as local file.
#
#################################################
awk '
BEGIN {
total_count=0
success_count=0
fail_count=0
print "Playlist: " ARGV[1]
if (ARGV[1] ~ /^http(s)?:\/\/.*/) {
parts_count = split(ARGV[1], parts, "/")
file_name = parts[parts_count]
code = system("wget " ARGV[1] " -qO /tmp/" file_name " > /dev/null")
if (code == 0) {
print "Saved in /tmp/" file_name
} else {
print "ERROR: cannot download playlist: " ARGV[1]
exit 1
}
ARGV[1] = "/tmp/" file_name
}
print ""
print "Note 1: operation may take some time."
print "Note 2: press CTRL+C to skip current channel or CTRL+Z to kill process."
print "Note 3: results may be inaccurate, you should use proper IPTV software to re-check."
print "Note 4: error codes listed here - https://everything.curl.dev/usingcurl/returns"
print "--------------------"
}
{
sub("\r$", "", $0) # crlf -> lf
if ($0 ~ /^#EXTINF:.+,/) {
total_count++
channel_name = substr($0, index($0, ",") + 1, length($0))
print "[" total_count "] " channel_name "..."
}
if ($0 ~ /^http(s)?:\/\/.*/) {
url = sprintf("%c%s%c", 34, $0, 34) # 34 == "
code = system("curl -s --max-time 5 --max-filesize 5000 -o /dev/null " url)
if (code == 0 || code == 63) {
print "\t- OK: " url
success_count++
} else {
print "\t- ERROR (" code "): " url
fail_count++
}
}
}
END {
print "--------------------"
print "Playlist: " ARGV[1]
print "Check stats"
print "- Success:\t" success_count "/" total_count
print "- Failed: \t" fail_count "/" total_count
}
' $1