312 lines
18 KiB
HTML
312 lines
18 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Widevine L3 Guessor 2024</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
|
|
<script src="/libs/pyodide/pyodide.js"></script>
|
|
<style>
|
|
body { min-height: 100vh; }
|
|
.section-card { margin-bottom: 1.5rem; }
|
|
.main-container { max-width: 1200px; }
|
|
.extraction-section { background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); }
|
|
.crawlflix-section { background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%); }
|
|
.clearkey-section { background: linear-gradient(135deg, #fff3e0 0%, #ffcc02 20%); }
|
|
.form-label { font-weight: 600; }
|
|
.card-header h5 { margin: 0; }
|
|
.status-area { min-height: 40px; }
|
|
</style>
|
|
</head>
|
|
<body class="bg-light">
|
|
<div class="container main-container p-4">
|
|
|
|
<!-- Header -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="text-center">
|
|
<h2 class="mb-3"><i class="fas fa-shield-alt text-primary"></i> Widevine L3 Guessor 2024</h2>
|
|
<p class="text-muted mb-3">Extract Widevine keys and send directly to CrawlFlix for seamless content processing</p>
|
|
<a href="./history.html" class="btn btn-outline-secondary">
|
|
<i class="fas fa-history"></i> Show History
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- No EME Detection -->
|
|
<div id="noEME" class="row">
|
|
<div class="col-12">
|
|
<div class="alert alert-warning text-center py-4">
|
|
<h4><i class="fas fa-exclamation-triangle"></i> No Widevine Content Detected</h4>
|
|
<p class="mb-0">Open a widevine-protected website and try again!</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Main Content Grid -->
|
|
<div id="home" class="hidden">
|
|
<div class="row">
|
|
<!-- Key Extraction Column -->
|
|
<div class="col-lg-6 col-xl-5">
|
|
<div class="card section-card extraction-section">
|
|
<div class="card-header py-3">
|
|
<h5><i class="fas fa-key text-success"></i> Key Extraction</h5>
|
|
</div>
|
|
<div class="card-body p-4">
|
|
<form id="wvForm">
|
|
<div class="mb-3">
|
|
<label for="pssh" class="form-label">PSSH</label>
|
|
<div class="input-group">
|
|
<input type="text" id="pssh" class="form-control font-monospace" disabled>
|
|
<button type="button" id="psshButton" class="btn btn-outline-primary">
|
|
<i class="fas fa-mouse-pointer"></i> Select
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label for="license" class="form-label">License URL</label>
|
|
<div class="input-group">
|
|
<input type="text" id="license" class="form-control font-monospace" disabled>
|
|
<button type="button" id="licenseButton" class="btn btn-outline-primary">
|
|
<i class="fas fa-mouse-pointer"></i> Select
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-8">
|
|
<label for="schemeSelect" class="form-label">Challenge Scheme</label>
|
|
<select id="schemeSelect" class="form-select">
|
|
<option value="Amazon">Amazon</option>
|
|
<option value="Allente">Allente</option>
|
|
<option value="CanalPlusVOD">CanalPlus (VOD)</option>
|
|
<option value="CanalPlusLive">CanalPlus (Live)</option>
|
|
<option value="Comcast">Comcast Xfinity</option>
|
|
<option value="CommonWV" selected>CommonWV</option>
|
|
<option value="DRMToday">DRMToday</option>
|
|
<option value="Fantop">Fantop</option>
|
|
<option value="GlobalTV">GlobalTV</option>
|
|
<option value="Heuristic">Heuristic</option>
|
|
<option value="moTV">moTV</option>
|
|
<option value="NosTV">NosTV</option>
|
|
<option value="oqee">Oqee</option>
|
|
<option value="PolSatBoxGo">PolSatBoxGo</option>
|
|
<option value="RedBee">Red Bee Media</option>
|
|
<option value="Sling">Sling</option>
|
|
<option value="thePlatform">thePlatform</option>
|
|
<option value="VdoCipher">VdoCipher</option>
|
|
<option value="VUDRM">VUDRM</option>
|
|
<option value="Vodafone">Vodafone</option>
|
|
<option value="Youku">Youku</option>
|
|
<option value="YouTube">YouTube</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-4 d-flex align-items-end">
|
|
<button type="button" id="editSchemeButton" class="btn btn-outline-secondary w-100">
|
|
<i class="fas fa-edit"></i> Edit
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<button type="button" id="guess" class="btn btn-primary btn-lg w-100 mb-4">
|
|
<i class="fas fa-magic me-2"></i> Extract Widevine Keys
|
|
</button>
|
|
|
|
<div>
|
|
<label for="result" class="form-label">Extracted Keys</label>
|
|
<textarea id="result" class="form-control font-monospace" rows="8"
|
|
placeholder="Extracted keys will appear here..."></textarea>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- CrawlFlix Integration Column -->
|
|
<div class="col-lg-6 col-xl-7">
|
|
<div class="card section-card crawlflix-section">
|
|
<div class="card-header py-3">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<h5><i class="fas fa-download text-info"></i> CrawlFlix Integration</h5>
|
|
<span class="badge bg-info">Auto-Workflow</span>
|
|
</div>
|
|
</div>
|
|
<div class="card-body p-4">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<div class="mb-3">
|
|
<label for="crawlFlixUrl" class="form-label">
|
|
<i class="fas fa-server"></i> CrawlFlix Server
|
|
</label>
|
|
<input type="text" id="crawlFlixUrl" class="form-control"
|
|
placeholder="http://localhost:4200" value="http://localhost:4200">
|
|
</div>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<div class="mb-3">
|
|
<label for="mpdSelect" class="form-label">
|
|
<i class="fas fa-file-video"></i> Detected MPD Manifests
|
|
</label>
|
|
<div class="input-group">
|
|
<select id="mpdSelect" class="form-select">
|
|
<option value="">-- Auto-detected MPDs --</option>
|
|
</select>
|
|
<button type="button" id="refreshMPDs" class="btn btn-success">
|
|
<i class="fas fa-sync-alt"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-4">
|
|
<label for="mpdUrl" class="form-label">MPD URL (Manual Entry)</label>
|
|
<input type="text" id="mpdUrl" class="form-control font-monospace"
|
|
placeholder="Or paste MPD URL manually...">
|
|
</div>
|
|
|
|
<div class="row mb-4">
|
|
<div class="col-md-6">
|
|
<button type="button" id="sendToCrawlFlix" class="btn btn-primary btn-lg w-100 mb-2">
|
|
<i class="fas fa-paper-plane me-2"></i> Send to CrawlFlix
|
|
</button>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<button type="button" id="copyKeys" class="btn btn-outline-secondary btn-lg w-100 mb-2">
|
|
<i class="fas fa-copy me-2"></i> Copy Keys Only
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="crawlFlixStatus" class="status-area"></div>
|
|
|
|
<!-- Workflow Steps -->
|
|
<div class="mt-4 p-3 bg-light rounded">
|
|
<h6 class="text-muted mb-3"><i class="fas fa-list-ol"></i> Automated Workflow</h6>
|
|
<div class="row text-center">
|
|
<div class="col-3">
|
|
<div class="workflow-step">
|
|
<i class="fas fa-shield-alt fa-2x text-primary mb-2"></i>
|
|
<p class="small mb-0">Extract Keys</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-3">
|
|
<div class="workflow-step">
|
|
<i class="fas fa-search fa-2x text-success mb-2"></i>
|
|
<p class="small mb-0">Detect MPD</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-3">
|
|
<div class="workflow-step">
|
|
<i class="fas fa-paper-plane fa-2x text-info mb-2"></i>
|
|
<p class="small mb-0">Send Data</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-3">
|
|
<div class="workflow-step">
|
|
<i class="fas fa-download fa-2x text-warning mb-2"></i>
|
|
<p class="small mb-0">Start Download</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ClearKey Section -->
|
|
<div id="ckHome" class="hidden">
|
|
<div class="card section-card">
|
|
<div class="card-header py-2">
|
|
<h6 class="mb-0"><i class="fas fa-unlock text-warning"></i> ClearKey Detected</h6>
|
|
</div>
|
|
<div class="card-body p-3">
|
|
<label for="ckResult" class="form-label">ClearKey Result:</label>
|
|
<textarea id="ckResult" class="form-control font-monospace" rows="6" placeholder="ClearKey data will appear here..."></textarea>
|
|
|
|
<!-- CrawlFlix for ClearKey -->
|
|
<div class="mt-3 pt-3 border-top">
|
|
<h6><i class="fas fa-download text-info"></i> Send to CrawlFlix</h6>
|
|
|
|
<div class="row g-2 mb-2">
|
|
<div class="col-12">
|
|
<label for="crawlFlixUrlCK" class="form-label">CrawlFlix Server</label>
|
|
<input type="text" id="crawlFlixUrlCK" class="form-control form-control-sm"
|
|
placeholder="http://localhost:4200" value="http://localhost:4200">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-2 mb-3">
|
|
<div class="col-10">
|
|
<label for="mpdSelectCK" class="form-label">MPD Manifest</label>
|
|
<select id="mpdSelectCK" class="form-select form-select-sm">
|
|
<option value="">-- Detected MPDs --</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-2 d-flex align-items-end">
|
|
<button type="button" id="refreshMPDsCK" class="btn btn-success btn-sm w-100">
|
|
<i class="fas fa-sync-alt"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<input type="text" id="mpdUrlCK" class="form-control form-control-sm"
|
|
placeholder="Or paste MPD URL manually...">
|
|
</div>
|
|
|
|
<div class="d-grid gap-2 d-md-flex">
|
|
<button type="button" id="sendToCrawlFlixCK" class="btn btn-primary btn-sm flex-fill">
|
|
<i class="fas fa-paper-plane"></i> Send to CrawlFlix
|
|
</button>
|
|
<button type="button" id="copyKeysCK" class="btn btn-outline-secondary btn-sm flex-fill">
|
|
<i class="fas fa-copy"></i> Copy Keys
|
|
</button>
|
|
</div>
|
|
|
|
<div id="crawlFlixStatusCK" class="mt-2"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Hidden containers -->
|
|
<div id="chooserContainer" class="hidden">
|
|
<div class="card">
|
|
<div class="card-body p-2">
|
|
<input type="text" id="chooserSearch" class="form-control form-control-sm mb-2" placeholder="Search">
|
|
<ul id="items" class="list-group list-group-flush"></ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="editSchemeContainer" class="hidden">
|
|
<div class="card">
|
|
<div class="card-header py-2">
|
|
<h6 class="mb-0">Edit Scheme</h6>
|
|
</div>
|
|
<div class="card-body p-3">
|
|
<textarea id="schemeCode" class="form-control font-monospace" rows="8"></textarea>
|
|
<button type="button" id="editSchemeOK" class="btn btn-primary btn-sm mt-2">OK</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="updateNotice" class="alert alert-info alert-sm hidden">
|
|
<i class="fas fa-info-circle"></i>
|
|
Version =VER= update available!
|
|
<a href="https://github.com/FoxRefire/wvg/archive/=HASH=.zip" class="alert-link">Download</a>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="./main.js" type="module"></script>
|
|
<script src="./drawList.js"></script>
|
|
<script src="./editScheme.js"></script>
|
|
<script src="./updateNotice.js"></script>
|
|
</body>
|
|
</html> |