mirror of
https://github.com/doms9/iptv.git
synced 2026-03-07 11:18:25 +01:00
Compare commits
38 commits
9cc75de850
...
00000d9d6b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
00000d9d6b | ||
|
|
7184f33572 | ||
|
|
57cb623fb4 | ||
|
|
506f4084e8 | ||
|
|
96c27bc166 | ||
|
|
7a54d5b0d1 | ||
|
|
6af7330a08 | ||
|
|
8ecf888255 | ||
|
|
1ea227c2bb | ||
|
|
7c990639bb | ||
|
|
29afb54212 | ||
|
|
cf116426ce | ||
|
|
14aaf4ef4a | ||
|
|
90bfcf4616 | ||
|
|
96cefdb5c7 | ||
|
|
0fef2d79f5 | ||
|
|
212831891c | ||
|
|
3d453ee6f9 | ||
|
|
79961bcdcf | ||
|
|
699d99162f | ||
|
|
f2624f4b13 | ||
|
|
b57ef84f92 | ||
|
|
d9959b1ce2 | ||
|
|
35de311dbd | ||
|
|
73138a7769 | ||
|
|
b37955913c | ||
|
|
61d0c019ee | ||
|
|
00000d99e7 | ||
|
|
825b5e9fd7 | ||
|
|
f0292600ed | ||
|
|
36a4543748 | ||
|
|
2cdfbeb99e | ||
|
|
f12a1f01f8 | ||
|
|
0ee4660e92 | ||
|
|
69a75f162f | ||
|
|
02d0c0c92e | ||
|
|
00000d91d9 | ||
|
|
64fa5490fb |
8 changed files with 190230 additions and 186468 deletions
1501
M3U8/TV.m3u8
1501
M3U8/TV.m3u8
File diff suppressed because it is too large
Load diff
373564
M3U8/TV.xml
373564
M3U8/TV.xml
File diff suppressed because one or more lines are too long
|
|
@ -235,6 +235,7 @@ https://fl1.moveonjoy.com/HALLMARK_MOVIES_MYSTERIES/index.m3u8
|
|||
http://fl1.moveonjoy.com/HBO/index.m3u8
|
||||
|
||||
#EXTINF:-1 tvg-chno="79" tvg-id="HBO2.HD.us2" tvg-name="HBO 2" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s68140_dark_360w_270h.png" group-title="TV",HBO 2
|
||||
#EXTVLCOPT:http-user-agent=curl/8.5.0
|
||||
http://lucidhosting.xyz:82/sandriassoc@gmail.com/Sm8G4ddxoW/2071
|
||||
|
||||
#EXTINF:-1 tvg-chno="80" tvg-id="HBO.Comedy.HD.us2" tvg-name="HBO Comedy" tvg-logo="http://schedulesdirect-api20141201-logos.s3.dualstack.us-east-1.amazonaws.com/stationLogos/s59839_dark_360w_270h.png" group-title="TV",HBO Comedy
|
||||
|
|
|
|||
1500
M3U8/events.m3u8
1500
M3U8/events.m3u8
File diff suppressed because it is too large
Load diff
|
|
@ -67,9 +67,10 @@ async def main() -> None:
|
|||
asyncio.create_task(livetvsx.scrape(hdl_brwsr)),
|
||||
asyncio.create_task(pixel.scrape(hdl_brwsr)),
|
||||
asyncio.create_task(ppv.scrape(xtrnl_brwsr)),
|
||||
asyncio.create_task(roxie.scrape(hdl_brwsr)),
|
||||
asyncio.create_task(sport9.scrape(xtrnl_brwsr)),
|
||||
asyncio.create_task(streamcenter.scrape(xtrnl_brwsr)),
|
||||
asyncio.create_task(streamhub.scrape(xtrnl_brwsr)),
|
||||
# asyncio.create_task(streamhub.scrape(xtrnl_brwsr)),
|
||||
asyncio.create_task(streamsgate.scrape(xtrnl_brwsr)),
|
||||
asyncio.create_task(totalsportek.scrape(hdl_brwsr)),
|
||||
asyncio.create_task(webcast.scrape(hdl_brwsr)),
|
||||
|
|
@ -79,8 +80,7 @@ async def main() -> None:
|
|||
httpx_tasks = [
|
||||
asyncio.create_task(fawa.scrape()),
|
||||
asyncio.create_task(istreameast.scrape()),
|
||||
asyncio.create_task(pawa.scrape()),
|
||||
asyncio.create_task(roxie.scrape()),
|
||||
# asyncio.create_task(pawa.scrape()),
|
||||
asyncio.create_task(shark.scrape()),
|
||||
# asyncio.create_task(streambtw.scrape()),
|
||||
asyncio.create_task(streamfree.scrape()),
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import asyncio
|
||||
import re
|
||||
from functools import partial
|
||||
from urllib.parse import urljoin
|
||||
|
||||
from playwright.async_api import Browser
|
||||
from selectolax.parser import HTMLParser
|
||||
|
||||
from .utils import Cache, Time, get_logger, leagues, network
|
||||
|
|
@ -17,7 +17,7 @@ CACHE_FILE = Cache(TAG, exp=10_800)
|
|||
|
||||
HTML_CACHE = Cache(f"{TAG}-html", exp=19_800)
|
||||
|
||||
BASE_URL = "https://roxiestreams.live"
|
||||
BASE_URL = "https://roxiestreams.info"
|
||||
|
||||
SPORT_ENDPOINTS = {
|
||||
"fighting": "Fighting",
|
||||
|
|
@ -30,25 +30,6 @@ SPORT_ENDPOINTS = {
|
|||
}
|
||||
|
||||
|
||||
async def process_event(url: str, url_num: int) -> str | None:
|
||||
if not (html_data := await network.request(url, log=log)):
|
||||
return
|
||||
|
||||
valid_m3u8 = re.compile(
|
||||
r"showPlayer\(['\"]clappr['\"],\s*['\"]([^'\"]+?\.m3u8(?:\?[^'\"]*)?)['\"]\)",
|
||||
re.IGNORECASE,
|
||||
)
|
||||
|
||||
if not (match := valid_m3u8.search(html_data.text)):
|
||||
log.info(f"URL {url_num}) No M3U8 found")
|
||||
|
||||
return
|
||||
|
||||
log.info(f"URL {url_num}) Captured M3U8")
|
||||
|
||||
return match[1]
|
||||
|
||||
|
||||
async def refresh_html_cache(
|
||||
url: str,
|
||||
sport: str,
|
||||
|
|
@ -118,8 +99,8 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
|||
|
||||
live = []
|
||||
|
||||
start_ts = now.delta(minutes=-30).timestamp()
|
||||
end_ts = now.delta(minutes=30).timestamp()
|
||||
start_ts = now.delta(hours=-1).timestamp()
|
||||
end_ts = now.delta(minutes=5).timestamp()
|
||||
|
||||
for k, v in events.items():
|
||||
if k in cached_keys:
|
||||
|
|
@ -133,12 +114,14 @@ async def get_events(cached_keys: list[str]) -> list[dict[str, str]]:
|
|||
return live
|
||||
|
||||
|
||||
async def scrape() -> None:
|
||||
async def scrape(browser: Browser) -> None:
|
||||
cached_urls = CACHE_FILE.load()
|
||||
|
||||
cached_count = len(cached_urls)
|
||||
valid_urls = {k: v for k, v in cached_urls.items() if v["url"]}
|
||||
|
||||
urls.update(cached_urls)
|
||||
valid_count = cached_count = len(valid_urls)
|
||||
|
||||
urls.update(valid_urls)
|
||||
|
||||
log.info(f"Loaded {cached_count} event(s) from cache")
|
||||
|
||||
|
|
@ -149,44 +132,52 @@ async def scrape() -> None:
|
|||
log.info(f"Processing {len(events)} new URL(s)")
|
||||
|
||||
if events:
|
||||
for i, ev in enumerate(events, start=1):
|
||||
handler = partial(
|
||||
process_event,
|
||||
url=ev["link"],
|
||||
url_num=i,
|
||||
)
|
||||
async with network.event_context(browser) as context:
|
||||
for i, ev in enumerate(events, start=1):
|
||||
async with network.event_page(context) as page:
|
||||
handler = partial(
|
||||
network.process_event,
|
||||
url=ev["link"],
|
||||
url_num=i,
|
||||
page=page,
|
||||
log=log,
|
||||
)
|
||||
|
||||
url = await network.safe_process(
|
||||
handler,
|
||||
url_num=i,
|
||||
semaphore=network.HTTP_S,
|
||||
log=log,
|
||||
)
|
||||
url = await network.safe_process(
|
||||
handler,
|
||||
url_num=i,
|
||||
semaphore=network.PW_S,
|
||||
log=log,
|
||||
)
|
||||
|
||||
if url:
|
||||
sport, event, ts, link = (
|
||||
ev["sport"],
|
||||
ev["event"],
|
||||
ev["event_ts"],
|
||||
ev["link"],
|
||||
)
|
||||
sport, event, ts, link = (
|
||||
ev["sport"],
|
||||
ev["event"],
|
||||
ev["event_ts"],
|
||||
ev["link"],
|
||||
)
|
||||
|
||||
tvg_id, logo = leagues.get_tvg_info(sport, event)
|
||||
tvg_id, logo = leagues.get_tvg_info(sport, event)
|
||||
|
||||
key = f"[{sport}] {event} ({TAG})"
|
||||
key = f"[{sport}] {event} ({TAG})"
|
||||
|
||||
entry = {
|
||||
"url": url,
|
||||
"logo": logo,
|
||||
"base": BASE_URL,
|
||||
"timestamp": ts,
|
||||
"id": tvg_id or "Live.Event.us",
|
||||
"link": link,
|
||||
}
|
||||
entry = {
|
||||
"url": url,
|
||||
"logo": logo,
|
||||
"base": BASE_URL,
|
||||
"timestamp": ts,
|
||||
"id": tvg_id or "Live.Event.us",
|
||||
"link": link,
|
||||
}
|
||||
|
||||
urls[key] = cached_urls[key] = entry
|
||||
cached_urls[key] = entry
|
||||
|
||||
if new_count := len(cached_urls) - cached_count:
|
||||
if url:
|
||||
valid_count += 1
|
||||
|
||||
urls[key] = entry
|
||||
|
||||
if new_count := valid_count - cached_count:
|
||||
log.info(f"Collected and cached {new_count} new event(s)")
|
||||
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -317,8 +317,6 @@ class Network:
|
|||
finally:
|
||||
page.remove_listener("request", handler)
|
||||
|
||||
await page.close()
|
||||
|
||||
|
||||
network = Network()
|
||||
|
||||
|
|
|
|||
19
readme.md
19
readme.md
|
|
@ -1,22 +1,13 @@
|
|||
## Base Log @ 2026-02-01 04:41 UTC
|
||||
## Base Log @ 2026-02-02 04:35 UTC
|
||||
|
||||
### ✅ Working Streams: 133<br>❌ Dead Streams: 13
|
||||
### ✅ Working Streams: 142<br>❌ Dead Streams: 4
|
||||
|
||||
| Channel | Error (Code) | Link |
|
||||
| ------- | ------------ | ---- |
|
||||
| Disney | HTTP Error (404) | `https://fl1.moveonjoy.com/DISNEY/index.m3u8` |
|
||||
| HBO 2 | HTTP Error (000) | `http://lucidhosting.xyz:82/sandriassoc@gmail.com/Sm8G4ddxoW/2071` |
|
||||
| HBO Family | HTTP Error (404) | `https://fl1.moveonjoy.com/HBO_FAMILY/index.m3u8` |
|
||||
| Hallmark Family | HTTP Error (000) | `https://fl1.moveonjoy.com/HALLMARK_DRAMA/index.m3u8` |
|
||||
| Nicktoons | HTTP Error (000) | `http://fl1.moveonjoy.com/NICKTOONS/index.m3u8` |
|
||||
| Ovation | HTTP Error (404) | `https://fl1.moveonjoy.com/Ovation/index.m3u8` |
|
||||
| Oxygen | HTTP Error (000) | `https://fl1.moveonjoy.com/OXYGEN/index.m3u8` |
|
||||
| Paramount Network | HTTP Error (000) | `https://fl1.moveonjoy.com/PARAMOUNT_NETWORK/index.m3u8` |
|
||||
| Pop TV | HTTP Error (000) | `https://fl1.moveonjoy.com/Pop_TV/index.m3u8` |
|
||||
| Sportsnet One | HTTP Error (403) | `http://mytvstream.net:8080/live/30550113/30550113/57297.m3u8` |
|
||||
| TV Land | HTTP Error (000) | `https://fl1.moveonjoy.com/TV_LAND/index.m3u8` |
|
||||
| TV One | HTTP Error (000) | `https://fl1.moveonjoy.com/TV_ONE/index.m3u8` |
|
||||
| Vice TV | HTTP Error (000) | `https://fl1.moveonjoy.com/VICELAND/index.m3u8` |
|
||||
| HLN TV | HTTP Error (000) | `https://turnerlive.warnermediacdn.com/hls/live/586496/cnngo/hln/VIDEO_0_3564000.m3u8` |
|
||||
| Premier Sports 2 | HTTP Error (000) | `http://hardcoremedia.xyz:80/NW3Vk7xXwW/8375773282/117038` |
|
||||
| Sony Movie Channel | HTTP Error (404) | `http://fl1.moveonjoy.com/Sony_Movie_Channel/index.m3u8` |
|
||||
---
|
||||
#### Base Channels URL
|
||||
```
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue