Spaces:
Paused
Paused
Upload main.rs
Browse files- src/main.rs +31 -64
src/main.rs
CHANGED
|
@@ -1337,70 +1337,37 @@ async fn pair_page(Host(host): Host, headers: HeaderMap, Query(q): Query<PairPag
|
|
| 1337 |
let code = q.code.unwrap_or_default().trim().to_string();
|
| 1338 |
let safe_code = htmlesc(&code);
|
| 1339 |
let scheme = forwarded_proto(&headers);
|
| 1340 |
-
let channel_url =
|
| 1341 |
-
let app_id =
|
| 1342 |
-
|
| 1343 |
-
|
| 1344 |
-
|
| 1345 |
-
|
| 1346 |
-
|
| 1347 |
-
|
| 1348 |
-
|
| 1349 |
-
|
| 1350 |
-
|
| 1351 |
-
|
| 1352 |
-
|
| 1353 |
-
|
| 1354 |
-
|
| 1355 |
-
|
| 1356 |
-
|
| 1357 |
-
|
| 1358 |
-
|
| 1359 |
-
|
| 1360 |
-
|
| 1361 |
-
|
| 1362 |
-
|
| 1363 |
-
|
| 1364 |
-
|
| 1365 |
-
|
| 1366 |
-
|
| 1367 |
-
|
| 1368 |
-
|
| 1369 |
-
|
| 1370 |
-
|
| 1371 |
-
try{\
|
| 1372 |
-
DZ.init({appId:'{app_id}',channelUrl:'{channel_url}'});\
|
| 1373 |
-
return true;\
|
| 1374 |
-
}catch(e){\
|
| 1375 |
-
return false;\
|
| 1376 |
-
}\
|
| 1377 |
-
}\
|
| 1378 |
-
if(!initDZ()){\
|
| 1379 |
-
setMsg('err','Не удалось инициализировать Deezer SDK.');\
|
| 1380 |
-
return;\
|
| 1381 |
-
}\
|
| 1382 |
-
document.getElementById('dz-login').addEventListener('click', function(){\
|
| 1383 |
-
setMsg('', 'Ожидаю Deezer…');\
|
| 1384 |
-
DZ.login(function(resp){\
|
| 1385 |
-
if(resp && resp.authResponse && resp.authResponse.accessToken){\
|
| 1386 |
-
setMsg('', 'Сохраняю токен…');\
|
| 1387 |
-
postToken(resp.authResponse.accessToken, resp.authResponse.userID).then(function(r){\
|
| 1388 |
-
if(r.ok && !r.json.error){\
|
| 1389 |
-
setMsg('ok','Готово ✓ Вернись на телевизор.');\
|
| 1390 |
-
}else{\
|
| 1391 |
-
setMsg('err','Ошибка сохранения: ' + (r.json.error || 'error'));\
|
| 1392 |
-
}\
|
| 1393 |
-
}).catch(function(){ setMsg('err','Ошибка сети при сохранении'); });\
|
| 1394 |
-
}else{\
|
| 1395 |
-
setMsg('err','Вход отменён или не удалось получить токен');\
|
| 1396 |
-
}\
|
| 1397 |
-
}, {perms:'basic_access,email,manage_library,listening_history'});\
|
| 1398 |
-
});\
|
| 1399 |
-
})();\
|
| 1400 |
-
</script>\
|
| 1401 |
-
<p class=\"muted\" style=\"margin:14px 0 0\">Если Deezer пишет про неверный redirect/domain — нужно указать свой <b>DEEZER_APP_ID</b> для домена этого сервера.</p>\
|
| 1402 |
-
</div></body></html>"
|
| 1403 |
-
);
|
| 1404 |
Html(html)
|
| 1405 |
}
|
| 1406 |
|
|
|
|
| 1337 |
let code = q.code.unwrap_or_default().trim().to_string();
|
| 1338 |
let safe_code = htmlesc(&code);
|
| 1339 |
let scheme = forwarded_proto(&headers);
|
| 1340 |
+
let channel_url = format!("{scheme}://{host}/pair/channel");
|
| 1341 |
+
let app_id = deezer_app_id();
|
| 1342 |
+
|
| 1343 |
+
let code_js = serde_json::to_string(&code).unwrap_or_else(|_| "\"\"".to_string());
|
| 1344 |
+
let channel_url_js = serde_json::to_string(&channel_url).unwrap_or_else(|_| "\"\"".to_string());
|
| 1345 |
+
let app_id_js = serde_json::to_string(&app_id).unwrap_or_else(|_| "\"\"".to_string());
|
| 1346 |
+
|
| 1347 |
+
let mut html = String::with_capacity(6000);
|
| 1348 |
+
html.push_str(r#"<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">"#);
|
| 1349 |
+
html.push_str(r#"<title>Deezer Login</title>"#);
|
| 1350 |
+
html.push_str(r#"<style>body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;background:#0b0b0b;color:#fff;margin:0;padding:20px}.box{max-width:420px;margin:0 auto;background:#151515;padding:18px;border-radius:12px}button{width:100%;padding:12px 14px;border-radius:10px;border:0;background:#a238ff;color:#fff;font-weight:800;font-size:16px}.muted{color:#aaa;font-size:13px;line-height:1.35}.ok{color:#1db954}.err{color:#ff5a5a}a{color:#a238ff}</style>"#);
|
| 1351 |
+
html.push_str(r#"</head><body><div class="box">"#);
|
| 1352 |
+
html.push_str(r#"<h2 style="margin:0 0 6px">Deezer: вход для ТВ</h2>"#);
|
| 1353 |
+
html.push_str(r#"<div class="muted">Код пары: <b>"#);
|
| 1354 |
+
html.push_str(&safe_code);
|
| 1355 |
+
html.push_str(r#"</b></div>"#);
|
| 1356 |
+
html.push_str(r#"<div class="muted" style="margin:10px 0 14px">Нажми кнопку, войди в Deezer и подтверди доступ. После успеха вернись на телевизор.</div>"#);
|
| 1357 |
+
html.push_str(r#"<button id="dz-login" type="button">Войти через Deezer</button>"#);
|
| 1358 |
+
html.push_str(r#"<div id="msg" class="muted" style="margin:12px 0 0"></div>"#);
|
| 1359 |
+
html.push_str(r#"<div id="dz-root"></div>"#);
|
| 1360 |
+
html.push_str(r#"<script src="https://cdns-files.deezer.com/js/min/dz.js"></script>"#);
|
| 1361 |
+
html.push_str(r#"<script>(function(){"#);
|
| 1362 |
+
html.push_str("var code=");
|
| 1363 |
+
html.push_str(&code_js);
|
| 1364 |
+
html.push_str(r#";var msg=document.getElementById('msg');function setMsg(cls,text){msg.className=cls?(cls+' muted'):'muted';msg.textContent=text;}if(!code){setMsg('err','Нет кода пары. Открой ссылку заново с QR.');return;}function postToken(at,uid){return fetch('/pair/oauth',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({code:code,access_token:at,user_id:String(uid||'')})}).then(function(r){return r.json().catch(function(){return {};}).then(function(j){return {ok:r.ok,json:j};});});}function initDZ(){try{DZ.init({appId:"#);
|
| 1365 |
+
html.push_str(&app_id_js);
|
| 1366 |
+
html.push_str(r#",channelUrl:"#);
|
| 1367 |
+
html.push_str(&channel_url_js);
|
| 1368 |
+
html.push_str(r#"});return true;}catch(e){return false;}}if(!initDZ()){setMsg('err','Не удалось инициализировать Deezer SDK.');return;}document.getElementById('dz-login').addEventListener('click',function(){setMsg('','Ожидаю Deezer…');DZ.login(function(resp){if(resp&&resp.authResponse&&resp.authResponse.accessToken){setMsg('','Сохраняю токен…');postToken(resp.authResponse.accessToken,resp.authResponse.userID).then(function(r){if(r.ok&&!r.json.error){setMsg('ok','Готово ✓ Вернись на телевизор.');}else{setMsg('err','Ошибка сохранения: '+(r.json.error||'error'));}}).catch(function(){setMsg('err','Ошибка сети при сохранении');});}else{setMsg('err','Вход отменён или не удалось получить токен');}},{perms:'basic_access,email,manage_library,listening_history'});});})();</script>"#);
|
| 1369 |
+
html.push_str(r#"<p class="muted" style="margin:14px 0 0">Если Deezer пишет про неверный redirect/domain — нужно указать свой <b>DEEZER_APP_ID</b> для домена этого сервера.</p>"#);
|
| 1370 |
+
html.push_str(r#"</div></body></html>"#);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1371 |
Html(html)
|
| 1372 |
}
|
| 1373 |
|