-
Notifications
You must be signed in to change notification settings - Fork 0
/
dbUtils.js
134 lines (109 loc) · 3.78 KB
/
dbUtils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import mongoose from "mongoose";
const aka = mongoose.Schema({
titleId: String,
ondering: String,
title: String,
region: String,
language: String,
types: String,
attributes: String,
isOriginalTitle: String,
});
const name = mongoose.Schema({
nconst: String,
primaryName: String,
primaryProfession: String,
deathYear: String,
birthYear: String,
knownForTitles: String,
});
const Aka = mongoose.model("Aka", aka);
const Name = mongoose.model("Name", name);
mongoose.set("strictQuery", true);
mongoose.connect("mongodb://localhost:27017/imdb");
export async function getMovieLocalTitle(imdbID) {
const query = await Aka.findOne({ titleId: imdbID }).exec();
if (query) {
return query.title;
}
return "";
}
export async function getNameAndId(nameArray, oscarYear, imdbID, job) {
/*
Return { name, nameConst }
First we check for how many names we have matched
If we find more than one, we look for one that is on
the knowForTitles.
If there are more than one, throw an warning
and link the imdb if found after the following steps:
- Remove non-actors/actress/directors
- DeathYear 5 years before oscarYear
- Size of "KnowForTitles"
Later on we can make another map of forced values
*/
const foundNameArray = nameArray.map(async (person) => {
const filteredName = await filterName(person);
return { name: filteredName.primaryName, nameID: filteredName.nconst };
// return person;
});
return await Promise.all(foundNameArray);
async function filterName(name) {
const results = await Name.find({ primaryName: name }).exec();
if (results.length == 1) {
return results[0];
}
const resultFilteredByKnownTitles = results.filter((person) => {
return person.knownForTitles.includes(imdbID);
});
if (resultFilteredByKnownTitles.length == 1) {
const personFound = resultFilteredByKnownTitles[0];
const personUrl = "https://www.imdb.com/name/" + personFound.nconst;
// logger.addWarning(`${name} found by Known titles: ${personUrl}`);
return personFound;
}
const resultFilteredByDeathYear = results.filter((person) => {
return !(Number(person.deathYear) < oscarYear - 5);
});
if (resultFilteredByDeathYear.length == 1) {
const personFound = resultFilteredByDeathYear[0];
const personUrl = "https://www.imdb.com/name/" + personFound.nconst;
// logger.addWarning(`${name} found by death year: ${personUrl}`);
return resultFilteredByDeathYear[0];
}
const resultFilteredByProfession = results.filter((person) => {
if (job == "acting") {
return (
person.primaryProfession?.includes("actor") ||
person.primaryProfession?.includes("actress")
);
} else if (job == "directing") {
return person.primaryProfession?.includes("director");
}
});
if (resultFilteredByProfession.length == 1) {
const personFound = resultFilteredByProfession[0];
const personUrl = "https://www.imdb.com/name/" + personFound.nconst;
// logger.addWarning(`${name} found by profession: ${personUrl}`);
return personFound;
}
const resultFilteredByLengthTitles = resultFilteredByProfession.sort(
(a, b) => {
return (
b.knownForTitles.split(",").length -
a.knownForTitles.split(",").length
);
}
);
if (resultFilteredByLengthTitles.length) {
const personFound = resultFilteredByLengthTitles[0];
const personUrl = "https://www.imdb.com/name/" + personFound.nconst;
// logger.addWarning(`${name} found by 'knownFor' count: ${personUrl}`);
return personFound;
}
// logger.addWarning(`${name} not found!`);
return { primaryName: name, nconst: "" };
}
}
export function disconnect() {
mongoose.disconnect();
}