NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name BLU Mod Help // @version 1.0 // @description Moderation Assistant for BLU. // @author MiM // @license MIT // @match https://blutopia.cc/torrents/* // @icon https://www.google.com/s2/favicons?sz=64&domain=blutopia.cc // @grant none // @updateURL https://openuserjs.org/meta/MiM/BLU_Mod_Help.meta.js // @downloadURL https://openuserjs.org/install/MiM/BLU_Mod_Help.user.js // ==/UserScript== // Video settings let video_format = null; let video_bits = NaN; let video_settings = {}; let video_resolution = null; let video_height = NaN; let video_width = NaN; let container = null; let video_hdr_format = ""; let stream_op_failed = []; let dxva_op_failed = []; let audio_format = null; let sub_format = null; let mediainfo_section = null; let general_section = null; let encode_settings = null; let audio_section = null; let video_section = null; let bdinfo_section = null; let flagged_as_stream_op = null; let torrent_type = null; let torrent_category = null; let torrent_title = null; let mod_results = []; function get_torrent_title() { return document.getElementsByClassName("torrent__name")[0].innerHTML.trim(); } function set_resolution() { try { video_section = get_mediainfo_video(); let video_nodes = video_section.childNodes; let i = 1; while (i < video_nodes.length) { if (video_nodes[i].innerHTML.trim() == "Resolution") { video_width = video_nodes[i + 2].innerHTML.split("×")[0].replace(' ', '').trim(); video_height = video_nodes[i + 2].innerHTML.split("×")[1].replace(' ', '').trim(); break; } i += 2; } } catch { video_width = NaN; video_height = NaN; } try { video_resolution = document.getElementsByClassName("torrent__resolution-link")[0].innerHTML.trim(); } catch { video_resolution = "Unknown"; } } function is_stream_op() { if (!mediainfo_section) { stream_op_failed.push("Missing mediainfo, impossible to check."); return false; } if (Object.keys(video_settings).length == 0) { stream_op_failed.push("Missing encode settings, impossible to check."); return false; } set_hdr_type(); if (stream_op_failed.length > 0) { return false; } if (container != "MPEG-4") { stream_op_failed.push("Must use mp4 container"); } let aq_mode = 0; try { aq_mode = video_settings.aq.substring(0, video_settings.aq.indexOf(':')); } catch { aq_mode = video_settings["aq-mode"]; } switch (video_resolution) { case "1080p": case "720p": if (video_format != "AVC") { stream_op_failed.push(`Must use x264`); } if (!(video_settings.me == "umh" || video_settings.me == "esa" || video_settings.me == "tesa")) { stream_op_failed.push(`me = ${video_settings.me} < "umh"`); } if (video_settings.ref > 3) { stream_op_failed.push(`ref (${video_settings.ref}) > 3 max`); } if (video_settings.bframes > 6) { stream_op_failed.push(`bframes (${video_settings.bframes}) > 6 max`); } if (video_settings.rc_lookahead < 80) { stream_op_failed.push(`rc-lookahead (${video_settings.rc_lookahead}) < 80 min`); } if (video_settings.trellis != 2) { stream_op_failed.push(`trellis (${video_settings.trellis}) must be 2`); } if (aq_mode != 2) { stream_op_failed.push(`aq-mode (${aq_mode}) must be 2`); } //TODO: add bitrate check. break; case "2160p": if (video_format != "HEVC") { stream_op_failed.push(`Must use x265`); } // TODO: Add HLG check. if (!video_hdr_format.includes("HDR10")) { stream_op_failed.push(`Must be HDR10 or HLG"`); } if (video_settings.me < 2) { stream_op_failed.push(`me = ${video_settings.me} < "umh (2)"`); } if (video_settings.ref > 4) { stream_op_failed.push(`ref (${video_settings.ref}) > 4 max`); } if (video_settings.bframes > 8) { stream_op_failed.push(`bframes (${video_settings.bframes}) > 8 max`); } if (video_settings["rc-lookahead"] < 80) { stream_op_failed.push(`rc-lookahead (${video_settings["rc-lookahead"]}) < 80 min`); } if ("b-intra" in video_settings) { stream_op_failed.push(`Must use no-b-intra`); } if (aq_mode < 2) { stream_op_failed.push(`aq-mode (${aq_mode}) < 2 min`); } //TODO: add bitrate check. break; default: break; } return stream_op_failed.length == 0; } function set_hdr_type() { try { let mediainfo_video_section = get_mediainfo_video(); let video_nodes = mediainfo_video_section.childNodes; let i = 1; while (i < video_nodes.length) { if (video_nodes[i].innerHTML.trim() == "HDR format") { video_hdr_format = video_nodes[i + 2].innerHTML.trim(); } i += 2; } } catch { video_hdr_format = "SDR"; } } function get_mediainfo_section() { try { return document.getElementsByClassName("mediainfo")[0]; } catch { return null; } } function get_bdinfo_section() { try { return document.getElementsByClassName("panelV2 torrent-bdinfo")[0].getElementsByTagName("code")[0];; } catch { return null; } } function get_mediainfo_encode_settings() { try { return mediainfo_section.getElementsByClassName("mediainfo__encode-settings")[0].getElementsByTagName("code")[0]; } catch { return null; } } function get_mediainfo_audio() { try { return mediainfo_section.getElementsByClassName("mediainfo__audio")[0].getElementsByTagName("dl")[0]; } catch { return null; } } function get_mediainfo_video() { try { return mediainfo_section.getElementsByClassName("mediainfo__video")[0].getElementsByTagName("dl")[0]; } catch { return null; } } function get_mediainfo_general() { try { return mediainfo_section.getElementsByClassName("mediainfo__general")[0].getElementsByTagName("dl")[0]; } catch { return null; } } function set_video_enc_settings(encode_settings) { let setting_name = null; let setting_value = null; let mediainfo_split = encode_settings.split(" / "); for (const setting of mediainfo_split) { setting_name = setting.substring(0, setting.indexOf('=')) setting_value = setting.substring(setting.indexOf('=') + 1) video_settings[setting_name] = setting_value; } } function get_enc_type() { switch (video_settings.rc) { case "crf": return `Constant Rate Factor (${video_settings.crf})`; case "2pass": return `Multi-Pass (${video_settings.bitrate} kbps)`; } // abr is rest try { if (video_settings["stats-read"] > 0) { return `Multi-Pass (${video_settings.bitrate} kbps)`; } else { return `Single-Pass (${video_settings.bitrate} kbps)`; } } catch { try { return `Single-Pass (${video_settings.bitrate} kbps)`; } catch { return "Unknown"; } } } function set_container() { try { general_section = get_mediainfo_general(); let general_nodes = general_section.childNodes; let i = 1; while (i < general_nodes.length) { if (general_nodes[i].innerHTML.trim() == "Format") { container = general_nodes[i + 2].innerHTML.trim(); break; } i += 2; } } catch { container = "Unknown"; } } function is_stream_op_flagged() { if (flagged_as_stream_op != null) { return flagged_as_stream_op } flagged_as_stream_op = document.getElementsByClassName("fas fa-play torrent-icons__stream-optimized").length == 1; return flagged_as_stream_op; } function get_torrent_type() { if (torrent_type != null) { return torrent_type } torrent_type = document.getElementsByClassName("torrent__type-link")[0].innerHTML.trim(); return torrent_type; } function get_torrent_category() { if (torrent_category != null) { return torrent_category } torrent_category = document.getElementsByClassName("torrent__category-link")[0].innerHTML.trim(); return torrent_category; } function stream_op_mod_check() { if (torrent_type != "Encode" && !flagged_as_stream_op) { return "CORRECT" } if (torrent_type != "Encode" && flagged_as_stream_op) { return `POSTPONE: Flagged as stream optimized and is of type '${torrent_type}'` } if (stream_op_failed.length > 0 && flagged_as_stream_op) { return "REJECT: Does not meet stream optimized encode settings requirement." } if (container == "MPEG-4" && stream_op_failed.length == 0 && !flagged_as_stream_op) { return "POSTPONE: mp4 with correct settings, missing stream optimized flag." } if (container == "MPEG-4" && stream_op_failed.length > 0 && !flagged_as_stream_op) { return "REJECT: mp4 with incorrect settings" } return "CORRECT"; } function hybrid_dovi_check_remux() { let description = document.getElementsByClassName("panel__body bbcode-rendered")[0]; let derived_p8_base_note_check = description.innerHTML.includes("This release contains a derived Dolby Vision profile 8 layer"); let derived_p8_comparison_check = description.innerHTML.includes("Comparisons between HDR masters:"); derived_p8_comparison_check = derived_p8_comparison_check && !description.innerHTML.includes("omparisons: missing"); let torrent_title = document.getElementsByClassName("torrent__name")[0].innerHTML.trim(); if (torrent_type == "Remux" && video_hdr_format.includes("dvhe.08") && !(derived_p8_base_note_check && derived_p8_comparison_check) && torrent_title.includes("Hybrid")) { return "POSTPONE: Missing required note/comps." } if (torrent_type == "Remux" && video_hdr_format.includes("dvhe.08") && !(derived_p8_base_note_check && derived_p8_comparison_check) && !torrent_title.includes("Hybrid")) { return "POSTPONE: Missing required note/comps and hybrid in title." } if (torrent_type == "Remux" && video_hdr_format.includes("dvhe.08") && (derived_p8_base_note_check && derived_p8_comparison_check) && !torrent_title.includes("Hybrid")) { return "POSTPONE: Missing hybrid in title." } if (torrent_type == "Remux" && video_hdr_format.includes("dvhe.05")) { return "REJECT: Profile 5 Dolby Vision not possible in a remux." } return "CORRECT"; } function hybrid_dovi_web() { let filename = document.getElementsByClassName("mediainfo__filename")[0].innerHTML.replace("<h3>Filename</h3>", '').trim(); let description = document.getElementsByClassName("panel__body bbcode-rendered")[0]; let derived_p8_base_note_check = description.innerHTML.includes("This release contains a derived Dolby Vision profile 8 layer"); let derived_p8_comparison_check = description.innerHTML.includes("DV and HDR are from same provider"); derived_p8_comparison_check = derived_p8_comparison_check && !description.innerHTML.includes("omparisons: missing"); let torrent_title = document.getElementsByClassName("torrent__name")[0].innerHTML.trim(); let needs_hybrid = true; needs_hybrid = needs_hybrid && (!torrent_title.includes("HULU WEB") && !torrent_title.includes(" MAX WEB")) needs_hybrid = needs_hybrid && (!(filename.includes("HULU WEB") || filename.includes("HULU.WEB"))) needs_hybrid = needs_hybrid && (!(filename.includes(" MAX WEB") || filename.includes(".MAX.WEB"))) if (torrent_type.includes("WEB") && video_hdr_format.includes("dvhe.08") && !(derived_p8_base_note_check && derived_p8_comparison_check) && torrent_title.includes("Hybrid") && needs_hybrid) { return "POSTPONE: Missing required note/comps." } if (torrent_type.includes("WEB") && video_hdr_format.includes("dvhe.08") && !(derived_p8_base_note_check && derived_p8_comparison_check) && !torrent_title.includes("Hybrid") && needs_hybrid) { return "POSTPONE: Missing required note/comps and hybrid in title." } if (torrent_type.includes("WEB") && video_hdr_format.includes("dvhe.08") && (derived_p8_base_note_check && derived_p8_comparison_check) && !torrent_title.includes("Hybrid") && needs_hybrid) { return "POSTPONE: Missing hybrid in title." } if (!needs_hybrid && derived_p8_base_note_check && !torrent_title.includes("Hybrid")) { return "POSTPONE: Has note when not a hybrid." } if (!needs_hybrid && derived_p8_base_note_check && torrent_title.includes("Hybrid")) { return "POSTPONE: Has note when not a hybrid and title has hybrid when it likely is not one." } if (torrent_type.includes("WEB") && video_hdr_format.includes("dvhe.05") && derived_p8_base_note_check && torrent_title.includes("Hybrid")) { return "POSTPONE: Contains profile 8 hybrid note and hybrid in title when this is profile 5, likely not a hybrid." } if (torrent_type.includes("WEB") && video_hdr_format.includes("dvhe.05") && derived_p8_base_note_check) { return "POSTPONE: Contains profile 8 hybrid note when this is profile 5, likely not a hybrid." } if (torrent_type.includes("WEB") && video_hdr_format.includes("dvhe.05") && !derived_p8_base_note_check && torrent_title.includes("Hybrid")) { return "CHECK: Contains hybrid in title on profile 5 Dolby Vision, verify the audio is hybrid." } return "CORRECT"; } function hybrid_dovi_check() { if (torrent_type == "Remux" && (video_hdr_format.includes("dvhe.08") || video_hdr_format.includes("dvhe.05"))) { mod_results.push(`Hybrid remux check: ${hybrid_dovi_check_remux()}`) } if (torrent_type.includes("WEB") && video_hdr_format.includes("dvhe.08")) { mod_results.push(`Hybrid WEB-DL/WEBRip moderation: ${hybrid_dovi_web()}`) } if (torrent_type.includes("Encode") && video_hdr_format.includes("dvhe.08")) { mod_results.push(`Hybrid Dolby Vision moderation: CHECK: Unable to check reliably, see sources used and if they are hybrids.`) } } function truehd_compat_check() { if (torrent_type.includes("Full Disc")) { return "CORRECT"; } let prev_atmos = false; let num_atmos = 0; let num_compat = 0; let truehd_language = null; if (mediainfo_section) { let audios = document.getElementsByClassName("mediainfo__audio")[0].getElementsByTagName("dd"); for (var i = 0; i < audios.length; i++) { if (torrent_type.includes("WEB")) { if (prev_atmos && (!audios[i].innerHTML.includes('/ AC-3 /') && !audios[i].innerHTML.includes('/ E-AC-3 /') && !audios[i].innerHTML.includes('/ E-AC-3 JOC /') ) && !audios[i].innerHTML.toLowerCase().includes("commentary")) { return "CHECK: Possible reject, might not have required (E-)AC-3 compatibility track." } if (prev_atmos && truehd_language == audios[i].getElementsByTagName("img")[0].title && (audios[i].innerHTML.includes('/ AC-3 /') || audios[i].innerHTML.includes('/ E-AC-3 /') || audios[i].innerHTML.includes('/ E-AC-3 JOC /') ) && !audios[i].innerHTML.toLowerCase().includes("commentary")) { num_compat++; } } else { if (prev_atmos && !audios[i].innerHTML.includes("/ AC-3 /") && !audios[i].innerHTML.toLowerCase().includes("commentary")) { return "CHECK: Possible reject, might not have required AC-3 compatibility track." } if (prev_atmos && truehd_language == audios[i].getElementsByTagName("img")[0].title && audios[i].innerHTML.includes("/ AC-3 /") && !audios[i].innerHTML.toLowerCase().includes("commentary")) { num_compat++ } } prev_atmos = false; if (audios[i].innerHTML.includes("/ MLP FBA ")) { prev_atmos = true; num_atmos++; truehd_language = audios[i].getElementsByTagName("img")[0].title; } } } if (num_atmos != num_compat) { return "CHECK: Might not have required compatibility track, E-AC-3 only allowed for WEB sourced releases."; } return "CORRECT"; } function missing_any_language_mod() { if (mediainfo_section) { let audios = document.getElementsByClassName("mediainfo__audio")[0].getElementsByTagName("dd"); for (var i = 0; i < audios.length; i++) { // remove newlines and extra spaces. remove two unknowns in a row or it may fail on DVDs. if (audios[i].innerHTML.replace(/[\r\n]+/gm, "").replace(/ +/gm, ' ').replaceAll('/ Unknown /', '/').replaceAll('/ Unknown /', '/').replaceAll('/ Unknown /', '/').includes("Unknown /")) { if (torrent_type.includes("Full Disc")) { return "CHECK: One or more audio/subtitle tracks does not show the language, they likely need to downgrade mediainfo or scan the .BUP, if issue remains it must be noted in the description."; } else { return "CHECK: One or more audio/subtitle tracks does not show the language, they must indicate it in the description."; } } } let subtitles = document.getElementsByClassName("mediainfo__subtitles") if (subtitles.length > 0) { subtitles = subtitles[0].getElementsByTagName("li"); for (i = 0; i < subtitles.length; i++) { if (subtitles[i].innerHTML.replaceAll('| Unknown', '|').replaceAll('| Unknown', '|').replaceAll('| Unknown', '|').includes("Unknown |")) { return "CHECK: One or more audio/subtitle tracks does not show the language, they must indicate it in the description."; } } } } return "CORRECT"; } function has_required_english_subs() { if (mediainfo_section) { let original_language = document.getElementsByClassName("meta__language")[0].innerHTML; if (!original_language) { return "CHECK: TMDb missing original language, unable to check." } if (original_language.replace(/[\r\n]+/gm, "").includes(" en ")) { return "CORRECT" } let subtitles = document.getElementsByClassName("mediainfo__subtitles"); if (subtitles.length > 0) { subtitles = subtitles[0].getElementsByTagName("li"); for (var i = 0; i < subtitles.length; i++) { if (subtitles[i].innerHTML.includes("English")) { return "CORRECT"; } } } return "CHECK: There are no internal English soft subs, check subtitle manager and if it has hardsubs noted. Postpone/reject accordingly." } return "CORRECT"; } /** * Returns image dimensions for specified URL. */ function getImageDimensions(url) { return new Promise((resolve, reject) => { const img = new Image(); img.onload = () => resolve({ width: img.width, height: img.height, full_object: img, }); img.onerror = (error) => reject(error); img.src = url; }); }; async function getImageBlob(imageUrl) { const response = await fetch(imageUrl) return response.blob() } async function screen_ar_size_format() { //TODO //Check the AR matches (within 2% or the mediainfo AR) //Check that they either the width or height matches the resolution //Check that they are png. //https://imgbox.c om/vjZ1VDbS //https://thumbs2.imgbox.com/76/fb/vjZ1VDbS_t.png //https://images2.imgbox.com/76/fb/vjZ1VDbS_o.png //https://wsrv.nl/?n=-1&url=https%3A%2F%2Fi.ibb.co%2FY31GgBR%2FOne-for-the-Road-2023-1080p-Blu-Ray-REMUX-AVC-True-HD7-1-Atmos-MANi-AC-mkv-snapshot-01-29-02-253.png //https://wsrv.nl/?n=-1&url=https%3A%2F%2Fi.ibb.co%2F80fVkgK%2FOne-for-the-Road-2023-1080p-Blu-Ray-REMUX-AVC-True-HD7-1-Atmos-MANi-AC-mkv-snapshot-01-29-02-253.png //80fVkgK //Y31GgBR try { let dimensions = {}; dimensions = await getImageDimensions("https://images2.imgbox.com/76/fb/vjZ1VDbS_o.png"); console.log(`Image dimensions: ${dimensions.width}px x ${dimensions.height}px`); console.log(`${dimensions.full_object}`) } catch (e) { // Could not load image from specified URL console.error(e); } } function only_one_mediainfo_bdinfo() { if (mediainfo_section && bdinfo_section) { return "POSTPONE: Contains mediainfo and bdinfo, should only have one" } return "CORRECT" } function resolution_check() { //TODO //verify resolution selected against mediainfo //verify SD flag let found_resolution = null; let total_pixels = null; if (!mediainfo_section && !bdinfo_section) { return "POSTPONE: Missing mediainfo/bdinfo." } if (mediainfo_section) { const regex = /[\d,\.]+ ?× ?[\d,\.]+\d+/g; let video_attributes = video_section.getElementsByTagName("dd"); for (var i = 0; i < video_attributes.length; i++) { found_resolution = video_attributes[i].innerHTML.replace(/[\s\r\n]+/gm, "").match(regex); if (found_resolution) { found_resolution = found_resolution[0].split('×') total_pixels = found_resolution[0] * found_resolution[1]; break; } } if (total_pixels < 600000) { //SD if (found_resolution[1] == 480) { found_resolution = '480' } else if (found_resolution[1] == 576) { found_resolution = '576' } else if (total_pixels > 430000) { found_resolution = '576' } else { found_resolution = '480' } } else { if (total_pixels > 70000000) { found_resolution = '8640' } else if (total_pixels > 13500000) { found_resolution = '4320' } else if (total_pixels > 3000000) { found_resolution = '2160' } else if (total_pixels > 960000) { found_resolution = '1080' } else if (total_pixels > 960000) { found_resolution = '720' } else { return "CHECK: Seemingly invalid resolution, between HD and SD." } } } else if (bdinfo_section) { const regex_bdinfo = /(\s+kbps\s+[\s/]+)(\d+[ip])([\s/]+)([\d\.]+ fps)/ found_resolution = bdinfo_section.innerHTML.replace(/[\r\n]+/gm, "").match(regex_bdinfo); if (found_resolution && found_resolution.length >= 5) { found_resolution = found_resolution[2].replace(/[ip]/gm, "") } else { return "POSTPONE: Unable to find resolution in bdinfo." } } if (!video_resolution.includes(found_resolution)) { return `POSTPONE: Detected resolution of '${found_resolution}' does not match selected '${video_resolution}'` } return "CORRECT" } function verify_interlaced() { //TODO //DVDs need to parse VOB in description. //25fps allow both let found_resolution = null; let found_interlaced = false; let is_25fps = false; if (torrent_type.includes("Full Disc")) { // Check bdinfo, else check for the VOB in the description. if (bdinfo_section) { const regex_bdinfo = /(\s+kbps\s+[\s/]+)(\d+[ip])([\s/]+)([\d\.]+ fps)/ found_resolution = bdinfo_section.innerHTML.replace(/[\r\n]+/gm, "").match(regex_bdinfo); if (found_resolution && found_resolution.length >= 5) { is_25fps = found_resolution[4] == "25 fps"; found_interlaced = found_resolution[2].includes("i"); if (is_25fps && found_interlaced && found_resolution.replace(/[ip]/gm, "") == "1080") { return "CORRECT" } if (found_interlaced == video_resolution.includes("i")) { return "CORRECT" } else if (found_interlaced) { return "POSTPONE: Flagged as interlaced, user selected progressive." } else { return "POSTPONE: Flagged as progressive, user selected interlaced." } } else { return "POSTPONE: Unable to find resolution and FPS in bdinfo." } // DVD logic here //TODO } } else { let mediainfo_text = document.getElementsByClassName("torrent-mediainfo-dump bbcode-rendered")[0].innerHTML.replace(/[\r\n]+/gm, ""); const interlaced_regex = /Scan type +: Interlaced/g; const mbaff_regex = /Scan type +: MBAFF/g; const fps_regex = /Frame rate +: \d+(\.\d+)?( \(\d+\/\d+\))? FPS/g; const is_25fps = mediainfo_text.match(fps_regex)[0].replace(' ', '').split(':')[1].includes('25.000') const mbaff_check = mediainfo_text.match(mbaff_regex); if (mediainfo_text.match(interlaced_regex) || mbaff_check) { if (!video_resolution.includes("i") && !is_25fps) { return "POSTPONE: Marked as progressive, but mediainfo shows interlaced and is not 25FPS." } if (!video_resolution.includes("i") && is_25fps && !mbaff_check) { return "POSTPONE: Not MBAFF flagged 24FPS content, likely interlaced." } if (video_resolution.includes("i") && is_25fps) { return "CORRECT: Most 24FPS is progressive, but mediainfo shows interlaced and is fine to title it as such." } } } return "CORRECT" } function encode_check() { //some basic quality requirements if (torrent_type.includes("Encode")) { if (!encode_settings) { return "REJECT: Hardware encodes not allowed." } } if (encode_settings && (torrent_type.includes("HDTV") || torrent_type.includes("Encode"))) { let encode_type = get_enc_type(); if (encode_type.includes("Single-Pass")) { return "REJECT: Single-Pass encodes are low quality." } if (!["umh", "esa", "tesa", "2", "3", "4", "5"].includes(video_settings.me)) { return `REJECT: me='${video_settings.me}' < umh (x264=umh | x265=3)` } if (video_settings.trellis && video_settings.trellis != 2) { return `REJECT: trellis='${video_settings.trellis}', likely low quality.` } let deblock = video_settings.deblock.split(":"); if (video_settings.merange < 24) { return "REJECT: low merange, should be at least 24 to allow decent motion vectors." } if (!is_stream_op() && video_settings.bframes < 5) { return `REJECT: low bframe count, ${video_settings.bframes}, likely low quality.` } if (!is_stream_op() && video_settings.bframes < 7) { return `CHECK: low bframe count, ${video_settings.bframes}, check quality looks good enough.` } if (deblock[0] != 1 && deblock[1] >= 0 && deblock[2] >= 0) { return `CHECK: deblock='${video_settings.deblock}' > 1:-1:-1. Non-annimation this is normally LQ.` } return "CORRECT" } return "CORRECT: Not an encode" } function title_check() { let title = null; let title_aka = null; let year = null; let cut = null; let hybrid = null; let repack = null; let resolution = null; let web_source = null; let source = null; let dual_audio = null; let audio_codec = null; let audio_channels = null; let audio_object = null; let dv = null; let hdr = null; let video_codec = null; let group = null; let title_aka_sans = null; let title_sans = null; let audio_space = null; //TODO let returns = []; if (torrent_category.includes("TV Show")) {} else { if (torrent_type.includes("Full Disc")) { const full_disc_regex = /Movie.../g; } else { // does not work on Blu-ray remux and alike, DVD will. const encode_web_regex = /^(.*? )(AKA .*?)*?(\d{4} )(.*? )?(Hybrid )?(REPACK )?(\d{3,4}[ip] |NTSC |PAL )?([A-Z]{2,10} )?(ProRes|UHD BluRay|BluRay|HDDVD|DVD|WEB-DL|WEBDL|WEB|WEBRip|HDTV)?( REMUX)?( )(Dual-Audio )?(DDP|DD\+|DDPA|DD|TrueHD|LPCM|DTS|DTS-?.?HD.?MA|DTS-HD HRA|DTS\:X|DTS-X|MPA|MP3|MP2|AAC|Opus|FLAC|L?PCM)( ?)(\d\.\d ?)+?(Atmos |Auro3D )?(DV )?(HDR |HDR10\+ )?(x26[45]|H\.26[45]|VC-?1|MEEG-?2|AV1|AVC|HEVC)?( ?-.*)?$/ig; let base_encode_web_check = torrent_title.matchAll(encode_web_regex); base_encode_web_check = base_encode_web_check.toArray(); if (base_encode_web_check.length == 0) { returns.push("POSTPONE: Base title check failed, double check everything is in the correct order."); return format_title_mod(returns); } base_encode_web_check = base_encode_web_check[0]; title = base_encode_web_check[1]; title_aka = base_encode_web_check[2]; year = base_encode_web_check[3]; if (!year) { returns.push("POSTPONE: Year is missing.") } cut = base_encode_web_check[4]; if (cut) { if (cut.toLowerCase().includes("repack") || cut.toLowerCase().includes("hybrid")) { returns.push("POSTPONE: Hybrid and/or repack in the wrong spot, 'CUT Hybrid REPACK' is expected") } } hybrid = base_encode_web_check[5]; if (hybrid) { if (!hybrid.startsWith("REPACK")) { returns.push("POSTPONE: Hybrid casing is wrong.") } } repack = base_encode_web_check[6]; if (repack) { if (!repack.startsWith("REPACK")) { returns.push("POSTPONE: REPACK casing is wrong.") } } resolution = base_encode_web_check[7]; web_source = base_encode_web_check[8]; source = base_encode_web_check[9]; if (!source) { returns.push("POSTPONE: Source is missing or in wrong spot, check and postpone.") } dual_audio = base_encode_web_check[12]; audio_codec = base_encode_web_check[13]; if (audio_codec == "DDP") { returns.push("POSTPONE: DDP is incorrect, should be DD+.") } if (audio_codec == "MPA") { returns.push("POSTPONE: MPA is incorrect, check mediainfo for if this is MP3 or MP2.") } if (audio_codec == "MP3") { returns.push("REJECT: MP3 is not allowed without good reason.") } if (audio_codec == "DDPA") { returns.push("POSTPONE: DDPA is incorrect, should be DD+.") } if (audio_codec == "DTS-X") { returns.push("POSTPONE: DTS-X is incorrect, should be DTS:X.") } if (audio_codec == "DTSMA") { returns.push("POSTPONE: DTSMA is incorrect, should be DTS-HD MA.") } if (audio_codec == "DTS MA") { returns.push("POSTPONE: DTS MA is incorrect, should be DTS-HD MA.") } if (audio_codec == "DTS.MA") { returns.push("POSTPONE: DTS.MA is incorrect, should be DTS-HD MA.") } if (audio_codec == "DTSHD") { returns.push("POSTPONE: DTSHD is incorrect, likely should be DTS-HD MA, check mediainfo.") } if (audio_codec == "DTSHDMA") { returns.push("POSTPONE: DTSHDMA is incorrect, should be DTS-HD MA.") } if (audio_codec == "DTSHD.MA") { returns.push("POSTPONE: DTSHD.MA is incorrect, should be DTS-HD MA.") } if (audio_codec == "DTSHD MA") { returns.push("POSTPONE: DTSHD MA is incorrect, should be DTS-HD MA.") } audio_space = base_encode_web_check[14]; if (!audio_space) { returns.push("POSTPONE: Missing space between audio codec and channels.") } audio_channels = base_encode_web_check[15]; if (!audio_channels) { returns.push("POSTPONE: Missing audio channels.") } audio_object = base_encode_web_check[16]; dv = base_encode_web_check[17]; hdr = base_encode_web_check[18]; video_codec = base_encode_web_check[19]; if (!video_codec) { returns.push("POSTPONE: Music not allowed, no video codec specified.") } if (video_codec == "MPEG2") { returns.push("POSTPONE: MPEG2 is incorrect, should be MPEG-2.") } if (video_codec == "VC1") { returns.push("POSTPONE: VC1 is incorrect, should be VC-1.") } group = base_encode_web_check[20]; if (title && title_aka) { if (title_aka.startsWith("aka")) { "POSTPONE: 'aka' needs to be in proper caps, 'AKA'." } title_sans = title.replace(/\s/g, '').replace(/[^A-z0-9]/g, '').toLowerCase(); title_aka_sans = title_aka.replace(/\s/g, '').replace(/[^A-z0-9]/g, '').toLowerCase().substring(3); if (title_sans.includes(title_aka_sans) || title_aka_sans.includes(title_sans)) { returns.push("POSTPONE: Redundant AKA and English/International title, only keep one.") } } if (source == "WEBDL") { returns.push("POSTPONE: Source should be WEB-DL, not WEBDL.") } if (source == "WEB") { returns.push("POSTPONE: Source is only specified as WEB, likely a WEB-DL, needs checked.") } if (!["ProRes", "UHD BluRay", "BluRay", "HDDVD", "DVD", "WEB-DL", "WEBRip", "HDTV"].includes(source)) { "POSTPONE: The source is the wrong casing." } if (torrent_type.includes("Encode")) { if (!["ProRes", "UHD BluRay", "BluRay", "HDDVD"].includes(source)) { "POSTPONE: Encode type selected, source matches another, check which is wrong." } if (!["x265", "x264"].includes(video_codec)) { returns.push("REJECT: Only x265 and x264 are allowed for encodes.") } } if (torrent_type.includes("WEB-DL")) { if (!["WEB-DL"].includes(source)) { "POSTPONE: WEB-DL type selected, source matches another, check which is wrong." } if (["x265", "x264"].includes(video_codec)) { returns.push("POSTPONE: x264/x265 specified and claims WEB-DL, check which it is.") } } if (torrent_type.includes("WEBRip")) { if (!["WEB-DL"].includes(source)) { returns.push("POSTPONE: WEBRip type selected, source matches another, check which is wrong.") } } if (torrent_type.includes("Remux")) { if (!["UHD BluRay", "BluRay", "HDDVD", "DVD"].includes(source)) { returns.push("POSTPONE: Remux type selected, source matches another, check which is wrong.") } } } } return format_title_mod(returns); } function format_title_mod(returns) { if (returns.length == 0) { returns.push("CHECK: Title checking is not guaranteed double check. No major issues detected.") } for (var i = 0; i < returns.length; i++) { returns[i] = `Title moderation: ${returns[i]}` } return returns } function AddModerationHelp() { let panelV2s = document.getElementsByClassName("panelV2") let moderationPanel = null; for (var i = 0; i < panelV2s.length; i++) { if (panelV2s[i].innerHTML.includes(`class="fal fa-hammer-war"`)) { moderationPanel = panelV2s[i]; } } if (!moderationPanel) { console.log(mod_results); return; } moderationPanel = moderationPanel.getElementsByTagName("div")[0]; moderationPanel.innerHTML += "<br><ul>"; let color = null; for (i = 0; i < mod_results.length; i++) { if (mod_results[i].includes("POSTPONE:")) { color = 'yellow'; } if (mod_results[i].includes("REJECT:")) { color = 'red' } if (mod_results[i].includes("CHECK:")) { color = 'orange' } if (mod_results[i].includes("CORRECT")) { color = 'green' } moderationPanel.innerHTML += `<li style='margin: 0px 0;'><span style="color:${color};'">${mod_results[i]}</span></li>` } moderationPanel.innerHTML += "</ul><br>"; } (async function () { 'use strict'; set_resolution(); mediainfo_section = get_mediainfo_section(); bdinfo_section = get_bdinfo_section(); if (mediainfo_section) { encode_settings = get_mediainfo_encode_settings(); audio_section = get_mediainfo_audio(); video_section = get_mediainfo_video(); general_section = get_mediainfo_general(); set_hdr_type() } if (encode_settings) { set_video_enc_settings(encode_settings.textContent); } set_container(); is_stream_op() set_resolution(); is_stream_op_flagged(); get_torrent_type(); get_torrent_category(); torrent_title = get_torrent_title(); mod_results.push(`Stream optimized moderation: ${stream_op_mod_check()}`) hybrid_dovi_check(); mod_results.push(`TrueHD compatibility moderation: ${truehd_compat_check()}`) mod_results.push(`Required English sub moderation: ${has_required_english_subs()}`) mod_results.push(`All tracks have languages moderation: ${missing_any_language_mod()}`) mod_results.push(`Encode quality check moderation: ${encode_check()}`) mod_results.push(`Only has mediainfo or bdinfo moderation: ${only_one_mediainfo_bdinfo()}`) mod_results.push(`Resolution matches calculated resolution moderation: ${resolution_check()}`) mod_results.push(`Interlaced/Progressive moderation: ${verify_interlaced()}`) let title_mod = title_check(); Array.prototype.push.apply(mod_results, title_mod) //await screen_ar_size_format(); AddModerationHelp(); })();