Skip to content

Commit 003c568

Browse files
committed
Music releases
1 parent 47b69b5 commit 003c568

File tree

12 files changed

+178
-36
lines changed

12 files changed

+178
-36
lines changed

src/api/apis/LocGovAPI.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {APIModel} from '../APIModel';
22
import {MediaTypeModel} from '../../models/MediaTypeModel';
33
import MediaDbPlugin from '../../main';
44

5+
// WIP
56
export class LocGovAPI extends APIModel {
67
plugin: MediaDbPlugin;
78
typeMappings: Map<string, string>;
@@ -21,7 +22,7 @@ export class LocGovAPI extends APIModel {
2122
async searchByTitle(title: string): Promise<MediaTypeModel[]> {
2223
console.log(`MDB | api "${this.apiName}" queried`);
2324

24-
const searchUrl = `https://www.loc.gov/search/?q=${title}&fo=json&c=20`;
25+
const searchUrl = `https://www.loc.gov/search/?q=${encodeURIComponent(title)}&fo=json&c=20`;
2526

2627
const fetchData = await fetch(searchUrl);
2728
console.log(fetchData);

src/api/apis/MALAPI.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class MALAPI extends APIModel {
2626
async searchByTitle(title: string): Promise<MediaTypeModel[]> {
2727
console.log(`MDB | api "${this.apiName}" queried`);
2828

29-
const searchUrl = `https://api.jikan.moe/v4/anime?q=${title}&limit=20${this.plugin.settings.sfwFilter ? '&sfw' : ''}`;
29+
const searchUrl = `https://api.jikan.moe/v4/anime?q=${encodeURIComponent(title)}&limit=20${this.plugin.settings.sfwFilter ? '&sfw' : ''}`;
3030

3131
const fetchData = await fetch(searchUrl);
3232
console.log(fetchData);

src/api/apis/MusicBrainzAPI.ts

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import {APIModel} from '../APIModel';
2+
import {MediaTypeModel} from '../../models/MediaTypeModel';
3+
import MediaDbPlugin from '../../main';
4+
import {requestUrl} from 'obsidian';
5+
import {MusicReleaseModel} from '../../models/MusicReleaseModel';
6+
// import {MusicBrainzApi} from 'musicbrainz-api';
7+
8+
// WIP
9+
export class MusicBrainzAPI extends APIModel {
10+
plugin: MediaDbPlugin;
11+
12+
constructor(plugin: MediaDbPlugin) {
13+
super();
14+
15+
this.plugin = plugin;
16+
this.apiName = 'MusicBrainz API';
17+
this.apiDescription = 'Free API for music albums.';
18+
this.apiUrl = 'https://musicbrainz.org/';
19+
this.types = ['music'];
20+
}
21+
22+
async searchByTitle(title: string): Promise<MediaTypeModel[]> {
23+
console.log(`MDB | api "${this.apiName}" queried`);
24+
25+
const searchUrl = `https://musicbrainz.org/ws/2/release-group?query=${encodeURIComponent(title)}&limit=20&fmt=json`;
26+
27+
const fetchData = await requestUrl({
28+
url: searchUrl,
29+
headers: {
30+
'User-Agent': 'obsidian-media-db-plugin/0.1.7 ( [email protected] )',
31+
},
32+
});
33+
34+
console.log(fetchData);
35+
36+
if (fetchData.status !== 200) {
37+
throw Error(`Received status code ${fetchData.status} from an API.`);
38+
}
39+
const data = await fetchData.json;
40+
41+
console.log(data);
42+
43+
let ret: MediaTypeModel[] = [];
44+
45+
for (const result of data['release-groups']) {
46+
ret.push(new MusicReleaseModel({
47+
type: 'musicRelease',
48+
title: result.title,
49+
englishTitle: result.title,
50+
year: (new Date(result['first-release-date'])).getFullYear().toString(),
51+
dataSource: this.apiName,
52+
url: '',
53+
id: result.id,
54+
55+
artists: result['artist-credit'].map((a: any) => a.name),
56+
subType: result['primary-type'],
57+
} as MusicReleaseModel));
58+
}
59+
60+
return ret;
61+
}
62+
63+
async getById(item: MediaTypeModel): Promise<MediaTypeModel> {
64+
console.log(`MDB | api "${this.apiName}" queried`);
65+
66+
const searchUrl = `https://musicbrainz.org/ws/2/release-group/${encodeURIComponent(item.id)}?inc=releases+artists+tags+ratings+genres&fmt=json`;
67+
68+
const fetchData = await requestUrl({
69+
url: searchUrl,
70+
headers: {
71+
'User-Agent': 'MyAwesomeTagger/1.2.0 ( [email protected] )',
72+
},
73+
});
74+
75+
const data = await fetchData.json;
76+
77+
console.log(data);
78+
79+
const result = data;
80+
81+
const model = new MusicReleaseModel({
82+
type: 'musicRelease',
83+
title: result.title,
84+
englishTitle: result.title,
85+
year: (new Date(result['first-release-date'])).getFullYear().toString(),
86+
dataSource: this.apiName,
87+
url: '',
88+
id: result.id,
89+
90+
artists: result['artist-credit'].map((a: any) => a.name),
91+
genres: result.genres.map((g: any) => g.name),
92+
subType: result['primary-type'],
93+
rating: result.rating.value * 2,
94+
} as MusicReleaseModel);
95+
96+
return model;
97+
}
98+
}

src/api/apis/OMDbAPI.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class OMDbAPI extends APIModel {
2626
async searchByTitle(title: string): Promise<MediaTypeModel[]> {
2727
console.log(`MDB | api "${this.apiName}" queried`);
2828

29-
const searchUrl = `http://www.omdbapi.com/?s=${title}&apikey=${this.plugin.settings.OMDbKey}`;
29+
const searchUrl = `http://www.omdbapi.com/?s=${encodeURIComponent(title)}&apikey=${this.plugin.settings.OMDbKey}`;
3030

3131
const fetchData = await fetch(searchUrl);
3232

src/api/apis/TestAPI.ts

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/api/apis/WikipediaAPI.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export class WikipediaAPI extends APIModel {
1919
async searchByTitle(title: string): Promise<MediaTypeModel[]> {
2020
console.log(`MDB | api "${this.apiName}" queried`);
2121

22-
const searchUrl = `https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch=${title}&srlimit=20&utf8=&format=json&origin=*`;
22+
const searchUrl = `https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch=${encodeURIComponent(title)}&srlimit=20&utf8=&format=json&origin=*`;
2323

2424
const fetchData = await fetch(searchUrl);
2525
console.log(fetchData);

src/main.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import {Notice, Plugin, TFile} from 'obsidian';
22
import {DEFAULT_SETTINGS, MediaDbPluginSettings, MediaDbSettingTab} from './settings/Settings';
33
import {APIManager} from './api/APIManager';
4-
import {TestAPI} from './api/apis/TestAPI';
54
import {MediaTypeModel} from './models/MediaTypeModel';
65
import {replaceIllegalFileNameCharactersInString, replaceTags} from './utils/Utils';
76
import {OMDbAPI} from './api/apis/OMDbAPI';
@@ -10,6 +9,7 @@ import {MediaDbSearchResultModal} from './modals/MediaDbSearchResultModal';
109
import {MALAPI} from './api/apis/MALAPI';
1110
import {MediaDbIdSearchModal} from './modals/MediaDbIdSearchModal';
1211
import {WikipediaAPI} from './api/apis/WikipediaAPI';
12+
import {MusicBrainzAPI} from './api/apis/MusicBrainzAPI';
1313

1414
export default class MediaDbPlugin extends Plugin {
1515
settings: MediaDbPluginSettings;
@@ -43,10 +43,10 @@ export default class MediaDbPlugin extends Plugin {
4343

4444
this.apiManager = new APIManager();
4545
// register APIs
46-
this.apiManager.registerAPI(new TestAPI());
4746
this.apiManager.registerAPI(new OMDbAPI(this));
4847
this.apiManager.registerAPI(new MALAPI(this));
4948
this.apiManager.registerAPI(new WikipediaAPI(this));
49+
this.apiManager.registerAPI(new MusicBrainzAPI(this));
5050
// this.apiManager.registerAPI(new LocGovAPI(this)); // TODO: parse data
5151
}
5252

@@ -71,6 +71,10 @@ export default class MediaDbPlugin extends Plugin {
7171
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.seriesTemplate).first();
7272
} else if (data.type === 'game' && this.settings.gameTemplate) {
7373
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.gameTemplate).first();
74+
} else if (data.type === 'wiki' && this.settings.wikiTemplate) {
75+
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.wikiTemplate).first();
76+
} else if (data.type === 'musicRelease' && this.settings.musicReleaseTemplate) {
77+
templateFile = this.app.vault.getFiles().filter((f: TFile) => f.name === this.settings.musicReleaseTemplate).first();
7478
}
7579

7680
if (templateFile) {

src/modals/MediaDbAdvancedSearchModal.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export class MediaDbAdvancedSearchModal extends Modal {
3030

3131
console.log(this.selectedApis);
3232

33-
if (!this.query || this.query.length < 5) {
33+
if (!this.query || this.query.length < 3) {
3434
new Notice('MDB: Query to short');
3535
return;
3636
}

src/models/MusicReleaseModel.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {MediaTypeModel} from './MediaTypeModel';
2+
import {stringifyYaml} from 'obsidian';
3+
4+
5+
export class MusicReleaseModel 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+
artists: string[];
16+
subType: string;
17+
rating: number;
18+
19+
personalRating: number;
20+
21+
constructor(obj: any = {}) {
22+
super();
23+
24+
Object.assign(this, obj);
25+
}
26+
27+
toMetaData(): string {
28+
return stringifyYaml(this);
29+
}
30+
31+
getFileName(): string {
32+
return this.title + ' (' + this.artists.join(', ') + ' - ' + this.year + ' - ' + this.subType + ')';
33+
}
34+
35+
}

src/models/SeriesModel.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export class SeriesModel extends MediaTypeModel {
3939
}
4040

4141
getFileName(): string {
42-
return this.title;
42+
return this.title + ' (' + this.year + ')';
4343
}
4444

4545
}

0 commit comments

Comments
 (0)