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

Доступ к Pintere LLC и использование Pintere LLC (\ "Pintere\" или \"Pintere.com\") вы соглашаетсяе быть связанными Pintere.com условиями обслуживания, как указано в этом документе. Если вы не принимаете эти условия, вам не разрешается использовать Pintere.com или его услуги.

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

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

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

Регистрация

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

Содержание

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

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

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

Pintere.com использует некоторые иконы для социальных медиа-услуг (\ «Social Media Icons» ) для направления пользователей на сайт Pintere.com о записи контента из таких социальных сетей.

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

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

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

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

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

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

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

Поведение

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

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

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

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

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

DMCA Политика

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

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

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

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

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

Вопросы

Если у вас есть какие-либо вопросы по этому служебному документу, не стесняйтесь 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: '896n6uFucMXcJGpiJL7pV3KhIv5D2Rz84QXBIm75Bj3N2nimHk5gfE5tydtI1WlZ' }, 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', '896n6uFucMXcJGpiJL7pV3KhIv5D2Rz84QXBIm75Bj3N2nimHk5gfE5tydtI1WlZ'); 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', '896n6uFucMXcJGpiJL7pV3KhIv5D2Rz84QXBIm75Bj3N2nimHk5gfE5tydtI1WlZ'); 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: "Pintere", csrfToken: "896n6uFucMXcJGpiJL7pV3KhIv5D2Rz84QXBIm75Bj3N2nimHk5gfE5tydtI1WlZ", goApiUrl: GO_API_URL || "", i18n: batchDownloadI18n, onAllDone: function () { setTimeout(function () { target.find(".spinner-border").addClass("d-none"); target.text('Поделиться Pintere.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('Поделиться Pintere.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: "Pintere-selected", csrfToken: "896n6uFucMXcJGpiJL7pV3KhIv5D2Rz84QXBIm75Bj3N2nimHk5gfE5tydtI1WlZ", 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); } }); } } ); }());