// ==UserScript==
// @name DDU Tagger
// @description DDU posts with IMDB, rottentomatoes
// @author SH3LL
// @version 0.4.3
// @match https://ddunlimited.net/viewforum.php?*
// @grant none
// @run-at document-idle
// @grant GM_xmlhttpRequest
// @license GPL3
// @namespace https://greasyfork.org/users/762057
// ==/UserScript==
function TMDB_search_api(title, year, content) {
if (content==="movie" || content==="movie_cartoon" || content==="movie_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://api.themoviedb.org/3/search/movie?api_key=8d6d91941230817f7807d643736e8a49&query='+ title +'&page=1&include_adult=false',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('TMDB search api: https://api.themoviedb.org/3/search/movie?api_key=8d6d91941230817f7807d643736e8a49&query='+ title +'&page=1&include_adult=false');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
if (parseInt(json.total_results) !== 0){
for(let result of json.results){
if(result.release_date === undefined) continue;
// animation check
let animation_flag=0;
if(content==="movie_cartoon" || content==="movie_anime"){
for(let curr_genre of result.genre_ids) {if(parseInt(curr_genre)===16) {animation_flag=1; continue;}}
}
if((content==="movie_cartoon" || content==="movie_anime") && animation_flag!==1) continue;
//send result
if( parseInt(result.release_date.slice(0,4)) === parseInt(year) || parseInt(result.release_date.slice(0,4)) === parseInt(year) - 1 || parseInt(result.release_date.slice(0,4)) === parseInt(year) + 1){ // FIX exported EU MOVIES & TMDB errors
resolve(result.id); return;
}
}
}else{
console.log("Error: query returned no results");
resolve("error"); return;
}
//if no year is found
console.log("Error: no result matched the year");
resolve("error"); return;
}
});
});
}else if(content==="tv" || content==="tv_cartoon" || content==="tv_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://api.themoviedb.org/3/search/tv?api_key=8d6d91941230817f7807d643736e8a49&query='+ title +'&page=1&include_adult=false',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('TMDB search api: https://api.themoviedb.org/3/search/tv?api_key=8d6d91941230817f7807d643736e8a49&query='+ title +'&page=1&include_adult=false');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
if (parseInt(json.total_results) !== 0){
let first_entry = json.results[0];
resolve(first_entry.id); return;
}else{
console.log("Error: query returned no results");
resolve("error"); return;
}
}
});
});
}
}
function TMDB_title_api(TMDB_id,content,country) {
if (content==="movie" || content==="movie_cartoon" || content==="movie_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://api.themoviedb.org/3/movie/'+TMDB_id+'?api_key=8d6d91941230817f7807d643736e8a49&language=it&append_to_response=external_ids,videos',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('TMDB title api: https://api.themoviedb.org/3/movie/'+TMDB_id+'?api_key=8d6d91941230817f7807d643736e8a49&language=it&append_to_response=external_ids,videos');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
let YT_trailer_url_delta=0,IMDB_id=0,TMDB_title=0,TMDB_year=0,TMDB_poster_delta=0;
if(content.includes("anime")) {TMDB_title = json.title;} else {TMDB_title = json.original_title;} //title
if(json.external_ids!==undefined && json.external_ids.imdb_id!== null) IMDB_id = json.external_ids.imdb_id; //imdb id
if(json.release_date!==null && json.release_date!==undefined) TMDB_year=json.release_date.slice(0,4);
if(json.poster_path!==null) TMDB_poster_delta = json.poster_path; //poster
if(json.videos!==undefined && json.videos.results.length!==0) YT_trailer_url_delta = json.videos.results[0].key; //videos
resolve([IMDB_id,TMDB_title,TMDB_year,TMDB_poster_delta,YT_trailer_url_delta]); return;
}
});
});
}else if(content==="tv" || content==="tv_cartoon" || content==="tv_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://api.themoviedb.org/3/tv/'+TMDB_id+'?api_key=8d6d91941230817f7807d643736e8a49&language='+country+'&append_to_response=external_ids,videos',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('TMDB title api: https://api.themoviedb.org/3/tv/'+TMDB_id+'?api_key=8d6d91941230817f7807d643736e8a49&language='+country+'&append_to_response=external_ids,videos');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
let YT_trailer_url_delta=0,IMDB_id=0,TMDB_title=0,TMDB_poster_delta=0,seasonscount=0;
if(content.includes("cartoon")) {TMDB_title = json.name;} else {TMDB_title = json.original_name;} //title
if(json.external_ids!==undefined && json.external_ids.imdb_id!== null) IMDB_id = json.external_ids.imdb_id; //imdb id
if(json.poster_path!==null) TMDB_poster_delta = json.poster_path; //poster
if(json.videos!==undefined && json.videos.results.length!==0) YT_trailer_url_delta = json.videos.results[0].key; //videos
if(json.seasons!==undefined && json.seasons!== null) seasonscount = (json.seasons).length;
//years range
let first_year="N/A",last_year="N/A",years_range;
if(json.first_air_date!==undefined && json.first_air_date!==null) first_year = json.first_air_date.slice(0,4);
if(json.last_air_date!==undefined && json.last_air_date!==null) {
if(json.last_air_date.slice(2,4) !== first_year.slice(2,4)) last_year = json.last_air_date.slice(2,4);
}
if(last_year !=="N/A") years_range=first_year + "-" + last_year; else years_range=first_year;
resolve([IMDB_id,TMDB_title,first_year,TMDB_poster_delta,YT_trailer_url_delta,seasonscount,years_range]); return;
}
});
});
}
}
function TMDB_providers_api(id,my_country,content) {
if (content==="movie" || content==="movie_cartoon" || content==="movie_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://api.themoviedb.org/3/movie/'+ id +'/watch/providers?api_key=8d6d91941230817f7807d643736e8a49',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('TMDB provder api: https://api.themoviedb.org/3/movie/'+ id +'/watch/providers?api_key=8d6d91941230817f7807d643736e8a49');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
let providers = [];
for(let curr_country in json.results){
if(String(curr_country)===my_country && json.results[curr_country].flatrate !== undefined){
for(let provider of json.results[curr_country].flatrate){
providers.push(
{
"provider_name" : provider.provider_name,
"provider_logo" : provider.logo_path
}
);
}
}
}
if(providers.length !== 0 ){
resolve(providers); return;
}else{resolve("error"); return}
}
});
});
}else if(content==="tv" || content==="tv_cartoon" || content==="tv_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://api.themoviedb.org/3/tv/'+ id +'/watch/providers?api_key=8d6d91941230817f7807d643736e8a49',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('TMDB provder api: https://api.themoviedb.org/3/tv/'+ id +'/watch/providers?api_key=8d6d91941230817f7807d643736e8a49');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
let providers = [];
for(let curr_country in json.results){
if(String(curr_country)===my_country && json.results[curr_country].flatrate !== undefined){
for(let provider of json.results[curr_country].flatrate){
providers.push(
{
"provider_name" : provider.provider_name,
"provider_logo" : provider.logo_path
}
);
}
}
}
if(providers.length !== 0 ){
resolve(providers); return;
}else{resolve("error"); return}
}
});
});
}
}
function OMDB_title_api(IMDB_id,content) {
if (content==="movie" || content==="movie_cartoon" || content==="movie_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://www.omdbapi.com/?apikey=75251a35&type=movie&i='+IMDB_id,
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('OMDB title api: https://www.omdbapi.com/?apikey=75251a35&type=movie&i='+IMDB_id);
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
let IMDB_rating=0, IMDB_title=json.Title, IMDB_year = json.Year, Awards=0;
for(let rating of json.Ratings){
if(rating.Source==="Internet Movie Database") IMDB_rating= rating.Value;
}
if(json.Awards !== "N/A" && json.Awards !== undefined) Awards = json.Awards;
resolve([IMDB_title,IMDB_year,IMDB_rating,Awards]); return;
}
});
});
}else if(content==="tv"|| content==="tv_cartoon" || content==="tv_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://www.omdbapi.com/?apikey=75251a35&type=series&i='+IMDB_id,
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('OMDB title api: https://www.omdbapi.com/?apikey=75251a35&type=series&i='+IMDB_id);
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
let IMDB_rating=0, IMDB_title=json.Title, IMDB_year = json.Year, Awards=0;
for(let rating of json.Ratings){
if(rating.Source==="Internet Movie Database") IMDB_rating= rating.Value;
}
if(json.Awards !== "N/A" && json.Awards !== undefined) Awards = json.Awards;
resolve([IMDB_title,IMDB_year,IMDB_rating,Awards]); return;
}
});
});
}
}
function JIKAN_search_api(title,year,content) {
title=title.replaceAll(" ","%20"); // <---
if (content==="movie_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://api.jikan.moe/v3/search/anime?q='+title+'&page=1',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('MAL search api: https://api.jikan.moe/v3/search/anime?q='+title+'&page=1');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
let MAL_url=0, MAL_title_name=0, MAL_score=0, MAL_image_url=0, content_type=0, episodes_count=0, start_date=0;
for(let result of json.results){
if(result.type!==null && result.start_date!==null &&
(parseInt(result.start_date.slice(0,4))===parseInt(year) || parseInt(result.start_date.slice(0,4))===parseInt(year)-1 || parseInt(result.start_date.slice(0,4))===parseInt(year)-2) &&
(result.type === "Movie" /*TV*/ || result.type === "ONA" || result.type === "OVA")){
if(result.url!== null) MAL_url = result.url;
if(result.title!== null) MAL_title_name = result.title;
if(result.score!== null) MAL_score = result.score;
if(result.image_url!== null) MAL_image_url = result.image_url;
if(result.type!== null) content_type = result.type;
if(result.episodes!== null) episodes_count = result.episodes;
if(result.start_date!== null) start_date = result.start_date.slice(0,4);
resolve([MAL_url, MAL_title_name, MAL_score, MAL_image_url, content_type, episodes_count, start_date]); return;
}
}
console.log("JIKAN [MAL]: Error, title not found");
resolve("error"); return;
}
});
});
}else if(content==="tv_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://api.jikan.moe/v3/search/anime?q='+title+'&page=1',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('MAL search api: https://api.jikan.moe/v3/search/anime?q='+title+'&page=1&limit=10');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
let MAL_url=0, MAL_title_name=0, MAL_score=0, MAL_image_url=0, content_type=0, episodes_count=0, start_date=0, end_date=0, date_range=0;
for(let result of json.results){
if(result.type!==null && result.start_date!==null &&
(parseInt(result.start_date.slice(0,4))===parseInt(year) || parseInt(result.start_date.slice(0,4))===parseInt(year)-1 || parseInt(result.start_date.slice(0,4))===parseInt(year)-2) &&
(result.type === "TV" || result.type === "ONA" || result.type === "OVA")){
if(result.url!== null) MAL_url = result.url;
if(result.title!== null) MAL_title_name = result.title;
if(result.score!== null) MAL_score = result.score;
if(result.image_url!== null) MAL_image_url = result.image_url;
if(result.type!== null) content_type = result.type;
if(result.episodes!== null) episodes_count = result.episodes;
if(result.start_date!== null) start_date = result.start_date.slice(0,4);
if(result.end_date!== null) end_date = result.end_date.slice(2,4);
if(start_date!== 0 && end_date!== 0) date_range = start_date + "-" + end_date
resolve([MAL_url, MAL_title_name, MAL_score, MAL_image_url, content_type, episodes_count, date_range]); return;
}
}
console.log("JIKAN [MAL]: Error, title not found");
resolve("error"); return;
}
});
});
}
}
function RT_search_api(title,year,content) {
title = title.replaceAll(".","").replaceAll(",","").replaceAll("&","").replaceAll("-","").replaceAll(":","");
title = title.replaceAll(/Parte \d+/gm,"").replaceAll(/Part \d+/gm,"").replaceAll("The Movie","").replaceAll("Il film","").replaceAll("Il Film","");
title = title.replace(/\s\s+/g, ' ').trim().replaceAll(" ", "%20");
if (content==="movie" || content==="movie_cartoon" || content==="movie_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://www.rottentomatoes.com/api/private/v2.0/search/?limit=100&q='+ title +'&t=movie',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('RT search api: https://www.rottentomatoes.com/api/private/v2.0/search/?limit=100&q='+ title +'&t=movie');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
if(json.movieCount === 0){
console.log("Error: No movies found in RT");
resolve("error"); return;
}
let fresh_certificate=0, meterscore = 0, url=0;
for(let movie of json.movies){
if(parseInt(movie.year) === parseInt(year) || parseInt(movie.year) === parseInt(year)+1|| parseInt(movie.year) === parseInt(year) +2 || parseInt(movie.year) === parseInt(year)-1){ //fix rotten tomatoes errors
if(movie.meterClass === "fresh" || movie.meterClass === "certified_fresh") fresh_certificate='fresh';
if(movie.meterClass === "rotten") fresh_certificate='rotten';
if(movie.meterScore !== "N/A" && movie.meterScore !== undefined) meterscore=movie.meterScore;
url=movie.url;
break;
}
}
if(url!==0) {resolve([url,meterscore,fresh_certificate]); return;} else{resolve("error"); return;}
}
});
});
}else if(content==="tv" || content==="tv_cartoon" || content==="tv_anime"){
return new Promise(function (resolve, reject) {
GM_xmlhttpRequest({
method: 'GET',
responseType: 'json',
synchronous: false,
url: 'https://www.rottentomatoes.com/api/private/v2.0/search/?limit=100&q='+ title +'&t=tvSeries',
onload: (resp) => {
let json = JSON.parse(resp.responseText);
console.log('RT search api: https://www.rottentomatoes.com/api/private/v2.0/search/?limit=100&q='+ title +'&t=tvSeries');
if (json && json.Error) {
console.log("Error: " + json.Error);
resolve("error"); return;
}
if(json.tvCount === 0){
console.log("Error: No series found in RT");
resolve("error"); return;
}
let fresh_certificate=0, meterscore = 0, url=0;
for(let title of json.tvSeries){
if(parseInt(title.startYear) === parseInt(year) || parseInt(title.startYear) === parseInt(year) +1 || parseInt(title.startYear) === parseInt(year) +2 || parseInt(title.startYear) === parseInt(year)-1){ //fix rotten tomatoes errors
if(title.meterClass === "fresh" || title.meterClass === "certified_fresh") fresh_certificate='fresh';
if(title.meterClass === "rotten") fresh_certificate='rotten';
if(title.meterScore !== "N/A" && title.meterScore !== undefined) meterscore=title.meterScore;
url=title.url;
break;
}
}
if(url!==0) {resolve([url,meterscore,fresh_certificate]); return;} else{resolve("error"); return;}
}
});
});
}
}
function clean_title(title,content){ //clean special characters
return new Promise(function (resolve, reject) {
if(title!=="" && title!==undefined){
let new_title,new_year;
//clean
title=title.replaceAll("&", " ");
title=title.replaceAll(":", " ");
title=title.replaceAll(",", " ");
title=title.replaceAll(".", " ");
title=title.replaceAll(";", " ");
title=title.replaceAll("–", "-");
title=title.replaceAll(" 01 ", " 1 ");
title=title.replaceAll(" 02 ", " 2 ");
title=title.replaceAll(" 03 ", " 3 ");
title=title.replaceAll(" 04 ", " 4 ");
title=title.replaceAll(" 05 ", " 5 ");
title=title.replaceAll(" 06 ", " 6 ");
title=title.replaceAll(" 07 ", " 7 ");
title=title.replaceAll(" 08 ", " 8 ");
title=title.replaceAll(" 09 ", " 9 ");
title=title.replaceAll(" OAV ", "");
title=title.replaceAll("[PRE] ", "");
title=title.replaceAll("[Pre] ", "");
title=title.replaceAll("[pre] ", "");
title=title.replaceAll("EXTENDED", " ");
title=title.replaceAll("Director Cut", " ");
title=title.replaceAll("Director's Cut", " ");
title=title.replaceAll("The Movie", " ");
title=title.replaceAll("the movie", " ");
title=title.replaceAll("The movie", " ");
title=title.replaceAll("the Movie", " ");
title=title.replaceAll("THE MOVIE", " ");
title=title.replaceAll("Movie", " ");
title=title.replaceAll("MOVIE", " ");
title=title.replaceAll("il film", " ");
title=title.replaceAll("Il film", " ");
title=title.replaceAll("il Film", " ");
title=title.replaceAll("Il Film", " ");
title=title.replaceAll("film", " ");
title=title.replaceAll("Film", " ");
title=title.replaceAll("FILM", " ");
title=title.replaceAll("ep", " ");
title=title.replaceAll("Ep", " ");
title=title.replaceAll("EP", " ");
title=title.trim();
//splitting
if(content==="movie" || content==="movie_cartoon" || content==="movie_anime"){
new_title=title.split("(")[0].trim();
let title_length=title.split("(")[1].split(")")[0].length;
new_year=title.split("(")[1].split(")")[0].slice(title_length-4, title_length).trim();
//double graph
if(isNaN(new_year)){
title_length=title.split("(")[2].split(")")[0].length;
new_year=parseInt(title.split("(")[2].split(")")[0].slice(title_length-4, title_length).trim());
}
//if(new_title.includes("-") && (content.includes("anime")) new_title = new_title.split("-")[0]; //double title problem (for movies, not anime)
if(new_title.includes("-")) new_title=new_title.replaceAll("-", " "); //dash in the anime title (for anime movies)
}else if(content==="tv"|| content==="tv_cartoon" || content==="tv_anime"){
new_title=title;
if(content.includes("cartoon") && !title.includes("(") ){resolve("Error, title clened was empty"); return;}
if(title.includes("(")){
new_title=title.split("(")[0];
new_year=parseInt(title.split("(")[1].slice(0, 4));
}
if(new_title.includes("-")) new_title = title.split("-")[0]; //double title problem
if(new_title.includes("[")) new_title = title.split("[")[0]; //double title problem
//if there is a bracket before the year bracket
if(isNaN(new_year) && title.includes("(")){
new_year=parseInt(title.split("(")[2].slice(0, 4));
}
}
new_title=new_title.replace(/\s\s+/g, ' ').trim().replaceAll(" ", "%20"); //remove multiple espaces and encode all remaining spaces
resolve([new_title,new_year]); return;
}else{resolve("Error, title clened was empty"); return;}
})
}
async function main(){
//data variables
let content=0, thread_title_year=0, country = "IT";
let TMDB_info=0,TMDB_id=0, TMDB_title=0,TMDB_providers=0, TMDB_year=0, YT_trailer_url=0, Seasonscount=0;
let OMDB_info=0, IMDB_id=0, IMDB_title=0,IMDB_year=0,IMDB_rating=0, Awards=0;;
let RT_info=0, RT_rating=0, RT_cert=0, RT_url_delta=0;
let MAL_info=0, MAL_url=0, MAL_title_name=0, MAL_score=0, MAL_image_url=0, MAL_content_type=0, MAL_episodes_count=0, MAL_date=0;
//content tagging
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=440")) {content="movie"} //se siamo in FilmHD
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=156")) {content="movie"} //se siamo in FilmHD DV-WEB
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=99")) {content="movie"} //se siamo in FILM SD
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=614")) {content="tv"} //se siamo in Serie HD
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=324")) {content="tv"} //se siamo in Serie SD
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=843")) {content="tv"} //se siamo in Serie HD SUB
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=323")) {content="tv"} //se siamo in Serie SD SUB
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=1945")) {content="tv"} //se siamo in Serie UHD
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=1584")) {content="movie_cartoon"} //se siamo in Movie Cartoon HD
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=1585")) {content="movie_cartoon"} //se siamo in Movie Cartoon SD
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=748")) {content="tv_cartoon"} //se siamo in Serie Cartoon HD
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=348")) {content="tv_cartoon"} //se siamo in Serie Cartoon SD
let blocks = document.getElementsByClassName("forumbg");
for(let block of blocks){
console.log(block.getElementsByClassName("row bg1 announce"));
console.log(block.getElementsByClassName("row bg1 sticky"));
if(block.getElementsByClassName("row bg1 global-announce").length!==0) {continue;}
if(window.location.href.includes("https://ddunlimited.net/viewforum.php?f=156") && block.getElementsByClassName("row bg1 announce").length!==0) {continue;}
if(!window.location.href.includes("https://ddunlimited.net/viewforum.php?f=156") && (block.getElementsByClassName("row bg1 announce").length!==0 || block.getElementsByClassName("row bg1 sticky").length!==0)) {continue;}
for (let thread of block.children[0].children[2].children){
//Link & Label variables
let TMDB_link = document.createElement("a"), IMDB_link = document.createElement("a"), RT_link = document.createElement("a"), AWARDS_link = document.createElement("a"), Seasons_label = document.createElement("label"), MAL_link= document.createElement("a"), YT_link = document.createElement("a");
TMDB_link.style.marginRight = '4px'; IMDB_link.style.marginLeft = '4px'; RT_link.style.marginLeft = '4px', AWARDS_link.style.marginLeft="4px", YT_link.style.marginRight = "4px", MAL_link.style.marginLeft = "4px", Seasons_label.style.marginLeft = "4px";
TMDB_link.style.color = 'deepskyblue'; IMDB_link.style.color = 'gold'; RT_link.style.color = 'orangered', AWARDS_link.style.color="goldenrod", AWARDS_link.style.fontSize = "70%", MAL_link.style.color="royalblue", Seasons_label.style.color = "salmon";
//Images variables
let TMDB_img = document.createElement('img'),IMDB_img = document.createElement('img'), RT_img = document.createElement('img'), RT_fresh_img = document.createElement('img'), RT_rotten_img = document.createElement('img'), AWARDS_img=document.createElement('img'), MAL_img=document.createElement('img'), YT_img=document.createElement('img'), POSTER_img=document.createElement('img');
IMDB_img.style.marginLeft = '8px'; MAL_img.style.marginLeft = '8px';MAL_img.style.borderRadius = '3px'; IMDB_img.style.borderRadius = '3px'; RT_img.style.marginLeft = '8px'; RT_rotten_img.style.marginLeft = '8px'; RT_fresh_img.style.marginLeft = '8px'; AWARDS_img.style.marginLeft = '8px';
AWARDS_img.style.height='16px'; AWARDS_img.style.width='16px'; RT_img.style.height='16px'; RT_img.style.width='16px'; RT_fresh_img.style.height='16px'; RT_fresh_img.style.width='16px'; RT_rotten_img.style.height='16px'; RT_rotten_img.style.width='16px'; POSTER_img.style.width = '46px'; POSTER_img.style.height = '69px';
TMDB_img.src= 'https://www.google.com/s2/favicons?domain=www.themoviedb.org';
IMDB_img.src= 'https://www.google.com/s2/favicons?domain=www.imdb.com';
RT_img.src= 'https://i.postimg.cc/RCkVnKrp/rotten-tomatoes-rating-icons-1.png'; RT_fresh_img.src= 'https://i.postimg.cc/T1RcJQfC/fresh.png'; RT_rotten_img.src= 'https://i.postimg.cc/fbq3rKc8/rotten.png';
MAL_img.src= 'https://www.google.com/s2/favicons?domain=myanimelist.net';
AWARDS_img.src = 'https://i.postimg.cc/bNZkqQx6/Oscars-logo.png';
YT_img.src = 'https://www.google.com/s2/favicons?domain=www.youtube.com';
//get title from thread
let thread_full_label=thread.children[0].children[0].children[0].children[0].children[0].children[0].innerText;
thread_title_year = await clean_title(thread_full_label,content);
if(thread_title_year.includes("Error")){ console.log(thread_title_year); TMDB_id="error";}
let thread_title=thread_title_year[0], thread_year=thread_title_year[1];
console.log([thread_title.replaceAll("%20", " "), thread_year]);
//get imdb ID & tmdb score from TMDB api
if(TMDB_id!=="error") TMDB_id = await TMDB_search_api(thread_title, thread_year,content);
console.log('TMDB id: ' + TMDB_id);
if(TMDB_id!=="error"){
// TMDB title info
TMDB_info = await TMDB_title_api(TMDB_id,content,country);
if(TMDB_info!=="error") IMDB_id = TMDB_info[0];
if(TMDB_info!=="error" && TMDB_info[1]!==0) TMDB_title = TMDB_info[1];
if(TMDB_info!=="error" && TMDB_info[2]!==0) TMDB_year = TMDB_info[2];
if(TMDB_info!=="error" && TMDB_info[3]!==0) POSTER_img.src= 'https://image.tmdb.org/t/p/w185' + TMDB_info[3];
if(TMDB_info!=="error" && TMDB_info[4]!==0 && TMDB_info[4]!==0){ YT_trailer_url = " https://www.youtube.com/watch?v=" + TMDB_info[4]; }else {YT_trailer_url= 'https://www.youtube.com/results?search_query=' + TMDB_title + ' trailer ita';}
if(content==="tv" && TMDB_info[5]!==0 && TMDB_info[6]!==0) Seasonscount= "{" + TMDB_info[6] +"}{S"+ TMDB_info[5]+"}";
console.log('IMDB id: ' + IMDB_id);
// TMDB proviers list
TMDB_providers = await TMDB_providers_api(TMDB_id,country,content);
}else{console.log("Skipping for error: " + thread_title.replaceAll("%20"," ") + " (" + thread_year + ")") ;}
if(TMDB_id !== 'error' && TMDB_id!==0){
//get IMDB title, rating, awards
OMDB_info = await OMDB_title_api(IMDB_id,content);
if(OMDB_info !== 'error'){
IMDB_title = OMDB_info[0].replaceAll(" ", "%20");
IMDB_year = OMDB_info[1];
IMDB_rating = OMDB_info[2];
//build awards string
let awards_string = String(OMDB_info[3]).replaceAll("total","").trim();
if (awards_string[awards_string.length-1]===".") awards_string=awards_string.substring(0, awards_string.length-1); // remove final dot from awards string
if(OMDB_info[3]!==0) Awards = "(" + awards_string + ")";
}
//get RT url, score, certificate
//RT_info = await RT_search_api(TMDB_title,TMDB_year,content);
if(RT_info !== 'error' && RT_info!==0){
RT_url_delta = RT_info[0];
RT_rating = RT_info[1];
RT_cert = RT_info[2];
}
console.log('IMDB score: ' + IMDB_rating + ' | RT score: '+RT_rating + ' (' + RT_cert +') | Awards: '+ Awards);
let thread_row = thread.children[0].children[0].children[0].children[0].children[0].children[0];
let thread_block = thread.children[0].children[0].children[0].children[0];
if(String(thread_row.children[0].href).includes("unread")) thread_row.removeChild(thread_row.children[0]);
//get MAL url, score, certificate
/*
if(content.includes("anime")) MAL_info = await JIKAN_search_api(IMDB_title,TMDB_year,content);
if(MAL_info !== 'error' && MAL_info!==0){
MAL_url=MAL_info[0];
MAL_title_name=MAL_info[1];
MAL_score=MAL_info[2];
MAL_image_url=MAL_info[3];
MAL_content_type=MAL_info[4];
MAL_episodes_count=MAL_info[5];
MAL_date=MAL_info[6];
}
console.log('MAL url: ' + MAL_url + ' | MAL score: '+ MAL_score );
*/
//Poster image
if(TMDB_id !==0 && TMDB_id!=="error"){
if(POSTER_img.src !== ""){
thread.children[0].className="search-project";
thread.children[0].style.cssText="";
let dd=document.createElement("dd");
dd.append(POSTER_img);
thread.children[0].children[0].before(dd);
}else{
thread.children[0].className="search-project";
thread.children[0].style.cssText="";
let label_img = document.createElement('label');
label_img.innerText = "Missing";
label_img.style.color = "firebrick";
let dd=document.createElement("dd");
dd.append(label_img);
thread.children[0].children[0].before(dd);
}
}
//YT Link
if(TMDB_title !==0){
YT_link.href = YT_trailer_url;
YT_link.append(YT_img);
thread_row.firstChild.before(YT_link);
}
//TMDB Link
if(TMDB_id !==0 && TMDB_id!=="error"){
if(content==="movie" || content==="movie_cartoon"|| content==="movie_anime") TMDB_link.href = 'https://www.themoviedb.org/movie/' + TMDB_id;
if(content==="tv" || content==="tv_cartoon"|| content==="serie_anime") TMDB_link.href = 'https://www.themoviedb.org/tv/' + TMDB_id;
TMDB_link.append(TMDB_img);
thread_row.firstChild.before(TMDB_link);
}
//Season Count
if(content==="tv" && Seasonscount!==0){
Seasons_label.innerText=Seasonscount;
thread_row.append(Seasons_label);
}
//IMDB Link
if(OMDB_info!=='error' && OMDB_info!==0){
if(IMDB_rating!==0) {IMDB_link.innerText = IMDB_rating.substring(0, IMDB_rating.length - 3);} else {IMDB_link.innerText="N/A"}
IMDB_link.href = `https://www.imdb.com/title/${IMDB_id}/`;
thread_row.append(IMDB_img,IMDB_link);
}
//MAL Link
/*
if(MAL_info!=='error' && MAL_info!==0){
if(MAL_score!==0) {MAL_link.innerText = MAL_score;} else {MAL_link.innerText="N/A"}
MAL_link.href = MAL_url;
thread.children[0].children[2].append(MAL_img, MAL_link);
}*/
//RT Link
if(RT_info!=='error' && RT_info!==0){
if(RT_rating!==0) {RT_link.innerText = RT_rating;} else {RT_link.innerText ="N/A";}
RT_link.href = `https://www.rottentomatoes.com${RT_url_delta}/`;
if(RT_cert===0) {thread_row.append(RT_img,RT_link);}
if(RT_cert==='fresh') {thread_row.append(RT_fresh_img,RT_link);}
if(RT_cert==='rotten') {RT_link.style.color="yellowgreen"; thread_row.append(RT_rotten_img,RT_link);}
}
//Awards
if(Awards!==0){
AWARDS_link.innerText = Awards;
AWARDS_link.href = "https://www.imdb.com/title/"+IMDB_id+"/awards/"
thread_row.append(AWARDS_img,AWARDS_link);
}
//providers
if(TMDB_providers !== "error"){
let tr = document.createElement('div');
let streaming_link = document.createElement('a');
if(content==="movie" || content==="movie_cartoon"|| content==="movie_anime") streaming_link.href="https://www.themoviedb.org/movie/"+ TMDB_id+"/watch?locale="+country;
if(content==="tv" || content==="tv_cartoon"|| content==="serie_anime") streaming_link.href="https://www.themoviedb.org/tv/"+ TMDB_id+"/watch?locale="+country
streaming_link.innerText = "Streaming:"
streaming_link.style.color = "salmon";
tr.append(streaming_link);
for(let provider of TMDB_providers){
let provider_image = document.createElement('img');
provider_image.style.height='16px';
provider_image.style.width='16px';
provider_image.style.marginLeft = '8px';
provider_image.style.marginTop = '4px';
//provider_image.style.marginBottom = '8px';
provider_image.style.borderRadius = '3px';
provider_image.src = 'https://image.tmdb.org/t/p/w185/' + provider["provider_logo"];
tr.append(provider_image);
}
thread_block.append(tr);
}
}else{ //if no content found in TMDB
let thread_row = thread.children[0].children[0].children[0].children[0].children[0].children[0];
if(String(thread_row.children[0].href).includes("unread")) thread_row.removeChild(thread_row.children[0]);
let error_message = document.createElement("label");
error_message.style.color="firebrick";
error_message.style.marginLeft = '4px';
error_message.innerText = "ERR: Title Misspelled/Not Found"
thread_row.append(error_message);
}
//reset all data
thread_title_year=0; OMDB_info=0; RT_info=0; TMDB_id=0; IMDB_id=0; IMDB_title=0; IMDB_year=0; RT_url_delta=0; IMDB_rating=0; RT_rating=0; RT_cert=0; Awards=0, Seasonscount=0;
}
}
//loop titles
}
main();