{"id":18854,"date":"2025-04-25T11:30:11","date_gmt":"2025-04-25T09:30:11","guid":{"rendered":"https:\/\/www.kabel1.cz\/www\/?page_id=18854"},"modified":"2026-01-21T13:45:48","modified_gmt":"2026-01-21T12:45:48","slug":"lantest","status":"publish","type":"page","link":"https:\/\/www.kabel1.cz\/www\/lantest\/","title":{"rendered":"LanTest"},"content":{"rendered":"<style>.kb-row-layout-id18854_346955-73 > .kt-row-column-wrap{align-content:start;}:where(.kb-row-layout-id18854_346955-73 > .kt-row-column-wrap) > .wp-block-kadence-column{justify-content:start;}.kb-row-layout-id18854_346955-73 > .kt-row-column-wrap{column-gap:var(--global-kb-gap-md, 2rem);row-gap:var(--global-kb-gap-md, 2rem);max-width:var( --global-content-width, 1290px );padding-left:var(--global-content-edge-padding);padding-right:var(--global-content-edge-padding);padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);grid-template-columns:minmax(0, 1fr);}.kb-row-layout-id18854_346955-73 > .kt-row-layout-overlay{opacity:0.30;}@media all and (max-width: 1024px){.kb-row-layout-id18854_346955-73 > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}@media all and (max-width: 767px){.kb-row-layout-id18854_346955-73 > .kt-row-column-wrap{grid-template-columns:minmax(0, 1fr);}}<\/style><div class=\"kb-row-layout-wrap kb-row-layout-id18854_346955-73 alignnone wp-block-kadence-rowlayout\"><div class=\"kt-row-column-wrap kt-has-1-columns kt-row-layout-equal kt-tab-layout-inherit kt-mobile-layout-row kt-row-valign-top kb-theme-content-width\">\n<style>.kadence-column18854_dd47a4-10 > .kt-inside-inner-col,.kadence-column18854_dd47a4-10 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column18854_dd47a4-10 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column18854_dd47a4-10 > .kt-inside-inner-col{flex-direction:column;}.kadence-column18854_dd47a4-10 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column18854_dd47a4-10 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column18854_dd47a4-10{position:relative;}@media all and (max-width: 1024px){.kadence-column18854_dd47a4-10 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column18854_dd47a4-10 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column18854_dd47a4-10\"><div class=\"kt-inside-inner-col\">\n<h5 class=\"wp-block-heading\">Lan test:<\/h5>\n\n\n<style>\r\n  :root {\r\n    --primary: #0073aa;\r\n    --primary-dark: #D73589;\r\n    --success-gradient: linear-gradient(90deg, #D73589, #B1CC20);\r\n    --bg-light: #f9f9f9;\r\n    --text-color: #333;\r\n  }\r\n\r\n  .speed-test-wrapper {\r\n    display: flex;\r\n    justify-content: center;\r\n    align-items: center;\r\n    min-height: 20vh;\r\n  }\r\n\r\n  #speed-test-container {\r\n    background: white;\r\n    padding: 30px;\r\n    border-radius: 12px;\r\n    box-shadow: 0 8px 20px rgba(0,0,0,0.1);\r\n    text-align: center;\r\n    width: 100%;\r\n    max-width: 800px;\r\n    margin: auto;\r\n  }\r\n\r\n  #start-btn {\r\n    background-color: var(--primary);\r\n    color: white;\r\n    border: none;\r\n    padding: 14px 28px;\r\n    font-size: 18px;\r\n    border-radius: 8px;\r\n    cursor: pointer;\r\n    transition: background 0.3s ease, transform 0.1s ease;\r\n  }\r\n\r\n  #start-btn:disabled {\r\n    opacity: 0.7;\r\n    cursor: not-allowed;\r\n  }\r\n\r\n  #start-btn:hover:not(:disabled) {\r\n    background-color: var(--primary-dark);\r\n    transform: scale(1.02);\r\n  }\r\n\r\n  #progress-bar {\r\n    width: 100%;\r\n    height: 20px;\r\n    background-color: #eee;\r\n    border-radius: 10px;\r\n    overflow: hidden;\r\n    margin: 20px 0;\r\n    display: none;\r\n    position: relative;\r\n  }\r\n\r\n  #progress-fill {\r\n    height: 100%;\r\n    width: 0%;\r\n    background: var(--success-gradient);\r\n    position: relative;\r\n    transition: width 0.2s ease-out, background 0.5s ease;\r\n  }\r\n\r\n  #progress-fill.pulsing {\r\n    animation: pulseGlow 1.5s infinite;\r\n  }\r\n\r\n  @keyframes pulseGlow {\r\n    0% { box-shadow: 0 0 10px rgba(183, 255, 0, 0.3); }\r\n    50% { box-shadow: 0 0 20px rgba(183, 255, 0, 0.7); }\r\n    100% { box-shadow: 0 0 10px rgba(183, 255, 0, 0.3); }\r\n  }\r\n\r\n  #progress-fill::after {\r\n    content: '';\r\n    position: absolute;\r\n    top: 0; left: 0; bottom: 0;\r\n    width: 200%;\r\n    background: repeating-linear-gradient(\r\n      45deg,\r\n      rgba(255,255,255,0.2) 0px,\r\n      rgba(255,255,255,0.2) 5px,\r\n      rgba(255,255,255,0) 5px,\r\n      rgba(255,255,255,0) 10px\r\n    );\r\n    animation: moveShine 2s linear infinite;\r\n  }\r\n\r\n  @keyframes moveShine {\r\n    0% { transform: translateX(-50%); }\r\n    100% { transform: translateX(0); }\r\n  }\r\n\r\n  #bar-speed-label {\r\n    position: absolute;\r\n    right: 10px;\r\n    top: 0;\r\n    color: white;\r\n    font-weight: bold;\r\n    font-size: 14px;\r\n    line-height: 20px;\r\n    z-index: 1;\r\n  }\r\n\r\n  @keyframes colorShift {\r\n    0% { background: var(--success-gradient); }\r\n    100% { background: linear-gradient(90deg, #20cc5f, #20bccc); }\r\n  }\r\n\r\n  #speed-result,\r\n  #ip-info,\r\n  #ping-info {\r\n    font-size: 18px;\r\n    margin-top: 10px;\r\n    word-break: break-word;\r\n  }\r\n\r\n  .fade-in {\r\n    animation: fadein 0.5s ease-in-out;\r\n  }\r\n\r\n  @keyframes fadein {\r\n    from { opacity: 0; transform: translateY(10px); }\r\n    to { opacity: 1; transform: translateY(0); }\r\n  }\r\n<\/style>\r\n\r\n<div class=\"speed-test-wrapper\">\r\n  <div id=\"speed-test-container\">\r\n    <button id=\"start-btn\">SPUSTIT TEST<\/button>\r\n    <p><br>Tento test slou\u017e\u00ed k testov\u00e1n\u00ed v m\u00edstn\u00ed s\u00edti Kabel1.<br>Test st\u00e1hne soubor o velikosti 100MB.<\/p>\r\n    <div id=\"progress-bar\">\r\n      <div id=\"progress-fill\">\r\n        <span id=\"bar-speed-label\">0%<\/span>\r\n      <\/div>\r\n    <\/div>\r\n    <div id=\"speed-result\" class=\"fade-in\"><\/div>\r\n    <div id=\"ip-info\" class=\"fade-in\"><\/div>\r\n    <div id=\"ping-info\" class=\"fade-in\"><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n  const testUrl = 'https:\/\/www.kabel1.cz\/www\/testdown.bin';\r\n  const fileSizeBytes = 100 * 1024 * 1024;\r\n\r\n  const startBtn = document.getElementById('start-btn');\r\n  const progressBar = document.getElementById('progress-bar');\r\n  const progressFill = document.getElementById('progress-fill');\r\n  const barSpeedLabel = document.getElementById('bar-speed-label');\r\n  const result = document.getElementById('speed-result');\r\n  const ipInfo = document.getElementById('ip-info');\r\n  const pingInfo = document.getElementById('ping-info');\r\n\r\n  startBtn.addEventListener('click', async () => {\r\n    resetDisplay();\r\n    disableButton(\"M\u011a\u0158\u00cdM...\");\r\n    progressFill.classList.add('pulsing');\r\n\r\n    try {\r\n      const { speed, duration, sizeOk } = await testSpeed();\r\n      const speedMBps = (speed \/ 8).toFixed(2);\r\n\r\n      if (!sizeOk) {\r\n        throw new Error(\"Sta\u017een\u00fd soubor byl men\u0161\u00ed ne\u017e o\u010dek\u00e1van\u00fdch 100MB. Server m\u016f\u017ee b\u00fdt p\u0159et\u00ed\u017een nebo nedostupn\u00fd.\");\r\n      }\r\n\r\n      result.innerHTML = `\ud83d\udce5 Rychlost stahov\u00e1n\u00ed: ${speed} Mbps (Mb\/s) | ${speedMBps} MB\/s<br>\u23f1\ufe0f Trv\u00e1n\u00ed testu: ${duration.toFixed(2)} s<br><br>` + interpretResult(speed);\r\n    } catch (err) {\r\n      result.textContent = `\u274c Chyba: ${err.message}`;\r\n    }\r\n\r\n    progressFill.classList.remove('pulsing');\r\n    enableButton(\"OPAKOVAT TEST\");\r\n    showIP();\r\n    testPing();\r\n  });\r\n\r\n  function resetDisplay() {\r\n    result.textContent = '';\r\n    ipInfo.textContent = '';\r\n    pingInfo.textContent = '';\r\n    progressBar.style.display = 'block';\r\n    progressFill.style.width = '0%';\r\n    barSpeedLabel.textContent = '0%';\r\n  }\r\n\r\n  function disableButton(text) {\r\n    startBtn.disabled = true;\r\n    startBtn.textContent = text;\r\n  }\r\n\r\n  function enableButton(text) {\r\n    startBtn.disabled = false;\r\n    startBtn.textContent = text;\r\n  }\r\n\r\n  async function testSpeed() {\r\n    const startTime = performance.now();\r\n    const controller = new AbortController();\r\n\r\n    const interval = setInterval(() => {\r\n      const elapsed = performance.now() - startTime;\r\n      const percent = Math.min(90, (elapsed \/ 3000) * 100);\r\n      progressFill.style.width = percent + '%';\r\n      barSpeedLabel.textContent = `${Math.round(percent)}%`;\r\n      if (percent >= 80) {\r\n        progressFill.style.animation = 'colorShift 2s infinite alternate';\r\n      }\r\n    }, 100);\r\n\r\n    const response = await fetch(testUrl + '?' + Math.random(), {\r\n      cache: 'no-store',\r\n      signal: controller.signal\r\n    });\r\n\r\n    const blob = await response.blob();\r\n    clearInterval(interval);\r\n    progressFill.style.width = '100%';\r\n    barSpeedLabel.textContent = '100%';\r\n    progressFill.style.animation = 'none';\r\n\r\n    const endTime = performance.now();\r\n    const duration = (endTime - startTime) \/ 1000;\r\n    const sizeOk = blob.size > fileSizeBytes * 0.8;\r\n    const speedMbps = ((blob.size * 8) \/ duration \/ 1_000_000).toFixed(2);\r\n    return { speed: speedMbps, duration, sizeOk };\r\n  }\r\n\r\n  async function showIP() {\r\n    try {\r\n      const res = await fetch('https:\/\/api.ipify.org?format=json');\r\n      const data = await res.json();\r\n      ipInfo.textContent = `\ud83c\udf10 Ve\u0159ejn\u00e1 IP: ${data.ip}`;\r\n    } catch {\r\n      ipInfo.textContent = \"\u2753 IP se nepoda\u0159ilo zjistit.\";\r\n    }\r\n  }\r\n\r\n  async function testPing() {\r\n    const pingStart = performance.now();\r\n    try {\r\n      await fetch('https:\/\/www.kabel1.cz\/favicon.ico?' + Math.random(), { cache: \"no-store\" });\r\n      const pingEnd = performance.now();\r\n      const pingTime = Math.round(pingEnd - pingStart);\r\n      pingInfo.textContent = `\ud83d\udcf6 Ping na server K1: ${pingTime} ms`;\r\n    } catch {\r\n      pingInfo.textContent = \"\u2757 Ping se nepoda\u0159ilo prov\u00e9st.\";\r\n    }\r\n  }\r\n\r\n  function interpretResult(speed) {\r\n    let message = \"\u26a0\ufe0f Test prov\u00e1d\u011bjte v\u017edy na za\u0159\u00edzen\u00ed p\u0159ipojen\u00e9m KABELEM, ne p\u0159es WIFI!\";\r\n\r\n    if (speed > 110) {\r\n      message += \"<br><br>\ud83d\ude80 Pravd\u011bpodobn\u011b m\u00e1te GiGa linku. Tento test je ur\u010den jen pro 100 Mb\/s p\u0159ipojen\u00ed.<br><br>\";\r\n    } else if (speed >= 90) {\r\n      message += \"<br><br>\u2705 V\u00fdborn\u011b! P\u0159ipojen\u00ed je v po\u0159\u00e1dku, nen\u00ed t\u0159eba \u017e\u00e1dn\u00fd z\u00e1sah.<br><br>\";\r\n    } else if (speed >= 65) {\r\n      message += \"<br><br>\ud83d\udd04 Rychlost je pr\u016fm\u011brn\u00e1. Doporu\u010dujeme test zopakovat. Pokud pot\u00ed\u017ee p\u0159etrvaj\u00ed, kontaktuj n\u00e1s. V\u00fdsledek m\u016f\u017ee ovlivnit i zapnut\u00e1 Genius TV.<br><br>\";\r\n    } else {\r\n      message += \"<br><br>\ud83d\udea8 N\u00edzk\u00e1 rychlost! Pokud neb\u011b\u017e\u00ed Genius TV, \u017e\u00e1dn\u00e9 za\u0159\u00edzen\u00ed nic nestahuje a test je st\u00e1le stejn\u00fd, ozvi se n\u00e1m na hotline.<br><br>\";\r\n    }\r\n\r\n    return message;\r\n  }\r\n<\/script>\r\n<\/div><\/div>\n\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Lan test:<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_eb_attr":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-18854","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/pages\/18854","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/comments?post=18854"}],"version-history":[{"count":5,"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/pages\/18854\/revisions"}],"predecessor-version":[{"id":22258,"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/pages\/18854\/revisions\/22258"}],"wp:attachment":[{"href":"https:\/\/www.kabel1.cz\/www\/wp-json\/wp\/v2\/media?parent=18854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}