人妻系列无码专区av在线,国内精品久久久久久婷婷,久草视频在线播放,精品国产线拍大陆久久尤物

電視直播源論壇(IPTV整合本地源互聯(lián)網(wǎng)源實(shí)現(xiàn)IPTV自由)

電視直播源論壇(IPTV整合本地源互聯(lián)網(wǎng)源實(shí)現(xiàn)IPTV自由)

寧沛珊 2025-04-12 科技 23 次瀏覽 0個(gè)評(píng)論
背景

關(guān)于iptv,之前在說(shuō)軟路由的時(shí)候說(shuō)過(guò)一次??梢越柚浡酚傻慕M播轉(zhuǎn)單播來(lái)實(shí)現(xiàn)iptv管看。具體參考刨除了機(jī)頂盒的限制,實(shí)現(xiàn)了家里多臺(tái)設(shè)備,隨時(shí)觀看iptv的訴求。但是有些頻道,本地運(yùn)營(yíng)商提供iptv沒(méi)有覆蓋完全。比如一些體育頻道,以及影視頻道等。

于是產(chǎn)生一個(gè)想法,電視家一類的軟件都能播放,那這些頻道的iptv源肯定是可以找到的,能否將這些頻道的源與本地共同組成家庭內(nèi)部的iptv源。

然后開(kāi)始找源,然后校驗(yàn),再整合的過(guò)程。這篇文章總結(jié)一下這個(gè)過(guò)程,以及分享過(guò)程中的一些經(jīng)驗(yàn)。

總體思路

總體思路遵循 尋找源、校驗(yàn)源,清晰源和整合的步驟。

IPTV整合:本地源+互聯(lián)網(wǎng)源實(shí)現(xiàn)IPTV自由

尋找源:這里主要是從互聯(lián)網(wǎng),用搜索工具去查找各種自己需要的iptv源。校驗(yàn)源:對(duì)第一步找到的源,集合本地的網(wǎng)絡(luò)進(jìn)行校驗(yàn),找到可用的源。這里因?yàn)槊考业木W(wǎng)絡(luò)的環(huán)境其實(shí)是有差異的,比如是否支持iptv等。清洗:這里主要是對(duì)整個(gè)可用的源進(jìn)行去重,格式整理,epg節(jié)目信息添加等操作整合:是將找到的可用的信息同本地的iptv源進(jìn)行整合、發(fā)布,統(tǒng)一到家里的電視,pad上去進(jìn)行播放。

有些文章只說(shuō)了上面的思路,但是沒(méi)說(shuō)具體怎么操作。下面具體說(shuō)下,我每一步怎么操作的。

具體操作過(guò)程尋找源

這個(gè)階段,主要是利用好搜索引擎,論壇,github,接口解密等等。這里分享下我怎么找的

有一個(gè)專門(mén)的iptv源搜索工具:電視直播源搜索引擎 。論壇我主要是在恩山,智能電視等尋找,很多大牛自己分享了自己整合的源。github的項(xiàng)目有幾類,有些自己通過(guò)自己的方法拿到了,托管到git上的, 也有一些專門(mén)提供這類源的。

名稱項(xiàng)目地址說(shuō)明

iptv-org

https://github.com/iptv-org/iptv

涵蓋全球的iptv源

iptv-source

https://github.com/HerbertHe/iptv-sources

整合了各種常見(jiàn)的可用的源,包括iptv-org 這個(gè)也有在國(guó)內(nèi)部署的鏡像,也可用自己部署

其他的可以自行在git上進(jìn)行搜索。

至于接口解密,這是主要是tvbox的接口節(jié)目,比如肥貓、飯?zhí)驳慕涌凇?p >不過(guò)這些源普遍存在一些問(wèn)題

重復(fù)太多?;旧洗蟛糠址窒淼脑椿径际侵貜?fù)的。有用的不多。很多播放源同家里運(yùn)營(yíng)商iptv提供的是一樣的,想要看的體育頻道,影視頻道等沒(méi)有的還是沒(méi)有有些播放源則需要科學(xué)上網(wǎng)

我想要的是,給定一個(gè)列表清單,自動(dòng)給我匹配出相應(yīng)的頻道列表??紤]到我的需求,我自己寫(xiě)了個(gè)爬蟲(chóng),去這個(gè)網(wǎng)站http://tonkiang.us/ 拉取所有想要的頻道,倒也實(shí)現(xiàn)了,獻(xiàn)丑貼下代碼,不感興趣的跳過(guò)繼續(xù)往后看。

