mirror of
https://github.com/movie-web/movie-web.git
synced 2024-11-14 09:05:06 +01:00
Merge branch 'dev' into dev
This commit is contained in:
commit
c541d4212a
@ -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": {
|
||||||
|
@ -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;
|
|
||||||
const movie = v as FLIXMovie;
|
|
||||||
return (
|
return (
|
||||||
compareTitle(movie.title, media.meta.title) &&
|
compareTitle(v.title, media.meta.title) &&
|
||||||
movie.releaseDate === media.meta.year
|
flixTypeToMWType(v.type) === media.meta.type &&
|
||||||
|
v.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,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
97
src/setup/locales/fr/translation.json
Normal file
97
src/setup/locales/fr/translation.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
@ -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 () => {
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user