Karan Adhikari commited on
V-4.0.1
Browse files* Sort stream by size
- Backend/__init__.py +1 -1
- Backend/fastapi/routes/stremio_routes.py +24 -6
- pyproject.toml +1 -1
- uv.lock +1 -1
Backend/__init__.py
CHANGED
|
@@ -13,4 +13,4 @@ StartTime = time()
|
|
| 13 |
USE_DEFAULT_ID: str = None
|
| 14 |
db = Database()
|
| 15 |
|
| 16 |
-
__version__ = "4.0.
|
|
|
|
| 13 |
USE_DEFAULT_ID: str = None
|
| 14 |
db = Database()
|
| 15 |
|
| 16 |
+
__version__ = "4.0.1"
|
Backend/fastapi/routes/stremio_routes.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
import time
|
| 2 |
from datetime import datetime, timedelta, timezone
|
| 3 |
from typing import Optional
|
|
@@ -118,6 +119,17 @@ def format_stream_details(filename: str, quality: str, size: str, is_split: bool
|
|
| 118 |
return (stream_name, stream_title)
|
| 119 |
|
| 120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
def get_resolution_priority(stream_name: str) -> int:
|
| 122 |
resolution_map = {
|
| 123 |
"2160p": 2160, "4k": 2160, "uhd": 2160,
|
|
@@ -427,7 +439,8 @@ async def _global_streams_for(token: str, imdb_id: str, media_type: str, season_
|
|
| 427 |
stream_name = f"🌐 GLOBAL {r['quality']}"
|
| 428 |
stream_title = f"{stream_title}\n📡 {r['source_chat']}"
|
| 429 |
url = f"{SettingsManager.current().base_url}/dl/{token}/{r['token']}/{quote(r['title'])}"
|
| 430 |
-
|
|
|
|
| 431 |
return streams
|
| 432 |
|
| 433 |
|
|
@@ -537,6 +550,7 @@ async def get_streams(
|
|
| 537 |
filename = quality.get("name", "")
|
| 538 |
quality_str = quality.get("quality", "HD")
|
| 539 |
size = quality.get("size", "")
|
|
|
|
| 540 |
|
| 541 |
stream_name, stream_title = format_stream_details(
|
| 542 |
filename, quality_str, size, is_split=bool(quality.get("group_key"))
|
|
@@ -549,24 +563,28 @@ async def get_streams(
|
|
| 549 |
streams.append({
|
| 550 |
"name": f"{stream_name} (Proxy)",
|
| 551 |
"title": stream_title,
|
| 552 |
-
"url": proxy_url
|
|
|
|
| 553 |
})
|
| 554 |
streams.append({
|
| 555 |
"name": f"{stream_name} (Direct)",
|
| 556 |
"title": stream_title,
|
| 557 |
-
"url": original_url
|
|
|
|
| 558 |
})
|
| 559 |
elif proxy_url:
|
| 560 |
streams.append({
|
| 561 |
"name": stream_name,
|
| 562 |
"title": stream_title,
|
| 563 |
-
"url": proxy_url
|
|
|
|
| 564 |
})
|
| 565 |
else:
|
| 566 |
streams.append({
|
| 567 |
"name": stream_name,
|
| 568 |
"title": stream_title,
|
| 569 |
-
"url": original_url
|
|
|
|
| 570 |
})
|
| 571 |
elif is_global_search_enabled():
|
| 572 |
try:
|
|
@@ -580,7 +598,7 @@ async def get_streams(
|
|
| 580 |
return {"streams": []}
|
| 581 |
|
| 582 |
streams.sort(
|
| 583 |
-
key=lambda s: get_resolution_priority(s.get("name", "")),
|
| 584 |
reverse=True
|
| 585 |
)
|
| 586 |
name_count: dict = {}
|
|
|
|
| 1 |
+
import re
|
| 2 |
import time
|
| 3 |
from datetime import datetime, timedelta, timezone
|
| 4 |
from typing import Optional
|
|
|
|
| 119 |
return (stream_name, stream_title)
|
| 120 |
|
| 121 |
|
| 122 |
+
def parse_size_to_bytes(size_str: str) -> int:
|
| 123 |
+
if not size_str:
|
| 124 |
+
return 0
|
| 125 |
+
match = re.match(r"([\d.]+)\s*([A-Za-z]+)", size_str.strip())
|
| 126 |
+
if not match:
|
| 127 |
+
return 0
|
| 128 |
+
value, unit = float(match.group(1)), match.group(2).upper()
|
| 129 |
+
multipliers = {"B": 1, "KB": 1024, "MB": 1024**2, "GB": 1024**3, "TB": 1024**4}
|
| 130 |
+
return int(value * multipliers.get(unit, 1))
|
| 131 |
+
|
| 132 |
+
|
| 133 |
def get_resolution_priority(stream_name: str) -> int:
|
| 134 |
resolution_map = {
|
| 135 |
"2160p": 2160, "4k": 2160, "uhd": 2160,
|
|
|
|
| 439 |
stream_name = f"🌐 GLOBAL {r['quality']}"
|
| 440 |
stream_title = f"{stream_title}\n📡 {r['source_chat']}"
|
| 441 |
url = f"{SettingsManager.current().base_url}/dl/{token}/{r['token']}/{quote(r['title'])}"
|
| 442 |
+
size_bytes = parse_size_to_bytes(r.get("size", ""))
|
| 443 |
+
streams.append({"name": stream_name, "title": stream_title, "url": url, "size_bytes": size_bytes})
|
| 444 |
return streams
|
| 445 |
|
| 446 |
|
|
|
|
| 550 |
filename = quality.get("name", "")
|
| 551 |
quality_str = quality.get("quality", "HD")
|
| 552 |
size = quality.get("size", "")
|
| 553 |
+
size_bytes = parse_size_to_bytes(size)
|
| 554 |
|
| 555 |
stream_name, stream_title = format_stream_details(
|
| 556 |
filename, quality_str, size, is_split=bool(quality.get("group_key"))
|
|
|
|
| 563 |
streams.append({
|
| 564 |
"name": f"{stream_name} (Proxy)",
|
| 565 |
"title": stream_title,
|
| 566 |
+
"url": proxy_url,
|
| 567 |
+
"size_bytes": size_bytes
|
| 568 |
})
|
| 569 |
streams.append({
|
| 570 |
"name": f"{stream_name} (Direct)",
|
| 571 |
"title": stream_title,
|
| 572 |
+
"url": original_url,
|
| 573 |
+
"size_bytes": size_bytes
|
| 574 |
})
|
| 575 |
elif proxy_url:
|
| 576 |
streams.append({
|
| 577 |
"name": stream_name,
|
| 578 |
"title": stream_title,
|
| 579 |
+
"url": proxy_url,
|
| 580 |
+
"size_bytes": size_bytes
|
| 581 |
})
|
| 582 |
else:
|
| 583 |
streams.append({
|
| 584 |
"name": stream_name,
|
| 585 |
"title": stream_title,
|
| 586 |
+
"url": original_url,
|
| 587 |
+
"size_bytes": size_bytes
|
| 588 |
})
|
| 589 |
elif is_global_search_enabled():
|
| 590 |
try:
|
|
|
|
| 598 |
return {"streams": []}
|
| 599 |
|
| 600 |
streams.sort(
|
| 601 |
+
key=lambda s: (get_resolution_priority(s.get("name", "")), s.get("size_bytes", 0)),
|
| 602 |
reverse=True
|
| 603 |
)
|
| 604 |
name_count: dict = {}
|
pyproject.toml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
[project]
|
| 2 |
name = "Telegram-Stremio"
|
| 3 |
-
version = "4.0.
|
| 4 |
description = "A powerful, self-hosted Telegram Stremio Media Server built with FastAPI, MongoDB, and PyroFork seamlessly integrated with Stremio for automated media streaming and discovery."
|
| 5 |
readme = "README.md"
|
| 6 |
requires-python = ">=3.11"
|
|
|
|
| 1 |
[project]
|
| 2 |
name = "Telegram-Stremio"
|
| 3 |
+
version = "4.0.1"
|
| 4 |
description = "A powerful, self-hosted Telegram Stremio Media Server built with FastAPI, MongoDB, and PyroFork seamlessly integrated with Stremio for automated media streaming and discovery."
|
| 5 |
readme = "README.md"
|
| 6 |
requires-python = ">=3.11"
|
uv.lock
CHANGED
|
@@ -1076,7 +1076,7 @@ wheels = [
|
|
| 1076 |
|
| 1077 |
[[package]]
|
| 1078 |
name = "telegram-stremio"
|
| 1079 |
-
version = "4.0.
|
| 1080 |
source = { virtual = "." }
|
| 1081 |
dependencies = [
|
| 1082 |
{ name = "aiofiles" },
|
|
|
|
| 1076 |
|
| 1077 |
[[package]]
|
| 1078 |
name = "telegram-stremio"
|
| 1079 |
+
version = "4.0.1"
|
| 1080 |
source = { virtual = "." }
|
| 1081 |
dependencies = [
|
| 1082 |
{ name = "aiofiles" },
|