Files
MediaFusion/mediafusion_scrapy/pipelines/live_stream_resolver_pipeline.py
T
Mohamed Zumair 709dc25d94 Enhance TV streaming functionality with MPD DRM support, and updated spiders & Bugfixes (#298)
* Refactor stream parsing and handling for DRM and MediaFlow

* Add encryption support for mediaflow url and refactor URL validation

* Enhance LiveTV spider to support MPD and handle new player API logic

* Update TV stream validation and add DRM fields in UI

* Add mediaflow_proxy_required.mp4 exception video

* Add FlareSolverr integration to scrapy spiders

* [WIP] TamilBulb spider to scraper

* Update StreamedSpider to new API and adjust schedulers
2024-09-27 08:13:10 +05:30

61 lines
2.1 KiB
Python

import scrapy
from itemadapter import ItemAdapter
from scrapy.exceptions import DropItem
from scrapy.http.request import NO_CALLBACK
from scrapy.utils.defer import maybe_deferred_to_future
from utils import const
class LiveStreamResolverPipeline:
async def process_item(self, item, spider):
adapter = ItemAdapter(item)
stream_url = adapter.get("stream_url")
stream_headers = adapter.get("stream_headers")
if not stream_headers:
referer = adapter.get("referer")
stream_headers = {"Referer": referer} if referer else {}
if not stream_url:
raise DropItem(f"No stream URL found in item: {item}")
response = await maybe_deferred_to_future(
spider.crawler.engine.download(
scrapy.Request(
stream_url,
callback=NO_CALLBACK,
headers=stream_headers,
method="HEAD",
dont_filter=True,
)
)
)
content_type = response.headers.get("Content-Type", b"").decode().lower()
if response.status == 200 and content_type in const.IPTV_VALID_CONTENT_TYPES:
stream_headers.update(
{
"User-Agent": response.request.headers.get("User-Agent").decode(),
"Referer": response.request.headers.get("Referer").decode(),
}
)
item["streams"].append(
{
"name": adapter["stream_name"],
"url": adapter["stream_url"],
"source": adapter["stream_source"],
"behaviorHints": {
"notWebReady": True,
"proxyHeaders": {
"request": stream_headers,
},
},
}
)
return item
else:
raise DropItem(
f"Invalid M3U8 URL: {stream_url} with Content-Type: {content_type} response: {response.status}"
)