Условия службы

Пользуясь Soundc LLC ("Soundc"), вы соглашаетесь на Soundc условий обслуживания, как указано в настоящем документе. Если вы не принимаете эти условия, вам не разрешается пользоваться Soundc или его услугами.

Soundc резервирует за собой право изменять, изменять, обновлять или прекращать срок службы по своему усмотрению в любое время по любой причине.

Если вы нарушаете положения об услугах, то любое предварительное разрешение, имплицитное или явное, на использование Soundc или его услуги немедленно прекращаются без уведомления.

В результате признания этих условий службы никаких отношений между работодателем и работником, партнерских отношений или других отношений с Soundc не возникает.

Регистрация

Вы представляете и утверждаете для нас, что: а) вы - индивид (т.е. не корпорация), и вы имеете законный возраст для заключения обязательного договора или для этого имеете разрешение вашего родителя, и вам не менее 13 лет или старше; b) вся представляемая вами информация о регистрации является точной и правдивой; и С) вы будете сохранять точность такой информации. Вы также удостоверяете, что вам разрешено пользоваться услугами и получать доступ к ним, и берете на себя всю полноту ответственности за выбор, использование и доступ к услугам. Это соглашение является недействительным, если оно запрещено законом, и любой доступ к Soundc или его услугам в таких юрисдикциях запрещен.

Содержание

Soundc сохраняет права на любой из своих оригинальных материалов Soundc и на свой веб-сайт.

Soundc может собирать информацию из вашего использования Soundc и его сервисов. Например, Soundc собирает ваш IP-адрес для записи ограничений скорости, если вы не пользователь UPGRADE. Это единственный случай, когда Soundc регистрирует ваш IP-адрес. На всех транскодерах нет IP. Он не связывает его с каким-либо видео, которое он записывает или аудио. Он просто показывает, что запись была сделана этим IP, пока IP не достигнет трех запросов. Через час ваш IP-адрес истекает. Это единственный случай, когда Soundc будет использовать ваш IP-адрес через Интернет-протокол (IP). Любые и все другие виды использования будут прямо запрещены, поскольку Soundc не регистрируются на каких-либо серверах, которые он использует. Он может также собирать информацию, которую вы можете предоставить при создании счета. Хотя вы владеете вашими личными данныминформацией, используя Soundc и свои услуги, вы предоставляете Soundc разрешений и лицензий на доступ, сбор и хранение таких пользовательских данных и информации ("пользующая информация"). Ваша информация пользователя не включает никаких ссылок, которые вы используете.

Вы представляете, что имеете право предоставлять Soundc вашей информации для пользователей. Вы также согласны с тем, что вся информация для пользователей, которую вы представляете Soundc, прямо или с использованием Soundc и ее услуг, будет собираться и регулироваться политикой защиты частной жизни Soundc.

Soundc использует некоторые иконы для социальных сетей ("Social Media Icons") для направления пользователей на сайт Soundc о записи контента из таких социальных сетей.

Помимо информации, представляемой пользователями и собранной у их пользователей, Soundc не собирает и не хранит никакого содержания или информации третьих сторон.

При использовании ссылки на контент третьей стороны с Soundc вы понимаете, что вы несете полную ответственность за использование связи с услугами Soundc. Soundc не отвечает за какое-либо содержание, доступное через такие ссылки или связанные с ними материалы. Вы берете на себя всю ответственность.

Soundc не содержит никаких ссылок на содержание третьей стороны и просто содержит напрямую к вам трубы. В результате Soundc могут получить доступ только к контенту, который не защищен DRM. Поскольку вы отвечаете за обеспечение связи с Soundc и его услугами, Soundc не пересматривают и не одобряют содержание сайтов третьей стороны. Кроме того, Soundc не претендуют на какие-либо права на такое содержание. Вы признаете, что содержание и материалы, доступные через ссылки, представленные Soundc, и его услуги не всегда могут быть точными, полными или обновленными.

