From 1cf76de0251ac8ca17bda73da7df72073f23281e Mon Sep 17 00:00:00 2001 From: AnthonyAxenov Date: Tue, 31 May 2022 23:00:08 +0800 Subject: [PATCH] New shell-script to check playlist channels --- check-pls.sh | 68 +++++++++++++++++++++++++++++++++++++++++++++++++ download-all.sh | 19 +++++++++++--- 2 files changed, 84 insertions(+), 3 deletions(-) create mode 100755 check-pls.sh diff --git a/check-pls.sh b/check-pls.sh new file mode 100755 index 0000000..e42b52c --- /dev/null +++ b/check-pls.sh @@ -0,0 +1,68 @@ +#!/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 "Check stats" + print "- Success:\t" success_count "/" total_count + print "- Failed: \t" fail_count "/" total_count + } +' $1 diff --git a/download-all.sh b/download-all.sh index 404bd79..e7a3e47 100755 --- a/download-all.sh +++ b/download-all.sh @@ -1,4 +1,17 @@ #!/bin/bash -mkdir files -cd files -grep -P "pls='(.*)'" ../playlists.ini | sed "s/^pls=//g" | sed "s/'//g" | tr -d '\r' | xargs wget + +################################################# +# +# IPTV Playlist download tool +# +# Usage: +# ./download-all.sh +# +# All playlists from playlists.ini will be +# downloaded in ./files directory +# +################################################# + +mkdir files && \ + cd files && \ + grep -P "pls='(.*)'" ../playlists.ini | sed "s/^pls=//g" | sed "s/'//g" | tr -d '\r' | xargs wget