Merge branch 'dev' into dev

This commit is contained in:
zisra 2023-03-30 21:19:21 -05:00 committed by GitHub
commit c541d4212a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 133 additions and 53 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "movie-web", "name": "movie-web",
"version": "3.0.8", "version": "3.0.9",
"private": true, "private": true,
"homepage": "https://movie.squeezebox.dev", "homepage": "https://movie.squeezebox.dev",
"dependencies": { "dependencies": {

View File

@ -8,24 +8,15 @@ import {
} from "../helpers/streams"; } from "../helpers/streams";
import { MWMediaType } from "../metadata/types"; import { MWMediaType } from "../metadata/types";
// const flixHqBase = "https://api.consumet.org/movies/flixhq"; const flixHqBase = "https://api.consumet.org/meta/tmdb";
// *** TEMPORARY FIX - use other instance
// SEE ISSUE: https://github.com/consumet/api.consumet.org/issues/326
const flixHqBase = "https://c.delusionz.xyz/movies/flixhq";
type FlixHQMediaType = "Movie" | "TV Series";
interface FLIXMediaBase { interface FLIXMediaBase {
id: number; id: number;
title: string; title: string;
url: string; url: string;
image: string; image: string;
type: "Movie" | "TV Series"; type: FlixHQMediaType;
}
interface FLIXTVSerie extends FLIXMediaBase {
seasons: number | null;
}
interface FLIXMovie extends FLIXMediaBase {
releaseDate: string; releaseDate: string;
} }
@ -48,12 +39,16 @@ const qualityMap: Record<string, MWStreamQuality> = {
"1080": MWStreamQuality.Q1080P, "1080": MWStreamQuality.Q1080P,
}; };
function flixTypeToMWType(type: FlixHQMediaType) {
if (type === "Movie") return MWMediaType.MOVIE;
return MWMediaType.SERIES;
}
registerProvider({ registerProvider({
id: "flixhq", id: "flixhq",
displayName: "FlixHQ", displayName: "FlixHQ",
rank: 100, rank: 100,
type: [MWMediaType.MOVIE, MWMediaType.SERIES], type: [MWMediaType.MOVIE, MWMediaType.SERIES],
async scrape({ media, episode, progress }) { async scrape({ media, episode, progress }) {
if (!this.type.includes(media.meta.type)) { if (!this.type.includes(media.meta.type)) {
throw new Error("Unsupported type"); throw new Error("Unsupported type");
@ -67,60 +62,46 @@ registerProvider({
); );
const foundItem = searchResults.results.find((v: FLIXMediaBase) => { const foundItem = searchResults.results.find((v: FLIXMediaBase) => {
if (media.meta.type === MWMediaType.MOVIE) { if (v.type !== "Movie" && v.type !== "TV Series") return false;
if (v.type !== "Movie") return false; return (
const movie = v as FLIXMovie; compareTitle(v.title, media.meta.title) &&
return ( flixTypeToMWType(v.type) === media.meta.type &&
compareTitle(movie.title, media.meta.title) && v.releaseDate === media.meta.year
movie.releaseDate === media.meta.year );
);
}
if (media.meta.type === MWMediaType.SERIES) {
if (v.type !== "TV Series") return false;
const serie = v as FLIXTVSerie;
if (serie.seasons && media.meta.seasons) {
return (
compareTitle(serie.title, media.meta.title) &&
serie.seasons === media.meta.seasons.length
);
}
return false;
}
return false;
}); });
if (!foundItem) throw new Error("No watchable item found"); if (!foundItem) throw new Error("No watchable item found");
const flixId = foundItem.id;
// get media info // get media info
progress(25); progress(25);
const mediaInfo = await proxiedFetch<any>("/info", { const mediaInfo = await proxiedFetch<any>(`/info/${foundItem.id}`, {
baseURL: flixHqBase, baseURL: flixHqBase,
params: { params: {
id: flixId, type: flixTypeToMWType(foundItem.type),
}, },
}); });
if (!mediaInfo.episodes) throw new Error("No watchable item found"); if (!mediaInfo.id) throw new Error("No watchable item found");
// get stream info from media // get stream info from media
progress(75); progress(50);
// By default we assume it is a movie let episodeId: string | undefined;
let episodeId: string | undefined = mediaInfo.episodes[0].id; if (media.meta.type === MWMediaType.MOVIE) {
if (media.meta.type === MWMediaType.SERIES) { episodeId = mediaInfo.episodeId;
} else if (media.meta.type === MWMediaType.SERIES) {
const seasonNo = media.meta.seasonData.number; const seasonNo = media.meta.seasonData.number;
const episodeNo = media.meta.seasonData.episodes.find( const episodeNo = media.meta.seasonData.episodes.find(
(e) => e.id === episode (e) => e.id === episode
)?.number; )?.number;
episodeId = mediaInfo.episodes.find(
(e: any) => e.season === seasonNo && e.number === episodeNo const season = mediaInfo.seasons.find((o: any) => o.season === seasonNo);
)?.id; episodeId = season.episodes.find((o: any) => o.episode === episodeNo).id;
} }
if (!episodeId) throw new Error("No watchable item found"); if (!episodeId) throw new Error("No watchable item found");
progress(75);
const watchInfo = await proxiedFetch<any>("/watch", { const watchInfo = await proxiedFetch<any>(`/watch/${episodeId}`, {
baseURL: flixHqBase, baseURL: flixHqBase,
params: { params: {
episodeId, id: mediaInfo.id,
mediaId: flixId,
}, },
}); });

View File

@ -6,7 +6,7 @@ function getInitialValue(params: { type: string; query: string }) {
const type = const type =
Object.values(MWMediaType).find((v) => params.type === v) || Object.values(MWMediaType).find((v) => params.type === v) ||
MWMediaType.MOVIE; MWMediaType.MOVIE;
const searchQuery = params.query || ""; const searchQuery = decodeURIComponent(params.query || "");
return { type, searchQuery }; return { type, searchQuery };
} }

View File

@ -0,0 +1,97 @@
{
"global": {
"name": "movie-web"
},
"search": {
"loading_series": "Recherche de votre série préférée...",
"loading_movie": "Recherche de vos films préférés...",
"loading": "Chargement...",
"allResults": "C'est tout ce que nous avons!",
"noResults": "Nous n'avons rien trouvé!",
"allFailed": "Le média n'a pas été trouvé, veuillez réessayez!",
"headingTitle": "Résultats de la recherche",
"bookmarks": "Favoris",
"continueWatching": "Continuer le visionnage",
"title": "Que voulez-vous voir?",
"placeholder": "Que voulez-vous voir?"
},
"media": {
"title": "Impossible de trouver ce média",
"description": "Nous n'avons pas pu trouver le média que vous avez demandé. Soit il a été supprimé, soit vous avez altéré l'URL."
},
"provider": {
"title": "Ce fournisseur a été désactivé",
"description": "Nous avons eu des problèmes avec le fournisseur ou bien il était trop instable pour être utilisé, donc nous avons dû le désactiver."
},
"page": {
"title": "Impossible de trouver cette page",
"description": "Nous avons cherché partout : sous les poubelles, dans le placard, derrière le proxy, mais nous n'avons finalement pas pu trouver la page que vous recherchez."
},
"searchBar": {
"movie": "Film",
"series": "Série",
"Search": "Rechercher"
},
"videoPlayer": {
"findingBestVideo": "Recherche de la meilleure vidéo pour vous",
"noVideos": "Désolé, nous n'avons pas pu trouver de vidéos pour vous",
"loading": "Chargement...",
"backToHome": "Retour à la page d'accueil",
"backToHomeShort": "Retour",
"seasonAndEpisode": "S{{season}} E{{episode}}",
"buttons": {
"episodes": "Épisodes",
"source": "Source",
"captions": "Sous-titres",
"download": "Télécharger",
"settings": "Paramètres",
"pictureInPicture": "Image dans l'image"
},
"popouts": {
"sources": "Sources",
"seasons": "Saisons",
"captions": "Sous-titres",
"captionPreferences": {
"title": "Personnaliser",
"delay": "Délai",
"fontSize": "Taille",
"opacity": "Opacité",
"color": "Couleur"
},
"episode": "E{{index}} - {{title}}",
"noCaptions": "Pas de sous-titres",
"linkedCaptions": "Sous-titres liés",
"customCaption": "Sous-titres personnalisés",
"uploadCustomCaption": "Télécharger des sous-titres (SRT, VTT)",
"noEmbeds": "Aucun contenu intégré n'a été trouvé pour cette source",
"errors": {
"loadingWentWong": "Un problème est survenu lors du chargement des épisodes pour {{seasonTitle}}",
"embedsError": "Un problème est survenu lors du chargement des contenus intégrés pour cet élément que vous aimez"
},
"descriptions": {
"sources": "Quel fournisseur voulez-vous utiliser ?",
"embeds": "Choisissez quelle vidéo regarder",
"seasons": "Choisissez la saison que vous voulez regarder",
"episode": "Sélectionnez un épisode",
"captions": "Choisissez une langue de sous-titres",
"captionPreferences": "Personnalisez l'apparence des sous-titres"
}
},
"errors": {
"fatalError": "Le lecteur vidéo a rencontré une erreur fatale, veuillez la signaler au serveur <0>Discord</0> ou sur <1>GitHub</1>."
}
},
"v3": {
"newSiteTitle": "Nouvelle version disponible!",
"newDomain": "https://movie-web.app",
"newDomainText": "movie-web déménagera bientôt vers un nouveau domaine : <0>https://movie-web.app</0>. Veillez à mettre à jour tous vos favoris car <1>l'ancien site web cessera de fonctionner le {{date}}.</1>",
"tireless": "Nous avons travaillé sans relâche sur cette nouvelle mise à jour et nous espérons que vous apprécierez ce que nous avons préparé ces derniers mois.",
"leaveAnnouncement": "Emmenez-moi là!"
},
"casting": {
"casting": "Transmission à l'appareil..."
},
"errors": {
"offline": "Vérifiez votre connexion internet"
}
}

View File

@ -285,7 +285,9 @@ export function createVideoStateProvider(
updateMediaPlaying(descriptor, state); updateMediaPlaying(descriptor, state);
}; };
const fullscreenchange = () => { const fullscreenchange = () => {
state.interface.isFullscreen = !!document.fullscreenElement; state.interface.isFullscreen =
!!document.fullscreenElement || // other browsers
!!(document as any).webkitFullscreenElement; // safari
updateInterface(descriptor, state); updateInterface(descriptor, state);
}; };
const volumechange = async () => { const volumechange = async () => {

View File

@ -64,8 +64,8 @@ export function VideoTesterView() {
/> />
<SourceController <SourceController
source={video.streamUrl} source={video.streamUrl}
type={MWStreamType.MP4} type={videoType}
quality={MWStreamQuality.Q720P} quality={MWStreamQuality.QUNKNOWN}
/> />
</VideoPlayer> </VideoPlayer>
</div> </div>