Определенное содержание может содержать цифровые механизмы прав, которые препятствуют доступу или хранению такого контента. Вы согласны не пытаться обойти такие цифровые механизмы прав.

Вы используете любые ссылки, как свою собственную свободу действий и риск. Вы понимаете.

Soundc человек уважают права интеллектуальной собственности других лиц и не разрешают и не оправдывают деятельность, нарушающую авторские права, и поэтому эта служба позволяет исключительно регистрировать доступное для общественности содержание в Интернете.

Опять же, Soundc не хранят никакого контента, доступного третьей стороне через ее сервисы или веб-сайт. Поэтому мы не можем удалить какой-либо контент. Если вы хотите удалить или отключить доступ к контенту, доступному через другие вебсайты, просьба направить любое уведомление поставщику (например, Instagram, FaceBook, Pinterest и т.д.) напрямую. Вы можете связаться с некоторыми из них по следующим ссылкам: Удаление инстаграма, Уничтожение лица.

Поведение

• Soundc, и его услуги должны использоваться только для личного, некоммерческого использования. >/сильное> Любое коммерческое использование Soundc строго запрещено. Soundc преследует исключительно цель позволить пользователю создать копию доступного онлайнового контента посредством использования его услуг в виде видеомагнитофона для частного, некоммерческого использования пользователя ("справедливое использование"). Однако это не включает публикацию записанного видео на любой публичной платформе без явно выраженного разрешения владельца. Любое использование контента третьей стороны должно быть санкционировано владельцем такого контента и его интеллектуальной собственности. Пользователь несет полную ответственность за использование Soundc. Soundc действует только в качестве поставщика технических услуг.

Кроме того, вы согласны не:

  • Назовите любые законы в вашей юрисдикции, включая любые законы о борьбе с пиратством.
  • Изображайте какую-либо третью сторону или сторону.
  • Disrupt the activities of other Soundc users.

Вы согласны использовать услуги Soundc ответственно.

Any violation of these Terms of Services and rights of any party may result in civil or criminal penalties pursued by Soundc or other third parties.

DMCA Политика

Soundc соблюдают права интеллектуальной собственности. Soundc сами по себе не хранят контент третьих сторон на своем веб-сайте или серверах, как видно из нашего примера кода, как настроить галерею-дл или похожий и Python для этого click здесь>/a>

Политика возмещения

Если вы хотите получить возмещение по какой бы то ни было причине в течение 30 дней после покупки, пожалуйста, обращайтесь к Контакты с нами>/a>.

Аффилированное раскрытие информации

Soundc человек могут заработать небольшую комиссионную от избранных нескольких ссылок по всему сайту

Вопросы

