124 lines
3.3 KiB
Python
124 lines
3.3 KiB
Python
|
|
"""
|
||
|
|
Minecraft Bedrock Edition version checker - tracks Windows releases
|
||
|
|
"""
|
||
|
|
|
||
|
|
import requests
|
||
|
|
import json
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
# Bedrock version tracking endpoints
|
||
|
|
# Using third-party services that track Bedrock version history
|
||
|
|
BEDROCK_VERSIONS_URL = "https://raw.githubusercontent.com/pmmp/PocketMine-MP/master/src/VersionInfo.php"
|
||
|
|
|
||
|
|
# Alternative: Direct launcher check (if available)
|
||
|
|
BEDROCK_LAUNCHER_API = "https://launcher.mojang.com/v1/products/bedrock-launcher/latest"
|
||
|
|
|
||
|
|
TIMEOUT = 10
|
||
|
|
|
||
|
|
|
||
|
|
def get_bedrock_versions():
|
||
|
|
"""
|
||
|
|
Fetch Bedrock version information.
|
||
|
|
Attempts multiple sources for reliability.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
Dict with version info or None
|
||
|
|
"""
|
||
|
|
# Try the launcher API first
|
||
|
|
try:
|
||
|
|
response = requests.get(BEDROCK_LAUNCHER_API, timeout=TIMEOUT)
|
||
|
|
if response.status_code == 200:
|
||
|
|
data = response.json()
|
||
|
|
if data:
|
||
|
|
return data
|
||
|
|
except Exception as e:
|
||
|
|
print(f"[BEDROCK_CHECKER] Launcher API error: {e}")
|
||
|
|
|
||
|
|
# Fallback: try Windows version manifest
|
||
|
|
try:
|
||
|
|
# Query Microsoft's update service for Bedrock
|
||
|
|
response = requests.get(
|
||
|
|
"https://launcher.mojang.com/v1/products/bedrock-launcher/16/latest",
|
||
|
|
headers={"Accept": "application/json"},
|
||
|
|
timeout=TIMEOUT
|
||
|
|
)
|
||
|
|
if response.status_code == 200:
|
||
|
|
return response.json()
|
||
|
|
except Exception as e:
|
||
|
|
print(f"[BEDROCK_CHECKER] Manifest error: {e}")
|
||
|
|
|
||
|
|
return None
|
||
|
|
|
||
|
|
|
||
|
|
def parse_bedrock_version(response_data):
|
||
|
|
"""
|
||
|
|
Parse response data into standardized version format.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
response_data: JSON response from version endpoint
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
Dict with keys: id, version, type, releaseTime
|
||
|
|
"""
|
||
|
|
if not response_data:
|
||
|
|
return None
|
||
|
|
|
||
|
|
try:
|
||
|
|
# Extract version information from different possible response formats
|
||
|
|
version = response_data.get('version') or response_data.get('latest')
|
||
|
|
|
||
|
|
if not version:
|
||
|
|
return None
|
||
|
|
|
||
|
|
return {
|
||
|
|
"id": version,
|
||
|
|
"version": version,
|
||
|
|
"type": "bedrock-windows",
|
||
|
|
"releaseTime": response_data.get('releaseTime', datetime.utcnow().isoformat() + "+00:00"),
|
||
|
|
"platform": "windows"
|
||
|
|
}
|
||
|
|
except Exception as e:
|
||
|
|
print(f"[BEDROCK_CHECKER] Parse error: {e}")
|
||
|
|
return None
|
||
|
|
|
||
|
|
|
||
|
|
def get_latest_bedrock_release():
|
||
|
|
"""
|
||
|
|
Get the latest Bedrock Windows release.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
Dict with version info or None
|
||
|
|
"""
|
||
|
|
try:
|
||
|
|
version_data = get_bedrock_versions()
|
||
|
|
return parse_bedrock_version(version_data)
|
||
|
|
except Exception as e:
|
||
|
|
print(f"[BEDROCK_CHECKER] Error getting latest release: {e}")
|
||
|
|
return None
|
||
|
|
|
||
|
|
|
||
|
|
def compare_versions(v1, v2):
|
||
|
|
"""
|
||
|
|
Compare two version strings (semantic versioning).
|
||
|
|
|
||
|
|
Args:
|
||
|
|
v1, v2: Version strings like "1.20.0"
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
True if v1 > v2, False otherwise
|
||
|
|
"""
|
||
|
|
try:
|
||
|
|
parts1 = [int(x) for x in v1.split('.')]
|
||
|
|
parts2 = [int(x) for x in v2.split('.')]
|
||
|
|
|
||
|
|
# Pad with zeros
|
||
|
|
while len(parts1) < len(parts2):
|
||
|
|
parts1.append(0)
|
||
|
|
while len(parts2) < len(parts1):
|
||
|
|
parts2.append(0)
|
||
|
|
|
||
|
|
return parts1 > parts2
|
||
|
|
except:
|
||
|
|
# Fallback to string comparison
|
||
|
|
return v1 > v2
|