← सभी गाइड

सीज़न कैलेंडर, अगली रेस और नतीजे

Python में अगली रेस काउंटडाउन वाला रेस कैलेंडर और हर राउंड का नतीजा पेज बनाएँ।

8 मिनट में पढ़ें

हर रेसिंग ऐप को कैलेंडर चाहिए। यह गाइड races endpoints से तीन चीज़ें बनाती है:

  1. राउंड के क्रम में पूरा सीज़न कैलेंडर।
  2. अगली रेस, काउंटडाउन या पुश नोटिफ़िकेशन के लिए।
  3. पूरे हो चुके राउंड के क्लासिफ़ाइड नतीजे।

कैलेंडर

GET /races/seasons/{year} एक कैटेगरी के लिए सीज़न के सभी राउंड लौटाता है:

{
  "round_number": 12,
  "name": "Qatar Airways Grand Prix of Great Britain",
  "circuit_name": "Silverstone Circuit, Silverstone",
  "country": "United Kingdom",
  "flag": "🇬🇧",
  "category": "MOTOGP",
  "race_date": "2026-08-09",
  "season_year": 2026
}

राउंड क्रम में नहीं लौटते, इसलिए उन्हें round_number से सॉर्ट करें:

import os
from datetime import date

import requests

HOST = "motogp-api-championship-data-statistics.p.rapidapi.com"
HEADERS = {"X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"], "X-RapidAPI-Host": HOST}


def get(path: str, **params):
    res = requests.get(f"https://{HOST}{path}", headers=HEADERS, params=params, timeout=10)
    res.raise_for_status()
    return res.json()["data"]


def calendar(year: int, category: str = "MOTOGP") -> list[dict]:
    races = get(f"/races/seasons/{year}", category=category)
    return sorted(races, key=lambda r: r["round_number"])


for race in calendar(2026):
    print(f"R{race['round_number']:>2}  {race['race_date']}  {race['flag']}  {race['name']}")
...
R 6  2026-05-17  🇪🇸  Monster Energy Grand Prix of Catalunya
...
R12  2026-08-09  🇬🇧  Qatar Airways Grand Prix of Great Britain
...

अगली रेस

race_date ISO तारीख़ (YYYY-MM-DD) है, इसलिए इसे स्ट्रिंग की तरह सॉर्ट और तुलना किया जा सकता है, या date.fromisoformat से पार्स किया जा सकता है:

def next_race(races: list[dict], today: date) -> dict | None:
    upcoming = [r for r in races if date.fromisoformat(r["race_date"]) >= today]
    return upcoming[0] if upcoming else None


race = next_race(calendar(2026), date.today())
if race:
    days = (date.fromisoformat(race["race_date"]) - date.today()).days
    print(f"Next: {race['name']} at {race['circuit_name']} in {days} days")
else:
    print("Season finished")

किसी राउंड के नतीजे

राउंड पूरा होने के बाद उसके नतीजे सीज़न और राउंड से मिलते हैं:

def results(year: int, round_number: int, category: str = "MOTOGP") -> list[dict]:
    rows = get(f"/races/seasons/{year}/round/{round_number}/results", category=category)
    return sorted(rows, key=lambda r: r["position"])


for row in results(2026, 1)[:3]:
    print(f"P{row['position']}  {row['rider_name']:<22} {row['team_name']:<32} +{row['points']} pts")
P1  Marco Bezzecchi        Aprilia Racing                   +25 pts
P2  ...
P3  Raúl Fernández         SuperFile Trackhouse MotoGP Team +16 pts

हर पंक्ति में status होता है: क्लासिफ़ाइड राइडर्स के लिए FINISHED, और बाक़ी के लिए DNF या DNS जैसे मान। रेस पूरी न करने वालों को क्लासिफ़ाइड राइडर्स के नीचे दिखाएँ।

रेस के बाद पोलिंग

नतीजे हर रेस वीकेंड के बाद जोड़े जाते हैं। अगर आप “नतीजे आ गए” नोटिफ़िकेशन भेजते हैं, तो रेस की तारीख़ के बाद हर कुछ सेकंड की जगह हर 30–60 मिनट पर सबसे ताज़ा राउंड का नतीजा endpoint पोल करें: ख़ाली सूची का मतलब “अभी नहीं” है, और धीमी पोलिंग आपको कोटे के भीतर आराम से रखती है। कैलेंडर में न होने वाले राउंड पर 404 मिलता है।

def results_ready(year: int, round_number: int) -> bool:
    return len(results(year, round_number)) > 0

Moto2 और Moto3

ऊपर के किसी भी फ़ंक्शन में category="MOTO2" या category="MOTO3" दें। राउंड नंबर और तारीख़ें उसी कैलेंडर का पालन करती हैं, इसलिए संयुक्त वीकेंड व्यू round_number पर मर्ज करके बन जाता है।

अगला गाइड → MotoGP फ़ैंटेसी लीग की स्कोरिंग