diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index e200ccc..e8d59f8 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -21,6 +21,10 @@ export default {
},
created() {
this.$store.dispatch('checkAuth')
+ // Charger les paramètres au démarrage si l'utilisateur est authentifié
+ if (this.isAuthenticated) {
+ this.$store.dispatch('loadSettings')
+ }
}
}
diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js
index c043990..d725bda 100644
--- a/frontend/src/store/index.js
+++ b/frontend/src/store/index.js
@@ -8,14 +8,25 @@ export default createStore({
token: localStorage.getItem('token') || '',
user: null,
loading: false,
- error: null
+ error: null,
+ settings: {
+ sonarr: {
+ url: '',
+ apiKey: ''
+ },
+ radarr: {
+ url: '',
+ apiKey: ''
+ }
+ }
},
getters: {
isAuthenticated: state => !!state.token,
user: state => state.user,
loading: state => state.loading,
- error: state => state.error
+ error: state => state.error,
+ settings: state => state.settings
},
mutations: {
@@ -41,6 +52,9 @@ export default createStore({
LOGOUT(state) {
state.token = ''
state.user = null
+ },
+ SET_SETTINGS(state, settings) {
+ state.settings = settings
}
},
@@ -124,6 +138,50 @@ export default createStore({
console.error('Erreur lors de la vérification des utilisateurs', error)
return true // Par défaut, on suppose qu'il existe des utilisateurs pour éviter des comportements inattendus
}
+ },
+
+ // Charger les paramètres
+ async loadSettings({ commit }) {
+ try {
+ const token = localStorage.getItem('token')
+ if (!token) return
+
+ const response = await axios.get(`${API_URL}/settings`, {
+ headers: {
+ 'x-auth-token': token
+ }
+ })
+
+ if (response.data) {
+ commit('SET_SETTINGS', response.data)
+ }
+ } catch (error) {
+ console.error('Erreur lors du chargement des paramètres', error)
+ }
+ },
+
+ // Sauvegarder les paramètres
+ async saveSettings({ commit }, settings) {
+ try {
+ const token = localStorage.getItem('token')
+ if (!token) return
+
+ await axios.post(
+ `${API_URL}/settings`,
+ settings,
+ {
+ headers: {
+ 'x-auth-token': token
+ }
+ }
+ )
+
+ commit('SET_SETTINGS', settings)
+ return true
+ } catch (error) {
+ console.error('Erreur lors de l\'enregistrement des paramètres', error)
+ throw error
+ }
}
},
diff --git a/frontend/src/views/Movies.vue b/frontend/src/views/Movies.vue
index e8dd695..8e8213e 100644
--- a/frontend/src/views/Movies.vue
+++ b/frontend/src/views/Movies.vue
@@ -54,7 +54,7 @@
-
![Poster]()
+
{{ movie.title }}
@@ -173,6 +173,20 @@ export default {
return 'status-available'
}
},
+ getImageUrl(url) {
+ if (!url) return 'default-poster.jpg';
+ // Vérifie si l'URL est absolue (commence par http:// ou https://)
+ if (url.match(/^https?:\/\//)) {
+ return url;
+ } else {
+ // Récupère l'URL de l'API Radarr depuis les settings
+ const radarrApiUrl = this.$store.state.settings?.radarrUrl || this.settings?.radarr?.url || '';
+ // Extraire l'URL de base (enlever /v3/api ou /api/v3)
+ const baseUrl = radarrApiUrl.replace(/\/(v3\/api|api\/v3)$/, '');
+ // Si l'URL commence par un /, on ne l'ajoute pas
+ return url.startsWith('/') ? `${baseUrl}${url}` : `${baseUrl}/${url}`;
+ }
+ },
filterMovies() {
// Fonction pour filtrer les films selon la recherche
const searchLower = this.search.toLowerCase()
diff --git a/frontend/src/views/Series.vue b/frontend/src/views/Series.vue
index af9f8d5..3685e4c 100644
--- a/frontend/src/views/Series.vue
+++ b/frontend/src/views/Series.vue
@@ -56,7 +56,7 @@
-
![Poster]()
+
{{ series.title }}
@@ -94,7 +94,7 @@
-
![Series Poster]()
+
{{ episode.series.title }}
@@ -251,6 +251,20 @@ export default {
} else {
this.filteredSeries = sourceList
}
+ },
+ getImageUrl(url) {
+ if (!url) return 'default-poster.jpg';
+ // Vérifie si l'URL est absolue (commence par http:// ou https://)
+ if (url.match(/^https?:\/\//)) {
+ return url;
+ } else {
+ // Récupère l'URL de l'API Sonarr depuis les settings
+ const sonarrApiUrl = this.$store.state.settings?.sonarrUrl || this.settings?.sonarr?.url || '';
+ // Extraire l'URL de base (enlever /v3/api ou /api/v3)
+ const baseUrl = sonarrApiUrl.replace(/\/(v3\/api|api\/v3)$/, '');
+ // Si l'URL commence par un /, on ne l'ajoute pas
+ return url.startsWith('/') ? `${baseUrl}${url}` : `${baseUrl}/${url}`;
+ }
}
},
watch: {
diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue
index c63dbb2..9790b9e 100644
--- a/frontend/src/views/Settings.vue
+++ b/frontend/src/views/Settings.vue
@@ -143,6 +143,10 @@ export default {
},
mounted() {
this.loadSettings()
+ // Charger les paramètres du store si disponibles
+ if (this.$store.getters.settings) {
+ this.settings = JSON.parse(JSON.stringify(this.$store.getters.settings))
+ }
},
methods: {
async loadSettings() {
@@ -153,19 +157,16 @@ export default {
return
}
- const response = await axios.get(`${API_URL}/settings`, {
- headers: {
- 'x-auth-token': token
- }
- })
+ await this.$store.dispatch('loadSettings')
- if (response.data) {
- // Si des paramètres existent déjà, les charger
- if (response.data.sonarr) {
- this.settings.sonarr = response.data.sonarr
+ // Si des paramètres existent dans le store, les utiliser
+ const storeSettings = this.$store.getters.settings
+ if (storeSettings) {
+ if (storeSettings.sonarr) {
+ this.settings.sonarr = {...storeSettings.sonarr}
}
- if (response.data.radarr) {
- this.settings.radarr = response.data.radarr
+ if (storeSettings.radarr) {
+ this.settings.radarr = {...storeSettings.radarr}
}
}
} catch (error) {
@@ -223,15 +224,8 @@ export default {
return
}
- await axios.post(
- `${API_URL}/settings`,
- this.settings,
- {
- headers: {
- 'x-auth-token': token
- }
- }
- )
+ // Sauvegarder les paramètres via le store
+ await this.$store.dispatch('saveSettings', this.settings)
this.successMessage = 'Configuration enregistrée avec succès'
setTimeout(() => {