Если у вас есть какие-либо вопросы по этому служебному документу, не стесняйтесь 0) { var dur = parseFloat(attrDuration); info.data('duration', dur); info.find('.clip-fields').show(); info.find('.clip-loading').hide(); initClipSlider(info, dur); } else { info.find('.clip-loading').show(); info.find('.clip-fields').hide(); info.find('.clip-error').hide(); var itemPageUrl = info.attr('data-item-page-url') || ''; var pageUrl = decodeURIComponent(info.find('.download-button').data('page-url') || ''); var directUrl = decodeURIComponent(info.find('.download-button').data('url') || ''); var fetchUrl = itemPageUrl || pageUrl || directUrl; $.ajax({ url: '/api/duration/', type: 'POST', data: { url: fetchUrl, csrfmiddlewaretoken: 'Z3GHvhVdpyOU7mvWkctTVlwqqMOuaiMPEvw5UXgvlbP8E1vpWhYLJXKBNgTOGxb7' }, success: function(data) { if (data.duration) { info.data('duration', data.duration); info.find('.clip-loading').hide(); info.find('.clip-fields').show(); initClipSlider(info, data.duration); } else { info.find('.clip-loading').hide(); info.find('.clip-error').text('Could not get duration').show(); } }, error: function() { info.find('.clip-loading').hide(); info.find('.clip-error').text('Could not get duration').show(); } }); } } } else { clipInputs.hide(); } resetDownloadButton(info); }); container.on("click", ".download-button", function (e) { var target = $(this); var info = target.closest('.result-item-info'); var itemType = target.data('type') || ''; var format = info.find('[data-input=format]:checked').val() || ''; var quality = info.find('[data-input=quality]').val() || ''; var h264 = info.find('input[name=h264]').is(':checked'); // Image conversion (available to all users) if (itemType === 'image' && GO_API_URL) { var imgFormat = info.find('[data-input=img-format]:checked').val() || ''; var imgWidth = info.find('[data-input=img-width]').val() || ''; var imgHeight = info.find('[data-input=img-height]').val() || ''; var imgAspectRatio = info.find('[data-input=img-aspect-ratio]').val() || ''; var needsImageConversion = imgFormat !== '' || imgWidth !== '' || imgHeight !== '' || imgAspectRatio !== ''; if (needsImageConversion) { e.preventDefault(); if (!hasPro) { var modal = new bootstrap.Modal(document.getElementById('upgradeModal')); modal.show(); return; } var sourceUrl = decodeURIComponent(target.data('url')); var fn = target.data('fn') || 'image'; var form = document.createElement('form'); form.method = 'POST'; form.action = '/api/convert/image/'; form.style.display = 'none'; function addImgField(name, value) { var input = document.createElement('input'); input.type = 'hidden'; input.name = name; input.value = value; form.appendChild(input); } addImgField('csrfmiddlewaretoken', 'Z3GHvhVdpyOU7mvWkctTVlwqqMOuaiMPEvw5UXgvlbP8E1vpWhYLJXKBNgTOGxb7'); addImgField('url', sourceUrl); addImgField('title', fn); if (imgFormat) addImgField('image_format', imgFormat); if (imgWidth) addImgField('width', imgWidth); if (imgHeight) addImgField('height', imgHeight); if (imgAspectRatio) addImgField('aspect_ratio', imgAspectRatio); document.body.appendChild(form); form.submit(); document.body.removeChild(form); onDownloadButton.call(target[0]); return; } } var needsConversion = (format === 'wav') || (quality !== '') || h264; if (needsConversion && !hasPro) { e.preventDefault(); var modal = new bootstrap.Modal(document.getElementById('upgradeModal')); modal.show(); return; } if (needsConversion && GO_API_URL) { e.preventDefault(); var pageUrl = decodeURIComponent(target.data('page-url') || ''); var fn = target.data('fn') || 'download'; var sourceUrl = pageUrl; if (pageUrl.indexOf('tiktok.com') !== -1) { var proxyType = (itemType === 'audio') ? 'audio' : 'video'; sourceUrl = GO_API_URL + '/api/proxy?url=' + encodeURIComponent(pageUrl) + '&type=' + proxyType + '&fn=' + encodeURIComponent(fn); } var fmt; if (format === 'wav') { fmt = 'wav'; } else if (itemType === 'audio') { fmt = 'mp3'; } else { fmt = 'mp4'; } var form = document.createElement('form'); form.method = 'POST'; form.action = '/api/convert/' + fmt + '/'; form.style.display = 'none'; function addField(name, value) { var input = document.createElement('input'); input.type = 'hidden'; input.name = name; input.value = value; form.appendChild(input); } addField('csrfmiddlewaretoken', 'Z3GHvhVdpyOU7mvWkctTVlwqqMOuaiMPEvw5UXgvlbP8E1vpWhYLJXKBNgTOGxb7'); addField('url', sourceUrl); addField('title', fn); if (fmt === 'mp3' && quality) addField('audio_quality', quality + 'k'); if (fmt === 'mp4' && quality) addField('video_quality', quality); if (fmt === 'mp4' && h264) addField('h264', 'true'); document.body.appendChild(form); form.submit(); document.body.removeChild(form); onDownloadButton.call(this); } else { onDownloadButton.call(this); } }); container.on("change", "[data-input=format]", function () { var info = $(this).closest('.result-item-info'); var row = info.find('.quality-row'); if ($(this).val() === 'wav') { row.addClass("d-none"); } else { row.removeClass("d-none"); } resetDownloadButton(info); }); container.on("change input", "[data-input=quality]", function () { resetDownloadButton($(this).closest('.result-item-info')); }); container.on("change", "input[name=h264]", function () { resetDownloadButton($(this).closest('.result-item-info')); }); onChangeURLValue(); function onDownloadAll() { var target = $(this); target.find(".spinner-border").removeClass("d-none"); target.prop("disabled", true); var filter = container.find('input[name="downloadFilter"]:checked').val() || 'all'; var downloadLinks = []; var downloadButtons = container.find(".download-button"); downloadButtons.each(function (index, item) { var type = $(item).data("type") || ""; if (filter === "all" || type === filter || (filter === "video" && (type === "video" || type === "video_watermark"))) { downloadLinks.push($(item).data("url")); $(item).addClass("downloaded"); } }); if (downloadLinks.length === 0) { target.find(".spinner-border").addClass("d-none"); target.prop("disabled", false); return; } var batchDownloadI18n = { intro: "We detected {count} files. To keep things reliable we will download them in {n} batches of up to {size}. Each batch is saved separately as it finishes.", progress: "Batch {current} of {total}", retrying: "Batch {batch} failed, retrying in {sec}s…", failed: "Batch {batch} failed after retries. Press Resume to try again.", done_status: "All batches downloaded.", resume_prompt: "You already downloaded {done} of {total} batches for this list. Continue from there?", cancel_confirm: "Cancel the remaining batches?" }; batchDownload.show({ urls: downloadLinks, baseName: "Soundc", csrfToken: "Z3GHvhVdpyOU7mvWkctTVlwqqMOuaiMPEvw5UXgvlbP8E1vpWhYLJXKBNgTOGxb7", goApiUrl: GO_API_URL || "", i18n: batchDownloadI18n, onAllDone: function () { setTimeout(function () { target.find(".spinner-border").addClass("d-none"); target.text('Поделиться Soundcook.com'); target.removeClass('btn-primary').addClass('btn-success'); target.prop("disabled", false); launchConfetti(target, 150, 2200); }, 100); }, onError: function (err) { alert(err && err.message ? err.message : err); target.find(".spinner-border").addClass("d-none"); target.prop("disabled", false); }, onCancel: function () { target.find(".spinner-border").addClass("d-none"); target.prop("disabled", false); } }); } var individualDownloadCount = 0; function onDownloadButton() { var target = $(this); if (!target.data('original-html')) { target.data('original-html', target.html()); target.data('original-class', target.attr('class')); } target.find(".spinner-border").removeClass("d-none"); setTimeout(function () { target.find(".spinner-border").addClass("d-none"); target.text('Поделиться Soundcook.com'); target.removeClass('btn-outline-primary').addClass('btn-success'); launchConfetti(target, 150, 2200); }, 100) if (!hasPro) { individualDownloadCount++; var banner = $('#batchUpsellBanner'); if (banner.length && individualDownloadCount >= 3) { $('#batchUpsellCount').text(individualDownloadCount); banner.removeClass('d-none'); } } } function resetDownloadButton(info) { var btn = info.find('.download-button'); var originalHtml = btn.data('original-html'); if (originalHtml) { btn.html(originalHtml); btn.attr('class', btn.data('original-class')); } } // Multi-select for batch download container.on('change', '.select-item-checkbox', function () { var checked = container.find('.select-item-checkbox:checked'); var count = checked.length; if (!hasPro && count > 1) { $(this).prop('checked', false); var modal = new bootstrap.Modal(document.getElementById('upgradeModal')); modal.show(); return; } $('#selectedCount').text(count); if (count > 1) { $('#downloadSelectedBtn').removeClass('d-none'); } else { $('#downloadSelectedBtn').addClass('d-none'); } }); $('#downloadSelectedBtn').on('click', function () { var target = $(this); target.find('.spinner-border').removeClass('d-none'); target.prop('disabled', true); var selectedUrls = []; container.find('.select-item-checkbox:checked').each(function () { selectedUrls.push($(this).data('url')); }); if (selectedUrls.length === 0) { target.find('.spinner-border').addClass('d-none'); target.prop('disabled', false); return; } var batchDownloadI18n = { intro: "We detected {count} files. To keep things reliable we will download them in {n} batches of up to {size}. Each batch is saved separately as it finishes.", progress: "Batch {current} of {total}", retrying: "Batch {batch} failed, retrying in {sec}s…", failed: "Batch {batch} failed after retries. Press Resume to try again.", done_status: "All batches downloaded.", resume_prompt: "You already downloaded {done} of {total} batches for this list. Continue from there?", cancel_confirm: "Cancel the remaining batches?" }; batchDownload.show({ urls: selectedUrls, baseName: "Soundc-selected", csrfToken: "Z3GHvhVdpyOU7mvWkctTVlwqqMOuaiMPEvw5UXgvlbP8E1vpWhYLJXKBNgTOGxb7", goApiUrl: GO_API_URL || "", i18n: batchDownloadI18n, onAllDone: function () { target.find('.spinner-border').addClass('d-none'); target.prop('disabled', false); launchConfetti(target, 150, 2200); }, onError: function (err) { alert(err && err.message ? err.message : 'An error occurred'); target.find('.spinner-border').addClass('d-none'); target.prop('disabled', false); }, onCancel: function () { target.find('.spinner-border').addClass('d-none'); target.prop('disabled', false); } }); }); function launchConfetti($btn, amount, lifetime) { var colors = ['#FF4757', '#2ED573', '#1E90FF', '#FFA502', '#A55EEA', '#2ECC71', '#FF6B81']; var offset = $btn.offset(); var btnWidth = $btn.outerWidth(); var btnHeight = $btn.outerHeight(); for (var i = 0; i < amount; i++) { var $c = $(''); var size = 3 + Math.random() * 4; // 🎯 más pequeño: 3–7 px var dur = 0.8 + Math.random() * 0.8; // más rápido: 0.8–1.6 s var delay = Math.random() * 0.2; var color = colors[Math.floor(Math.random() * colors.length)]; var rotateStart = Math.floor(Math.random() * 360); var startLeft = offset.left + Math.random() * btnWidth; var startTop = offset.top + Math.random() * btnHeight; $c.css({ position: 'absolute', left: startLeft + 'px', top: startTop + 'px', background: color, width: size + 'px', height: (size + 2) + 'px', transform: 'rotate(' + rotateStart + 'deg)', animation: 'fall linear forwards', animationDuration: dur + 's', animationDelay: delay + 's', zIndex: 9999, pointerEvents: 'none', opacity: 0.9 }); $('body').append($c); (function (el) { setTimeout(function () { el.remove(); }, lifetime || 2000); })($c); } } function onChangeURLValue() { const inputValue = $('#url').val(); if (!inputValue) { return } const button = $('#copyPasteText'); const pasteText = button.data('paste'); const clearText = button.data('clear'); if (inputValue.trim() === '') { button.text(pasteText); } else { button.text(clearText); } } function onLoadMore() { var wrapper = $(this).closest(".job-wrapper"); container.find("#loadMoreEntries").prop("disabled", true); container.find("#loadMoreEntries").find(".spinner-border").removeClass("d-none"); var target = container.find("#form"); var formData = target.serializeArray(); var nextPageToken = wrapper.find("[name=next_page_token]").val(); formData.push({name: 'page', value: page}); formData.push({name: 'next_page_token', value: nextPageToken}); $.ajax({ url: `/api/extract/`, type: 'POST', data: formData, success: function (data) { if (data.error === true || data.success === false) { $('.m-progress').removeClass('m-progress').removeAttr('disabled'); container.find("#loadMoreEntries .spinner-border").addClass("d-none"); container.find("#loadMoreEntries").prop("disabled", false); if (data.html) { wrapper.find(".job-result").append(data.html); } return; } wrapper.find("#actionsWrapper").remove(); wrapper.find(`.job-result #postListWrapper`).append(data.html); wrapper.find(`[name=next_page_token]`).val(data.next_page_token); if (!data.next_page_token) { container.find("#loadMoreEntries").remove(); } else { container.find("#loadMoreEntries .spinner-border").addClass("d-none"); container.find("#loadMoreEntries").removeClass('m-progress').removeAttr('disabled'); } initializeLazyLoad(); page += 1; }, error: function (xhr, status, error) { container.find("#loadMoreEntries .spinner-border").addClass("d-none"); container.find("#loadMoreEntries").prop("disabled", false); try { var response = JSON.parse(xhr.responseText); if (response.html) { wrapper.find(".job-result").append(response.html); } } catch (e) { alert(error); } } }); } function onSubmit(e) { page = 1; var target = $(this); container.find("#result").html(""); container.find("#heading").html(""); e.preventDefault(); var urlInput = target.find("#url").val(); if (!isValidURL(urlInput)) { alert("Введите действительный URL-адрес."); return; } target.find("button").addClass("m-progress").attr('disabled', 'disabled'); // Show loader var wrapperId = 'extract-' + Date.now(); var wrapperHtml = "

"; container.find("#result").append(wrapperHtml); container.find("#" + wrapperId + " .job-result").append($(loader)); $.ajax({ url: `/api/extract/`, type: 'POST', data: target.serialize(), success: function (data) { if (data.error === true || data.success === false) { $('.m-progress').removeClass('m-progress').removeAttr('disabled'); if (data.html) { container.find("#" + wrapperId + " .job-result").html(data.html); } else { container.find("#" + wrapperId + " .job-result").html( '
Произошла неизвестная ошибка.
' ); } return; } container.find("#heading").html(data.heading); container.find("#" + wrapperId + " .job-result").html(data.html); container.find("#" + wrapperId + " [name=next_page_token]").val(data.next_page_token); if (!data.next_page_token) { container.find("#loadMoreEntries").remove(); } $('.m-progress').removeClass('m-progress').removeAttr('disabled'); initializeLazyLoad(); page += 1; }, error: function (xhr, status, error) { $('.m-progress').removeClass('m-progress').removeAttr('disabled'); try { var errorJSON = JSON.parse(xhr.responseText); // Rate limit error if (errorJSON.rate_limit || errorJSON.no_credits) { container.find("#" + wrapperId).remove(); container.find("#rateModal .exceeded-wrapper").html(errorJSON.error); container.find('#rateModal').modal('show'); if (errorJSON.until) { var rateInterval; var totalSeconds = errorJSON.until; container.find('.time-exceeded').text(utils.formatDuration(totalSeconds)); rateInterval = setInterval( function () { totalSeconds--; container.find('.time-exceeded').text(utils.formatDuration(totalSeconds)); if (totalSeconds < 0) { clearInterval(rateInterval); window.location.reload(); } }, 1000 ); } return; } // Bulk URL error if (errorJSON.bulk === false) { container.find("#" + wrapperId).remove(); container.find("#rateModal .exceeded-wrapper").html(errorJSON.error); container.find('#rateModal').modal('show'); return; } // Other error with HTML if (errorJSON.html) { container.find("#" + wrapperId + " .job-result").html(errorJSON.html); } else if (errorJSON.error) { container.find("#" + wrapperId + " .job-result").html( '
' + errorJSON.error + '
' ); } } catch (e) { container.find("#" + wrapperId + " .job-result").html( '
При обработке запроса произошла ошибка.
' ); } } }); } function isValidURL(string) { try { // Extraer solo la parte antes de los parámetros (?) let baseUrl = string.split("?")[0]; // Intentar crear un objeto URL para validar let url = new URL(baseUrl); // Asegurar que el hostname (dominio) es válido return !!(url.hostname && url.hostname.includes(".")); } catch (e) { return false; // Si la URL no es válida, devolver false } } function getResults(jobId, $wrapper, onComplete, next_page_token) { $.ajax({ url: `/api/result/`, type: 'GET', data: { job_id: jobId, nextPageToken: next_page_token, }, success: function (data) { if (data.loading) { setTimeout(function () { getResults(jobId, $wrapper, onComplete, next_page_token); }, 4000); return; } // Check if response indicates failure (even with status 200) // This happens when job completes but with errors if (data.error === true || data.success === false) { $('.m-progress').removeClass('m-progress').removeAttr('disabled'); if (data.html) { container.find(`#${jobId} .job-result`).html(data.html); } else { container.find(`#${jobId} .job-result`).html( '
Произошла неизвестная ошибка.
' ); } if (onComplete) onComplete(); return; } container.find("#heading").html(data.heading); if (page > 1) { $wrapper.find("#actionsWrapper").remove(); $wrapper.find(`.job-result #postListWrapper`).append(data.html); $wrapper.find(`[name=next_page_token]`).val(data.next_page_token); } else { container.find(`#${jobId} .job-result`).html(data.html); container.find(`#${jobId} [name=next_page_token]`).val(data.next_page_token); } if (!data.next_page_token) { container.find("#loadMoreEntries").remove(); } else { container.find("#loadMoreEntries .spinner-border").addClass("d-none"); container.find("#loadMoreEntries").removeClass('m-progress').removeAttr('disabled'); } $('.m-progress').removeClass('m-progress').removeAttr('disabled'); initializeLazyLoad(); page += 1; if (onComplete) onComplete(); }, error: function (xhr, status, error) { $('.m-progress').removeClass('m-progress').removeAttr('disabled'); try { const response = JSON.parse(xhr.responseText); if (response.html) { container.find(`#${jobId} .job-result`).html(response.html); } else { container.find(`#${jobId} .job-result`).html( '
Произошла неизвестная ошибка.
' ); } } catch (e) { container.find(`#${jobId} .job-result`).html( '
При обработке запроса произошла ошибка.
' ); } if (onComplete) onComplete(); } }); } function initializeLazyLoad() { const lazyImages = document.querySelectorAll('img.lazyload[data-src]'); if (!('IntersectionObserver' in window)) { // Fallback simple para navegadores antiguos lazyImages.forEach(img => { img.src = img.getAttribute('data-src'); img.removeAttribute('data-src'); img.classList.remove('lazyload'); }); return; } const observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; if (!img.getAttribute('data-src')) return; img.src = img.getAttribute('data-src'); img.removeAttribute('data-src'); img.onload = () => { const parent = img.closest('.thumbnail-container') || img.closest('.result-image'); const loader = parent ? parent.querySelector('.loader-gif') : null; if (loader) { loader.style.display = 'none'; } }; img.classList.remove('lazyload'); observer.unobserve(img); } }); }); lazyImages.forEach(img => observer.observe(img)); // Initialize Bootstrap tooltips on newly loaded content document.querySelectorAll('[data-bs-toggle="tooltip"]').forEach(function(el) { if (!bootstrap.Tooltip.getInstance(el)) { new bootstrap.Tooltip(el); } }); } } ); }());