sancez1905
Üye
Merhaba arkadaşlar ben yaklaşık 7-8 aydır bir bot kullanıyordum vavoo yayınları için fakat bugun itibari ile artık çalışmıyor yayınları çekemiyorum sunucuya yardımcı olabilecek biri varmı ? gerekirse ücretiyle.
benimde worker hesabimda artik islemiyor vavoo ama normal listelerde calisiyor yani kendi orjinal listesi hatta dunku derby ordan izledim ilk yariyi ne takilma ne donma olduBilemiyorum ki inan acaba benim sunucu ile alakalı mi ?
Rica etsem yollar misin ?benimde worker hesabimda artik islemiyor vavoo ama normal listelerde calisiyor yani kendi orjinal listesi hatta dunku derby ordan izledim ilk yariyi ne takilma ne donma oldu
Kusura bakmayin, size dönüş yapmayı unuttum. Vavoo listesi halen aktif bir şekilde çekiliyor benim sistemimde. Sizinle kodlarımi paylaşayım, bir farklılık var mi kontrol edebilirsiniz. Gerçi benim worker degil ama mantik ayni.Güncel.
Vavoo için benlede paylaşabilir misinizKusura bakmayin, size dönüş yapmayı unuttum. Vavoo listesi halen aktif bir şekilde çekiliyor benim sistemimde. Sizinle kodlarımi paylaşayım, bir farklılık var mi kontrol edebilirsiniz. Gerçi benim worker degil ama mantik ayni.
Hocam valla cok makbule geçerKusura bakmayin, size dönüş yapmayı unuttum. Vavoo listesi halen aktif bir şekilde çekiliyor benim sistemimde. Sizinle kodlarımi paylaşayım, bir farklılık var mi kontrol edebilirsiniz. Gerçi benim worker degil ama mantik ayni.
bunun nereye yapıştırıcaz aabaselamlar arkadaşlar, benim sunucu üzeirnden çalıştırdığım kod aşağıdadır, umarım yardımcı olur. eğer takıldığınız yer olursa akşam saatlerinde detaylı anlatım da yapabilirim
import os
import sys
import time
import uuid
import re
import shutil
import argparse
import subprocess
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor
import requests
if hasattr(sys.stdout, 'reconfigure'):
sys.stdout.reconfigure(encoding='utf-8', line_buffering=True)
if hasattr(sys.stderr, 'reconfigure'):
sys.stderr.reconfigure(encoding='utf-8', line_buffering=True)
OUTPUT_FILE = "kanallar6.m3u8"
GITLAB_TARGET_REPO = "Bağlantı linkini görmek için giriş yapın veya kayıt olun."
SERVER_LISTELER_DIR = "/opt/scraper-engine/listeler"
BROWSER_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36"
CLIENT_VERSION = "3.1.4"
DEFAULT_GROUPS = [
"Turkey",
"Germany",
"United Kingdom",
"France",
"Italy",
"Spain",
"Arabia",
"Balkans",
"Russia",
"Poland",
"Portugal",
"Netherlands",
"Albania",
"Romania",
"Bulgaria"
]
def get_auth_signature(max_retries=3):
"""
vypn.net / vavoo.tv üzerinden MediaHubMX imzasını alır.
"""
ping_urls = [
"Bağlantı linkini görmek için giriş yapın veya kayıt olun.",
"Bağlantı linkini görmek için giriş yapın veya kayıt olun.",
"Bağlantı linkini görmek için giriş yapın veya kayıt olun."
]
uid = str(uuid.uuid4())
ts = int(time.time() * 1000)
payload = {
"reason": "app-focus",
"locale": "en",
"theme": "dark",
"metadata": {
"device": {"type": "desktop", "uniqueId": uid},
"os": {"name": "win32", "version": "Windows 10 Pro", "abis": ["x64"], "host": "Lenovo"},
"app": {"platform": "electron"},
"version": {"package": "net.vypn.app", "binary": "3.1.0", "js": "3.1.0"}
},
"appFocusTime": 0,
"playerActive": False,
"playDuration": 0,
"devMode": False,
"hasAddon": True,
"castConnected": False,
"package": "net.vypn.app",
"version": "3.1.0",
"process": "app",
"firstAppStart": ts,
"lastAppStart": ts,
"ipLocation": None,
"adblockEnabled": True,
"proxy": {"supported": ["ss"], "engine": "Mu", "enabled": False, "autoServer": True},
"iap": {"supported": False}
}
headers = {
"User-Agent": BROWSER_UA,
"Accept": "*/*",
"Content-Type": "application/json; charset=utf-8"
}
for attempt in range(1, max_retries + 1):
for url in ping_urls:
try:
r = requests.post(url, json=payload, headers=headers, timeout=10)
if r.status_code == 200:
data = r.json()
sig = data.get("sig") or data.get("addonSig") or data.get("signature") or data.get("token")
if sig:
print(f"Başarıyla MediaHubMX imzası alındı: {sig[:20]}...")
return sig
except Exception:
continue
if attempt < max_retries:
time.sleep(1)
print("İmza alınamadı, imzasız devam edilecek...")
return None
def clean_channel_name(raw_name):
"""
Kanal isimlerindeki gereksiz teknik uzantıları (.s, .c, .b, (1), vb.) temizler.
Örn: 'TRT 1 HD .c' -> 'TRT 1 HD', '24 .s' -> '24'
"""
if not raw_name:
return "İsimsiz Kanal"
name = re.sub(r'\s*(\.[a-zA-Z0-9]{1,3})+$', '', raw_name)
name = re.sub(r'\s*\((?:\d+|[A-Za-z]{1,3})\)\s*$', '', name)
name = re.sub(r'\s+', ' ', name).strip()
return name if name else raw_name.strip()
def fetch_group_channels(group_name, signature, domain="vavoo.to"):
"""
Belirli bir ülke grubunun tüm sayfalarını mediahubmx-catalog API'si üzerinden çeker.
"""
catalog_url = f"https://{domain}/mediahubmx-catalog.json"
session = requests.Session()
headers = {
"User-Agent": BROWSER_UA,
"Accept": "application/json",
"Accept-Language": "de",
"Content-Type": "application/json; charset=utf-8"
}
if signature:
headers["mediahubmx-signature"] = signature
session.headers.update(headers)
channels = []
cursor = 0
max_pages = 20
for _ in range(max_pages):
body = {
"language": "de",
"region": "AT",
"catalogId": "iptv",
"id": "iptv",
"*****": False,
"search": "",
"sort": "name",
"filter": {"group": group_name},
"cursor": cursor,
"clientVersion": CLIENT_VERSION
}
try:
r = session.post(catalog_url, json=body, timeout=15)
if r.status_code != 200:
break
data = r.json()
items = data.get("items", [])
if not items:
break
for itm in items:
raw_name = itm.get("name", "")
clean_name = clean_channel_name(raw_name)
# Kanal id ve oynatma linki
chid = ""
if isinstance(itm.get("ids"), dict):
chid = itm["ids"].get("id", "")
if not chid:
chid = itm.get("id", "")
url = itm.get("url") or itm.get("play") or ""
if not url and chid:
url = f"Bağlantı linkini görmek için giriş yapın veya kayıt olun.{chid}"
elif url and "/play/" in url and "/vavoo-iptv/" not in url:
url = re.sub(r'https?://[^/]+/play/', 'Bağlantı linkini görmek için giriş yapın veya kayıt olun.', url)
if not url:
continue
# Logo tespiti
images = itm.get("images", {}) if isinstance(itm.get("images"), dict) else {}
logo = images.get("logo") or images.get("poster") or itm.get("logo") or itm.get("poster") or ""
tvg_id = ""
if isinstance(itm.get("ids"), dict):
tvg_id = itm["ids"].get("tvg", "")
channels.append({
"name": clean_name,
"raw_name": raw_name,
"url": url,
"group": group_name,
"logo": logo,
"tvg_id": tvg_id
})
cursor = data.get("nextCursor")
if not cursor or cursor == 0:
break
except Exception as e:
print(f"[{group_name}] Sayfa çekme hatası: {e}")
break
return group_name, channels
def fetch_all_vavoo_channels(groups=None):
"""
Tüm grupları paralel olarak çeker ve düzenler.
"""
if not groups:
groups = DEFAULT_GROUPS
sig = get_auth_signature()
print(f"Vavoo / MediaHub kanalları çekiliyor ({len(groups)} grup)...")
start_time = time.time()
all_channels_by_group = {}
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(fetch_group_channels, g, sig) for g in groups]
for f in futures:
group_name, ch_list = f.result()
all_channels_by_group[group_name] = ch_list
print(f"[{group_name:15}]: {len(ch_list):4d} kanal")
# Türkiye'yi ilk sıraya al, kalanları gruplar sırasına göre ekle
sorted_channels = []
if "Turkey" in all_channels_by_group:
sorted_channels.extend(all_channels_by_group["Turkey"])
for g in groups:
if g != "Turkey" and g in all_channels_by_group:
sorted_channels.extend(all_channels_by_group[g])
duration = round(time.time() - start_time, 2)
print(f"Toplam {len(sorted_channels)} kanal {duration} saniyede başarıyla toplandı.")
return sorted_channels
def generate_m3u8(channels, output_file):
"""
Kanalları standart M3U8 formatında kaydeder.
"""
lines = [
"#EXTM3U",
f"#EXT-X-USER-AGENT:{BROWSER_UA}",
"#EXT-X-REFERER:Bağlantı linkini görmek için giriş yapın veya kayıt olun.",
"#EXT-X-ORIGIN:Bağlantı linkini görmek için giriş yapın veya kayıt olun."
]
for ch in channels:
logo_part = f' tvg-logo="{ch["logo"]}"' if ch["logo"] else ""
tvg_id_part = f' tvg-id="{ch["tvg_id"]}"' if ch["tvg_id"] else ""
extinf = f'#EXTINF:-1{tvg_id_part} tvg-name="{ch["name"]}"{logo_part} group-title="{ch["group"]}",{ch["name"]}'
lines.append(extinf)
lines.append(ch["url"])
content = "\n".join(lines) + "\n"
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"'{output_file}' dosyasına kaydedildi ({len(channels)} kanal, {round(len(content.encode('utf-8')) / 1024, 1)} KB).")
def push_to_gitlab(output_file, token=None):
"""
kanallar6.m3u8 dosyasını GitLab listeler reposuna aktarır.
"""
# 1. Sunucu yerel /opt/scraper-engine/listeler deposu kontrolü
if os.path.isdir(SERVER_LISTELER_DIR):
print(f"Sunucu listeler deposu bulundu: {SERVER_LISTELER_DIR}")
try:
dest_file = os.path.join(SERVER_LISTELER_DIR, os.path.basename(output_file))
shutil.copy2(output_file, dest_file)
subprocess.run(["git", "add", os.path.basename(output_file)], cwd=SERVER_LISTELER_DIR, check=True)
diff_res = subprocess.run(["git", "diff", "--staged", "--quiet"], cwd=SERVER_LISTELER_DIR)
if diff_res.returncode == 0:
print("GitLab reposunda içerik değişmedi, yeni commit atılmadı.")
else:
now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
commit_msg = f"Auto-update {os.path.basename(output_file)} [{now_str}]"
subprocess.run(["git", "commit", "-m", commit_msg], cwd=SERVER_LISTELER_DIR, check=True)
push_res = subprocess.run(["git", "push", "origin", "main"], cwd=SERVER_LISTELER_DIR, capture_output=True, text=True)
if push_res.returncode == 0:
print("GitLab listeler reposuna başarıyla push edildi (origin/main)!")
else:
print(f"Git push hatası: {push_res.stderr}")
return False
return True
except Exception as e:
print(f"Sunucu yerel repo aktarımı hatası: {e}")
return False
# 2. Harici ortam (Token ile geçici klonlama)
gitlab_token = token or os.environ.get("GITLAB_TOKEN")
if not gitlab_token:
print("GITLAB_TOKEN ortam değişkeni bulunamadı. GitLab'a otomatik push atlanıyor.")
return False
auth_repo_url = GITLAB_TARGET_REPO.replace("https://", f"Bağlantı linkini görmek için giriş yapın veya kayıt olun.:{gitlab_token}@")
temp_dir = "temp_gitlab_listeler_trvip6"
print(f"GitLab reposuna aktarılıyor: {GITLAB_TARGET_REPO}")
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir, ignore_errors=True)
try:
subprocess.run(["git", "clone", "--depth", "1", auth_repo_url, temp_dir], check=True, timeout=60)
dest_file = os.path.join(temp_dir, os.path.basename(output_file))
shutil.copy2(output_file, dest_file)
cwd = temp_dir
subprocess.run(["git", "config", "user.name", "trvip6-bot"], cwd=cwd, check=True)
subprocess.run(["git", "config", "user.email", "[email protected]"], cwd=cwd, check=True)
subprocess.run(["git", "add", os.path.basename(output_file)], cwd=cwd, check=True)
diff_res = subprocess.run(["git", "diff", "--staged", "--quiet"], cwd=cwd)
if diff_res.returncode == 0:
print("GitLab reposunda içerik değişmedi, yeni commit atılmadı.")
else:
now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
commit_msg = f"Auto-update {os.path.basename(output_file)} [{now_str}]"
subprocess.run(["git", "commit", "-m", commit_msg], cwd=cwd, check=True)
subprocess.run(["git", "push", "origin", "main"], cwd=cwd, check=True, timeout=60)
print("GitLab reposuna başarıyla push edildi (origin/main)!")
return True
except Exception as e:
print(f"GitLab push sırasında hata oluştu: {e}")
return False
finally:
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir, ignore_errors=True)
def main():
parser = argparse.ArgumentParser(description="trvip6: Vavoo MediaHub M3U8 Kazıyıcı")
parser.add_argument("--output", default=OUTPUT_FILE, help="Çıktı M3U8 dosya adı (varsayılan: kanallar6.m3u8)")
parser.add_argument("--push", action="store_true", help="GitLab listeler reposuna otomatik push et")
parser.add_argument("--token", default=None, help="GitLab Access Token")
args = parser.parse_args()
print("\n" + "=" * 65)
print(f"TRVIP6 (VAVOO MEDIAHUB) KAZIMA BAŞLADI: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 65)
channels = fetch_all_vavoo_channels()
if not channels:
print("Hiçbir kanal çekilemedi!")
sys.exit(1)
generate_m3u8(channels, args.output)
# Geriye dönük uyumluluk için vavoo_kanallar.m3u8 olarak da bir kopya tut
if args.output == OUTPUT_FILE:
shutil.copy2(args.output, "vavoo_kanallar.m3u8")
if args.push:
push_to_gitlab(args.output, token=args.token)
print(f"İşlem başarıyla tamamlandı! [{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}]\n")
if __name__ == "__main__":
main()
teşekkürlerselamlar arkadaşlar, benim sunucu üzeirnden çalıştırdığım kod aşağıdadır, umarım yardımcı olur. eğer takıldığınız yer olursa akşam saatlerinde detaylı anlatım da yapabilirim
import os
import sys
import time
import uuid
import re
import shutil
import argparse
import subprocess
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor
import requests
if hasattr(sys.stdout, 'reconfigure'):
sys.stdout.reconfigure(encoding='utf-8', line_buffering=True)
if hasattr(sys.stderr, 'reconfigure'):
sys.stderr.reconfigure(encoding='utf-8', line_buffering=True)
OUTPUT_FILE = "kanallar6.m3u8"
GITLAB_TARGET_REPO = "Bağlantı linkini görmek için giriş yapın veya kayıt olun."
SERVER_LISTELER_DIR = "/opt/scraper-engine/listeler"
BROWSER_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36"
CLIENT_VERSION = "3.1.4"
DEFAULT_GROUPS = [
"Turkey",
"Germany",
"United Kingdom",
"France",
"Italy",
"Spain",
"Arabia",
"Balkans",
"Russia",
"Poland",
"Portugal",
"Netherlands",
"Albania",
"Romania",
"Bulgaria"
]
def get_auth_signature(max_retries=3):
"""
vypn.net / vavoo.tv üzerinden MediaHubMX imzasını alır.
"""
ping_urls = [
"Bağlantı linkini görmek için giriş yapın veya kayıt olun.",
"Bağlantı linkini görmek için giriş yapın veya kayıt olun.",
"Bağlantı linkini görmek için giriş yapın veya kayıt olun."
]
uid = str(uuid.uuid4())
ts = int(time.time() * 1000)
payload = {
"reason": "app-focus",
"locale": "en",
"theme": "dark",
"metadata": {
"device": {"type": "desktop", "uniqueId": uid},
"os": {"name": "win32", "version": "Windows 10 Pro", "abis": ["x64"], "host": "Lenovo"},
"app": {"platform": "electron"},
"version": {"package": "net.vypn.app", "binary": "3.1.0", "js": "3.1.0"}
},
"appFocusTime": 0,
"playerActive": False,
"playDuration": 0,
"devMode": False,
"hasAddon": True,
"castConnected": False,
"package": "net.vypn.app",
"version": "3.1.0",
"process": "app",
"firstAppStart": ts,
"lastAppStart": ts,
"ipLocation": None,
"adblockEnabled": True,
"proxy": {"supported": ["ss"], "engine": "Mu", "enabled": False, "autoServer": True},
"iap": {"supported": False}
}
headers = {
"User-Agent": BROWSER_UA,
"Accept": "*/*",
"Content-Type": "application/json; charset=utf-8"
}
for attempt in range(1, max_retries + 1):
for url in ping_urls:
try:
r = requests.post(url, json=payload, headers=headers, timeout=10)
if r.status_code == 200:
data = r.json()
sig = data.get("sig") or data.get("addonSig") or data.get("signature") or data.get("token")
if sig:
print(f"Başarıyla MediaHubMX imzası alındı: {sig[:20]}...")
return sig
except Exception:
continue
if attempt < max_retries:
time.sleep(1)
print("İmza alınamadı, imzasız devam edilecek...")
return None
def clean_channel_name(raw_name):
"""
Kanal isimlerindeki gereksiz teknik uzantıları (.s, .c, .b, (1), vb.) temizler.
Örn: 'TRT 1 HD .c' -> 'TRT 1 HD', '24 .s' -> '24'
"""
if not raw_name:
return "İsimsiz Kanal"
name = re.sub(r'\s*(\.[a-zA-Z0-9]{1,3})+$', '', raw_name)
name = re.sub(r'\s*\((?:\d+|[A-Za-z]{1,3})\)\s*$', '', name)
name = re.sub(r'\s+', ' ', name).strip()
return name if name else raw_name.strip()
def fetch_group_channels(group_name, signature, domain="vavoo.to"):
"""
Belirli bir ülke grubunun tüm sayfalarını mediahubmx-catalog API'si üzerinden çeker.
"""
catalog_url = f"https://{domain}/mediahubmx-catalog.json"
session = requests.Session()
headers = {
"User-Agent": BROWSER_UA,
"Accept": "application/json",
"Accept-Language": "de",
"Content-Type": "application/json; charset=utf-8"
}
if signature:
headers["mediahubmx-signature"] = signature
session.headers.update(headers)
channels = []
cursor = 0
max_pages = 20
for _ in range(max_pages):
body = {
"language": "de",
"region": "AT",
"catalogId": "iptv",
"id": "iptv",
"*****": False,
"search": "",
"sort": "name",
"filter": {"group": group_name},
"cursor": cursor,
"clientVersion": CLIENT_VERSION
}
try:
r = session.post(catalog_url, json=body, timeout=15)
if r.status_code != 200:
break
data = r.json()
items = data.get("items", [])
if not items:
break
for itm in items:
raw_name = itm.get("name", "")
clean_name = clean_channel_name(raw_name)
# Kanal id ve oynatma linki
chid = ""
if isinstance(itm.get("ids"), dict):
chid = itm["ids"].get("id", "")
if not chid:
chid = itm.get("id", "")
url = itm.get("url") or itm.get("play") or ""
if not url and chid:
url = f"Bağlantı linkini görmek için giriş yapın veya kayıt olun.{chid}"
elif url and "/play/" in url and "/vavoo-iptv/" not in url:
url = re.sub(r'https?://[^/]+/play/', 'Bağlantı linkini görmek için giriş yapın veya kayıt olun.', url)
if not url:
continue
# Logo tespiti
images = itm.get("images", {}) if isinstance(itm.get("images"), dict) else {}
logo = images.get("logo") or images.get("poster") or itm.get("logo") or itm.get("poster") or ""
tvg_id = ""
if isinstance(itm.get("ids"), dict):
tvg_id = itm["ids"].get("tvg", "")
channels.append({
"name": clean_name,
"raw_name": raw_name,
"url": url,
"group": group_name,
"logo": logo,
"tvg_id": tvg_id
})
cursor = data.get("nextCursor")
if not cursor or cursor == 0:
break
except Exception as e:
print(f"[{group_name}] Sayfa çekme hatası: {e}")
break
return group_name, channels
def fetch_all_vavoo_channels(groups=None):
"""
Tüm grupları paralel olarak çeker ve düzenler.
"""
if not groups:
groups = DEFAULT_GROUPS
sig = get_auth_signature()
print(f"Vavoo / MediaHub kanalları çekiliyor ({len(groups)} grup)...")
start_time = time.time()
all_channels_by_group = {}
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(fetch_group_channels, g, sig) for g in groups]
for f in futures:
group_name, ch_list = f.result()
all_channels_by_group[group_name] = ch_list
print(f"[{group_name:15}]: {len(ch_list):4d} kanal")
# Türkiye'yi ilk sıraya al, kalanları gruplar sırasına göre ekle
sorted_channels = []
if "Turkey" in all_channels_by_group:
sorted_channels.extend(all_channels_by_group["Turkey"])
for g in groups:
if g != "Turkey" and g in all_channels_by_group:
sorted_channels.extend(all_channels_by_group[g])
duration = round(time.time() - start_time, 2)
print(f"Toplam {len(sorted_channels)} kanal {duration} saniyede başarıyla toplandı.")
return sorted_channels
def generate_m3u8(channels, output_file):
"""
Kanalları standart M3U8 formatında kaydeder.
"""
lines = [
"#EXTM3U",
f"#EXT-X-USER-AGENT:{BROWSER_UA}",
"#EXT-X-REFERER:Bağlantı linkini görmek için giriş yapın veya kayıt olun.",
"#EXT-X-ORIGIN:Bağlantı linkini görmek için giriş yapın veya kayıt olun."
]
for ch in channels:
logo_part = f' tvg-logo="{ch["logo"]}"' if ch["logo"] else ""
tvg_id_part = f' tvg-id="{ch["tvg_id"]}"' if ch["tvg_id"] else ""
extinf = f'#EXTINF:-1{tvg_id_part} tvg-name="{ch["name"]}"{logo_part} group-title="{ch["group"]}",{ch["name"]}'
lines.append(extinf)
lines.append(ch["url"])
content = "\n".join(lines) + "\n"
with open(output_file, "w", encoding="utf-8") as f:
f.write(content)
print(f"'{output_file}' dosyasına kaydedildi ({len(channels)} kanal, {round(len(content.encode('utf-8')) / 1024, 1)} KB).")
def push_to_gitlab(output_file, token=None):
"""
kanallar6.m3u8 dosyasını GitLab listeler reposuna aktarır.
"""
# 1. Sunucu yerel /opt/scraper-engine/listeler deposu kontrolü
if os.path.isdir(SERVER_LISTELER_DIR):
print(f"Sunucu listeler deposu bulundu: {SERVER_LISTELER_DIR}")
try:
dest_file = os.path.join(SERVER_LISTELER_DIR, os.path.basename(output_file))
shutil.copy2(output_file, dest_file)
subprocess.run(["git", "add", os.path.basename(output_file)], cwd=SERVER_LISTELER_DIR, check=True)
diff_res = subprocess.run(["git", "diff", "--staged", "--quiet"], cwd=SERVER_LISTELER_DIR)
if diff_res.returncode == 0:
print("GitLab reposunda içerik değişmedi, yeni commit atılmadı.")
else:
now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
commit_msg = f"Auto-update {os.path.basename(output_file)} [{now_str}]"
subprocess.run(["git", "commit", "-m", commit_msg], cwd=SERVER_LISTELER_DIR, check=True)
push_res = subprocess.run(["git", "push", "origin", "main"], cwd=SERVER_LISTELER_DIR, capture_output=True, text=True)
if push_res.returncode == 0:
print("GitLab listeler reposuna başarıyla push edildi (origin/main)!")
else:
print(f"Git push hatası: {push_res.stderr}")
return False
return True
except Exception as e:
print(f"Sunucu yerel repo aktarımı hatası: {e}")
return False
# 2. Harici ortam (Token ile geçici klonlama)
gitlab_token = token or os.environ.get("GITLAB_TOKEN")
if not gitlab_token:
print("GITLAB_TOKEN ortam değişkeni bulunamadı. GitLab'a otomatik push atlanıyor.")
return False
auth_repo_url = GITLAB_TARGET_REPO.replace("https://", f"Bağlantı linkini görmek için giriş yapın veya kayıt olun.:{gitlab_token}@")
temp_dir = "temp_gitlab_listeler_trvip6"
print(f"GitLab reposuna aktarılıyor: {GITLAB_TARGET_REPO}")
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir, ignore_errors=True)
try:
subprocess.run(["git", "clone", "--depth", "1", auth_repo_url, temp_dir], check=True, timeout=60)
dest_file = os.path.join(temp_dir, os.path.basename(output_file))
shutil.copy2(output_file, dest_file)
cwd = temp_dir
subprocess.run(["git", "config", "user.name", "trvip6-bot"], cwd=cwd, check=True)
subprocess.run(["git", "config", "user.email", "[email protected]"], cwd=cwd, check=True)
subprocess.run(["git", "add", os.path.basename(output_file)], cwd=cwd, check=True)
diff_res = subprocess.run(["git", "diff", "--staged", "--quiet"], cwd=cwd)
if diff_res.returncode == 0:
print("GitLab reposunda içerik değişmedi, yeni commit atılmadı.")
else:
now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
commit_msg = f"Auto-update {os.path.basename(output_file)} [{now_str}]"
subprocess.run(["git", "commit", "-m", commit_msg], cwd=cwd, check=True)
subprocess.run(["git", "push", "origin", "main"], cwd=cwd, check=True, timeout=60)
print("GitLab reposuna başarıyla push edildi (origin/main)!")
return True
except Exception as e:
print(f"GitLab push sırasında hata oluştu: {e}")
return False
finally:
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir, ignore_errors=True)
def main():
parser = argparse.ArgumentParser(description="trvip6: Vavoo MediaHub M3U8 Kazıyıcı")
parser.add_argument("--output", default=OUTPUT_FILE, help="Çıktı M3U8 dosya adı (varsayılan: kanallar6.m3u8)")
parser.add_argument("--push", action="store_true", help="GitLab listeler reposuna otomatik push et")
parser.add_argument("--token", default=None, help="GitLab Access Token")
args = parser.parse_args()
print("\n" + "=" * 65)
print(f"TRVIP6 (VAVOO MEDIAHUB) KAZIMA BAŞLADI: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 65)
channels = fetch_all_vavoo_channels()
if not channels:
print("Hiçbir kanal çekilemedi!")
sys.exit(1)
generate_m3u8(channels, args.output)
# Geriye dönük uyumluluk için vavoo_kanallar.m3u8 olarak da bir kopya tut
if args.output == OUTPUT_FILE:
shutil.copy2(args.output, "vavoo_kanallar.m3u8")
if args.push:
push_to_gitlab(args.output, token=args.token)
print(f"İşlem başarıyla tamamlandı! [{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}]\n")
if __name__ == "__main__":
main()
Bu bana ait bir kod, konu açan arkadaşa yardim olmak amaciyla gonderdim, birebir alip yapistirinca calismaz.bunun nereye yapıştırıcaz aaba