任期

通过访问和使用 Pintere LLC (\"Pintere\\" 或\"Pintere.com\"),您同意接受本文件中所述Pintere.com人的服务条件的约束。如果你不接受这些条件,您不能使用Pintere.com人或其服务。

Pintere.com人保留随时以任何理由,完全斟酌决定改变、改变、更新或终止服务条件的权利,继续使用Pintere.com人或其服务,同意受本服务条件文件今后任何版本的约束,因此,我们建议你不时审查这些服务条件。

Should you violate the Terms of Services, any prior authorization, implicit or explicit, to use Pintere.com or its services shall terminate immediately without notice. Any use of Pintere.com in violation of these Terms of Service shall be unauthorized.

No employer-employee relationship, partnership, or other agency relationship with Pintere.com is created as a result of acceptance of these terms of service.

登记登记

You represent and warrant to us that: (A) you are an individual (i.e., not a corporation) and you are of legal age to form a binding contract or have your parent's permission to do so, and you are at least 13 years or age or older; (B) all registration information you submit is accurate and truthful; and (C) you will maintain the accuracy of such information. You also certify that you are legally permitted to use and access the services and take full responsibility for the selection and use of and access to the services. This agreement is void where prohibited by law, and any access to Pintere.com or its services in such jurisdictions is prohibited.

内容内容内容内容内容内容内容

Pintere.com保留在Pintere.com及其网站上查阅其原始内容的任何内容的权利。

Pintere.com 可能收集您使用 Pintere.com 及其服务的信息 。 例如, Pintere.com 收集您的 IP 地址 用于 利率 限制 记录 。 如果您不是 UPGRADED 用户, 则收集您的 IP 地址 。 这是 Pintere.com 登录您的 IP 的唯一实例。 在任何转码器上没有 IP 登录 。 它不会将 IP 连接到 IP 所录的任何视频或音频 。 它只是统计该 IP 完成的 IP 记录, 直到 IP 达到 3 个请求 。 一小时后, 您的 IP 地址将过期 。 这是 Pintere.com 使用您的 IP IP IP 协议 地址 (\ “ IP\ ” ) 的唯一实例 。 任何其它用途都将被明确禁止 。 因为 Pintere.com 不登录在它使用的任何服务器上 。 它也可以在创建账户时收集您提供的信息 。 尽管您拥有您的个人数据和信息, 并且通过您使用 Pintere.com 及其服务, 您会提供 Pintere.com 访问、 收集、 并存储这些用户数据和信息的授权和 授权和 89000 。 您 。 您 授权和 。

您表示您有权提供 Pintere.com 的用户信息。 您还同意您提交到 Pintere.com 的所有用户信息, 无论是明确还是使用 Pintere.com 及其服务, 都将按照 Pintere.com 的隐私政策收集并管理 。

Pintere.com使用社会媒体服务的某些图标(\“社会媒体图标”)引导用户在Pintere.com网站上获得有关记录社会媒体服务内容的信息。 使用这些图标并不反映社会媒体网站对Pintere.com的认可或其服务。

Apart from User Information provided by and collected from its users, Pintere.com does not collect or store any third party content or information.

在使用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等 ) 直接发送任何通知。 您可以通过下列链接联系其中一些内容 : Instagma 收缩, 收取利息.

行为行为行为行为行为行为

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.

DMCAC 政策

Pintere.com 尊重知识产权。 Pintere.com 本身不在其网站或服务器上存储第三方内容,从我们的示例代码中可以看出,如何配置画廊Dl或类似的Python 来进行 < a href='https://gist.github.com/nadermx/0c98f7f99407c3535b5f90580647912a'>here。任何人都不应将任何第三方内容上传到Pintere.com。

如果您认为Pintere.com上的任何材料侵犯了您拥有或控制的任何版权,您可以向我们指定的数字千年版权法(以下称“DMCA”)代理人发送一份指称版权侵犯的书面通知。在通知中,您应当:

(A) 充分详细地查明你声称被侵犯的有版权的工作或知识产权,以便我们能够找到这些材料;

(B) 在Pintere.com上标明URL或其他特定位置,其中含有您声称侵犯版权的材料;

(C) 提供版权所有人或受权代表版权所有人行事的人的电子或实际签名;

(D) 包括一项声明,表明你真诚相信有争议的使用未经版权所有人、其代理人或法律授权;

(E) 附上一份声明,说明通知所载信息准确无误,并证明你为版权所有人或受权代表版权所有人行事的人,并按伪证罪处罚;以及

(F) 包括您的姓名、邮寄地址、电话号码和电子邮件地址。

你可以通过电子邮件、传真或邮件将通知发送给我们指定的DMCA探员,具体如下:

Pintere LLC

注意: DMCA 代理

850 Clark st.

P.O. Box 1232

South Windsor CT 06074

传真至: +18604837010

电子邮件 : hello@pintere.com

When Pintere.com receives a proper Notification, it promptly removes or disables access to the allegedly infringing material and terminates the accounts associated therewith (if applicable) in accordance with the DMCA.

Pintere.com人采取政策,在适当的情况下,完全酌情终止被视为累犯的成员。 Pintere.com人也可在完全斟酌的情况下限制他人使用Pintere.com人和/或终止任何侵犯他人任何知识产权的人使用Pintere.com人和/或终止其使用,不论是否存在任何累犯。

赔偿

您应赔偿Pintere.com人及所有子公司、合伙人、客户、雇员、承包商、顾问和其他有关实体,使其免受第三方索赔或对Pintere.com人的诉讼所引起的任何责任、费用、损害、损失或法律事项,包括律师费的损害,并免予赔偿。这明确包括如果提起任何诉讼,有义务为Pintere.com人辩护。

管理法

这些条款和条件受康涅狄格州法律的管辖和解释,并且不可撤销地服从该国或该地法院的专属管辖权。

我怎么取消我的订阅?

要取消订阅,请点击此处;或

附带披露

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: 'RaAFAcUea6Wjd3GQX665zRWjZFEtdwo0rkOSYv0oud8cnxj45Lw2USIzDcvCWiZr' }, 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', 'RaAFAcUea6Wjd3GQX665zRWjZFEtdwo0rkOSYv0oud8cnxj45Lw2USIzDcvCWiZr'); 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', 'RaAFAcUea6Wjd3GQX665zRWjZFEtdwo0rkOSYv0oud8cnxj45Lw2USIzDcvCWiZr'); 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: "RaAFAcUea6Wjd3GQX665zRWjZFEtdwo0rkOSYv0oud8cnxj45Lw2USIzDcvCWiZr", 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: "RaAFAcUea6Wjd3GQX665zRWjZFEtdwo0rkOSYv0oud8cnxj45Lw2USIzDcvCWiZr", 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); } }); } } ); }());