Skip to content

Commit

Permalink
adding series search and folder
Browse files Browse the repository at this point in the history
- added command: search series.
- added folder for series.
- added option to switch to created note.
- there now is a warning if the given folder does not exitst.
  • Loading branch information
Superschnizel committed Oct 19, 2023
1 parent 47ae251 commit 7679860
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 42 deletions.
134 changes: 96 additions & 38 deletions main.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
import { App, Editor, MarkdownView, Modal, Menu, Notice, Plugin, PluginSettingTab, Setting, requestUrl } from 'obsidian';
import { App, Editor, MarkdownView, Modal, Menu, Notice, Plugin, PluginSettingTab, Setting, requestUrl, normalizePath } from 'obsidian';

import {MoviegrabberSettings, DEFAULT_SETTINGS} from "./src/MoviegrabberSettings"
import {MoviegrabberSearchModal} from "./src/MoviegrabberSearchModal"
import {MovieData, MovieSearch, MovieSearchItem, TEST_SEARCH} from "./src/MoviegrabberSearchObject"
import { MoviegrabberSelectionModal } from 'src/MoviegrabberSelectionModal';
import { existsSync } from 'fs';


export default class Moviegrabber extends Plugin {
settings: MoviegrabberSettings;

async onload() {
await this.loadSettings();



console.log(this.app.vault.adapter.exists('/fuskcnslgasdfalög/'));
// This adds a simple command that can be triggered anywhere
this.addCommand({
id: 'search-movie',
Expand All @@ -22,8 +25,23 @@ export default class Moviegrabber extends Plugin {
n.noticeEl.addClass("notice_error");
return;
}
new MoviegrabberSearchModal(this.app, (result) =>
{this.searchMovie(result);
new MoviegrabberSearchModal(this.app,'movie', (result) =>
{this.searchOmdb(result, 'movie');
}).open();
}
});

this.addCommand({
id: 'search-series',
name: 'Search series',
callback: () => {
if (this.settings.OMDb_API_Key == '' || this.settings.YouTube_API_Key == '') {
var n = new Notice("missing one or more API keys!")
n.noticeEl.addClass("notice_error");
return;
}
new MoviegrabberSearchModal(this.app, 'series',(result) =>
{this.searchOmdb(result, 'series');
}).open();
}
});
Expand All @@ -45,12 +63,12 @@ export default class Moviegrabber extends Plugin {
}

// search the OMDb and oben selection Modal if some are found
async searchMovie(title : string) {
async searchOmdb(title : string, type : 'movie' | 'series') {
var url = new URL("http://www.omdbapi.com");

url.searchParams.append('apikey', this.settings.OMDb_API_Key);
url.searchParams.append('s', title);
url.searchParams.append('type', "movie");
url.searchParams.append('type', type);

const response = await requestUrl(url.toString());
if (response.status != 200) {
Expand All @@ -69,14 +87,14 @@ export default class Moviegrabber extends Plugin {

new MoviegrabberSelectionModal(this.app, data as MovieSearch, (result) =>
{
this.createNote(result);
this.createNote(result, type);
}).open();
}



// get the Movie Data from OMDb
async getMovieData(movie : MovieSearchItem) : Promise<MovieData | null | undefined> {
async getOmdbData(movie : MovieSearchItem) : Promise<MovieData | null | undefined> {
var url = new URL("http://www.omdbapi.com");

url.searchParams.append('apikey', this.settings.OMDb_API_Key);
Expand All @@ -92,6 +110,8 @@ export default class Moviegrabber extends Plugin {

const data = await response.json;

console.log(data);

if (data.Response != "True") {
var n = new Notice(`Found no movies named ${movie.Title}!`)
n.noticeEl.addClass("notice_error");
Expand Down Expand Up @@ -130,49 +150,66 @@ export default class Moviegrabber extends Plugin {
return embed;
}

async createNote(movie : MovieSearchItem) {
async createNote(item : MovieSearchItem, type : 'movie' | 'series') {
// create path and check for directory before posting the request

var dir = this.settings.MovieDirectory != '' ? `/${this.settings.MovieDirectory}/` : '';
var path = `${dir}${movie.Title.replace(/[/\\?%*:|"<>]/g, '')}.md`
var dir = type == 'movie' ? this.settings.MovieDirectory : this.settings.SeriesDirectory;

dir.replace(/(^[/\s]+)|([/\s]+$)/g, ''); // clean up

var dir = dir != '' ? `/${dir}/` : '';

if (!(await this.app.vault.adapter.exists('dir'))) {
var n = new Notice(`Folder for ${type}: ${dir} does not exist!`)
n.noticeEl.addClass("notice_error")
return;
}

var path = `${dir}${item.Title.replace(/[/\\?%*:|"<>]/g, '')}.md`

if (this.app.vault.getAbstractFileByPath(path) != null) {
var n = new Notice("File for Movie already exists!");
var n = new Notice(`Note for ${item.Title} already exists!`);
n.noticeEl.addClass("notice_error");
return;
}

var movieData = await this.getMovieData(movie);
var itemData = await this.getOmdbData(item);

if (movieData == null){
var n = new Notice(`something went wrong in fetching ${movie.Title} data`)
if (itemData == null){
var n = new Notice(`something went wrong in fetching ${item.Title} data`)
n.noticeEl.addClass("notice_error")
return;
}

new Notice(`Creating Note for: ${item.Title} (${item.Year})`);

// clean Movie Title to avoid frontmatter issues
movieData.Title = movieData.Title.replace(/[/\\?%*:|"<>]/g, '');
itemData.Title = itemData.Title.replace(/[/\\?%*:|"<>]/g, '');

var content =
`---\n`+
`type: movie\n`+
`country: ${movieData.Country}\n`+
`title: ${movieData.Title}\n`+
`year: ${movieData.Year}\n`+
`director: ${movieData.Director}\n`+
`actors: [${movieData.Actors}]\n`+
`genre: [${movieData.Genre}]\n`+
`length: ${ movieData.Runtime.split(" ")![0] }\n`+
`type: ${type}\n`+
`country: ${itemData.Country}\n`+
`title: ${itemData.Title}\n`+
`year: ${itemData.Year}\n`+
`director: ${itemData.Director}\n`+
`actors: [${itemData.Actors}]\n`+
`genre: [${itemData.Genre}]\n`+
`length: ${ itemData.Runtime.split(" ")![0] }\n`+
(type == 'movie' ? '' : `seasons: ${itemData.totalSeasons}\n`) +
`seen:\n`+
`rating: \n`+
`found_at: \n`+
`trailer_embed: ${await this.getTrailerEmbed(movieData.Title, movieData.Year)}\n`+
`poster: "${movieData.Poster}"\n`+
`trailer_embed: ${await this.getTrailerEmbed(itemData.Title, itemData.Year)}\n`+
`poster: "${itemData.Poster}"\n`+
`availability:\n`+
`---\n`+
`${movieData.Plot}`
`${itemData.Plot}`

this.app.vault.create(path, content)
var tFile = await this.app.vault.create(path, content);
if (this.settings.SwitchToCreatedNote) {
this.app.workspace.getLeaf().openFile(tFile);
}
}
}

Expand All @@ -191,7 +228,7 @@ class MoviegrabberSettingTab extends PluginSettingTab {

new Setting(containerEl)
.setName('Movie folder')
.setDesc('Folder in which to save the generated notes')
.setDesc('Folder in which to save the generated notes for series')
.addText(text => text
.setPlaceholder('Movies')
.setValue(this.plugin.settings.MovieDirectory)
Expand All @@ -200,6 +237,17 @@ class MoviegrabberSettingTab extends PluginSettingTab {
await this.plugin.saveSettings();
}));

new Setting(containerEl)
.setName('Series folder')
.setDesc('Folder in which to save the generated notes for series')
.addText(text => text
.setPlaceholder('Series')
.setValue(this.plugin.settings.SeriesDirectory)
.onChange(async (value) => {
this.plugin.settings.SeriesDirectory = value;
await this.plugin.saveSettings();
}));

new Setting(containerEl)
.setName('OMDb API key')
.setDesc('Your API key for OMDb')
Expand All @@ -212,14 +260,24 @@ class MoviegrabberSettingTab extends PluginSettingTab {
}));

new Setting(containerEl)
.setName('Youtube API key')
.setDesc('Your API key for Youtube')
.addText(text => text
.setPlaceholder('')
.setValue(this.plugin.settings.YouTube_API_Key)
.onChange(async (value) => {
this.plugin.settings.YouTube_API_Key = value;
await this.plugin.saveSettings();
}));
.setName('Youtube API key')
.setDesc('Your API key for Youtube')
.addText(text => text
.setPlaceholder('')
.setValue(this.plugin.settings.YouTube_API_Key)
.onChange(async (value) => {
this.plugin.settings.YouTube_API_Key = value;
await this.plugin.saveSettings();
}));

new Setting(containerEl)
.setName('Switch to generated notes')
.setDesc('Automatically switch to the current workspace to the newly created note')
.addToggle(toggle => toggle
.setValue(this.plugin.settings.SwitchToCreatedNote)
.onChange(async (value) => {
this.plugin.settings.SwitchToCreatedNote = value;
await this.plugin.saveSettings();
}));
}
}
6 changes: 4 additions & 2 deletions src/MoviegrabberSearchModal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,18 @@ import { App, Modal, Setting, TextComponent } from "obsidian";
export class MoviegrabberSearchModal extends Modal {
result: string;
onSubmit: (result: string) => void;
searchType : string;

constructor(app: App, onSubmit: (result: string) => void) {
constructor(app: App, searchType: 'movie' | 'series',onSubmit: (result: string) => void) {
super(app);
this.onSubmit = onSubmit;
this.searchType = searchType;
}

onOpen() {
const { contentEl } = this;

contentEl.createEl("h1", { text: "Search movie by title" });
contentEl.createEl("h1", { text: `Search ${this.searchType} by title` });
// contentEl.createEl("input", {type: "text", cls: "search_text"})
var text = new TextComponent(contentEl.createDiv({cls : "search_text_box"}))
.onChange((value) => {
Expand Down
1 change: 1 addition & 0 deletions src/MoviegrabberSearchObject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export interface MovieData{
BoxOffice: string,
Production: string,
Website: string,
totalSeasons: number,
Response: boolean
}

Expand Down
1 change: 0 additions & 1 deletion src/MoviegrabberSelectionModal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ export class MoviegrabberSelectionModal extends SuggestModal<MovieSearchItem> {

// Perform action on the selected suggestion.
onChooseSuggestion(movie: MovieSearchItem, evt: MouseEvent | KeyboardEvent) {
new Notice(`Creating Note for: ${movie.Title} (${movie.Year})`);
this.onSubmit(movie);
}
}
6 changes: 5 additions & 1 deletion src/MoviegrabberSettings.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
export interface MoviegrabberSettings {
MovieDirectory: string;
SeriesDirectory: string;
OMDb_API_Key: string;
YouTube_API_Key: string;
SwitchToCreatedNote: boolean;
}

export const DEFAULT_SETTINGS: MoviegrabberSettings = {
MovieDirectory: 'Movies',
SeriesDirectory: 'Series',
OMDb_API_Key: '',
YouTube_API_Key: ''
YouTube_API_Key: '',
SwitchToCreatedNote: true
}

0 comments on commit 7679860

Please sign in to comment.