Spaces:
Running
Running
| #!/usr/bin/env python3 | |
| """ | |
| Skrypt do pobierania listy gier ze SteamSpy i zapisywania do MongoDB. | |
| Pobiera wszystkie gry dostępne w SteamSpy API (~85,000 gier) | |
| i zapisuje je do kolekcji 'games' w MongoDB. | |
| Uruchom z głównego katalogu projektu: | |
| python scripts/fetch_games_to_mongodb.py | |
| Wymaga uruchomionego MongoDB i ustawionych zmiennych środowiskowych. | |
| """ | |
| import asyncio | |
| import sys | |
| import time | |
| from pathlib import Path | |
| import httpx | |
| # Dodaj backend do path | |
| sys.path.insert(0, str(Path(__file__).parent.parent / "backend")) | |
| from app.db.mongodb import mongodb | |
| STEAMSPY_API = "https://steamspy.com/api.php" | |
| MAX_PAGES = 90 # ~90,000 gier | |
| DELAY_SECONDS = 1.0 # Opóźnienie między zapytaniami | |
| BATCH_SIZE = 1000 # Zapisuj do MongoDB co tyle gier | |
| def fetch_page_sync(client: httpx.Client, page: int) -> list[dict]: | |
| """Pobiera jedną stronę gier ze SteamSpy (synchronicznie).""" | |
| params = {"request": "all", "page": page} | |
| try: | |
| response = client.get(STEAMSPY_API, params=params, timeout=30) | |
| response.raise_for_status() | |
| data = response.json() | |
| if not data or not isinstance(data, dict): | |
| return [] | |
| # Wyciągnij appid, name, developer, publisher | |
| games = [] | |
| for info in data.values(): | |
| if not isinstance(info, dict) or not info.get("name"): | |
| continue | |
| game = { | |
| "appid": str(info["appid"]), | |
| "name": info["name"], | |
| } | |
| # Dodaj developer jeśli istnieje | |
| if info.get("developer"): | |
| game["developer"] = info["developer"] | |
| # Dodaj publisher jeśli istnieje i różny od developer | |
| if info.get("publisher") and info.get("publisher") != info.get("developer"): | |
| game["publisher"] = info["publisher"] | |
| games.append(game) | |
| return games | |
| except Exception as e: | |
| print(f" Błąd na stronie {page}: {e}") | |
| return [] | |
| async def main(): | |
| """Główna funkcja - pobiera gry i zapisuje do MongoDB.""" | |
| print("=" * 60) | |
| print("Pobieranie listy gier ze SteamSpy do MongoDB") | |
| print("=" * 60) | |
| print() | |
| # Połącz z MongoDB | |
| print("Łączenie z MongoDB...") | |
| try: | |
| await mongodb.connect() | |
| except Exception as e: | |
| print(f"Błąd połączenia z MongoDB: {e}") | |
| print("Upewnij się, że MongoDB jest uruchomione i zmienne środowiskowe są ustawione.") | |
| return | |
| # Sprawdź czy już są gry w bazie | |
| existing_count = await mongodb.get_games_count() | |
| if existing_count > 0: | |
| print(f"W bazie jest już {existing_count} gier.") | |
| response = input("Czy usunąć istniejące i pobrać nowe? (t/n): ").strip().lower() | |
| if response != "t": | |
| print("Anulowano.") | |
| await mongodb.disconnect() | |
| return | |
| await mongodb.clear_games() | |
| print("Usunięto istniejące gry.") | |
| print() | |
| print(f"Pobieranie maksymalnie {MAX_PAGES} stron po ~1000 gier każda...") | |
| print(f"Opóźnienie między zapytaniami: {DELAY_SECONDS}s") | |
| print() | |
| all_games: list[dict] = [] | |
| total_saved = 0 | |
| with httpx.Client() as client: | |
| for page in range(MAX_PAGES): | |
| print(f"Strona {page + 1}/{MAX_PAGES}...", end=" ", flush=True) | |
| games = fetch_page_sync(client, page) | |
| if not games: | |
| print("Pusta - koniec danych") | |
| break | |
| all_games.extend(games) | |
| print(f"OK ({len(games)} gier, łącznie: {len(all_games)})") | |
| # Zapisuj do MongoDB co BATCH_SIZE gier | |
| if len(all_games) >= BATCH_SIZE: | |
| saved = await mongodb.save_games_batch(all_games) | |
| total_saved += saved | |
| all_games = [] | |
| print(f" -> Zapisano do MongoDB (łącznie: {total_saved})") | |
| # Opóźnienie | |
| if page < MAX_PAGES - 1: | |
| time.sleep(DELAY_SECONDS) | |
| # Zapisz pozostałe gry | |
| if all_games: | |
| saved = await mongodb.save_games_batch(all_games) | |
| total_saved += saved | |
| print(f" -> Zapisano pozostałe do MongoDB") | |
| # Podsumowanie | |
| final_count = await mongodb.get_games_count() | |
| print() | |
| print("=" * 60) | |
| print(f"Zakończono!") | |
| print(f"Gier w bazie: {final_count}") | |
| print("=" * 60) | |
| await mongodb.disconnect() | |
| if __name__ == "__main__": | |
| asyncio.run(main()) | |