Merge origin/develop into sonarqube resolve conflicts (.gitignore, settings, DownloadProvider, downloads page)

This commit is contained in:
Uruk
2025-10-09 16:51:26 +02:00
40 changed files with 2327 additions and 296 deletions

View File

@@ -189,7 +189,7 @@ function useDownloadProvider() {
return task.metadata && !processes.some((p) => p.id === task.id);
};
const findTaskById = (taskId: string) => {
const _findTaskById = (taskId: string) => {
return tasks.find((taskItem: any) => taskItem.id === taskId);
};
@@ -310,7 +310,7 @@ function useDownloadProvider() {
return db.movies[id];
}
// If not in movies, check episodes
// Check episodes
for (const series of Object.values(db.series)) {
for (const season of Object.values(series.seasons)) {
for (const episode of Object.values(season.episodes)) {
@@ -321,6 +321,11 @@ function useDownloadProvider() {
}
}
// Check other media types
if (db.other[id]) {
return db.other[id];
}
return undefined;
};
@@ -357,7 +362,7 @@ function useDownloadProvider() {
if (file) {
return JSON.parse(file) as DownloadsDatabase;
}
return { movies: {}, series: {} };
return { movies: {}, series: {}, other: {} }; // Initialize other media types storage
};
const getDownloadedItems = () => {
@@ -369,6 +374,7 @@ function useDownloadProvider() {
Object.values(season.episodes),
),
),
...Object.values(db.other), // Include other media types in results
];
return allItems;
};
@@ -667,6 +673,9 @@ function useDownloadProvider() {
db.series[item.SeriesId].seasons[seasonNumber].episodes[
episodeNumber
] = downloadedItem;
} else if (item.Id) {
// Handle other media types
db.other[item.Id] = downloadedItem;
}
saveDownloadsDatabase(db);
@@ -865,31 +874,6 @@ function useDownloadProvider() {
[authHeader, startDownload],
);
const findAndDeleteMovie = (
db: DownloadsDatabase,
id: string,
): DownloadedItem | undefined => {
const downloadedItem = db.movies[id];
if (downloadedItem) {
delete db.movies[id];
}
return downloadedItem;
};
const cleanUpEmptyParents = (
series: DownloadedSeries,
seasonNumber: string,
seriesId: string,
db: DownloadsDatabase,
) => {
if (!Object.keys(series.seasons[Number(seasonNumber)].episodes).length) {
delete series.seasons[Number(seasonNumber)];
}
if (!Object.keys(series.seasons).length) {
delete db.series[seriesId];
}
};
const findAndDeleteEpisode = (
db: DownloadsDatabase,
id: string,
@@ -902,15 +886,41 @@ function useDownloadProvider() {
if (episode.item.Id === id) {
const downloadedItem = episode;
delete season.episodes[Number(episodeNumber)];
cleanUpEmptyParents(series, seasonNumber, seriesId, db);
cleanUpEmptyParents(series, Number(seasonNumber), seriesId, db);
return downloadedItem;
}
}
}
}
return undefined;
};
const cleanUpEmptyParents = (
series: DownloadedSeries,
seasonNumber: number,
seriesId: string,
db: DownloadsDatabase,
) => {
if (!Object.keys(series.seasons[seasonNumber].episodes).length) {
delete series.seasons[seasonNumber];
}
if (!Object.keys(series.seasons).length) {
delete db.series[seriesId];
}
};
const findAndDeleteMovie = (
db: DownloadsDatabase,
id: string,
): DownloadedItem | undefined => {
const downloadedItem = db.movies[id];
if (downloadedItem) {
delete db.movies[id];
}
return downloadedItem;
};
const deleteMediaFiles = async (downloadedItem: DownloadedItem) => {
if (downloadedItem.videoFilePath) {
await FileSystem.deleteAsync(downloadedItem.videoFilePath, {
@@ -938,7 +948,7 @@ function useDownloadProvider() {
}
};
const deleteFile = async (id: string, type: "Movie" | "Episode") => {
const deleteFile = async (id: string, type: BaseItemDto["Type"]) => {
const db = getDownloadsDatabase();
let downloadedItem: DownloadedItem | undefined;
@@ -946,6 +956,10 @@ function useDownloadProvider() {
downloadedItem = findAndDeleteMovie(db, id);
} else if (type === "Episode") {
downloadedItem = findAndDeleteEpisode(db, id);
} else {
// Other media types
downloadedItem = db.other[id];
if (downloadedItem) delete db.other[id];
}
if (downloadedItem) {
@@ -958,7 +972,7 @@ function useDownloadProvider() {
const deleteItems = async (items: BaseItemDto[]) => {
for (const item of items) {
if (item.Id && (item.Type === "Movie" || item.Type === "Episode")) {
if (item.Id) {
await deleteFile(item.Id, item.Type);
}
}
@@ -1019,6 +1033,8 @@ function useDownloadProvider() {
const db = getDownloadsDatabase();
if (db.movies[itemId]) {
db.movies[itemId] = updatedItem;
} else if (db.other[itemId]) {
db.other[itemId] = updatedItem;
} else {
updateEpisodeInSeries(db, itemId, updatedItem);
}

View File

@@ -88,6 +88,8 @@ export interface DownloadsDatabase {
movies: Record<string, DownloadedItem>;
/** A map of series IDs to their downloaded series data. */
series: Record<string, DownloadedSeries>;
/** A map of IDs to downloaded items that are neither movies nor episodes */
other: Record<string, DownloadedItem>;
}
/**

View File

@@ -64,7 +64,7 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({
setJellyfin(
() =>
new Jellyfin({
clientInfo: { name: "Streamyfin", version: "0.38.0" },
clientInfo: { name: "Streamyfin", version: "0.39.0" },
deviceInfo: {
name: deviceName,
id,
@@ -87,7 +87,7 @@ export const JellyfinProvider: React.FC<{ children: ReactNode }> = ({
return {
authorization: `MediaBrowser Client="Streamyfin", Device=${
Platform.OS === "android" ? "Android" : "iOS"
}, DeviceId="${deviceId}", Version="0.38.0"`,
}, DeviceId="${deviceId}", Version="0.39.0"`,
};
}, [deviceId]);