// ==UserScript== // @name Culture.ru – Unlocked [Ath] // @name:ru Culture.ru – Отпёртый [Ath] // @name:uk Culture.ru – Розблоковано [Ath] // @name:be Culture.ru – Адмыкнуты [Ath] // @name:bg Culture.ru – Отключен [Ath] // @name:tt Culture.ru – Açıq [Ath] // @name:sl Culture.ru – Odklenjeno [Ath] // @name:sr Culture.ru – Otključano [Ath] // @name:ka Culture.ru – განბლოკილი [Ath] // @description Fixes the bug causing the "Видеозапись недоступна для просмотра по решению правообладателя" error message. // @description:ru Исправляет баг, приводящий к появлению сообщения "Видеозапись недоступна для просмотра по решению правообладателя". // @description:uk Виправляє баг, що призводить до появи повідомлення "Видеозапись недоступна для просмотра по решению правообладателя". // @description:be Іспраўляе баг, які прыводзіць да паўстання паведамлення "Видеозапись недоступна для просмотра по решению правообладателя". // @description:bg Отстранява грешката, която води до появата на съобщение "Видеозапись недоступна для просмотра по решению правообладателя". // @description:tt Хатаны төзәтә, ул "Видеозапись недоступна для просмотра по решению правообладателя" дигән хәбәр барлыкка килүгә китерә. // @description:sl Odpravlja napako, ki povzroča pojav sporočila "Видеозапись недоступна для просмотра по решению правообладателя". // @description:sr Ispravlja bag koji dovodi do pojavljivanja poruke "Видеозапись недоступна для просмотра по решению правообладателя". // @description:ka ფიქსირებს ბაგს, რომელიც იწვევს "Видеозапись недоступна для просмотра по решению правообладателя" შეტყობინების გამოჩენას. // @namespace athari // @author Athari (https://github.com/Athari) // @copyright © Prokhorov ‘Athari’ Alexander, 2024–2025 // @license MIT // @homepageURL https://github.com/Athari/AthariUserJS // @supportURL https://github.com/Athari/AthariUserJS/issues // @version 1.0.4 // @icon https://www.google.com/s2/favicons?sz=64&domain=culture.ru // @match https://*.culture.ru/* // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // @grant GM_getResourceText // @grant GM_getResourceURL // @grant GM_info // @run-at document-start // @require https://cdn.jsdelivr.net/npm/string@3.3.3/dist/string.min.js // @require https://cdn.jsdelivr.net/npm/@athari/monkeyutils@0.2.2/monkeyutils.u.min.js // @require https://cdn.jsdelivr.net/npm/hls.js@1.5.18/dist/hls.light.min.js // @require https://cdn.jsdelivr.net/npm/plyr@3.7.8/dist/plyr.min.js // @resource script-urlpattern https://cdn.jsdelivr.net/npm/urlpattern-polyfill/dist/urlpattern.js // @resource css-plyr https://cdn.jsdelivr.net/npm/plyr@3.7.8/dist/plyr.css // @tag athari // ==/UserScript== (async () => { 'use strict' // Test URL: https://www.culture.ru/live/movies/3183/zimnyaya-skazka const { waitForEvent, h, attempt, ress, scripts, els, opts } = athari.monkeyutils; const res = ress(), script = scripts(res); const el = els(document, { mainHeader: "main > div:has(h1)", footer: "footer", titleDivs: "div:has(> h1) div", lstVideos: "#ath-videos", videos: "#ath-videos video", lstImages: "#ath-images", images: "#ath-images img", lblPlyrAuto: ".plyr__menu__container [data-plyr='quality'][value='0'] span", }); const opt = opts({ hideOriginal: true, thumbHeight: 240, }); const strs = { en: { opt: { hideOriginal: "Hide original media", thumbHeight: "Thumbnail height", }, }, ru: { opt: { hideOriginal: "Скрыть исходные материалы", thumbHeight: "Высота превьюшек", }, }, g: { videoErrorMessage: "Видеозапись недоступна для просмотра по решению правообладателя", } }; const language = navigator.languages.filter(l => strs[l] != null)[0] ?? strs[navigator.language] ?? 'ru'; const str = strs[language]; S.extendPrototype(); Object.assign(globalThis, globalThis.URLPattern ? null : await script.urlpattern); await waitForEvent(document, 'DOMContentLoaded'); const data = unsafeWindow.__NEXT_DATA__; el.tag.head.insertAdjacentHTML('beforeEnd', /*html*/` `); attempt("add options", () => { const inputs = []; const meta = (prop) => GM_info.script[`${prop}_i18n`]?.[language] ?? GM_info.script[prop]; const formatAttrs = attrs => Object.entries(attrs).map(([k, v]) => `${k}="${h(v)}"`).join(" "); const tplInput = (id, attrs = { type: 'checkbox' }) => ( inputs.push({ id, ...attrs }), /*html*/``); el.footer.insertAdjacentHTML('beforeBegin', /*html*/`