// ==UserScript==
// @name Multi-Database Search for TMDB
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Add multi-database search functionality to TMDB
// @author You
// @match https://www.themoviedb.org/*
// @grant GM_xmlhttpRequest
// @downloadURL https://update.greasyfork.icu/scripts/527813/Multi-Database%20Search%20for%20TMDB.user.js
// @updateURL https://update.greasyfork.icu/scripts/527813/Multi-Database%20Search%20for%20TMDB.meta.js
// ==/UserScript==
(function() {
'use strict';
// TMDB API 키를 여기에 입력하세요
const TMDB_API_KEY = 'YOUR_API_KEY_HERE';
// 검색 컨테이너 생성
function createSearchContainer() {
const container = document.createElement('div');
container.style.cssText = `
position: fixed;
top: 0;
left: 0;
background: white;
border-radius: 0 0 5px 0;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
z-index: 9999;
transition: all 0.3s ease;
`;
const toggleButton = document.createElement('div');
toggleButton.textContent = 'Search by another DB ID';
toggleButton.style.cssText = `
padding: 0px 5px;
background: #01b4e4;
color: white;
cursor: pointer;
border-radius: 0 0 5px 0;
font-weight: bold;
font-size: 12px;
`;
const searchContent = document.createElement('div');
searchContent.style.cssText = `
width: 200px;
padding: 10px;
display: none;
background: white;
`;
const input = document.createElement('input');
input.setAttribute('type', 'text');
input.setAttribute('placeholder', 'Enter ID (tt/Q/number)');
input.style.cssText = `
padding: 5px;
margin-right: 5px;
border: 1px solid #ccc;
border-radius: 3px;
width: calc(100% - 10px);
margin-bottom: 5px;
`;
const button = document.createElement('button');
button.textContent = 'Search';
button.style.cssText = `
padding: 5px 10px;
background: #01b4e4;
color: white;
border: none;
border-radius: 3px;
cursor: pointer;
width: 100%;
`;
const resultDiv = document.createElement('div');
resultDiv.style.cssText = `
margin-top: 5px;
word-break: break-all;
`;
const infoDiv = document.createElement('div');
infoDiv.style.cssText = `
margin-top: 5px;
font-size: 11px;
color: #666;
`;
infoDiv.innerHTML = `
e.g.
* IMDB: tt3968668
* Wikidata: Q483913
* TVDB: 139251
`;
searchContent.appendChild(input);
searchContent.appendChild(button);
searchContent.appendChild(resultDiv);
searchContent.appendChild(infoDiv);
container.appendChild(toggleButton);
container.appendChild(searchContent);
// 토글 기능 추가
let isExpanded = false;
toggleButton.addEventListener('click', () => {
isExpanded = !isExpanded;
searchContent.style.display = isExpanded ? 'block' : 'none';
toggleButton.style.borderRadius = isExpanded ? '0' : '0 0 5px 0';
});
button.addEventListener('click', () => searchDatabase(input.value, resultDiv));
input.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
searchDatabase(input.value, resultDiv);
}
});
return container;
}
// 데이터베이스 검색
function searchDatabase(id, resultDiv) {
let url;
let externalSource;
if (id.startsWith('tt')) {
externalSource = 'imdb_id';
} else if (id.startsWith('Q')) {
externalSource = 'wikidata_id';
} else if (/^\d+$/.test(id)) {
externalSource = 'tvdb_id';
} else {
resultDiv.innerHTML = 'Invalid ID format. Please use tt/Q/number format.';
return;
}
url = `https://api.themoviedb.org/3/find/${id}?api_key=${TMDB_API_KEY}&external_source=${externalSource}`;
GM_xmlhttpRequest({
method: 'GET',
url: url,
onload: function(response) {
try {
const data = JSON.parse(response.responseText);
let result = data.movie_results[0] || data.tv_results[0];
if (result) {
const link = document.createElement('a');
link.href = `https://www.themoviedb.org/${result.media_type}/${result.id}`;
// 원어 제목 가져오기 (영화 또는 TV 시리즈)
const originalTitle = result.original_title || result.original_name;
// 연도 추출 (release_date 또는 first_air_date에서)
const dateStr = result.release_date || result.first_air_date;
const year = dateStr ? ` (${dateStr.split('-')[0]})` : '';
link.textContent = `${originalTitle}${year}`;
link.target = '_blank';
link.style.color = '#01b4e4';
resultDiv.innerHTML = '';
resultDiv.appendChild(link);
} else {
resultDiv.innerHTML = 'No results found.';
}
} catch (error) {
resultDiv.innerHTML = 'Error processing response';
}
},
onerror: function() {
resultDiv.innerHTML = 'Error making request';
}
});
}
// 페이지에 검색 컨테이너 추가
document.body.appendChild(createSearchContainer());
})();