recycleactor commited on
Commit
bc0ee50
·
verified ·
1 Parent(s): 45f75e2

Upload main.rs

Browse files
Files changed (1) hide show
  1. 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 = htmlesc(&format!("{scheme}://{host}/pair/channel"));
1341
- let app_id = htmlesc(&deezer_app_id());
1342
- let html = format!(
1343
- "<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\
1344
- <title>Deezer Login</title>\
1345
- <style>body{{font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;background:#0b0b0b;color:#fff;margin:0;padding:20px}}\
1346
- .box{{max-width:420px;margin:0 auto;background:#151515;padding:18px;border-radius:12px}}\
1347
- button{{width:100%;padding:12px 14px;border-radius:10px;border:0;background:#a238ff;color:#fff;font-weight:800;font-size:16px}}\
1348
- .muted{{color:#aaa;font-size:13px;line-height:1.35}}\
1349
- .ok{{color:#1db954}}\
1350
- .err{{color:#ff5a5a}}\
1351
- a{{color:#a238ff}}</style>\
1352
- </head><body><div class=\"box\">\
1353
- <h2 style=\"margin:0 0 6px\">Deezer: вход для ТВ</h2>\
1354
- <div class=\"muted\">Код пары: <b>{safe_code}</b></div>\
1355
- <div class=\"muted\" style=\"margin:10px 0 14px\">Нажми кнопку, войди в Deezer и подтверди доступ. После успеха вернись на телевизор.</div>\
1356
- <button id=\"dz-login\" type=\"button\">Войти через Deezer</button>\
1357
- <div id=\"msg\" class=\"muted\" style=\"margin:12px 0 0\"></div>\
1358
- <div id=\"dz-root\"></div>\
1359
- <script src=\"https://cdns-files.deezer.com/js/min/dz.js\"></script>\
1360
- <script>\
1361
- (function(){\
1362
- var code = \"{safe_code}\";\
1363
- var msg = document.getElementById('msg');\
1364
- function setMsg(cls, text){ msg.className = cls ? (cls + ' muted') : 'muted'; msg.textContent = text; }\
1365
- if(!code){ setMsg('err','Нет кода пары. Открой ссылку заново с QR.'); return; }\
1366
- function postToken(at, uid){\
1367
- return fetch('/pair/oauth',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({code:code,access_token:at,user_id:String(uid||'')})})\
1368
- .then(function(r){return r.json().catch(function(){return {};}).then(function(j){return {ok:r.ok, json:j};});});\
1369
- }\
1370
- function initDZ(){\
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