Skip to content

Commit d2afe3b

Browse files
committed
games, english anime titles, specials and OVAs
1 parent c400b7a commit d2afe3b

File tree

10 files changed

+141
-42
lines changed

10 files changed

+141
-42
lines changed

src/api/APIModel.ts

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
import {MediaTypeModel} from '../models/MediaTypeModel';
22

33
export abstract class APIModel {
4-
apiName: string;
5-
apiUrl: string;
6-
apiDescription: string;
7-
types: string[];
4+
apiName: string;
5+
apiUrl: string;
6+
apiDescription: string;
7+
types: string[];
88

9-
/**
10-
* This function should query the api and return a list of matches. The matches should be caped at 20.
11-
*
12-
* @param title the title to query for
13-
*/
14-
abstract searchByTitle(title: string): Promise<MediaTypeModel[]>;
9+
/**
10+
* This function should query the api and return a list of matches. The matches should be caped at 20.
11+
*
12+
* @param title the title to query for
13+
*/
14+
abstract searchByTitle(title: string): Promise<MediaTypeModel[]>;
1515

16-
abstract getById(item: MediaTypeModel): Promise<MediaTypeModel>;
16+
abstract getById(item: MediaTypeModel): Promise<MediaTypeModel>;
1717

18-
hasType(type: string): boolean {
19-
return this.types.contains(type);
20-
}
18+
hasType(type: string): boolean {
19+
return this.types.contains(type);
20+
}
2121

22-
hasTypeOverlap(types: string[]): boolean {
23-
for (const type of types) {
24-
if (this.hasType(type)) {
25-
return true;
26-
}
27-
}
28-
return false;
29-
}
22+
hasTypeOverlap(types: string[]): boolean {
23+
for (const type of types) {
24+
if (this.hasType(type)) {
25+
return true;
26+
}
27+
}
28+
return false;
29+
}
3030
}

src/api/apis/MALAPI.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ import {APIModel} from '../APIModel';
22
import {MediaTypeModel} from '../../models/MediaTypeModel';
33
import {MovieModel} from '../../models/MovieModel';
44
import MediaDbPlugin from '../../main';
5-
// @ts-ignore
6-
import Jikanjs from '@mateoaranda/jikanjs';
75
import {SeriesModel} from '../../models/SeriesModel';
86

