import urllib.parse import os import requests import redis import xml.etree.ElementTree as ET import re from flask import request, Response PROXY_URL = os.getenv("PROXY_URL") REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/0") CACHE_TTL = int(os.getenv("CACHE_TTL", 3600)) rdb = redis.from_url(REDIS_URL) def extract_viewtopic_link(description): """Search viewtopic.php in description""" match = re.search(r'href="(http://tapochek\.net/viewtopic\.php\?t=\d+)"', description) return match.group(1) if match else None def init_proxy(app): @app.route("/proxy") def proxy(): """Proxy RSS feed with per-item caching and GUID replacement.""" raw_query = request.query_string.decode() if raw_query.startswith("url="): url = urllib.parse.unquote(raw_query[4:]) else: return "Missing URL", 400 try: proxies = {"http": PROXY_URL, "https": PROXY_URL} if PROXY_URL else None r = requests.get(url, timeout=10, proxies=proxies) _encode = r.apparent_encoding.lower() r.encoding = _encode xml_data = r.text.replace(f'', '') root = ET.fromstring(xml_data) items = root.findall(".//item") cached_items = [] new_items = [] for item in items: guid = item.find("guid") if guid is None or guid.get("isPermaLink") == "true": continue cache_key = f"rss:item:{guid.text}" cached_item = rdb.get(cache_key) if cached_item: cached_items.append(cached_item.decode()) else: description = item.find("description") if description is not None: new_guid = extract_viewtopic_link(description.text) if new_guid: guid.text = new_guid item_str = ET.tostring(item, encoding="unicode") rdb.setex(cache_key, CACHE_TTL, item_str) new_items.append(item_str) final_items = cached_items + new_items response_xml = f'{"".join(final_items)}' return Response(response_xml, content_type="application/xml; charset=utf-8") except Exception as e: return f"Error: {e}", 500