#!/bin/sh
#author:Wos
#universal m3u8 downloader
#the m3u8 link must be a end link,you need manual verify this
UA="User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
FILTER1="aiailah|haijiao|xhcdn|.cdnlz|.lz|yzzy|phncdn|xvideo|xnxx|xluuss|surrit|ijycnd"
#long segment name filter
FILTER2="fentvoss|tlkqc"
TEMPPATH=/tmp/m3u8temp/
if [ ! -d "$TEMPPATH" ]; then
mkdir -p "$TEMPPATH"
fi
rm ${TEMPPATH}* 2>/dev/null
M0=${TEMPPATH}"0.m3u8"
M1=${TEMPPATH}"1.m3u8"
M2=${TEMPPATH}"2.m3u8"
M3=${TEMPPATH}"3.m3u8"
M4=${TEMPPATH}"4.m3u8"
PXY=""
PPXY=""
LINK=$(xclip -selection clipboard -o 2>/dev/null)
if [[ ${LINK} =~ ^https:// ]]; then
echo -ne "\033[96;40mEnable Proxy(Y/N)?\033[0m"
read -r input
if [[ $input == 'y' || $input == "Y" ]]; then
PXY=" -x http://127.0.0.1:7891"
PPXY=" --all-proxy=http://127.0.0.1:7891"
fi
#normal file download
echo ${LINK}|grep -E "mp4$|mp4?"|grep -v -E "m3u8$|m3u8?" && aria2c "${LINK}" --max-tries=3 --allow-overwrite=true --file-allocation=none -c -s8 -x8 -k 1M ${PPXY} && exit
#hls file download
curl ${PXY} -H "${UA}" -s "${LINK}" > ${M0} || exit
cat ${M0}|grep "#EXTM3U" >/dev/null || exit
#Prefix domain name determination
#Adjust the parameters in the following regular expression according to the type of m3u8
echo ${LINK}|grep -E "${FILTER1}" && PRELINK=${LINK%/*} || PRELINK=$(echo ${LINK}|cut -d '/' -f 1-3)
echo ${PRELINK}
> ${M1}
cat ${M0}|grep "MAP:URI=\"/key=" && PRELINK=$(echo ${LINK}|cut -d '/' -f 1-3)
cat ${M0}|grep "AES-128,URI=\""|grep -v "=\"https" && echo ${PRELINK}/$(cat ${M0}|grep "AES-128,URI="|awk -F\" '{print $2}') >> ${M1}
cat ${M0}|grep "AES-128,URI=\"http" && echo $(cat ${M0}|grep "AES-128,URI="|awk -F\" '{print $2}') >> ${M1}
cat ${M0}|grep "MAP:URI=\"/key=" && echo ${PRELINK}/$(cat ${M0}|grep "MAP"|awk -F\" '{print $2}') >> ${M1}
cat ${M0}|grep "MAP:URI=\"http" && cat ${M0}|grep "MAP"|awk -F\" '{print $2}' >> ${M1}
cat ${M0}|grep -v -E '^#|^http'|awk '{print "'${PRELINK}'/"$1}' >> ${M1}
cat ${M0}|grep -v '^#'|grep '^http'|awk '{print $1}' >> ${M1}
cat ${M0}|sed -e '/^#/! s/\(.*\/\)/\/tmp\/m3u8temp\//g' -e '/^#/ s/\(".*\/\)/"\/tmp\/m3u8temp\//g' -e 's/.ts?.*/.ts/g' -e "s/?.*\"/\"/g" > ${M2}
#Long file name handling
echo ${LINK}|grep -E "${FILTER2}" && cat ${M0}|sed -e '/^#/! s/\(.*\/\)/\/tmp\/m3u8temp\//g' -e '/^#/ s/\(".*\/\)/"\/tmp\/m3u8temp\//g' -e 's/.ts?.*/.ts/g' -e '/^#/! s/.*\(.\{13\}\)$/\1/p' -e '/^#/! s/^/\/tmp\/m3u8temp\//g'|uniq > ${M2}
echo ${LINK}|grep -E "${FILTER2}" && cat ${M1}|sed -e 's/.*\(.\{13\}\)$/\1/p' -e 's/^/ out=/g'|grep 'out=' > ${M3}
echo ${LINK}|grep -E "${FILTER2}" && paste -d, ${M1} ${M3}|tr ',' '\n' > ${M4}
echo ${LINK}|grep -E "${FILTER2}" && aria2c -i ${M4} --max-tries=3 --allow-overwrite=true --file-allocation=none -c -s8 -x8 -k 1M ${PPXY} -d ${TEMPPATH}
#multithread download files
echo ${LINK}|grep -v -E "${FILTER2}" && aria2c -i ${M1} --max-tries=3 --allow-overwrite=true --file-allocation=none -c -s8 -x8 -k 1M ${PPXY} -d ${TEMPPATH}
#combine multi files
FN=$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 5)
ffmpeg -allowed_extensions ALL -i ${M2} -c copy ${FN}.mp4
echo ""
echo -e "File Save As:\033[96;40m${FN}.mp4\033[0m"
fi