Files
Aniworld/src/server/web/static/js/index/nfo-config.js
Lukas c92e2d340e Fix JSON parsing in NFO JavaScript modules
- Add response.json() calls in nfo-manager.js for all API calls
- Add response.json() calls in nfo-config.js for all API calls
- Fix createNFO, refreshNFO, viewNFO, getSeriesWithoutNFO functions
- Fix load and testTMDBConnection functions
- All API responses must be parsed before accessing properties
2026-01-18 12:18:42 +01:00

184 lines
6.8 KiB
JavaScript

/**
* AniWorld - NFO Config Module
*
* Handles NFO metadata configuration settings.
*
* Dependencies: constants.js, api-client.js, ui-utils.js
*/
var AniWorld = window.AniWorld || {};
AniWorld.NFOConfig = (function() {
'use strict';
const API = AniWorld.Constants.API;
/**
* Load NFO configuration from server
*/
async function load() {
try {
const response = await AniWorld.ApiClient.request(API.CONFIG);
if (!response) {
throw new Error('Failed to load configuration');
}
const config = await response.json();
if (config && config.nfo) {
const nfo = config.nfo;
// TMDB API Key
const tmdbKey = document.getElementById('tmdb-api-key');
if (tmdbKey && nfo.tmdb_api_key) {
tmdbKey.value = nfo.tmdb_api_key;
}
// Auto-create NFO
const autoCreate = document.getElementById('nfo-auto-create');
if (autoCreate) {
autoCreate.checked = nfo.auto_create || false;
}
// Update on scan
const updateOnScan = document.getElementById('nfo-update-on-scan');
if (updateOnScan) {
updateOnScan.checked = nfo.update_on_scan || false;
}
// Download options
const downloadPoster = document.getElementById('nfo-download-poster');
if (downloadPoster) {
downloadPoster.checked = nfo.download_poster !== false;
}
const downloadLogo = document.getElementById('nfo-download-logo');
if (downloadLogo) {
downloadLogo.checked = nfo.download_logo !== false;
}
const downloadFanart = document.getElementById('nfo-download-fanart');
if (downloadFanart) {
downloadFanart.checked = nfo.download_fanart !== false;
}
// Image size
const imageSize = document.getElementById('nfo-image-size');
if (imageSize && nfo.image_size) {
imageSize.value = nfo.image_size;
}
}
} catch (error) {
console.error('Error loading NFO config:', error);
AniWorld.UI.showToast('Failed to load NFO configuration', 'error');
}
}
/**
* Save NFO configuration
*/
async function save() {
try {
AniWorld.UI.showLoading('Saving NFO configuration...');
// Get form values
const tmdbKey = document.getElementById('tmdb-api-key');
const autoCreate = document.getElementById('nfo-auto-create');
const updateOnScan = document.getElementById('nfo-update-on-scan');
const downloadPoster = document.getElementById('nfo-download-poster');
const downloadLogo = document.getElementById('nfo-download-logo');
const downloadFanart = document.getElementById('nfo-download-fanart');
const imageSize = document.getElementById('nfo-image-size');
// Validate TMDB API key is provided if auto-create is enabled
if (autoCreate && autoCreate.checked && (!tmdbKey || !tmdbKey.value.trim())) {
AniWorld.UI.hideLoading();
AniWorld.UI.showToast('TMDB API key is required when auto-create is enabled', 'error');
return;
}
// Get current config
const configResponse = await AniWorld.ApiClient.get(AniWorld.Constants.API.CONFIG);
if (!configResponse) {
throw new Error('Failed to load current configuration');
}
const config = await configResponse.json();
// Update NFO settings
config.nfo = {
tmdb_api_key: tmdbKey ? tmdbKey.value.trim() || null : null,
auto_create: autoCreate ? autoCreate.checked : false,
update_on_scan: updateOnScan ? updateOnScan.checked : false,
download_poster: downloadPoster ? downloadPoster.checked : true,
download_logo: downloadLogo ? downloadLogo.checked : true,
download_fanart: downloadFanart ? downloadFanart.checked : true,
image_size: imageSize ? imageSize.value : 'original'
};
// Save configuration
const response = await AniWorld.ApiClient.put(AniWorld.Constants.API.CONFIG, config);
if (response) {
AniWorld.UI.showToast('NFO configuration saved successfully', 'success');
} else {
throw new Error('Failed to save configuration');
}
} catch (error) {
console.error('Error saving NFO config:', error);
AniWorld.UI.showToast('Failed to save NFO configuration: ' + error.message, 'error');
} finally {
AniWorld.UI.hideLoading();
}
}
/**
* Test TMDB API connection
*/
async function testTMDBConnection() {
try {
const tmdbKey = document.getElementById('tmdb-api-key');
if (!tmdbKey || !tmdbKey.value.trim()) {
AniWorld.UI.showToast('Please enter a TMDB API key first', 'warning');
return;
}
AniWorld.UI.showLoading('Testing TMDB connection...');
const response = await AniWorld.ApiClient.request(
'/api/config/tmdb/validate',
{
method: 'POST',
body: JSON.stringify({ api_key: tmdbKey.value.trim() })
}
);
if (!response) {
throw new Error('No response from server');
}
const data = await response.json();
if (data && data.valid) {
AniWorld.UI.showToast('TMDB API key is valid!', 'success');
} else {
const message = data && data.message ? data.message : 'Invalid API key';
AniWorld.UI.showToast('TMDB validation failed: ' + message, 'error');
}
} catch (error) {
console.error('Error testing TMDB connection:', error);
AniWorld.UI.showToast('Failed to test TMDB connection: ' + error.message, 'error');
} finally {
AniWorld.UI.hideLoading();
}
}
// Public API
return {
load: load,
save: save,
testTMDBConnection: testTMDBConnection
};
})();