first commit
This commit is contained in:
133
Extras/movies.js
Normal file
133
Extras/movies.js
Normal file
@@ -0,0 +1,133 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user