1<!DOCTYPE html><html data-wf-page="6863cf4e8a8fd8f51a50a1e4" data-wf-site="6863cf4e8a8fd8f51a50a119" lang="en"><head> 2 <meta charset="utf-8"> 3 <title>Christian Ludwig | Imprint</title> 4 <meta content="" name="description"> 5 <meta content="Christian Ludwig | Imprint" property="og:title"> 6 <meta content="" property="og:description"> 7 <meta content="https://cdn.prod.website-files.com/6863cf4e8a8fd8f51a50a119/686487d751b2f87b6e1844eb_WE1_7254.webp" property="og:image"> 8 <meta content="Christian Ludwig | Imprint" property="twitter:title"> 9 <meta content="" property="twitter:description"> 10 <meta content="https://cdn.prod.website-files.com/6863cf4e8a8fd8f51a50a119/686487d751b2f87b6e1844eb_WE1_7254.webp" property="twitter:image"> 11 <meta property="og:type" content="website"> 12 <meta content="summary_large_image" name="twitter:card"> 13 <meta content="width=device-width, initial-scale=1" name="viewport"> 14 <link href="css/normalize.css" rel="stylesheet" type="text/css"> 15 <link href="css/components.css" rel="stylesheet" type="text/css"> 16 <link href="css/christian-ludwig-29b251.css" rel="stylesheet" type="text/css"> 17
17<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
17 18 <link href="images/favicon.png" rel="shortcut icon" type="image/x-icon"> 19 <link href="images/webclip.png" rel="apple-touch-icon"> 20
20<script async="" src="https://cdn.jsdelivr.net/npm/@finsweet/cookie-consent@1/fs-cc.js" fs-cc-mode="opt-in"></script>
20 21 <style> 22 * { 23 -webkit-font-smoothing: antialiased; 24 -moz-osx-font-smoothing: grayscale; 25 } 26 .w-nav-overlay{ 27 top:0; 28 } 29</style> 30 <style> 31 .youtube { 32 background-color: #939393; 33 position: relative; 34 overflow: hidden; 35 cursor: pointer; 36 min-height:150px; 37 padding-top:56.25%; 38 } 39 .youtube img { 40 top:0; 41 left: 0; 42 height: 100%; 43 width: 100%; 44 object-fit: cover; 45 } 46 .youtube .play-button { 47 width: 60px; 48 height: 60px; 49 z-index: 1; 50 opacity: 1; 51 display: flex; 52 align-items: center; 53 justify-content: center; 54 } 55 .youtube img, 56 .youtube .play-button { 57 cursor: pointer; 58 } 59 .youtube img, 60 .youtube iframe, 61 .youtube .play-button, 62 .youtube .play-button:before { 63 position: absolute; 64 } 65 .youtube .play-button, 66 .youtube .play-button:before { 67 top: 50%; left: 50%; transform: translate3d( -50%, -50%, 0 ); 68 } 69 .youtube iframe { 70 height: 100%; width: 100%; top: 0; left: 0; 71 } 72 .w-lightbox-backdrop { 73 z-index:9999999; 74 } 75</style> 76 <link rel="stylesheet" href="https://cdn.plyr.io/3.7.8/plyr.css"> 77
77<script async="" src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-cmsload@1/cmsload.js"></script>
77 78</head> 79<body> 80 <div class="page-wrapper"> 81 <div class="global-styles w-embed"> 82 <style> 83/* Snippet gets rid of top margin on first element in any rich text*/ 84.w-richtext>:first-child { 85 margin-top: 0; 86} 87/* Snippet gets rid of bottom margin on last element in any rich text*/ 88.w-richtext>:last-child, .w-richtext ol li:last-child, .w-richtext ul li:last-child { 89 margin-bottom: 0; 90} 91/* Snippet makes all link elements listed below to inherit color from their parent */ 92a, 93.w-tab-link, 94.w-nav-link, 95.w-dropdown-btn, 96.w-dropdown-toggle, 97.w-dropdown-link 98{ 99color: inherit; 100} 101/* Snippet prevents all click and hover interaction with an element */ 102.clickable-off { 103 pointer-events: none; 104} 105/* Snippet enables all click and hover interaction with an element */ 106.clickable-on{ 107 pointer-events: auto; 108} 109/* Snippet enables you to add class of div-square which creates and maintains a 1:1 dimension of a div.*/ 110.div-square::after { 111 content: ""; 112 display: block; 113 padding-bottom: 100%; 114} 115/*Hide focus outline for main content element*/ 116 main:focus-visible { 117 outline: -webkit-focus-ring-color auto 0px; 118} 119/* Make sure containers never lose their center alignment*/ 120.container-medium, .container-small, .container-large { 121 margin-right: auto !important; 122 margin-left: auto !important; 123} 124/*Reset selects, buttons, and links styles*/ 125.w-input, .w-select, a { 126color: inherit; 127text-decoration: inherit; 128font-size: inherit; 129} 130/*Apply "..." after 3 lines of text */ 131.text-style-3lines { 132 display: -webkit-box; 133 overflow: hidden; 134 -webkit-line-clamp: 3; 135 -webkit-box-orient: vertical; 136} 137/* Apply "..." after 2 lines of text */ 138.text-style-2lines { 139 display: -webkit-box; 140 overflow: hidden; 141 -webkit-line-clamp: 2; 142 -webkit-box-orient: vertical; 143} 144/* Apply "..." at 100% width */ 145.truncate-width { 146 width: 100%; 147 white-space: nowrap; 148 overflow: hidden; 149 text-overflow: ellipsis; 150} 151/* Removes native scrollbar */ 152.no-scrollbar { 153 -ms-overflow-style: none; // IE 10+ 154 overflow: -moz-scrollbars-none; // Firefox 155} 156.no-scrollbar::-webkit-scrollbar {
157 display: none; // Safari and Chrome 158} 159</style> 160 </div> 161 <div class="cookie-consent"> 162 <div fs-cc="banner" class="cc-banner_component"> 163 <div class="fs-cc-banner2_container"> 164 <div class="fs-cc-banner2_text">By clicking âAcceptâ, you agree to the storing of cookies on your device to enhance site navigation, analyze site usage, and assist in our marketing efforts. View our <a href="privacy-policy.html" class="fs-cc-banner2_text-link">Privacy Policy</a> for more information.</div> 165 <div class="fs-cc-banner2_buttons-wrapper"> 166 <a fs-cc="deny" href="#" class="fs-cc-banner2_button fs-cc-button-alt w-button">Deny</a> 167 <a fs-cc="allow" href="#" class="fs-cc-banner2_button w-button">Accept</a> 168 </div> 169 </div> 170 </div> 171 <div fs-cc="manager" class="cc-manager_component"> 172 <div fs-cc="open-preferences" role="button" tabindex="0" title="Cookie Preferences" aria-label="Cookie Preferences" class="fs-cc-manager2_button w-embed"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 173 <path d="M9 8L9 8.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> 174 <path d="M16 15L16 15.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> 175 <path d="M10 17L10 17.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> 176 <path d="M11 13L11 13.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> 177 <path d="M6 12L6 12.01" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> 178 <path d="M12 21C16.9706 21 21 16.9706 21 12C21 11.4402 20.9489 10.8924 20.8511 10.361C20.3413 10.7613 19.6985 11 19 11C18.4536 11 17.9413 10.8539 17.5 10.5987C17.0587 10.8539 16.5464 11 16 11C14.3431 11 13 9.65685 13 8C13 7.60975 13.0745 7.23691 13.2101 6.89492C11.9365 6.54821 11 5.38347 11 4C11 3.66387 11.0553 3.34065 11.1572 3.03894C6.58185 3.46383 3 7.31362 3 12C3 16.9706 7.02944 21 12 21Z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path> 179 </svg></div> 180 </div> 181 <div fs-cc-scroll="disable" fs-cc="preferences" class="cc-prefs_component"> 182 <div class="fs-cc-prefs2_form-wrapper w-form"> 183 <form id="cookie-preferences" name="wf-form-Cookie-Preferences" data-name="Cookie Preferences" method="get" class="fs-cc-prefs2_form" data-wf-page-id="6863cf4e8a8fd8f51a50a1e4" data-wf-element-id="c4bd1fb6-5502-677d-1794-351bc3102070"> 184 <div fs-cc="close" class="fs-cc-prefs2_close"> 185 <div class="fs-cc-preferences2_close-icon w-embed"><svg fill="currentColor" aria-hidden="true" focusable="false" viewBox="0 0 16 16"> 186 <path d="M9.414 8l4.293-4.293-1.414-1.414L8 6.586 3.707 2.293 2.293 3.707 6.586 8l-4.293 4.293 1.414 1.414L8 9.414l4.293 4.293 1.414-1.414L9.414 8z"></path> 187 </svg></div> 188 </div> 189 <div class="fs-cc-prefs2_content"> 190 <div class="fs-cc-prefs2_space-small"> 191 <div class="fs-cc-prefs2_title">Privacy Preferences</div> 192 </div> 193 <div class="fs-cc-prefs2_option"> 194 <div class="fs-cc-prefs2_toggle-wrapper"> 195 <div class="fs-cc-prefs2_label">Essential cookies</div> 196 <div>Required</div> 197 </div> 198 </div> 199 <div class="fs-cc-prefs2_option"> 200 <div class="fs-cc-prefs2_toggle-wrapper"> 201 <div class="fs-cc-prefs2_label">Marketing cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field"> 202 <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="marketing-2" name="marketing-2" data-name="Marketing 2" fs-cc-checkbox="marketing" style="opacity:0;position:absolute;z-index:-1"><span for="marketing-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span> 203 </label> 204 </div> 205 </div> 206 <div class="fs-cc-prefs2_option"> 207 <div class="fs-cc-prefs2_toggle-wrapper"> 208 <div class="fs-cc-prefs2_label">Personalization cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field"> 209 <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="personalization-2" name="personalization-2" data-name="Personalization 2" fs-cc-checkbox="personalization" style="opacity:0;position:absolute;z-index:-1"><span for="personalization-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span> 210 </label> 211 </div> 212 </div> 213 <div class="fs-cc-prefs2_option"> 214 <div class="fs-cc-prefs2_toggle-wrapper"> 215 <div class="fs-cc-prefs2_label">Analytics cookies</div><label class="w-checkbox fs-cc-prefs2_checkbox-field"> 216 <div class="w-checkbox-input w-checkbox-input--inputType-custom fs-cc-prefs2_checkbox"></div><input type="checkbox" id="analytics-2" name="analytics-2" data-name="Analytics 2" fs-cc-checkbox="analytics" style="opacity:0;position:absolute;z-index:-1"><span for="analytics-2" class="fs-cc-prefs2_checkbox-label w-form-label">Essential</span> 217 </label> 218 </div> 219 </div> 220 <div class="fs-cc-prefs2_buttons-wrapper"> 221 <a fs-cc="deny" href="#" class="fs-cc-prefs2_button fs-cc-button-alt w-button">
221Reject all cookies</a> 222 <a fs-cc="allow" href="#" class="fs-cc-prefs2_button w-button">Allow all cookies</a> 223 <a fs-cc="submit" href="#" class="fs-cc-prefs2_submit w-button">Save preferences</a> 224 </div> 225 </div> 226 </form> 227 <div class="form-done"></div> 228 <div class="form-fail"></div> 229 <div fs-cc="close" class="fs-cc-prefs2_overlay"></div> 230 </div> 231 </div> 232 </div> 233 <main class="main-wrapper"> 234 <header class="section-legal"> 235 <div class="page-padding"> 236 <div class="container-large"> 237 <div class="padding-vertical padding-xhuge"> 238 <div class="max-width-large align-center"> 239 <div class="w-dyn-list"> 240 <div role="list" class="w-dyn-items"> 241 <div role="listitem" class="w-dyn-item"> 242 <div class="margin-bottom margin-xxlarge"> 243 <div class="max-width-large"> 244 <h2 class="">Imprint</h2> 245 </div> 246 </div> 247 <div class="blogpost1_content"> 248 <div class="text-rich-text w-richtext"><p>Angaben gemäà §5 DDG:</p> 249<p><a href="//www.xxxxx.de" rel="noopener noreferrer nofollow" data-link-auto="">www.christianludwig.com</a> ist ein Angebot von</p> 250<p>Christian Ludwig</p> 251<p>Rheinaustrasse 32</p> 252<p>D â 53225 Bonn</p> 253<p>USt-IdNr: </p> 254<p>E-Mail-Adresse: [email protected]</p> 255<p>Fotomaterial: Paul Meixner</p> 256<p>Webdesign & Umsetzung:</p> 257<p><a href="//www.dreher-media.de" rel="noopener noreferrer nofollow" data-link-auto="">www.dreher-media.de</a></p> 258<p> </p> 259<p><strong>Haftung für Inhalte</strong></p> 260<p>Als Diensteanbieter sind wir gemäà § 7 Abs.1 DDG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 DDG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.</p> 261<p>Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.</p> 262<p> </p> 263<p><strong>Haftung für Links</strong></p> 264<p>Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche RechtsverstöÃe überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.</p> 265<p> </p> 266<p><strong>Urheberrecht</strong></p> 267<p>Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung auÃerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.</p> 268<p>Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.</p> 269<p> </p> 270<p>Die Europäische Kommission stellt eine Plattform für die auÃergerichtliche Online-Streitbeilegung (OS-Plattform) bereit, die unter<a href="http://www.ec.europa.eu/consumers/odr" rel="noopener noreferrer nofollow"> </a><a href="//www.ec.europa.eu/consumers/odr" rel="noopener noreferrer nofollow" data-link-auto="">www.ec.europa.eu/consumers/odr</a> aufrufbar ist. Wir sind nicht bereit und nicht verpflichtet, an dieser Streitbeilegung teilzunehmen.</p> 271<p>â</p> 272<p>â</p></div> 273 </div> 274 </div> 275 </div> 276 </div> 277 </div> 278 </div> 279 </div> 280 </div> 281 </header> 282 <footer class="footer"> 283 <div class="w-layout-grid footer_grid"> 284 <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b781-2482b77f" class="footer_wrapper"> 285 <a href="imprint.html" aria-current="page" class="w-inline-block w--current"> 286 <div class="coopyright_text created">Imprint</div> 287 </a> 288 <div class="coopyright_text created">|</div> 289 <a href="privacy-policy.html" class="w-inline-block"> 290 <div class="coopyright_text created">Privacy Policy</div> 291 </a> 292 </div> 293 <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b788-2482b77f" class="coopyright_text">©<span class="copyright-year">YEAR</span> Christian Ludwig</div> 294 <div id="w-node-_3f8a519d-e42a-33a3-9e93-b9a22482b78a-2482b77f" class="footer_wrapper"> 295 <div class="coopyright_text created">created by</div> 296 <a href="https://www.dreher-media.de" target="_blank" class="w-inline-block"><img src="images/dreher.media-logo_website-white.svg" loading="lazy" alt="" class="dreher-media-logo
296inverted"></a> 297 </div> 298 </div> 299 </footer> 300 </main> 301 </div> 302
302<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=6863cf4e8a8fd8f51a50a119" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
302 303
303<script src="js/christian-ludwig-29b251.js" type="text/javascript"></script>
303 304
304<script> 305 // Functionality for fs-cc-reject 306 let initFsCCListener = false; 307 function handleFsCcReject() { 308 if (!window.FsCC) { 309 setTimeout(handleFsCcReject, 200); 310 return; 311 } 312 if (!initFsCCListener) { 313 // Add a listener for changes in consent preferences 314 window.FsCC.consentController.on('updateconsents', (consents) => { 315 handleFsCcReject(); // Run the function whenever consent changes 316 }); 317 } 318 // Iterate through all elements with fs-cc-reject attributes 319 document.querySelectorAll('[fs-cc-reject]').forEach((rejectElement) => { 320 const category = rejectElement.getAttribute('fs-cc-reject'); // Get the consent category 321 const isConsentGiven = window.FsCC.store.consents[category]; // Check if consent is granted for the category 322 const consentElement = document.querySelector('[fs-cc="' + category + '"]'); // Find the corresponding fs-cc element 323 // Toggle visibility based on consent state 324 if (isConsentGiven) { 325 rejectElement.style.display = 'none'; // Hide the reject element 326 if (consentElement) consentElement.style.display = 'block'; // Show the consented content 327 } else { 328 rejectElement.style.display = 'block'; // Show the reject element 329 if (consentElement) consentElement.style.display = 'none'; // Hide the consented content 330 } 331 }); 332 } 333 // Run the script on page load 334 document.addEventListener('DOMContentLoaded', handleFsCcReject); 335</script>
335 336
336<script> 337 Webflow.push(function() { 338 $('.copyright-year').text(new Date().getFullYear()); 339 }); 340 window.addEventListener('load', (event) => { 341 const routeName = window.location.pathname?.split('/')?.slice(-1)?.[0] 342 document 343 .querySelectorAll('a[href*="' + routeName + '"]') 344 ?.forEach((el) => el?.classList?.add('w--current')) 345 }) 346 function addSeparatorsByDataAttribute() { 347 // Find all elements in the document 348 const matchingElements = document.querySelectorAll('[data-separator]'); 349 // Process each matching element 350 matchingElements.forEach(element => { 351 // Get the separator text from the data-separator attribute 352 const separatorText = element.getAttribute('data-separator'); 353 // Get all child elements of the current element 354 const children = Array.from(element.children); 355 // Iterate through the children and insert separators 356 children.forEach((child, index) => { 357 if (index < children.length - 1) { // No separator after the last child 358 // Create a new separator element (you could change this to suit) 359 const separator = document.createElement('span'); 360 separator.innerHTML = ' ' + separatorText + ' '; // Set separator text 361 // Insert the separator after the current child 362 child.insertAdjacentElement('afterend', separator); 363 } 364 }); 365 }); 366 } 367 addSeparatorsByDataAttribute(); 368 document.querySelectorAll('.tab-link') 369 ?.forEach((el) => el.addEventListener('click', (event) => { 370 el.parentNode.querySelector('.tab-link.active').classList.remove('active') 371 el.classList.add('active') 372 })) 373 document.querySelectorAll('.biography-lang-links .tab-link') 374 ?.forEach((el) => el.addEventListener('click', (event) => { 375 const lang = el.dataset?.lang 376 document.querySelectorAll('.biography-text:not(.' + lang + ')') 377 ?.forEach((bioEl) => bioEl.style.display = 'none') 378 document.querySelectorAll('.biography-text.' + lang) 379 ?.forEach((bioEl) => bioEl.style.display = 'block') 380 })) 381 const videoSwipers = [] 382</script>
382 383
383<script src="https://cdn.plyr.io/3.7.8/plyr.polyfilled.js"></script>
383 384
384<script src="https://www.youtube.com/iframe_api"></script>
384 385
385<script src="https://player.vimeo.com/api/player.js"></script>
385 386
386<script src="https://geo.dailymotion.com/libs/player.js"></script>
386 387
387<script> 388 const plyrPlayers = Plyr.setup('._init-plyr'); 389 var youtube = document.querySelectorAll('.youtube'); 390 const players = {}; 391 let init = false; 392 function onYouTubeIframeAPIReady() { 393 init = true; 394 for (const el of youtube) { 395 el.addEventListener('click', () => { 396 const customEmbed = el.querySelector('[data-custom-embed]'); 397 if (customEmbed) { 398 el.innerHTML = customEmbed.innerHTML; 399 } 400 const id = 'player_' + el.dataset.id; 401 const type = el.dataset.type; 402 const videoId = el.dataset.videoId; 403 const time = el.dataset.time || 0; // Start time in seconds 404 onPlay(id); // Manage autoplay functionality 405 let player; 406 // YouTube Player 407 if (type === 'youtube') { 408 player = new YT.Player(id, { 409 videoId: videoId, 410 playerVars: { 411 start: time, 412 }, 413 events: { 414 onReady: (event) => { 415 event.target.playVideo(); 416 }, 417 onStateChange: (event) => { 418 if (event.data === YT.PlayerState.PLAYING) { 419 onPlay(id); 420 } else if ( 421 event.data === YT.PlayerState.PAUSED || 422 event.data === YT.PlayerState.ENDED 423 ) { 424 onPause(id); 425 } 426 }, 427 }, 428 }); 429 // Vimeo Player 430 } else if (type === 'vimeo') { 431 document.getElementById(id).innerHTML = ''; 432 player = new Vimeo.Player(id, { 433 id: videoId, 434 autoplay: true, 435 start: time, 436 }); 437 player.on('play', () => onPlay(id)); 438 player.on('pause', () => onPause(id)); 439 // Dailymotion Player (using Player Library Script) 440 } else if (type === 'dailymotion') { 441 const container = document.getElementById(id); 442 // Create Dailymotion player instance using Player Library 443 dailymotion.createPlayer(id, { 444 video: videoId, 445 params: { 446 autoplay: 1, 447 start: time, 448 mute: false, // Adjust other parameters as needed 449 } 450 }) 451 .then((playerInstance) => { 452 console.log('Dailymotion Player initialized:', playerInstance); 453 // Attach event listeners for play, pause, and ended events 454 playerInstance.on('play', () => onPlay(id)); 455 playerInstance.on('pause', () => onPause(id)); 456 playerInstance.on('ended', () => onPause(id)); 457 // Store the player instance for later control 458 players[id] = { type: 'dailymotion', player: playerInstance }; 459 }) 460 .catch((error) => console.error('Error initializing Dailymotion player:', error)); 461 } 462 // Store the player instance (for YouTube or Vimeo) 463 players[id] = { type, player }; 464 }); 465 } 466 } 467 const pauseAllPlayers = (id = null) => { 468 for (const [key, value] of Object.entries(players)) { 469 if (id === key) continue; 470 if (value.type === 'youtube') { 471 value.player.pauseVideo(); 472 } else if (value.type === 'vimeo') { 473 value.player.pause(); 474 } else if (value.type === 'dailymotion') { 475 value.player.pause(); // Pause Dailymotion video using the Player Library 476 } 477 } 478 }; 479 const onPlay = (id) => { 480 pauseAllPlayers(id); 481 videoSwipers?.forEach((swiper) => { 482 swiper.autoplay.stop(); 483 }); 484 }; 485 const onPause = (id) => { 486 videoSwipers?.forEach((swiper) => { 487 swiper.autoplay.start(); 488 }); 489 }; 490 document.addEventListener("DOMContentLoaded", () => { 491 videoSwipers?.forEach((swiper) => { 492 swiper.on('slideChange', () => { 493 pauseAllPlayers(); 494 }); 495 }); 496 setTimeout(() => { 497 if (!init) { 498 onYouTubeIframeAPIReady(); 499 } 500 }, 500); 501 }); 502 const checkYouTubeThumbnails = (el, currentIndex = 0) => { 503 if (el.naturalWidth > 120) return 504 const thumbnailSizes = [ 505 'maxresdefault', 506 'sddefault', 507 'hqdefault', 508 'mqdefault', 509 'default', 510 ] 511 if (currentIndex >= thumbnailSizes.length) { 512 return 513 } 514 const size = thumbnailSizes[currentIndex] 515 const originalSrc = el.src 516 const img = new Image() 517 img.onload = function () {
518 if (img.naturalWidth > 120) { 519 el.src = img.src 520 } else { 521 checkYouTubeThumbnails(el, currentIndex + 1) 522 } 523 } 524 img.onerror = function () { 525 checkYouTubeThumbnails(el, currentIndex + 1) 526 } 527 img.src = originalSrc.replace(/maxresdefault/, size) 528 } 529 document.querySelectorAll('.youtube img').forEach((el) => { 530 checkYouTubeThumbnails(el) 531 }) 532</script>
532 533
533<script> 534 // Function to download a file 535 function downloadFile(url, filename) { 536 const link = document.createElement('a'); 537 link.href = url; 538 link.download = filename || url.split('/').pop(); // Use filename if provided, otherwise extract from URL 539 document.body.appendChild(link); 540 link.click(); 541 document.body.removeChild(link); 542 } 543 // Add event listeners to all elements with the [data-download-href] attribute 544 document.querySelectorAll('[data-download-href]').forEach(element => { 545 element.addEventListener('click', function(event) { 546 event.preventDefault(); // Prevent the default action (if it's a link) 547 event.stopPropagation(); 548 const url = element.getAttribute('data-download-href'); 549 const filename = element.getAttribute('data-download-filename'); // Optional filename attribute 550 downloadFile(url, filename); 551 }); 552 }); 553</script>
553 554</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.