97
export class MALAPI extends APIModel {
@@ -36,18 +34,20 @@ export class MALAPI extends APIModel {
3634
let ret: MediaTypeModel[] = [];
3735

3836
for (const result of data.data) {
39-
if (result.type.toLowerCase() === 'movie') {
37+
if (result.type.toLowerCase() === 'movie' || result.type.toLowerCase() === 'special') {
4038
ret.push(new MovieModel({
4139
type: result.type,
4240
title: result.title,
41+
englishTitle: result.title_english ?? result.title,
4342
year: result.year ?? result.aired?.prop?.from?.year ?? '',
4443
dataSource: this.apiName,
4544
id: result.mal_id,
4645
} as MovieModel));
47-
} else if (result.type.toLowerCase() === 'tv') {
46+
} else if (result.type.toLowerCase() === 'tv' || result.type.toLowerCase() === 'ova') {
4847
ret.push(new SeriesModel({
4948
type: result.type,
5049
title: result.title,
50+
englishTitle: result.title_english ?? result.title,
5151
year: result.year ?? result.aired?.prop?.from?.year ?? '',
5252
dataSource: this.apiName,
5353
id: result.mal_id,
@@ -71,10 +71,11 @@ export class MALAPI extends APIModel {
7171
console.log(data);
7272
const result = data.data;
7373

74-
if (result.type.toLowerCase() === 'movie') {
74+
if (result.type.toLowerCase() === 'movie' || result.type.toLowerCase() === 'special') {
7575
const model = new MovieModel({
7676
type: result.type,
7777
title: result.title,
78+
englishTitle: result.title_english ?? result.title,
7879
year: result.year ?? result.aired?.prop?.from?.year ?? '',
7980
dataSource: this.apiName,
8081
url: result.url,
@@ -95,10 +96,11 @@ export class MALAPI extends APIModel {
9596
} as MovieModel);
9697

9798
return model;
98-
} else if (result.type.toLowerCase() === 'tv') {
99+
} else if (result.type.toLowerCase() === 'tv' || result.type.toLowerCase() === 'ova') {
99100
const model = new SeriesModel({
100101
type: result.type,
101102
title: result.title,
103+
englishTitle: result.title_english ?? result.title,
102104
year: result.year ?? result.aired?.prop?.from?.year ?? '',
103105
dataSource: this.apiName,
104106
url: result.url,

src/api/apis/OMDbAPI.ts

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {MediaTypeModel} from '../../models/MediaTypeModel';
33
import {MovieModel} from '../../models/MovieModel';
44
import MediaDbPlugin from '../../main';
55
import {SeriesModel} from '../../models/SeriesModel';
6+
import {GameModel} from '../../models/GameModel';
67

78
export class OMDbAPI extends APIModel {
89
plugin: MediaDbPlugin;
@@ -12,7 +13,7 @@ export class OMDbAPI extends APIModel {
1213

1314
this.plugin = plugin;
1415
this.apiName = 'OMDbAPI';
15-
this.apiDescription = 'A free API for Movies and Series.';
16+
this.apiDescription = 'A free API for Movies, Series and Games.';
1617
this.apiUrl = 'http://www.omdbapi.com/';
1718
this.types = ['movie', 'series'];
1819
}
@@ -44,23 +45,34 @@ export class OMDbAPI extends APIModel {
4445

4546
let ret: MediaTypeModel[] = [];
4647

47-
for (const value of data.Search) {
48-
if (value.Type === 'movie') {
48+
for (const result of data.Search) {
49+
if (result.Type === 'movie') {
4950
ret.push(new MovieModel({
5051
type: 'movie',
51-
title: value.Title,
52-
year: value.Year,
52+
title: result.Title,
53+
englishTitle: result.Title,
54+
year: result.Year,
5355
dataSource: this.apiName,
54-
id: value.imdbID,
56+
id: result.imdbID,
5557
} as MovieModel));
56-
} else if (value.Type === 'series') {
58+
} else if (result.Type === 'series') {
5759
ret.push(new SeriesModel({
5860
type: 'series',
59-
title: value.Title,
60-
year: value.Year,
61+
title: result.Title,
62+
englishTitle: result.Title,
63+
year: result.Year,
6164
dataSource: this.apiName,
62-
id: value.imdbID,
65+
id: result.imdbID,
6366
} as SeriesModel));
67+
} else if (result.Type === 'game') {
68+
ret.push(new GameModel({
69+
type: 'game',
70+
title: result.Title,
71+
englishTitle: result.Title,
72+
year: result.Year,
73+
dataSource: this.apiName,
74+
id: result.imdbID,
75+
} as GameModel));
6476
}
6577
}
6678

@@ -91,6 +103,7 @@ export class OMDbAPI extends APIModel {
91103
const model = new MovieModel({
92104
type: 'movie',
93105
title: result.Title,
106+
englishTitle: result.Title,
94107
year: result.Year,
95108
dataSource: this.apiName,
96109
url: `https://www.imdb.com/title/${result.imdbID}/`,
@@ -115,6 +128,7 @@ export class OMDbAPI extends APIModel {
115128
const model = new SeriesModel({
116129
type: 'series',
117130
title: result.Title,
131+
englishTitle: result.Title,
118132
year: result.Year,
119133
dataSource: this.apiName,
120134
url: `https://www.imdb.com/title/${result.imdbID}/`,
@@ -137,6 +151,28 @@ export class OMDbAPI extends APIModel {
137151
personalRating: 0,
138152
} as SeriesModel);
139153

154+
return model;
155+
} else if (result.Type === 'game') {
156+
const model = new GameModel({
157+
type: 'game',
158+
title: result.Title,
159+
englishTitle: result.Title,
160+
year: result.Year,
161+
dataSource: this.apiName,
162+
url: `https://www.imdb.com/title/${result.imdbID}/`,
163+
id: result.imdbID,
164+
165+
genres: result.Genre?.split(', ') ?? [],
166+
onlineRating: Number.parseFloat(result.imdbRating ?? 0),
167+
image: result.Poster ?? '',
168+
169+
released: true,
170+
releaseDate: (new Date(result.Released)).toLocaleDateString() ?? 'unknown',
171+
172+
played: false,
173+
personalRating: 0,
174+
} as GameModel);
175+
140176
return model;
141177
}
142178

src/main.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ export default class MediaDbPlugin extends Plugin {
7474
// console.log(template);
7575
fileContent += template;
7676
}
77+
} else if (data.type === 'game' && this.settings.seriesTemplate) {
78+
const templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.gameTemplate).first();
79+
if (templateFile) {
80+
let template = await this.app.vault.read(templateFile);
81+
// console.log(template);
82+
fileContent += template;
83+
}
7784
}
7885

7986
const fileName = replaceIllegalFileNameCharactersInString(data.getFileName());

src/modals/MediaDbSearchResultModal.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export class MediaDbSearchResultModal extends SuggestModal<MediaTypeModel> {
2121
// Renders each suggestion item.
2222
renderSuggestion(item: MediaTypeModel, el: HTMLElement) {
2323
el.createEl('div', {text: item.getFileName()});
24+
el.createEl('small', {text: `${item.englishTitle}\n`});
2425
el.createEl('small', {text: `${item.type.toUpperCase()} from ${item.dataSource}`});
2526
}
2627

src/models/GameModel.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {MediaTypeModel} from './MediaTypeModel';
2+
import {stringifyYaml} from 'obsidian';
3+
4+
5+
export class GameModel extends MediaTypeModel {
6+
type: string;
7+
title: string;
8+
englishTitle: string;
9+
year: string;
10+
dataSource: string;
11+
url: string;
12+
id: string;
13+
14+
genres: string[];
15+
onlineRating: number;
16+
image: string;
17+
18+
released: boolean;
19+
releaseDate: string;
20+
21+
played: boolean;
22+
personalRating: number;
23+
24+
25+
constructor(obj: any = {}) {
26+
super();
27+
28+
Object.assign(this, obj);
29+
}
30+
31+
toMetaData(): string {
32+
return stringifyYaml(this);
33+
}
34+
35+
getFileName(): string {
36+
return this.title + (this.year ? ` (${this.year})` : '');
37+
}
38+
39+
}

src/models/MediaTypeModel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export abstract class MediaTypeModel {
22
type: string;
33
title: string;
4+
englishTitle: string;
45
year: string;
56
dataSource: string;
67
url: string;

src/models/MovieModel.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {stringifyYaml} from 'obsidian';
55
export class MovieModel extends MediaTypeModel {
66
type: string;
77
title: string;
8+
englishTitle: string;
89
year: string;
910
dataSource: string;
1011
url: string;
@@ -28,8 +29,6 @@ export class MovieModel extends MediaTypeModel {
2829
super();
2930

3031
Object.assign(this, obj);
31-
32-
this.type = 'movie';
3332
}
3433

3534
toMetaData(): string {

src/models/SeriesModel.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {stringifyYaml} from 'obsidian';
55
export class SeriesModel extends MediaTypeModel {
66
type: string;
77
title: string;
8+
englishTitle: string;
89
year: string;
910
dataSource: string;
1011
url: string;
@@ -31,8 +32,6 @@ export class SeriesModel extends MediaTypeModel {
3132
super();
3233

3334
Object.assign(this, obj);
34-
35-
this.type = 'series';
3635
}
3736

3837
toMetaData(): string {

src/settings/Settings.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface MediaDbPluginSettings {
1111
OMDbKey: string,
1212
movieTemplate: string,
1313
seriesTemplate: string,
14+
gameTemplate: string,
1415
}
1516

1617
export const DEFAULT_SETTINGS: MediaDbPluginSettings = {
@@ -19,6 +20,7 @@ export const DEFAULT_SETTINGS: MediaDbPluginSettings = {
1920
OMDbKey: '',
2021
movieTemplate: '',
2122
seriesTemplate: '',
23+
gameTemplate: '',
2224
};
2325

2426
export class MediaDbSettingTab extends PluginSettingTab {
@@ -75,6 +77,19 @@ export class MediaDbSettingTab extends PluginSettingTab {
7577
});
7678
});
7779

80+
new Setting(containerEl)
81+
.setName('Game template')
82+
.setDesc('Template file to be used when creating a new note for a game.')
83+
.addSearch(cb => {
84+
new FileSuggest(this.app, cb.inputEl);
85+
cb.setPlaceholder('Example: gameTemplate.md')
86+
.setValue(this.plugin.settings.gameTemplate)
87+
.onChange(data => {
88+
this.plugin.settings.gameTemplate = data;
89+
this.plugin.saveSettings();
90+
});
91+
});
92+
7893
new Setting(containerEl)
7994
.setName('OMDb API key')
8095
.setDesc('API key for "www.omdbapi.com".')

0 commit comments

Comments
 (0)