engine_url = "http://tonkiang.us/"# 爬取CCTV頻道資源def spider_source(): # 爬取直播源引擎 groups = ["CCTV6"] for group_addr in groups: # 獲取當(dāng)前時(shí)間 current_time = datetime.now() page = 1 number = 0 page_count = 1 counts = 1 timeout_cnt = 0 # 初始化集合數(shù)據(jù) data_list = [] # 生成數(shù)據(jù)格式 while page <= page_count and number < counts: #url = engine_url + "?page=" + str(page) + "&s=" + group_addr url = engine_url + "?name=" + group_addr ##修改地址 # 發(fā)起HTTP請(qǐng)求獲取網(wǎng)頁(yè)內(nèi)容 try: response = requests.get(url, timeout=15) # 處理響應(yīng) response.raise_for_status() # 檢查請(qǐng)求是否成功 html_content = response.text #print(html_content) print(f"{current_time} 搜索頻道直播源:{url}") # 使用BeautifulSoup解析網(wǎng)頁(yè)內(nèi)容 soup = BeautifulSoup(html_content, "html.parser") # 查找所有class為"result"的<div>標(biāo)簽 result_divs = soup.find_all("div", attrs={"class": "resultplus"}) # 循環(huán)處理每個(gè)結(jié)果<div>標(biāo)簽 for result_div in result_divs: m3u8_name = "" m3u8_link = "" # 獲取m3u8名稱 channel_div = result_div.find(name="div", attrs={"class": "channel"}) #print(result_div.text) if channel_div is not None: name_div = channel_div.find(name="div", attrs={"class": "tip", "style": "float: left;"}) if name_div is not None: m3u8_name = name_div.text.strip() #print(f"m3u name is {m3u8_name}") else: counts_text = channel_div.text.strip() # 提取數(shù)字部分 counts = int(''.join(filter(str.isdigit, counts_text))) print(f"{current_time} 總記錄數(shù):{counts}") page_count = int(counts) // 30 if counts/30 > page_count: page_count += 1 print(f"{current_time} 總頁(yè)碼數(shù):{page_count}") # 獲取m3u8鏈接 #m3u8_div = result_div.find(name="div", attrs={"class": "ujbmjx"}) m3u8_div = result_div.find_all(name="tba") if len(m3u8_div) == 2: m3u8_link = m3u8_div[-1].text.strip() print(f"頻道名稱: {m3u8_name}, 頻道地址是 {m3u8_link}") except (requests.Timeout, requests.RequestException) as e: timeout_cnt += 1 print(f"{current_time} 請(qǐng)求發(fā)生超時(shí),異常次數(shù):{timeout_cnt}") if timeout_cnt <= 10: # 繼續(xù)下一次循環(huán)迭代 continue else: print(f"{current_time} 超時(shí)次數(shù)過(guò)多:{timeout_cnt} 次,請(qǐng)檢查網(wǎng)絡(luò)是否正常") page += 1# 執(zhí)行主程序函數(shù)spider_source()

但是這個(gè)站點(diǎn)速度有點(diǎn)慢,代碼邏輯也沒(méi)仔細(xì)打磨,搞一段放棄了。想找大佬造好的輪子,我拿來(lái)直接用。git上一搜還真有,項(xiàng)目地址:https://github.com/yuanzl77/IPTV 這個(gè)大牛的思路是這樣的,自定定義搜索的范圍以及要搜索的目標(biāo)以及v4還是v6,在source_urls里面可用隨意定義source。

ip_version_priority = "ipv6"source_urls = [ ...]

然后在demo.txt下定義要搜索的目標(biāo),代碼入口如下

if __name__ == "__main__": template_file = "demo.txt" channels, template_channels = filter_source_urls(template_file) updateChannelUrlsM3U(channels, template_channels)

整體結(jié)構(gòu)和邏輯不算復(fù)雜,感興趣的自己去讀吧。

這樣我就可以把前面我找到的所有站點(diǎn)投一股腦丟個(gè)他,自己定義想要看的頻道,然后等他跑完就行。

校驗(yàn)

這里校驗(yàn)是很關(guān)鍵的一步,就是判斷這些源能不能在你家的網(wǎng)絡(luò)下播放,如果能播放,時(shí)延是多少,分辨率是多少。

大概的思路,就是后臺(tái)用直接打開(kāi)這個(gè)頻道,根據(jù)返回的結(jié)果判斷。其中用到了ffmpeg或者opencv相關(guān)的模塊來(lái)提取分辨率信息。具體參考這個(gè)項(xiàng)目:https://github.com/flyfishes/IPTV-M3U-Checker2

不過(guò)這個(gè)相對(duì)來(lái)說(shuō)還是復(fù)雜,我又找了一個(gè)開(kāi)箱即用的,還有打包好的容器鏡像, 項(xiàng)目地址:https://github.com/zhimin-dev/iptv-checker 提供了命令行和web頁(yè)面兩種方式,輸入一個(gè)列表,生成可用的iptv源,非常完美。

root@cdb832788958:/app# ./iptv-checker-rs check -h檢查相關(guān)命令Usage: iptv-checker-rs check [OPTIONS]Options: -i, --input-file <INPUT_FILE> 輸入文件,可以是本地文件或者是網(wǎng)絡(luò)文件,支持標(biāo)準(zhǔn)m3u格式以及非標(biāo)準(zhǔn)的格式:CCTV,https://xxxx.com/xxx.m3u8格式 -o, --output-file <OUTPUT_FILE> 輸出文件,如果不指定,則默認(rèn)生成一個(gè)隨機(jī)文件名 [default: ] -t, --timeout <TIMEOUT> 超時(shí)時(shí)間,默認(rèn)超時(shí)時(shí)間為28秒 [default: 28000] --debug debug使用,可以看到相關(guān)的中間日志 -c, --concurrency <CONCURRENCY> 并發(fā)數(shù) [default: 1] --like <KEYWORD_LIKE> 想看關(guān)鍵詞 --dislike <KEYWORD_DISLIKE> 不想看關(guān)鍵詞 --sort 頻道排序 -h, --help Print help清洗

