Skip to content

Commit fa9cc9a

Browse files
committed
Update: Add context referencing for chatbot (#196)
1 parent 7047c47 commit fa9cc9a

38 files changed

+96
-570
lines changed

MovieVerse-Mobile/platforms/android/app/src/main/assets/www/MovieVerse-Frontend/js/actor-details.js

+5-32
Original file line numberDiff line numberDiff line change
@@ -58,35 +58,6 @@ function handleSearch() {
5858
window.location.href = 'search.html';
5959
}
6060

61-
function calculateMoviesToDisplay() {
62-
const screenWidth = window.innerWidth;
63-
if (screenWidth <= 689.9) return 10;
64-
if (screenWidth <= 1021.24) return 20;
65-
if (screenWidth <= 1353.74) return 21;
66-
if (screenWidth <= 1684.9) return 20;
67-
if (screenWidth <= 2017.49) return 20;
68-
if (screenWidth <= 2349.99) return 18;
69-
if (screenWidth <= 2681.99) return 21;
70-
if (screenWidth <= 3014.49) return 24;
71-
if (screenWidth <= 3345.99) return 27;
72-
if (screenWidth <= 3677.99) return 20;
73-
if (screenWidth <= 4009.99) return 22;
74-
if (screenWidth <= 4340.99) return 24;
75-
if (screenWidth <= 4673.49) return 26;
76-
if (screenWidth <= 5005.99) return 28;
77-
if (screenWidth <= 5337.99) return 30;
78-
if (screenWidth <= 5669.99) return 32;
79-
if (screenWidth <= 6001.99) return 34;
80-
if (screenWidth <= 6333.99) return 36;
81-
if (screenWidth <= 6665.99) return 38;
82-
if (screenWidth <= 6997.99) return 40;
83-
if (screenWidth <= 7329.99) return 42;
84-
if (screenWidth <= 7661.99) return 44;
85-
if (screenWidth <= 7993.99) return 46;
86-
if (screenWidth <= 8325.99) return 48;
87-
return 20;
88-
}
89-
9061
let initialMainContent = '';
9162

9263
document.addEventListener('DOMContentLoaded', () => {
@@ -106,6 +77,7 @@ async function fetchActorDetails(actorId) {
10677
showSpinner();
10778
const actorUrl = `https://${getMovieVerseData()}/3/person/${actorId}?${generateMovieNames()}${getMovieCode()}`;
10879
const creditsUrl = `https://${getMovieVerseData()}/3/person/${actorId}/movie_credits?${generateMovieNames()}${getMovieCode()}`;
80+
10981
try {
11082
const [actorResponse, creditsResponse] = await Promise.all([
11183
fetch(actorUrl),
@@ -216,7 +188,8 @@ async function populateActorDetails(actor, credits) {
216188
if (movie.poster_path) {
217189
movieImage.src = IMGPATH2 + movie.poster_path;
218190
movieImage.alt = `${movie.title} Poster`;
219-
} else {
191+
}
192+
else {
220193
movieImage.alt = 'Image Not Available';
221194
movieImage.src = 'https://movie-verse.com/images/movie-default.jpg';
222195
movieImage.style.filter = 'grayscale(100%)';
@@ -248,7 +221,6 @@ async function populateActorDetails(actor, credits) {
248221
const mediaResponse = await fetch(mediaUrl);
249222
const mediaData = await mediaResponse.json();
250223
const images = mediaData.profiles;
251-
252224
const detailsContainer = document.getElementById('actor-description');
253225

254226
let mediaContainer = document.getElementById('media-container');
@@ -321,7 +293,6 @@ async function populateActorDetails(actor, credits) {
321293

322294
imageElement.addEventListener('click', function () {
323295
const imageUrl = this.src;
324-
325296
const modalHtml = `
326297
<div id="image-modal" style="z-index: 100022222; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.8); display: flex; justify-content: center; align-items: center;">
327298
<button id="prevModalButton" style="position: absolute; left: 20px; top: 50%; transform: translateY(-50%); background-color: #7378c5; color: white; border-radius: 8px; height: 30px; width: 30px; border: none; cursor: pointer; z-index: 11;"><i class="fas fa-arrow-left"></i></button>
@@ -450,6 +421,8 @@ async function populateActorDetails(actor, credits) {
450421
navigateMedia(images, imageElement, index - currentIndex);
451422
updateDots(index);
452423
});
424+
dot.addEventListener('mouseover', () => dot.style.backgroundColor = '#6a6a6a');
425+
dot.addEventListener('mouseout', () => dot.style.backgroundColor = index === currentIndex ? '#ff8623' : '#bbb');
453426

454427
currentLine.appendChild(dot);
455428

MovieVerse-Mobile/platforms/android/app/src/main/assets/www/MovieVerse-Frontend/js/add-to-favorites.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ export async function checkAndUpdateFavoriteButton() {
8383
console.log('Firebase quota exceeded. Checking local storage for favorites.');
8484
const localFavorites = JSON.parse(localStorage.getItem('moviesFavorited')) || [];
8585
updateFavoriteButton(movieId, localFavorites);
86-
} else {
86+
}
87+
else {
8788
console.error('An error occurred:', error);
8889
}
8990
}
@@ -198,8 +199,8 @@ export async function toggleFavorite() {
198199
}
199200

200201
updateMoviesFavorited(movieId);
201-
202-
} catch (error) {
202+
}
203+
catch (error) {
203204
if (error.code === 'resource-exhausted') {
204205
console.log('Firebase quota exceeded. Using localStorage for favorites.');
205206
let favoritesMovies = JSON.parse(localStorage.getItem('moviesFavorited')) || [];
@@ -231,7 +232,6 @@ export async function toggleFavorite() {
231232

232233
updateMoviesFavorited(movieId);
233234
}
234-
235235
window.location.reload();
236236
}
237237

MovieVerse-Mobile/platforms/android/app/src/main/assets/www/MovieVerse-Frontend/js/add-to-tv-favorites.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ export async function checkAndUpdateFavoriteButtonTVSeries() {
136136
const userData = querySnapshot.docs[0].data();
137137
favoritesTVSeries = userData.favoritesTVSeries || [];
138138
}
139-
} else {
139+
}
140+
else {
140141
favoritesTVSeries = JSON.parse(localStorage.getItem('favoritesTVSeries')) || [];
141142
}
142143

MovieVerse-Mobile/platforms/android/app/src/main/assets/www/MovieVerse-Frontend/js/chatbot.js

+2-67
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { GoogleGenerativeAI, HarmBlockThreshold, HarmCategory } from "@google/generative-ai";
22

3-
const chatbotInput = document.getElementById("chatbotInput");
43
const chatbotBody = document.getElementById("chatbotBody");
54
const movieee = `https://${getMovieVerseData()}/3`;
65

@@ -31,13 +30,8 @@ document.addEventListener('DOMContentLoaded', function() {
3130
document.getElementById('clear-search-btn').style.display = 'none';
3231
});
3332

34-
const search = document.getElementById("search");
35-
const searchButton = document.getElementById("button-search");
3633
const searchTitle = document.getElementById("search-title");
37-
const otherTitle = document.getElementById("other1");
3834
const SEARCHPATH = `https://${getMovieVerseData()}/3/search/movie?&${generateMovieNames()}${getMovieCode()}&query=`;
39-
const IMGPATH = "https://image.tmdb.org/t/p/w1280";
40-
const main = document.getElementById("main");
4135

4236
async function ensureGenreMapIsAvailable() {
4337
if (!localStorage.getItem('genreMap')) {
@@ -171,24 +165,6 @@ async function rotateUserStats() {
171165
});
172166
}
173167

174-
function updateMovieVisitCount(movieId, movieTitle) {
175-
let movieVisits = JSON.parse(localStorage.getItem('movieVisits')) || {};
176-
let uniqueMoviesViewed = JSON.parse(localStorage.getItem('uniqueMoviesViewed')) || [];
177-
178-
if (!movieVisits[movieId]) {
179-
movieVisits[movieId] = { count: 0, title: movieTitle };
180-
}
181-
182-
movieVisits[movieId].count += 1;
183-
184-
if (!uniqueMoviesViewed.includes(movieId)) {
185-
uniqueMoviesViewed.push(movieId);
186-
}
187-
188-
localStorage.setItem('movieVisits', JSON.stringify(movieVisits));
189-
localStorage.setItem('uniqueMoviesViewed', JSON.stringify(uniqueMoviesViewed));
190-
}
191-
192168
function getMostVisitedDirector() {
193169
const directorVisits = JSON.parse(localStorage.getItem('directorVisits')) || {};
194170
let mostVisitedDirector = '';
@@ -304,9 +280,9 @@ function sendInitialInstructions() {
304280
</span>
305281
</div>
306282
<ul style="text-align: left; margin-bottom: 10px; color: #fff;">
307-
<li>To find details about a movie, type "Show me details about [movie name]".</li>
283+
<li>To quickly find the trailer of a movie, type "Show trailer for [movie name]".</li>
308284
<li>You can also ask about genres, top-rated movies, latest movies, get a recommended movie, and any general questions!</li>
309-
<li>💡<b>Tip:</b> To get the best results, try to avoid phrasing requests like "Show me details about ...", as they might trigger specific functions instead of a broader search.</li>
285+
<li>💡<b>Tip:</b> To get the best results, try to avoid phrasing requests like "Show trailer for ...", as they might trigger specific functions instead of a broader search.</li>
310286
</ul>
311287
<div style="text-align: left; color: #fff;">How may I assist you today? 🎬🍿</div>
312288
`;
@@ -476,47 +452,6 @@ function hideSpinner() {
476452
document.getElementById('myModal').classList.remove('modal-visible');
477453
}
478454

479-
async function fetchMovieDetailsFromTMDB(movieName) {
480-
const url = `${movieee}/search/movie?${generateMovieNames()}${getMovieCode()}&query=${encodeURIComponent(movieName)}`;
481-
482-
try {
483-
const response = await fetch(url);
484-
const data = await response.json();
485-
486-
if (data.results.length > 0) {
487-
const movie = data.results[0];
488-
localStorage.setItem('selectedMovieId', movie.id);
489-
490-
let movieOverview = movie.overview;
491-
if (movieOverview.length > 500) {
492-
movieOverview = movieOverview.substring(0, 500) + '...';
493-
}
494-
if (movieOverview === '' || movieOverview === null || !movieOverview) {
495-
movieOverview = 'N/A';
496-
}
497-
498-
let movieReleaseDate = movie.release_date;
499-
if (movieReleaseDate === '' || movieReleaseDate === null || !movieReleaseDate) {
500-
movieReleaseDate = 'N/A';
501-
}
502-
503-
let movieVoteAverage = movie.vote_average.toFixed(1);
504-
if (movieVoteAverage === '' || movieVoteAverage === null || !movieVoteAverage) {
505-
movieVoteAverage = 'N/A';
506-
}
507-
508-
return `The title of the movie is ${movie.title}. Its overview is: ${movieOverview}. Its release date is ${movieReleaseDate}, and rating is ${movieVoteAverage}. You can find more info about it if you wish <a href="../html/movie-details.html" class='movie-details-link' style='color: #ff8623; cursor: pointer; text-decoration: underline;' data-movie-id='${movie.id}'>here</a>.`;
509-
}
510-
else {
511-
return "I couldn't find any movie with that name. Please try another movie name.";
512-
}
513-
}
514-
catch (error) {
515-
console.log('Error fetching movie details:', error);
516-
return "Sorry, I encountered an error while trying to fetch movie details. Please try again later.";
517-
}
518-
}
519-
520455
async function showMovieOfTheDay() {
521456
const year = new Date().getFullYear();
522457
const url = `https://${getMovieVerseData()}/3/discover/movie?${generateMovieNames()}${getMovieCode()}&sort_by=vote_average.desc&vote_count.gte=100&primary_release_year=${year}&vote_average.gte=7`;

MovieVerse-Mobile/platforms/android/app/src/main/assets/www/MovieVerse-Frontend/js/christopher-nolan.js

-61
Original file line numberDiff line numberDiff line change
@@ -50,35 +50,6 @@ function handleSearch() {
5050
window.location.href = 'search.html';
5151
}
5252

53-
function calculateMoviesToDisplay() {
54-
const screenWidth = window.innerWidth;
55-
if (screenWidth <= 689.9) return 10;
56-
if (screenWidth <= 1021.24) return 20;
57-
if (screenWidth <= 1353.74) return 21;
58-
if (screenWidth <= 1684.9) return 20;
59-
if (screenWidth <= 2017.49) return 20;
60-
if (screenWidth <= 2349.99) return 18;
61-
if (screenWidth <= 2681.99) return 21;
62-
if (screenWidth <= 3014.49) return 24;
63-
if (screenWidth <= 3345.99) return 27;
64-
if (screenWidth <= 3677.99) return 20;
65-
if (screenWidth <= 4009.99) return 22;
66-
if (screenWidth <= 4340.99) return 24;
67-
if (screenWidth <= 4673.49) return 26;
68-
if (screenWidth <= 5005.99) return 28;
69-
if (screenWidth <= 5337.99) return 30;
70-
if (screenWidth <= 5669.99) return 32;
71-
if (screenWidth <= 6001.99) return 34;
72-
if (screenWidth <= 6333.99) return 36;
73-
if (screenWidth <= 6665.99) return 38;
74-
if (screenWidth <= 6997.99) return 40;
75-
if (screenWidth <= 7329.99) return 42;
76-
if (screenWidth <= 7661.99) return 44;
77-
if (screenWidth <= 7993.99) return 46;
78-
if (screenWidth <= 8325.99) return 48;
79-
return 20;
80-
}
81-
8253
function handleSignInOut() {
8354
const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false;
8455

@@ -118,38 +89,6 @@ document.addEventListener("DOMContentLoaded", function() {
11889
document.getElementById('googleSignInBtn').addEventListener('click', handleSignInOut);
11990
});
12091

121-
async function getMovies(url) {
122-
clearMovieDetails();
123-
const numberOfMovies = calculateMoviesToDisplay();
124-
const pagesToFetch = numberOfMovies <= 20 ? 1 : 2;
125-
let allMovies = [];
126-
127-
for (let page = 1; page <= pagesToFetch; page++) {
128-
const response = await fetch(`${url}&page=${page}`);
129-
const data = await response.json();
130-
allMovies = allMovies.concat(data.results);
131-
}
132-
133-
const popularityThreshold = 0.5;
134-
135-
allMovies.sort((a, b) => {
136-
const popularityDifference = Math.abs(a.popularity - b.popularity);
137-
if (popularityDifference < popularityThreshold) {
138-
return b.vote_average - a.vote_average;
139-
}
140-
return b.popularity - a.popularity;
141-
});
142-
143-
if (allMovies.length > 0) {
144-
showMovies(allMovies.slice(0, numberOfMovies));
145-
document.getElementById('clear-search-btn').style.display = 'block'; // Show the button
146-
}
147-
else {
148-
main.innerHTML = `<p>No movie with the specified search term found. Please try again.</p>`;
149-
document.getElementById('clear-search-btn').style.display = 'none'; // Hide the button if no results
150-
}
151-
}
152-
15392
document.getElementById('clear-search-btn').addEventListener('click', () => {
15493
location.reload();
15594
});

MovieVerse-Mobile/platforms/android/app/src/main/assets/www/MovieVerse-Frontend/js/company-details.js

+2-12
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,6 @@ const IMGPATH = "https://image.tmdb.org/t/p/w1280";
3030
const IMGPATH2 = "https://image.tmdb.org/t/p/w185";
3131
const searchTitle = document.getElementById("search-title");
3232

33-
function getClassByRate(vote){
34-
if (vote >= 8) {
35-
return 'green';
36-
}
37-
else if (vote >= 5) {
38-
return 'orange';
39-
}
40-
else {
41-
return 'red';
42-
}
43-
}
44-
4533
async function ensureGenreMapIsAvailable() {
4634
if (!localStorage.getItem('genreMap')) {
4735
await fetchGenreMap();
@@ -317,6 +305,7 @@ async function fetchCompanyDetails(companyId) {
317305

318306
const homepage = company.homepage || '#';
319307
const companyWebsite = document.getElementById('company-website');
308+
320309
if (homepage !== '#') {
321310
companyWebsite.href = homepage;
322311
companyWebsite.textContent = homepage;
@@ -344,6 +333,7 @@ async function fetchCompanyMovies(companyId) {
344333
try {
345334
const response = await fetch(url);
346335
const data = await response.json();
336+
347337
if (data.results.length === 0) {
348338
const companyMoviesContainer = document.getElementById('company-movies-container');
349339
companyMoviesContainer.innerHTML = `<p>No movies found for this company.</p>`;

MovieVerse-Mobile/platforms/android/app/src/main/assets/www/MovieVerse-Frontend/js/director-details.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ function handleSearch() {
6565

6666
function updateSignInButtonState() {
6767
const isSignedIn = JSON.parse(localStorage.getItem('isSignedIn')) || false;
68-
6968
const signInText = document.getElementById('signInOutText');
7069
const signInIcon = document.getElementById('signInIcon');
7170
const signOutIcon = document.getElementById('signOutIcon');
@@ -90,6 +89,7 @@ document.addEventListener("DOMContentLoaded", function() {
9089

9190
document.addEventListener('DOMContentLoaded', () => {
9291
const directorId = localStorage.getItem('selectedDirectorId');
92+
9393
if (directorId) {
9494
fetchDirectorDetails(directorId);
9595
}
@@ -100,8 +100,10 @@ document.addEventListener('DOMContentLoaded', () => {
100100

101101
async function fetchDirectorDetails(directorId) {
102102
showSpinner();
103+
103104
const directorUrl = `https://${getMovieVerseData()}/3/person/${directorId}?${generateMovieNames()}${getMovieCode()}`;
104105
const creditsUrl = `https://${getMovieVerseData()}/3/person/${directorId}/movie_credits?${generateMovieNames()}${getMovieCode()}`;
106+
105107
try {
106108
const [directorResponse, creditsResponse] = await Promise.all([
107109
fetch(directorUrl),
@@ -204,7 +206,8 @@ async function populateDirectorDetails(director, credits) {
204206
if (movie.poster_path) {
205207
movieImage.src = IMGPATH2 + movie.poster_path;
206208
movieImage.alt = `${movie.title} Poster`;
207-
} else {
209+
}
210+
else {
208211
movieImage.alt = 'Image Not Available';
209212
movieImage.src = 'https://movie-verse.com/images/movie-default.jpg';
210213
movieImage.style.filter = 'grayscale(100%)';
@@ -442,6 +445,8 @@ async function populateDirectorDetails(director, credits) {
442445
navigateMedia(images, imageElement, index - currentIndex);
443446
updateDots(index);
444447
});
448+
dot.addEventListener('mouseover', () => dot.style.backgroundColor = '#6a6a6a');
449+
dot.addEventListener('mouseout', () => dot.style.backgroundColor = index === currentIndex ? '#ff8623' : '#bbb');
445450

446451
currentLine.appendChild(dot);
447452

0 commit comments

Comments
 (0)