133 lines
3.0 KiB
JavaScript
133 lines
3.0 KiB
JavaScript
const notice = (msg) => new Notice(msg, 5000);
|
|
const log = (msg) => console.log(msg);
|
|
|
|
const API_KEY_OPTION = "OMDb API Key";
|
|
const API_URL = "http://www.omdbapi.com/";
|
|
|
|
module.exports = {
|
|
entry: start,
|
|
settings: {
|
|
name: "Movie Script",
|
|
author: "Christian B. B. Houmann",
|
|
options: {
|
|
[API_KEY_OPTION]: {
|
|
type: "text",
|
|
defaultValue: "",
|
|
placeholder: "OMDb API Key",
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
let QuickAdd;
|
|
let Settings;
|
|
|
|
async function start(params, settings) {
|
|
QuickAdd = params;
|
|
Settings = settings;
|
|
|
|
const query = await QuickAdd.quickAddApi.inputPrompt(
|
|
"Enter movie title or IMDB ID: "
|
|
);
|
|
if (!query) {
|
|
notice("No query entered.");
|
|
throw new Error("No query entered.");
|
|
}
|
|
|
|
let selectedShow;
|
|
|
|
if (isImdbId(query)) {
|
|
selectedShow = await getByImdbId(query);
|
|
} else {
|
|
const results = await getByQuery(query);
|
|
|
|
const choice = await QuickAdd.quickAddApi.suggester(
|
|
results.map(formatTitleForSuggestion),
|
|
results
|
|
);
|
|
if (!choice) {
|
|
notice("No choice selected.");
|
|
throw new Error("No choice selected.");
|
|
}
|
|
|
|
selectedShow = await getByImdbId(choice.imdbID);
|
|
}
|
|
|
|
QuickAdd.variables = {
|
|
...selectedShow,
|
|
actorLinks: linkifyList(selectedShow.Actors.split(",")),
|
|
genreLinks: linkifyList(selectedShow.Genre.split(",")),
|
|
directorLink:
|
|
selectedShow.Director === "N/A" ? " " : `[[${selectedShow.Director}]]`,
|
|
fileName: replaceIllegalFileNameCharactersInString(selectedShow.Title),
|
|
typeLink: `[[${selectedShow.Type === "movie" ? "Movies" : "Series"}]]`,
|
|
};
|
|
}
|
|
|
|
function isImdbId(str) {
|
|
return /^tt\d+$/.test(str);
|
|
}
|
|
|
|
function formatTitleForSuggestion(resultItem) {
|
|
return `(${resultItem.Type === "movie" ? "M" : "TV"}) ${resultItem.Title} (${
|
|
resultItem.Year
|
|
})`;
|
|
}
|
|
|
|
async function getByQuery(query) {
|
|
const searchResults = await apiGet(API_URL, {
|
|
s: query,
|
|
});
|
|
|
|
if (!searchResults.Search || !searchResults.Search.length) {
|
|
notice("No results found.");
|
|
throw new Error("No results found.");
|
|
}
|
|
|
|
return searchResults.Search;
|
|
}
|
|
|
|
async function getByImdbId(id) {
|
|
const res = await apiGet(API_URL, {
|
|
i: id,
|
|
});
|
|
|
|
if (!res) {
|
|
notice("No results found.");
|
|
throw new Error("No results found.");
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
function linkifyList(list) {
|
|
if (list.length === 0) return "";
|
|
if (list.length === 1) return `[[${list[0]}]]`;
|
|
|
|
return list.map((item) => `[[${item.trim()}]]`).join(", ");
|
|
}
|
|
|
|
function replaceIllegalFileNameCharactersInString(string) {
|
|
return string.replace(/[\\,#%&\{\}\/*<>?$\'\":@]*/g, "");
|
|
}
|
|
|
|
async function apiGet(url, data) {
|
|
let finalURL = new URL(url);
|
|
if (data)
|
|
Object.keys(data).forEach((key) =>
|
|
finalURL.searchParams.append(key, data[key])
|
|
);
|
|
|
|
finalURL.searchParams.append("apikey", Settings[API_KEY_OPTION]);
|
|
|
|
const res = await request({
|
|
url: finalURL.href,
|
|
method: "GET",
|
|
cache: "no-cache",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
});
|
|
|
|
return JSON.parse(res);
|
|
} |