前面的第一步,因?yàn)樽远x了搜索的范圍,而這些范圍的重復(fù)率也高,所以找到的源重復(fù)率非常高。同時(shí)不知道哪個(gè)源可以用,所以即使重復(fù)了,第二步校驗(yàn)的時(shí)候也保留了。但是最終不能將重復(fù)的源整合起來(lái)用,體驗(yàn)太差。

前面兩步其實(shí)是最難的,這一步主要是簡(jiǎn)單的數(shù)據(jù)處理。這里說(shuō)的清洗,主要是針對(duì)前面找到可用的目標(biāo)源,這里主要是去重。同時(shí),也根據(jù)節(jié)目信息,添加log,epg等信息。

這個(gè)好像沒(méi)找到合適的項(xiàng)目參考,所以自己寫(xiě)了個(gè)腳本,對(duì)字符串進(jìn)行拼湊(這里便于理解,只貼了去重部分,供參考)

if __name__ == "__main__": file_name = sys.argv[1] # 可用的iptv文件名,包括重復(fù)信息等 userfull_line = "" tv_name = [] # key信息 with open(file_name,'r',encoding="utf-8") as f: all_info = f.readlines() all_len = len(all_info) index = 1 for line in all_info: # 獲取tvg_name tv = all_info[index].split(" ")[2].split("=")[1] try: tv = all_info[index].split(" ")[2].split("=")[1] except Exception as e: print(e) if tv in tv_name: pass else: tv_name.append(tv) userfull_line += all_info[index] userfull_line += all_info[index+1] index += 2 if index >= all_len: print("duplicate finish") break with open("duplicate.m3u", "w",encoding="utf-8") as ff: ff.write(userfull_line)整合

這里是最簡(jiǎn)單的一步,將找到的去重了的源直接整合起來(lái)放到nas或者h(yuǎn)ttpserver上。然后播放器,或者tvbox等在內(nèi)網(wǎng)直接指向這個(gè)他就行了??梢允莟xt格式,也可以是m3u格式。

這里我把前面幾個(gè)過(guò)程用一個(gè)shell全部整合起來(lái)了。實(shí)現(xiàn)了自動(dòng)更新,校驗(yàn)。

注意:腳本供參考,不能直接用,很多是我本地特有的路徑或者名稱。

#!/bin/bashcd /opt/itv/# 獲取本地iptv源# 輸出localiptv.m3u文件# getlocaliptv是我自己寫(xiě)的獲取本地iptv的腳本./getlocaliptv# 獲取互聯(lián)網(wǎng)iptv,searchiptv是基于yuanzl7的程序我直接打包的,便于發(fā)布# 輸出live.m3ucd /opt/itv/searchTv./searchiptv sleep 60# 檢查互聯(lián)網(wǎng)iptv的可用/usr/bin/cp -rf live.m3u ../output/cd ..# 調(diào)用iptv-checker容器里面的命令# 輸出可用的m3u文件available.m3udocker exec myIp /app/iptv-checker-rs check -i static/output/live.m3u -o static/output/available.m3u -t 8000sleep 30# 去除重復(fù)的# duplicate是我程序自己打包的代碼./duplicate output/available.m3u #匯總互聯(lián)網(wǎng)源和本地iptv源cat duplicate.m3u >> localiptv.m3u# 放到nas上去供播放器調(diào)用/usr/bin/cp -rf localiptv.m3u /nasdir/media/總結(jié)

上面總結(jié)了我整合iptv的一些思路,以及用到的一些資源。這里面主要用到一些大佬開(kāi)源的項(xiàng)目,也有一些我自己折騰的腳本?;緦?shí)現(xiàn)了自動(dòng)找源,自動(dòng)校驗(yàn)清晰,可用在家里面看一些iptv沒(méi)有覆蓋到的節(jié)目,如一些體育頻道等。

如果你要問(wèn)這些怎么部署發(fā)布,當(dāng)然是全部部署在家里的軟路由上。

轉(zhuǎn)載請(qǐng)注明來(lái)自夕逆IT,本文標(biāo)題:《電視直播源論壇(IPTV整合本地源互聯(lián)網(wǎng)源實(shí)現(xiàn)IPTV自由)》

每一天,每一秒,你所做的決定都會(huì)改變你的人生!

發(fā)表評(píng)論

快捷回復(fù):

評(píng)論列表 (暫無(wú)評(píng)論,23人圍觀)參與討論

還沒(méi)有評(píng)論,來(lái)說(shuō)兩句吧...