Karan Adhikari commited on
Commit
e84d5c8
·
unverified ·
1 Parent(s): 7ef97b4

* Sort stream by size

Backend/__init__.py CHANGED
@@ -13,4 +13,4 @@ StartTime = time()
13
  USE_DEFAULT_ID: str = None
14
  db = Database()
15
 
16
- __version__ = "4.0.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
- streams.append({"name": stream_name, "title": stream_title, "url": url})
 
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.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.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" },