Greasy Fork is available in English.

DDU Tagger

DDU posts with IMDB, rottentomatoes

// ==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();