{"id":284,"date":"2025-09-13T14:21:16","date_gmt":"2025-09-13T12:21:16","guid":{"rendered":"https:\/\/happynessradio.fr\/amiens\/?page_id=284"},"modified":"2025-12-23T16:22:25","modified_gmt":"2025-12-23T15:22:25","slug":"mentions-legales","status":"publish","type":"page","link":"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/","title":{"rendered":"Mentions l\u00e9gales"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"284\" class=\"elementor elementor-284\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1fcbe4e e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"1fcbe4e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ee35610 elementor-widget elementor-widget-html\" data-id=\"ee35610\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2261\" class=\"elementor elementor-2261\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f984528 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"f984528\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0e2d65f elementor-widget elementor-widget-html\" data-id=\"0e2d65f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover, maximum-scale=1.0, user-scalable=no\">\n    <title>Happyness Radio - Le Son du Bonheur<\/title>\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;600;800&display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\">\n\n    <link rel=\"icon\" href=\"https:\/\/happynessradio.fr\/wp-content\/uploads\/2025\/12\/Mention-HappynessAmiens@2x.webp\" type=\"image\/webp\">\n\n    <style>\n        :root {\n            --primary-color: #C10000;\n            --text-color: #ffffff;\n            --bar-height: 80px;\n            --nav-height: 80px;\n            --safe-area-bottom: env(safe-area-inset-bottom);\n            --header-height: 60px;\n        }\n        \n        body {\n            margin: 0; font-family: 'Inter', sans-serif;\n            background-color: #121212; color: white;\n            -webkit-tap-highlight-color: transparent;\n            overscroll-behavior: none;\n        }\n\n        \/* --- 1. MINI PLAYER (Banni\u00e8re) --- *\/\n        .radio-player {\n            position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%);\n            background: rgba(193, 0, 0, 0.95); backdrop-filter: blur(10px);\n            color: var(--text-color); display: flex; align-items: center;\n            padding: 10px 15px; border-radius: 16px;\n            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);\n            width: 95%; max-width: 800px; \n            height: var(--bar-height);\n            z-index: 9999; \n            cursor: pointer; box-sizing: border-box;\n            transition: transform 0.3s ease;\n        }\n        .radio-player img { width: 50px; height: 50px; border-radius: 8px; margin-right: 15px; object-fit: cover; }\n        .song-details { flex-grow: 1; display: flex; flex-direction: column; overflow: hidden; white-space: nowrap; }\n        .song-details span { overflow: hidden; text-overflow: ellipsis; }\n        #song-title { font-weight: 800; font-size: 15px; }\n        #song-artist { font-size: 13px; opacity: 0.9; }\n        .btn-icon {\n            background: none; border: none; color: white; cursor: pointer;\n            font-size: 18px; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center;\n            border-radius: 50%; transition: background 0.2s;\n        }\n        .btn-icon:hover { background: rgba(255,255,255,0.1); }\n        .btn-play-mini { background: white; color: var(--primary-color); width: 40px; height: 40px; margin-right: 10px; border-radius: 50%; }\n\n        \/* --- 2. FULLSCREEN OVERLAY --- *\/\n        .fullscreen-overlay {\n            position: fixed; top: 100%; left: 0; width: 100%; height: 100%;\n            background-color: #121212; z-index: 10000; \n            transition: top 0.4s cubic-bezier(0.22, 1, 0.36, 1);\n            display: flex; flex-direction: column;\n        }\n        .fullscreen-overlay.open { top: 0; }\n        \n        .fullscreen-bg {\n            position: absolute; top: 0; left: 0; width: 100%; height: 100%;\n            background-size: cover; background-position: center;\n            filter: blur(60px) brightness(0.2); z-index: -1; transition: background-image 0.5s;\n        }\n\n        .fs-header {\n            display: flex; justify-content: space-between; align-items: center;\n            padding: 10px 20px; padding-top: calc(10px + env(safe-area-inset-top));\n            flex-shrink: 0; background: linear-gradient(to bottom, rgba(0,0,0,0.3), transparent);\n            z-index: 10;\n            height: var(--header-height); box-sizing: content-box;\n        }\n        .fs-header img.logo { height: 28px; }\n\n        \/* --- SCROLL WRAPPER --- *\/\n        .scrollable-content-wrapper {\n            flex: 1; \n            overflow-y: auto; \n            overflow-x: hidden;\n            -webkit-overflow-scrolling: touch; \n            display: flex;\n            flex-direction: column;\n            width: 100%;\n            scroll-behavior: smooth; \n        }\n\n        \/* --- ZONE LECTEUR (MOBILE) --- *\/\n        .player-section {\n            flex-shrink: 0;\n            height: auto; \n            max-height: 75vh; \n            min-height: auto; \n            padding: 0px 20px 10px 20px; \n            display: flex; flex-direction: column; align-items: center; text-align: center;\n            justify-content: flex-end; \n            box-sizing: border-box;\n        }\n\n        .artwork-container {\n            width: 55vw; \n            max-width: 250px; \n            height: auto; \n            aspect-ratio: 1\/1;\n            margin-bottom: 15px; \n            position: relative;\n            flex-shrink: 0;\n            margin-top: 5px;\n        }\n        \n        .artwork-img {\n            width: 100%; height: 100%; border-radius: 20px;\n            box-shadow: 0 10px 40px rgba(0,0,0,0.5); object-fit: cover;\n            transition: transform 0.5s ease;\n        }\n        .artwork-container.playing .artwork-img { transform: scale(1); }\n        .artwork-container.paused .artwork-img { transform: scale(0.9); opacity: 0.8; }\n\n        .btn-return-overlay {\n            position: absolute; top: 10px; right: 10px;\n            background: rgba(0,0,0,0.7); backdrop-filter: blur(5px);\n            border: 1px solid var(--primary-color);\n            color: white;\n            padding: 6px 12px; border-radius: 20px;\n            font-size: 10px; font-weight: bold;\n            cursor: pointer; z-index: 10;\n            display: none; align-items: center; gap: 5px;\n            box-shadow: 0 4px 10px rgba(0,0,0,0.5); transition: transform 0.2s;\n        }\n        .btn-return-overlay:active { transform: scale(0.95); }\n        .btn-return-overlay.visible { display: flex; }\n\n        .fs-info { width: 100%; padding: 0 10px; box-sizing: border-box; margin-bottom: 10px; }\n        .fs-info h2 { font-size: 20px; margin: 0 0 5px; font-weight: bold; line-height: 1.2; }\n        .fs-info h3 { font-size: 14px; margin: 0; color: rgba(255,255,255,0.7); font-weight: 400; }\n        \n        .fs-controls { width: 100%; max-width: 400px; margin-top: 0; }\n        \n        .progress-container { width: 100%; margin-bottom: 5px; padding: 0 5px; box-sizing: border-box; }\n        \n        input[type=range].seek-slider {\n            -webkit-appearance: none; width: 100%; height: 4px;\n            background: rgba(255,255,255,0.2); border-radius: 5px; outline: none; margin: 0; cursor: pointer;\n        }\n        input[type=range].seek-slider::-webkit-slider-thumb {\n            -webkit-appearance: none; appearance: none;\n            width: 14px; height: 14px; border-radius: 50%; \n            background: #ffffff; cursor: pointer;\n            box-shadow: 0 0 10px rgba(0,0,0,0.5);\n            transition: transform 0.1s;\n        }\n        input[type=range].seek-slider::-webkit-slider-thumb:active { transform: scale(1.3); }\n\n        .time-row {\n            display: flex; justify-content: space-between; \n            font-size: 11px; color: #aaa; margin-top: 8px; font-weight: 500;\n        }\n        \n        .control-buttons { \n            display: flex; justify-content: space-between; align-items: center; \n            margin-top: 5px; width: 100%; padding: 0 10px; box-sizing: border-box;\n        }\n        \n        .btn-fs-play {\n            width: 65px; height: 65px; background: white; color: black; border-radius: 50%;\n            font-size: 24px; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center;\n            transition: transform 0.2s; box-shadow: 0 5px 15px rgba(0,0,0,0.2);\n        }\n        .btn-fs-play:active { transform: scale(0.95); }\n\n        .btn-skip {\n            background: none; border: none; color: white; font-size: 22px; cursor: pointer;\n            display: flex; flex-direction: column; align-items: center; opacity: 0.8; width: 50px;\n            transition: opacity 0.2s;\n        }\n        .btn-skip span { font-size: 9px; margin-top: 2px; font-weight: bold; }\n        .btn-skip:active { opacity: 0.5; }\n\n        .btn-speed {\n            background: rgba(255,255,255,0.1); border: 1px solid rgba(255,255,255,0.2); \n            color: white; border-radius: 8px; padding: 5px 10px; font-size: 11px; font-weight: bold; cursor: pointer;\n            width: 40px; text-align: center;\n        }\n\n        .volume-control-area { display: none; width: 100%; margin-top: 20px; align-items: center; gap: 10px; justify-content: center; }\n        #volumeContainerMobile { display: none; }\n\n        \/* --- CONTENU & LISTE (S'AFFICHE TOUJOURS APR\u00c8S LE PLAYER) --- *\/\n        .content-section {\n            flex: 1; \n            width: 100%;\n            background: rgba(0,0,0,0.4); \n            backdrop-filter: blur(20px);\n            border-top-left-radius: 24px;\n            border-top-right-radius: 24px; \n            padding-bottom: 120px; \n            margin-top: 0;\n            position: relative;\n            min-height: 200px; \n        }\n\n        .tab-view {\n            display: none; padding: 20px 20px 20px 20px; \n            animation: fadeIn 0.3s ease;\n        }\n        .tab-view.active { display: block; }\n        @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }\n\n        \/* --- GLOBAL SEARCH STYLES --- *\/\n        .search-wrapper { position: relative; margin-bottom: 20px; z-index: 50; margin-top: 0px; }\n        .search-box {\n            width: 100%; background: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.1);\n            border-radius: 12px; padding: 12px 15px; padding-left: 15px; color: white;\n            font-size: 16px; font-family: 'Inter', sans-serif; outline: none; transition: all 0.3s ease;\n            box-sizing: border-box; backdrop-filter: blur(5px);\n        }\n        .search-box:focus { background: rgba(255, 255, 255, 0.15); border-color: var(--primary-color); box-shadow: 0 0 15px rgba(193, 0, 0, 0.3); }\n        .search-clear { position: absolute; right: 15px; top: 50%; transform: translateY(-50%); color: rgba(255, 255, 255, 0.5); cursor: pointer; display: none; padding: 5px; }\n        \n        #searchResultsView { display: none; padding-bottom: 20px; }\n        #searchResultsView.active { display: block; }\n\n        .search-section-title {\n            color: white; font-size: 11px; font-weight: 800; letter-spacing: 1px; text-transform: uppercase;\n            margin-top: 20px; margin-bottom: 10px; border-bottom: 1px solid rgba(255,255,255,0.1); padding-bottom: 5px;\n        }\n\n        .browsing-container { transition: opacity 0.3s; }\n        .browsing-container.hidden { display: none; }\n\n        \/* LISTES ET GRILLES *\/\n        .history-list, .episode-list { list-style: none; padding: 0; margin: 0; }\n        .history-list li, .episode-list li { display: flex; align-items: center; padding: 12px 0; border-bottom: 1px solid rgba(255,255,255,0.05); cursor: pointer; }\n        .history-list img, .episode-list img { width: 45px; height: 45px; border-radius: 8px; margin-right: 15px; object-fit: cover; flex-shrink: 0; }\n        .h-info { flex: 1; overflow: hidden; }\n        .h-title { display: block; font-size: 14px; font-weight: 600; margin-bottom: -2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n        .h-artist { font-size: 12px; color: #aaa; }\n        .h-time { font-size: 11px; color: #666; white-space: nowrap; margin-left: 10px;}\n\n        .podcasts-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; }\n        .podcast-card {\n            background: rgba(255,255,255,0.05); border-radius: 12px; padding: 10px;\n            display: flex; flex-direction: column; cursor: pointer; transition: transform 0.2s;\n        }\n        .podcast-card:active { transform: scale(0.96); background: rgba(255,255,255,0.1); }\n        .pc-img { width: 100%; aspect-ratio: 1\/1; border-radius: 8px; margin-bottom: 10px; object-fit: cover; background: #333; }\n        .pc-title { font-size: 12px; font-weight: bold; margin-bottom: 0; text-align: center; line-height: 1.3; }\n\n        \/* --- NAVIGATION BAR --- *\/\n        .nav-bar {\n            height: var(--nav-height); background: rgba(0,0,0,0.95); backdrop-filter: blur(20px);\n            display: flex; justify-content: center; align-items: center; gap: 60px; flex-shrink: 0; \n            border-top: 1px solid rgba(255,255,255,0.1); padding-bottom: var(--safe-area-bottom);\n            position: relative; z-index: 20; width: 100%;\n        }\n        .nav-btn {\n            background: transparent; border: none; color: rgba(255,255,255,0.5); font-size: 12px; \n            display: flex; flex-direction: column; align-items: center; padding: 0; margin: 0;\n            cursor: pointer; width: 70px; transition: color 0.3s ease, transform 0.2s ease; outline: none; \n        }\n        .nav-btn:hover { color: var(--primary-color); background: transparent; transform: scale(1.05); }\n        .nav-btn.active { color: var(--primary-color); background: transparent; }\n        .nav-btn i { font-size: 20px; margin-bottom: 6px; }\n\n        .source-badge {\n            background: var(--primary-color); color: white; font-size: 10px; font-weight: bold;\n            padding: 4px 10px; border-radius: 12px; margin-bottom: 10px; display: inline-block;\n            text-transform: uppercase; letter-spacing: 1px;\n        }\n        .source-badge.podcast-mode { background: #6c5ce7; }\n\n        #episodesView { display: none; }\n        .back-btn { background: none; border: none; color: white; display: flex; align-items: center; font-size: 14px; font-weight: 600; margin-bottom: 20px; cursor: pointer; padding: 0; }\n        .back-btn i { margin-right: 8px; color: var(--primary-color); }\n\n        .loading-spinner { text-align: center; padding: 40px; color: #aaa; font-size: 14px; }\n        .loading-hint { font-size: 10px; color: #666; margin-left: 10px; font-weight: normal; }\n        \n        .load-more-container { display: flex; justify-content: center; padding: 20px 0; width: 100%; }\n        .btn-load-more {\n            background-color: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2);\n            color: white; padding: 12px 25px; border-radius: 30px; font-size: 13px; font-weight: 600;\n            cursor: pointer; transition: all 0.3s ease; display: flex; align-items: center; gap: 10px;\n        }\n        .btn-load-more:hover { background-color: var(--primary-color); border-color: var(--primary-color); transform: translateY(-2px); }\n\n        \/* --- OPTIMISATION PETITS \u00c9CRANS --- *\/\n        @media (max-height: 700px) {\n            .player-section { padding: 5px 20px 5px 20px; }\n            .artwork-container { width: 45vw; max-width: 180px; margin-bottom: 10px; margin-top: 5px; }\n            .fs-info h2 { font-size: 18px; }\n            .btn-fs-play { width: 55px; height: 55px; font-size: 22px; }\n        }\n\n        \/* --- RESPONSIVE DESKTOP & TABLETTE --- *\/\n        @media (min-width: 900px) {\n            .scrollable-content-wrapper { flex-direction: row; overflow: hidden; max-width: 100%; margin: 0 auto; }\n            \n            \/* Player \u00e0 gauche *\/\n            .player-section { \n                width: 35%; height: 100%; overflow-y: auto; border-right: 1px solid rgba(255,255,255,0.1); \n                padding: 20px; justify-content: center; min-height: auto; max-height: none; \n            }\n\n            .artwork-container { width: 260px; max-width: none; height: 260px; margin-bottom: 20px; margin-top: 0; }\n            .fs-info h2 { font-size: 24px; margin-bottom: 4px; }\n            .fs-info h3 { font-size: 16px; }\n\n            .fs-controls { width: 100%; max-width: 300px; margin-top: 15px; }\n            .btn-fs-play { width: 55px; height: 55px; font-size: 20px; }\n            #volumeContainerMobile { display: flex; margin-top: 15px; }\n\n            \/* Contenu \u00e0 droite *\/\n            .content-section { \n                width: 65%; height: 100%; overflow-y: auto; background: transparent; border-radius: 0; padding-bottom: 0; margin-top: 0;\n            }\n            .tab-view { padding: 30px; }\n            .nav-bar { width: 100%; max-width: 100%; gap: 100px; }\n            .podcasts-grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 20px; }\n        }\n    <\/style>\n<\/head>\n<body>\n\n    <audio id=\"audioElement\" preload=\"none\"><\/audio>\n\n    <div class=\"radio-player\" id=\"miniPlayer\">\n        <img decoding=\"async\" id=\"miniCover\" src=\"\" alt=\"Cover\">\n        <div class=\"song-details\">\n            <span id=\"miniTitle\" style=\"font-weight: bold;\">Chargement...<\/span>\n            <span id=\"miniArtist\">Happyness Radio<\/span>\n        <\/div>\n        <button id=\"miniPlayBtn\" class=\"btn-icon btn-play-mini\"><i class=\"fas fa-play\"><\/i><\/button>\n        <button id=\"expandBtn\" class=\"btn-icon\"><i class=\"fas fa-chevron-up\"><\/i><\/button>\n    <\/div>\n\n    <div class=\"fullscreen-overlay\" id=\"fullscreenOverlay\">\n        <div class=\"fullscreen-bg\" id=\"fsBg\"><\/div>\n\n        <div class=\"fs-header\">\n            <button class=\"btn-icon\" id=\"closeFsBtn\"><i class=\"fas fa-chevron-down\"><\/i><\/button>\n            <img decoding=\"async\" class=\"logo\" src=\"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/Mention-HappynessAmiens.webp\" alt=\"Happyness\">\n            <button class=\"btn-icon\" id=\"chatBtn\"><i class=\"fas fa-comments\"><\/i><\/button>\n        <\/div>\n\n        <div class=\"scrollable-content-wrapper\" id=\"scrollWrapper\">\n            \n            <div class=\"player-section\">\n                <div id=\"sourceBadge\" class=\"source-badge\">DIRECT<\/div>\n                \n                <div class=\"artwork-container paused\" id=\"artworkContainer\">\n                    <div id=\"btnReturnOverlay\" class=\"btn-return-overlay\">\n                        <i class=\"fas fa-broadcast-tower\"><\/i> RETOUR DIRECT\n                    <\/div>\n                    <img decoding=\"async\" id=\"fsCover\" class=\"artwork-img\" src=\"\" alt=\"Album Art\">\n                <\/div>\n\n                <div class=\"fs-info\">\n                    <h2 id=\"fsTitle\">Happyness Radio<\/h2>\n                    <h3 id=\"fsArtist\">Le Son du Bonheur<\/h3>\n                <\/div>\n\n                <div class=\"fs-controls\">\n                    \n                    <div class=\"progress-container\">\n                        <input type=\"range\" id=\"seekSlider\" class=\"seek-slider\" min=\"0\" max=\"100\" value=\"0\" step=\"0.1\">\n                        <div class=\"time-row\">\n                            <span id=\"currentTime\">00:00<\/span>\n                            <span id=\"totalTime\">LIVE<\/span>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"control-buttons\">\n                        <button class=\"btn-speed\" id=\"speedBtn\">1x<\/button>\n\n                        <button class=\"btn-skip\" id=\"btnRewind\">\n                            <i class=\"fas fa-rotate-left\"><\/i>\n                            <span>-10<\/span>\n                        <\/button>\n                        \n                        <button id=\"fsPlayBtn\" class=\"btn-fs-play\"><i class=\"fas fa-play\"><\/i><\/button>\n                        \n                        <button class=\"btn-skip\" id=\"btnForward\">\n                            <i class=\"fas fa-rotate-right\"><\/i>\n                            <span>+10<\/span>\n                        <\/button>\n\n                        <button class=\"btn-icon\" style=\"opacity:0; pointer-events:none;\"><i class=\"fas fa-ellipsis\"><\/i><\/button>\n                    <\/div>\n                    \n                    <div id=\"volumeContainerMobile\" class=\"volume-control-area\">\n                        <i class=\"fas fa-volume-low\" style=\"font-size:12px; opacity:0.7\"><\/i>\n                        <input type=\"range\" id=\"volumeSlider\" min=\"0\" max=\"1\" step=\"0.05\" value=\"0.5\" style=\"width:100%; accent-color: white; height: 3px; cursor: pointer;\">\n                        <i class=\"fas fa-volume-high\" style=\"font-size:12px; opacity:0.7\"><\/i>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"content-section\">\n                \n                <div id=\"tab-live\" class=\"tab-view active\">\n                    <h4 style=\"margin-top:0; margin-bottom:15px; color:#aaa; text-transform:uppercase; font-size:11px; letter-spacing:1px; border-bottom:1px solid rgba(255,255,255,0.1); padding-bottom:10px;\">Derni\u00e8rement diffus\u00e9<\/h4>\n                    <ul class=\"history-list\" id=\"historyList\"><\/ul>\n                <\/div>\n\n                <div id=\"tab-podcasts\" class=\"tab-view\">\n                    \n                    <div class=\"search-wrapper\">\n                        <input type=\"text\" id=\"globalSearchInput\" class=\"search-box\" placeholder=\"Rechercher une \u00e9mission ou un \u00e9pisode...\">\n                        <i class=\"fas fa-times search-clear\" id=\"clearSearchBtn\"><\/i>\n                    <\/div>\n\n                    <div id=\"searchResultsView\">\n                        <div class=\"search-section-title\">\u00c9MISSIONS<\/div>\n                        <div class=\"podcasts-grid\" id=\"searchResultShows\"><\/div>\n                        \n                        <div class=\"search-section-title\">\u00c9PISODES <span id=\"indexingHint\" class=\"loading-hint\"><\/span><\/div>\n                        <ul class=\"episode-list\" id=\"searchResultEpisodes\"><\/ul>\n                        <div id=\"searchNoResults\" class=\"no-results\">Aucun r\u00e9sultat trouv\u00e9.<\/div>\n                    <\/div>\n\n                    <div id=\"browsingContainer\" class=\"browsing-container\">\n                        <div id=\"showsView\">\n                            <h4 style=\"margin-top:0; margin-bottom:15px; color:#aaa; text-transform:uppercase; font-size:11px; letter-spacing:1px; border-bottom:1px solid rgba(255,255,255,0.1); padding-bottom:10px;\">Nos \u00c9missions<\/h4>\n                            <div class=\"podcasts-grid\" id=\"podcastsGrid\"><\/div>\n                        <\/div>\n\n                        <div id=\"episodesView\">\n                            <button class=\"back-btn\" id=\"backToShowsBtn\"><i class=\"fas fa-arrow-left\"><\/i> Retour aux \u00e9missions<\/button>\n                            <div id=\"selectedShowHeader\" style=\"display:flex; align-items:center; margin-bottom:20px;\">\n                                <img decoding=\"async\" id=\"selectedShowImg\" src=\"\" style=\"width:60px; height:60px; border-radius:8px; margin-right:15px; object-fit:cover;\">\n                                <div>\n                                    <h3 id=\"selectedShowTitle\" style=\"margin:0; font-size:16px;\">Titre<\/h3>\n                                    <span style=\"font-size:12px; color:#aaa;\">Liste des \u00e9pisodes<\/span>\n                                <\/div>\n                            <\/div>\n                            <ul class=\"episode-list\" id=\"episodesList\"><\/ul>\n                            \n                            <div id=\"loadMoreContainer\" class=\"load-more-container\" style=\"display: none;\">\n                                <button id=\"loadMoreBtn\" class=\"btn-load-more\">\n                                    <i class=\"fas fa-plus\"><\/i> Charger les \u00e9pisodes suivants\n                                <\/button>\n                            <\/div>\n                            <\/div>\n                    <\/div>\n\n                <\/div>\n\n            <\/div>\n        <\/div>\n\n        <div class=\"nav-bar\">\n            <button class=\"nav-btn active\" id=\"navLive\">\n                <i class=\"fas fa-broadcast-tower\"><\/i>\n                Direct\n            <\/button>\n            <button class=\"nav-btn\" id=\"navPodcasts\">\n                <i class=\"fas fa-podcast\"><\/i>\n                Podcasts\n            <\/button>\n        <\/div>\n    <\/div>\n\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/fuse.js\/dist\/fuse.min.js\"><\/script>\n\n    <script>\n        \/\/ --- CONFIGURATION ---\n        const CONFIG = {\n            liveStreamUrl: \"https:\/\/azuracast-scrs-2.foxoud.synology.me\/listen\/happyness_amiens\/player\",\n            liveApiUrl: \"https:\/\/azuracast-scrs-2.foxoud.synology.me\/api\/nowplaying\/happyness_amiens\",\n            defaultCover: \"https:\/\/scontent-cdg4-2.xx.fbcdn.net\/v\/t39.30808-6\/546621562_1568129641039264_7460438818059504658_n.jpg?_nc_cat=107&ccb=1-7&_nc_sid=6ee11a&_nc_ohc=wO-O9jQ18FkQ7kNvwHa0Ugj&_nc_oc=AdkxPCcQmnLJ1oh4bBaqmuC_BXHzDvRgpp3uzggBaWkZG_ZN6gKaACso9uNS_TCPh4Pg1qAEAb5_-6WgKbaNuJm&_nc_zt=23&_nc_ht=scontent-cdg4-2.xx&_nc_gid=pUKDzKdabin9jPhV7p_v2g&oh=00_AflB6KUeFDXucjAIw9HTvpqgVOALkit_MnfS6fGE89_hfA&oe=69361F80\",\n            chatUrl: \"https:\/\/1343.3cx.cloud\/callus\/#LiveChat928433\"\n        };\n\n        \/\/ --- DATA PODCASTS ---\n        const PODCAST_SHOWS = [\n            { id: 1, title: \"Happyness Interview\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/Visuel-Happyness-Interview.webp\", rss: \"https:\/\/castopod.happynessradio.fr\/@happynessinterview\/feed.xml\" },\n            { id: 2, title: \"Le R\u00e9veil Happyness\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/LRH-Visuel-Podcast-site-25-26-avec-logo.webp\", rss: \"https:\/\/castopod.happynessradio.fr\/@lereveilhappyness\/feed.xml\" },\n            { id: 3, title: \"L'Antre du Geek\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/ADG-visuel-podcst-site-25-26-avec-logo-2.webp\", rss: \"https:\/\/castopod.happynessradio.fr\/@lantredugeek\/feed.xml\" },\n            { id: 4, title: \"Riff and Jack\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/RAJ-visuel-podcst-site-25-26-sans-logo.webp\", rss: \"https:\/\/castopod.happynessradio.fr\/@riffandjack\/feed.xml\" },\n            { id: 7, title: \"Les chroniques du JDR\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/JDR-visuel-podcast-site-25-26-avec-logo.webp\", rss: \"https:\/\/castopod.happynessradio.fr\/@les_chroniques_du_jdr\/feed.xml\" },\n            { id: 8, title: \"Quoi d'neuf ? Compi\u00e8gne\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2026\/02\/QDN-Compiegne-Visuel-Player.webp\", rss: \"https:\/\/castopod.happynessradio.fr\/@qdncmp\/feed.xml\" },\n            { id: 9, title: \"Quoi d'neuf ? Amiens\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2026\/02\/QDN-Amiens-Visuel-Player.webp\", rss: \"https:\/\/castopod.happynessradio.fr\/@qdnamiens\/feed.xml\" },\n            { id: 10, title: \"\u00c7a vient du coeur\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/CVC-visuel-podcst-site-25-26-sans-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@cvc\/feed.xml\" },\n            { id: 11, title: \"point.\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/PNT-visuel-podcast-avec-logo-25-26-sans-logo-2.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@point\/feed.xml\" },\n            { id: 12, title: \"Nos Entrepreneurs avec BGE Picardie\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/NES-visuel-podcst-site-25-26.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@nos_entrepreneurs_BGE_Somme\/feed.xml\" },\n            { id: 13, title: \"Le Micro aux Initiatives\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/MAI-visuel-podcst-sans-logo-V2.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@microinitiaves\/feed.xml\" },\n            { id: 15, title: \"Saveurs et confidences\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/SEC-visuel-podcst-site-25-26-sans-logo-V2.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@saveursetconfidences\/feed.xml\" },\n            { id: 16, title: \"P\u00e8li Clap\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/PCL-visuel-podcast-site-25-26-avec-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@peliclap\/feed.xml\" },\n            { id: 17, title: \"Quoi d'neuf ? Chambly\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2026\/02\/QDN-Chambly-Visuel-Player.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@qdnchambly\/feed.xml\" },\n            { id: 18, title: \"Rencontre & Vous\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/REV-visuel-podcst-site-25-26-avec-logo-V2.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@rencontrevous\/feed.xml\" },\n            { id: 19, title: \"Sam'Culture\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/SCE-visuel-podcst-site-25-26.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@samculture\/feed.xml\" },\n            { id: 20, title: \"Temps Additionnel\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/TAD-visuel-podcast-site-25-26-sans-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@tempsadditionnel\/feed.xml\" },\n            { id: 21, title: \"Cin\u00e9matique Sans Toc\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/CST-visuel-podcst-site-25-26-avec-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@cinematiquesanstoc\/feed.xml\" },\n            { id: 22, title: \"Recueils Oniriques\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/RON-visuel-avec-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@RO\/feed.xml\" },\n            { id: 23, title: \"Les Hors Studio d'Happyness\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/LHS-Happyness-sans-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@happynessdeloc\/feed.xml\" },\n            { id: 24, title: \"La Plume et le Sabre\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/LPS-visuel-podcst-site-25-26-sans-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@laplumeetlesabre\/feed.xml\" },\n            { id: 25, title: \"La playlist d'Alex\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/PLA-visuel-podcst-site-25-26-avec-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@laplaylistdalex\/feed.xml\" },\n            { id: 26, title: \"100% Lifestyle\", image: \"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/100Lifestyle-25-26-sans-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@100lifestyle\/feed.xml\" },            \n        ];\n\n        \/\/ --- VARIABLES D'ETAT ---\n        let isPlayingPodcast = false;\n        let currentLiveMetadata = { title: \"Happyness\", artist: \"Radio\", cover: CONFIG.defaultCover };\n        let audio = document.getElementById('audioElement');\n        let currentSpeedIndex = 0;\n        const speedOptions = [1, 1.25, 1.5, 2, 0.5];\n\n        \/\/ VARIABLES PAGINATION\n        let currentPodcastEpisodes = []; \n        let displayedEpisodeCount = 0;   \n        const EPISODES_PER_BATCH = 50;   \n        let currentContext = {};        \n\n        \/\/ GLOBAL SEARCH CACHE & FUSE\n        let globalEpisodeIndex = [];\n        let isIndexing = false;\n        let fuseShows;\n        let fuseEpisodes;\n\n        \/\/ Options Fuse.js pour la tol\u00e9rance aux fautes\n        const fuseOptionsBase = {\n            includeScore: true,\n            threshold: 0.4, \n            ignoreLocation: true,\n            ignoreDiacritics: true,\n            minMatchCharLength: 2\n        };\n\n        const ui = {\n            miniPlayer: document.getElementById('miniPlayer'),\n            overlay: document.getElementById('fullscreenOverlay'),\n            playBtns: [document.getElementById('miniPlayBtn'), document.getElementById('fsPlayBtn')],\n            miniTitle: document.getElementById('miniTitle'),\n            miniArtist: document.getElementById('miniArtist'),\n            miniCover: document.getElementById('miniCover'),\n            fsTitle: document.getElementById('fsTitle'),\n            fsArtist: document.getElementById('fsArtist'),\n            fsCover: document.getElementById('fsCover'),\n            fsBg: document.getElementById('fsBg'),\n            artworkContainer: document.getElementById('artworkContainer'),\n            \n            scrollWrapper: document.getElementById('scrollWrapper'),\n\n            \/\/ New Controls\n            seekSlider: document.getElementById('seekSlider'),\n            currTime: document.getElementById('currentTime'),\n            totTime: document.getElementById('totalTime'),\n            speedBtn: document.getElementById('speedBtn'),\n            btnRewind: document.getElementById('btnRewind'),\n            btnForward: document.getElementById('btnForward'),\n            \n            btnReturnOverlay: document.getElementById('btnReturnOverlay'),\n            \n            loadMoreBtn: document.getElementById('loadMoreBtn'),\n            loadMoreContainer: document.getElementById('loadMoreContainer'),\n\n            sourceBadge: document.getElementById('sourceBadge'),\n            historyList: document.getElementById('historyList'),\n            podcastsGrid: document.getElementById('podcastsGrid'),\n            showsView: document.getElementById('showsView'),\n            episodesView: document.getElementById('episodesView'),\n            episodesList: document.getElementById('episodesList'),\n            backToShowsBtn: document.getElementById('backToShowsBtn'),\n            selectedShowTitle: document.getElementById('selectedShowTitle'),\n            selectedShowImg: document.getElementById('selectedShowImg'),\n            \n            \/\/ SEARCH UI\n            searchInput: document.getElementById('globalSearchInput'),\n            clearSearchBtn: document.getElementById('clearSearchBtn'),\n            browsingContainer: document.getElementById('browsingContainer'),\n            searchResultsView: document.getElementById('searchResultsView'),\n            searchResultShows: document.getElementById('searchResultShows'),\n            searchResultEpisodes: document.getElementById('searchResultEpisodes'),\n            searchNoResults: document.getElementById('searchNoResults'),\n            indexingHint: document.getElementById('indexingHint'),\n\n            \/\/ Nav\n            navLive: document.getElementById('navLive'),\n            navPodcasts: document.getElementById('navPodcasts'),\n            tabLive: document.getElementById('tab-live'),\n            tabPodcasts: document.getElementById('tab-podcasts')\n        };\n\n        \/\/ --- FORMAT TIME FUNCTION ---\n        \/\/ G\u00e8re les Heures, Minutes, Secondes selon la dur\u00e9e\n        function formatTime(s) {\n            if (isNaN(s) || s === null) return \"00:00\";\n            \n            const hours = Math.floor(s \/ 3600);\n            const minutes = Math.floor((s % 3600) \/ 60);\n            const seconds = Math.floor(s % 60);\n\n            const formatNum = (num) => (num < 10 ? '0' : '') + num;\n\n            if (hours > 0) {\n                return `${hours}:${formatNum(minutes)}:${formatNum(seconds)}`;\n            } else {\n                return `${formatNum(minutes)}:${formatNum(seconds)}`;\n            }\n        }\n\n        \/\/ --- INIT SEARCH (Shows) ---\n        function initShowSearch() {\n            fuseShows = new Fuse(PODCAST_SHOWS, {\n                ...fuseOptionsBase,\n                keys: ['title']\n            });\n        }\n        initShowSearch();\n\n        \/\/ --- AUDIO ---\n        function playStream(url, isPodcast = false, meta = null) {\n            if (audio.src !== url) {\n                updatePlayButtons('loading');\n                \n                audio.src = url;\n                audio.load();\n                isPlayingPodcast = isPodcast;\n                audio.playbackRate = 1; \n                currentSpeedIndex = 0;\n                ui.speedBtn.textContent = \"1x\";\n\n                if (isPodcast && meta) {\n                    updateDisplay(meta.title, meta.artist, meta.cover, true);\n                    ui.sourceBadge.textContent = \"PODCAST\";\n                    ui.sourceBadge.classList.add('podcast-mode');\n                    \n                    ui.btnReturnOverlay.classList.add('visible');\n                    ui.seekSlider.disabled = false;\n                    ui.seekSlider.style.opacity = \"1\";\n                    ui.btnRewind.style.opacity = \"1\"; ui.btnRewind.style.pointerEvents = \"auto\";\n                    ui.btnForward.style.opacity = \"1\"; ui.btnForward.style.pointerEvents = \"auto\";\n                    ui.speedBtn.style.opacity = \"1\"; ui.speedBtn.style.pointerEvents = \"auto\";\n                } else {\n                    updateDisplay(currentLiveMetadata.title, currentLiveMetadata.artist, currentLiveMetadata.cover, false);\n                    ui.sourceBadge.textContent = \"DIRECT\";\n                    ui.sourceBadge.classList.remove('podcast-mode');\n                    \n                    ui.btnReturnOverlay.classList.remove('visible');\n                    ui.seekSlider.disabled = true;\n                    ui.seekSlider.value = 100;\n                    ui.seekSlider.style.background = \"var(--primary-color)\";\n                    ui.btnRewind.style.opacity = \"0.3\"; ui.btnRewind.style.pointerEvents = \"none\";\n                    ui.btnForward.style.opacity = \"0.3\"; ui.btnForward.style.pointerEvents = \"none\";\n                    ui.speedBtn.style.opacity = \"0.3\"; ui.speedBtn.style.pointerEvents = \"none\";\n                }\n            }\n            \n            var playPromise = audio.play();\n            if (playPromise !== undefined) {\n                playPromise.then(_ => {}).catch(error => { updatePlayButtons('paused'); });\n            }\n        }\n\n        \/\/ --- FONCTION TOGGLE PLAY ---\n        function togglePlay() {\n            if (audio.paused) {\n                if (!isPlayingPodcast) {\n                    playStream(CONFIG.liveStreamUrl + '?t=' + Date.now(), false);\n                } else {\n                    if (!audio.src) {\n                        playStream(CONFIG.liveStreamUrl + '?t=' + Date.now(), false);\n                    } else {\n                        updatePlayButtons('loading');\n                        audio.play();\n                    }\n                }\n            } else {\n                audio.pause();\n                updatePlayButtons('paused');\n                \n                if (!isPlayingPodcast) {\n                    audio.src = \"\"; \n                    audio.load(); \n                }\n            }\n        }\n\n        function updatePlayButtons(state) {\n            let iconHtml = '';\n            let isPlayingBool = false;\n\n            if (state === 'loading') {\n                iconHtml = '<i class=\"fas fa-circle-notch fa-spin\"><\/i>';\n                isPlayingBool = true;\n            } else if (state === 'playing') {\n                if (isPlayingPodcast) {\n                    iconHtml = '<i class=\"fas fa-pause\"><\/i>';\n                } else {\n                    iconHtml = '<i class=\"fas fa-stop\"><\/i>';\n                }\n                isPlayingBool = true;\n            } else {\n                iconHtml = '<i class=\"fas fa-play\"><\/i>';\n                isPlayingBool = false;\n            }\n\n            ui.playBtns.forEach(btn => btn.innerHTML = iconHtml);\n            \n            updateEpisodeListIcons(state);\n\n            if(isPlayingBool) {\n                ui.artworkContainer.classList.add('playing');\n                ui.artworkContainer.classList.remove('paused');\n                if ('mediaSession' in navigator) navigator.mediaSession.playbackState = \"playing\";\n            } else {\n                ui.artworkContainer.classList.remove('playing');\n                ui.artworkContainer.classList.add('paused');\n                if ('mediaSession' in navigator) navigator.mediaSession.playbackState = \"paused\";\n            }\n        }\n        \n        function updateEpisodeListIcons(state) {\n            const icons = document.querySelectorAll('.episode-action-icon');\n            icons.forEach(icon => {\n                if(icon.dataset.url && icon.dataset.url === audio.src) {\n                      if(state === 'playing') {\n                        icon.className = \"fas fa-pause-circle episode-action-icon\";\n                      } else if (state === 'loading') {\n                        icon.className = \"fas fa-circle-notch fa-spin episode-action-icon\";\n                      } else {\n                        icon.className = \"fas fa-play-circle episode-action-icon\";\n                      }\n                } else {\n                    icon.className = \"fas fa-play-circle episode-action-icon\";\n                }\n            });\n        }\n\n        audio.addEventListener('playing', () => updatePlayButtons('playing'));\n        audio.addEventListener('waiting', () => updatePlayButtons('loading'));\n        audio.addEventListener('pause', () => updatePlayButtons('paused'));\n        audio.addEventListener('timeupdate', updateProgress);\n        \n        \/\/ --- CONTROL EVENTS ---\n        ui.btnReturnOverlay.onclick = (e) => {\n            e.stopPropagation();\n            playStream(CONFIG.liveStreamUrl + '?t=' + Date.now(), false);\n            ui.navLive.click();\n        };\n\n        let isSeeking = false;\n        ui.seekSlider.addEventListener('input', () => {\n            isSeeking = true;\n            const time = (ui.seekSlider.value \/ 100) * audio.duration;\n            ui.currTime.textContent = formatTime(time);\n            updateSliderStyle(ui.seekSlider.value);\n        });\n        ui.seekSlider.addEventListener('change', () => {\n            if(audio.duration) {\n                const time = (ui.seekSlider.value \/ 100) * audio.duration;\n                audio.currentTime = time;\n            }\n            isSeeking = false;\n        });\n\n        const doRewind = () => { if(audio.duration) audio.currentTime = Math.max(0, audio.currentTime - 10); };\n        const doForward = () => { if(audio.duration) audio.currentTime = Math.min(audio.duration, audio.currentTime + 10); };\n\n        ui.btnRewind.onclick = doRewind;\n        ui.btnForward.onclick = doForward;\n\n        ui.speedBtn.onclick = () => {\n            currentSpeedIndex = (currentSpeedIndex + 1) % speedOptions.length;\n            const newSpeed = speedOptions[currentSpeedIndex];\n            audio.playbackRate = newSpeed;\n            ui.speedBtn.textContent = newSpeed + \"x\";\n        };\n\n        \/\/ --- MEDIA SESSION & METADATA ---\n        function updateDisplay(title, artist, cover, isPodcastMode) {\n            if (isPlayingPodcast && !isPodcastMode) return;\n            \n            ui.miniTitle.textContent = title;\n            ui.miniArtist.textContent = artist;\n            ui.fsTitle.textContent = title;\n            ui.fsArtist.textContent = artist;\n            if (ui.miniCover.src !== cover) {\n                ui.miniCover.src = cover;\n                ui.fsCover.src = cover;\n                ui.fsBg.style.backgroundImage = `url('${cover}')`;\n            }\n\n            if ('mediaSession' in navigator) {\n                navigator.mediaSession.metadata = new MediaMetadata({\n                    title: title,\n                    artist: artist,\n                    album: isPodcastMode ? \"Happyness Podcast\" : \"Happyness Radio\",\n                    artwork: [\n                        { src: cover, sizes: '96x96', type: 'image\/png' },\n                        { src: cover, sizes: '128x128', type: 'image\/png' },\n                        { src: cover, sizes: '192x192', type: 'image\/png' },\n                        { src: cover, sizes: '256x256', type: 'image\/png' },\n                        { src: cover, sizes: '384x384', type: 'image\/png' },\n                        { src: cover, sizes: '512x512', type: 'image\/png' },\n                    ]\n                });\n            }\n        }\n\n        if ('mediaSession' in navigator) {\n            navigator.mediaSession.setActionHandler('play', togglePlay);\n            navigator.mediaSession.setActionHandler('pause', togglePlay);\n            navigator.mediaSession.setActionHandler('seekbackward', doRewind);\n            navigator.mediaSession.setActionHandler('seekforward', doForward);\n            navigator.mediaSession.setActionHandler('previoustrack', doRewind);\n            navigator.mediaSession.setActionHandler('nexttrack', doForward);\n        }\n\n        async function fetchLiveMetadata() {\n            try {\n                const res = await fetch(CONFIG.liveApiUrl);\n                const data = await res.json();\n                if (data && data.now_playing) {\n                    const track = data.now_playing.song;\n                    currentLiveMetadata = { title: track.title, artist: track.artist, cover: track.art || CONFIG.defaultCover };\n                    if (!isPlayingPodcast) updateDisplay(currentLiveMetadata.title, currentLiveMetadata.artist, currentLiveMetadata.cover, false);\n                    renderHistory(data.song_history);\n                }\n            } catch (e) { console.error(\"Live API Error\", e); }\n        }\n\n        function renderHistory(history) {\n            ui.historyList.innerHTML = '';\n            history.slice(0, 15).forEach(item => {\n                const li = document.createElement('li');\n                li.innerHTML = `<img decoding=\"async\" src=\"${item.song.art || CONFIG.defaultCover}\"><div class=\"h-info\"><span class=\"h-title\">${item.song.title}<\/span><span class=\"h-artist\">${item.song.artist}<\/span><\/div><span class=\"h-time\">${new Date(item.played_at * 1000).toLocaleTimeString([], {hour:'2-digit', minute:'2-digit'})}<\/span>`;\n                ui.historyList.appendChild(li);\n            });\n        }\n\n        \/\/ --- PODCASTS LOGIC ---\n        function renderShows() {\n            ui.podcastsGrid.innerHTML = '';\n            \n            let shuffledShows = [...PODCAST_SHOWS];\n            for (let i = shuffledShows.length - 1; i > 0; i--) {\n                const j = Math.floor(Math.random() * (i + 1));\n                [shuffledShows[i], shuffledShows[j]] = [shuffledShows[j], shuffledShows[i]];\n            }\n\n            shuffledShows.forEach(show => {\n                const card = document.createElement('div');\n                card.className = 'podcast-card';\n                card.onclick = () => openShowEpisodes(show);\n                card.innerHTML = `<img decoding=\"async\" src=\"${show.image}\" class=\"pc-img\"><div class=\"pc-title\">${show.title}<\/div>`;\n                ui.podcastsGrid.appendChild(card);\n            });\n        }\n\n        function openShowEpisodes(show) {\n            ui.showsView.style.display = 'none';\n            ui.episodesView.style.display = 'block';\n            ui.selectedShowTitle.textContent = show.title;\n            ui.selectedShowImg.src = show.image;\n            \n            ui.episodesList.innerHTML = '<div class=\"loading-spinner\"><i class=\"fas fa-circle-notch fa-spin\"><\/i> R\u00e9cup\u00e9ration des \u00e9pisodes...<\/div>';\n            ui.loadMoreContainer.style.display = 'none';\n            \n            fetchRSS_Robust(show.rss, show.image, show.title, (items) => {\n                setupPodcastView(items, show.image, show.title);\n            });\n        }\n\n        function setupPodcastView(items, showImage, showTitle) {\n            currentPodcastEpisodes = items;\n            currentContext = { image: showImage, title: showTitle };\n            displayedEpisodeCount = 0;\n            \n            ui.episodesList.innerHTML = '';\n            ui.loadMoreContainer.style.display = 'none';\n\n            if (items.length === 0) {\n                ui.episodesList.innerHTML = '<li style=\"padding:20px; text-align:center;\">Aucun \u00e9pisode trouv\u00e9.<\/li>';\n                return;\n            }\n\n            loadNextBatch();\n        }\n\n        function loadNextBatch() {\n            const start = displayedEpisodeCount;\n            const end = start + EPISODES_PER_BATCH;\n            \n            const batch = currentPodcastEpisodes.slice(start, end); \n            \n            renderEpisodesList(batch, currentContext.image, currentContext.title, ui.episodesList, true);\n            \n            displayedEpisodeCount += batch.length;\n\n            if (displayedEpisodeCount < currentPodcastEpisodes.length) {\n                ui.loadMoreContainer.style.display = 'flex';\n                const remaining = currentPodcastEpisodes.length - displayedEpisodeCount;\n                ui.loadMoreBtn.innerHTML = `<i class=\"fas fa-plus\"><\/i> Charger les \u00e9pisodes suivants (${remaining})`;\n            } else {\n                ui.loadMoreContainer.style.display = 'none';\n            }\n        }\n        \n        ui.loadMoreBtn.onclick = loadNextBatch;\n        \n        ui.backToShowsBtn.onclick = () => {\n            ui.episodesView.style.display = 'none';\n            ui.showsView.style.display = 'block';\n        };\n\n        \/\/ --- FETCH RSS WITH RSS2JSON ---\n        async function fetchRSS_Robust(url, showImage, showTitle, callback) {\n            try {\n                const res = await fetch('https:\/\/api.rss2json.com\/v1\/api.json?rss_url=' + encodeURIComponent(url));\n                const data = await res.json();\n                \n                if (data.status === 'ok') {\n                    const parsedItems = data.items.map(item => {\n                        const audioUrl = item.enclosure ? item.enclosure.link : null;\n                        if (!audioUrl) return null;\n                        \n                        const title = item.title || \"\u00c9pisode\";\n                        let dateStr = \"\";\n                        if (item.pubDate) {\n                            try { dateStr = new Date(item.pubDate).toLocaleDateString('fr-FR', {day: 'numeric', month: 'short'}); } catch(e){}\n                        }\n                        \n                        let epImage = item.thumbnail || showImage;\n                        \n                        \/\/ Traitement de la dur\u00e9e format\u00e9e\n                        let duration = \"\";\n                        let rawDuration = item.enclosure && item.enclosure.duration ? item.enclosure.duration : null;\n                        if (!rawDuration && item.duration) rawDuration = item.duration; \/\/ Fallback au cas o\u00f9\n                        \n                        if (rawDuration && rawDuration !== \"\") {\n                            if (!isNaN(rawDuration)) {\n                                duration = formatTime(parseInt(rawDuration));\n                            } else {\n                                let parts = rawDuration.toString().split(':').reverse();\n                                let secs = 0;\n                                for (let i = 0; i < parts.length; i++) {\n                                    secs += parseInt(parts[i]) * Math.pow(60, i);\n                                }\n                                duration = formatTime(secs);\n                            }\n                        }\n\n                        return { title, audioUrl, dateStr, epImage, duration, showTitle, showImage };\n                    }).filter(i => i !== null);\n\n                    callback(parsedItems);\n                } else {\n                    callback([]);\n                }\n            } catch (e) { \n                callback([]); \n            }\n        }\n\n        function renderEpisodesList(items, showImage, showTitle, container, shouldAppend = false) {\n            if (!shouldAppend) {\n                container.innerHTML = '';\n            }\n            \n            if(items.length === 0 && !shouldAppend) { container.innerHTML = '<li style=\"padding:20px; text-align:center;\">Aucun \u00e9pisode.<\/li>'; return; }\n\n            items.forEach(item => {\n                const li = document.createElement('li');\n                \n                let iconClass = \"fas fa-play-circle\";\n                if(item.audioUrl === audio.src && !audio.paused) {\n                    iconClass = \"fas fa-pause-circle\";\n                }\n\n                li.onclick = () => {\n                    if(audio.src === item.audioUrl) {\n                        togglePlay();\n                    } else {\n                        playStream(item.audioUrl, true, { title: item.title, artist: item.showTitle || showTitle, cover: item.epImage });\n                        ui.overlay.classList.add('open');\n                        ui.scrollWrapper.scrollTo({ top: 0, behavior: 'smooth' });\n                    }\n                };\n                \n                const displaySubtitle = showTitle === \"Recherche\" \n                    ? `<span style=\"color:#D3D3D3; font-weight:600;\">${item.showTitle}<\/span> \u2022 ${item.dateStr}`\n                    : `${item.duration ? item.duration + ' \u2022 ' : ''}${item.dateStr}`;\n\n                li.innerHTML = `\n                    <img decoding=\"async\" src=\"${item.epImage}\" alt=\"cover\" onerror=\"this.src='${showImage}'\">\n                    <div class=\"h-info\">\n                        <span class=\"h-title\">${item.title}<\/span>\n                        <span class=\"h-artist\">${displaySubtitle}<\/span>\n                    <\/div>\n                    <i class=\"${iconClass} episode-action-icon\" data-url=\"${item.audioUrl}\" style=\"font-size:24px; color:var(--primary-color); margin-left:10px;\"><\/i>\n                `;\n                container.appendChild(li);\n            });\n        }\n\n        \/\/ --- GLOBAL INDEXING SYSTEM ---\n        function startGlobalIndexing() {\n            if(isIndexing || globalEpisodeIndex.length > 0) return; \n            isIndexing = true;\n            ui.indexingHint.textContent = \"(Chargement...)\";\n            \n            let loadedCount = 0;\n            \n            PODCAST_SHOWS.forEach(show => {\n                fetchRSS_Robust(show.rss, show.image, show.title, (items) => {\n                    globalEpisodeIndex.push(...items);\n                    loadedCount++;\n                    \n                    if(loadedCount === PODCAST_SHOWS.length) {\n                        isIndexing = false;\n                        ui.indexingHint.textContent = \"\";\n                        \n                        fuseEpisodes = new Fuse(globalEpisodeIndex, {\n                            ...fuseOptionsBase,\n                            keys: ['title', 'showTitle']\n                        });\n\n                        if(ui.searchInput.value.trim().length > 0) {\n                             ui.searchInput.dispatchEvent(new Event('input'));\n                        }\n                    }\n                });\n            });\n        }\n\n        \/\/ --- UNIFIED SEARCH LOGIC ---\n        ui.searchInput.addEventListener('input', (e) => {\n            const term = e.target.value.trim();\n            \n            if (term.length > 0) {\n                ui.clearSearchBtn.style.display = 'block';\n                ui.browsingContainer.classList.add('hidden');\n                ui.searchResultsView.classList.add('active');\n\n                ui.searchResultShows.innerHTML = '';\n                const showResults = fuseShows ? fuseShows.search(term) : [];\n                \n                if (showResults.length > 0) {\n                    showResults.forEach(result => {\n                        const show = result.item;\n                        const card = document.createElement('div');\n                        card.className = 'podcast-card';\n                        card.onclick = () => { resetSearch(); openShowEpisodes(show); };\n                        card.innerHTML = `<img decoding=\"async\" src=\"${show.image}\" class=\"pc-img\"><div class=\"pc-title\">${show.title}<\/div>`;\n                        ui.searchResultShows.appendChild(card);\n                    });\n                    ui.searchResultShows.style.display = 'grid';\n                    ui.searchResultShows.previousElementSibling.style.display = 'block'; \n                } else {\n                    ui.searchResultShows.style.display = 'none';\n                    ui.searchResultShows.previousElementSibling.style.display = 'none';\n                }\n\n                ui.searchResultEpisodes.innerHTML = '';\n                let episodeResults = [];\n                if (fuseEpisodes) {\n                    episodeResults = fuseEpisodes.search(term).map(res => res.item);\n                } else {\n                    const lowerTerm = term.toLowerCase();\n                    episodeResults = globalEpisodeIndex.filter(ep => \n                        ep.title.toLowerCase().includes(lowerTerm) || ep.showTitle.toLowerCase().includes(lowerTerm)\n                    );\n                }\n                \n                const resultsToShow = episodeResults.slice(0, 50);\n\n                if (resultsToShow.length > 0) {\n                    renderEpisodesList(resultsToShow, CONFIG.defaultCover, \"Recherche\", ui.searchResultEpisodes, false); \n                    ui.searchResultEpisodes.style.display = 'block';\n                    ui.searchResultEpisodes.previousElementSibling.style.display = 'block';\n                } else {\n                    ui.searchResultEpisodes.style.display = 'none';\n                    ui.searchResultEpisodes.previousElementSibling.style.display = 'none';\n                }\n\n                if (showResults.length === 0 && resultsToShow.length === 0) {\n                        ui.searchNoResults.style.display = 'block';\n                } else {\n                        ui.searchNoResults.style.display = 'none';\n                }\n\n            } else {\n                resetSearchUI();\n            }\n        });\n\n        ui.clearSearchBtn.onclick = resetSearch;\n\n        function resetSearch() {\n            ui.searchInput.value = '';\n            resetSearchUI();\n        }\n\n        function resetSearchUI() {\n            ui.clearSearchBtn.style.display = 'none';\n            ui.searchResultsView.classList.remove('active');\n            ui.browsingContainer.classList.remove('hidden');\n        }\n\n        \/\/ --- PROGRESS & VISUALS ---\n        function updateProgress() {\n            if (isPlayingPodcast && audio.duration) {\n                if(!isSeeking) {\n                    const pct = (audio.currentTime \/ audio.duration) * 100;\n                    ui.seekSlider.value = pct;\n                    ui.currTime.textContent = formatTime(audio.currentTime);\n                    ui.totTime.textContent = formatTime(audio.duration);\n                    updateSliderStyle(pct);\n                }\n            } else {\n                ui.currTime.textContent = \"LIVE\";\n                ui.totTime.textContent = \"\";\n            }\n        }\n\n        function updateSliderStyle(value) {\n            ui.seekSlider.style.background = `linear-gradient(to right, var(--primary-color) 0%, var(--primary-color) ${value}%, rgba(255,255,255,0.2) ${value}%, rgba(255,255,255,0.2) 100%)`;\n        }\n\n        \/\/ --- NAV ---\n        const openFs = () => { ui.overlay.classList.add('open'); ui.miniPlayer.style.transform = \"translateX(-50%) translateY(200%)\"; };\n        const closeFs = () => { ui.overlay.classList.remove('open'); ui.miniPlayer.style.transform = \"translateX(-50%) translateY(0)\"; };\n\n        document.getElementById('expandBtn').onclick = (e) => { e.stopPropagation(); openFs(); };\n        ui.miniPlayer.onclick = (e) => { if(!e.target.closest('button')) openFs(); };\n        document.getElementById('closeFsBtn').onclick = closeFs;\n        ui.navLive.onclick = () => {\n            ui.navLive.classList.add('active'); ui.navPodcasts.classList.remove('active');\n            ui.tabLive.classList.add('active'); ui.tabPodcasts.classList.remove('active');\n        };\n        ui.navPodcasts.onclick = () => {\n            ui.navPodcasts.classList.add('active'); ui.navLive.classList.remove('active');\n            ui.tabPodcasts.classList.add('active'); ui.tabLive.classList.remove('active');\n            startGlobalIndexing();\n        };\n        ui.playBtns.forEach(btn => btn.onclick = (e) => { e.stopPropagation(); togglePlay(); });\n        document.getElementById('chatBtn').onclick = () => window.open(CONFIG.chatUrl, '_blank', 'width=360,height=533');\n        document.getElementById('volumeSlider').addEventListener('input', (e) => audio.volume = e.target.value);\n\n        \/\/ INIT\n        ui.miniCover.src = CONFIG.defaultCover;\n        ui.fsCover.src = CONFIG.defaultCover;\n        ui.fsBg.style.backgroundImage = `url('${CONFIG.defaultCover}')`;\n        renderShows();\n        fetchLiveMetadata();\n        \n        audio.volume = 0.5;\n        \n        setInterval(fetchLiveMetadata, 10000);\n    <\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5f21d30 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"5f21d30\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7d75b09 elementor-widget elementor-widget-html\" data-id=\"7d75b09\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"24\" class=\"elementor elementor-24\">\n\t\t\t\t<div class=\"elementor-element elementor-element-98a4bfd e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"98a4bfd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d6ea404 elementor-widget elementor-widget-html\" data-id=\"d6ea404\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Happyness Radio - Header Transparent<\/title>\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;700;900&display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\">\n    <style>\n        \/* Encapsulation totale avec pr\u00e9fixe hr-header- *\/\n        .hr-header-wrapper * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n        .hr-header-wrapper {\n            font-family: 'Inter', sans-serif;\n            width: 100%; \/* EXIGENCE RESPECT\u00c9E : Largeur inchang\u00e9e *\/\n        }\n        .hr-header {\n            padding: 15px 20px;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            width: 100%; \/* EXIGENCE RESPECT\u00c9E : Largeur inchang\u00e9e *\/\n            position: relative;\n            background-color: transparent; \/* Pr\u00eat pour le transparent *\/\n        }\n        \n        \/* Logo \u00e0 gauche *\/\n        .hr-header-logo {\n            display: flex;\n            align-items: center;\n            gap: 15px; \/* L\u00e9g\u00e8rement augment\u00e9 pour a\u00e9rer *\/\n            margin-left: -30px;\n            margin-top: 0;\n        }\n        .hr-header-logo img {\n            width: 150px;\n            height: auto;\n            transition: transform 0.3s ease;\n        }\n        .hr-header-logo img:hover {\n            transform: scale(1.02); \/* Petit effet de scale au survol du logo *\/\n        }\n        \n        \/* Conteneur de localisation *\/\n        .hr-header-location-container {\n            position: relative;\n            display: flex;\n            align-items: center;\n        }\n        .hr-header-location-text {\n            font-family: 'Inter', sans-serif;\n            font-weight: 700;\n            font-size: 13px;\n            text-transform: uppercase;\n            letter-spacing: 1.5px;\n            color: #c10000;\n            background-color: transparent;\n            border: 2px solid #c10000;\n            border-radius: 50px;\n            padding: 8px 18px;\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);\n        }\n        .hr-header-location-text:hover {\n            background-color: #c10000;\n            color: #ffffff;\n            box-shadow: 0 6px 15px rgba(193, 0, 0, 0.25);\n            transform: translateY(-1px); \/* L\u00e9ger soul\u00e8vement *\/\n        }\n        .hr-header-location-arrow {\n            margin-left: 10px;\n            font-size: 12px;\n            transition: transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);\n        }\n\n        \/* Menu d\u00e9roulant Localisation *\/\n        .hr-header-location-modal {\n            display: none;\n            position: absolute;\n            top: calc(100% + 12px); \/* Un peu plus d'espace *\/\n            left: 0;\n            background-color: #ffffff;\n            border: 1px solid rgba(0,0,0,0.05); \/* Bordure subtile *\/\n            border-radius: 12px;\n            min-width: 140px;\n            z-index: 1000;\n            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); \/* Ombre plus douce et moderne *\/\n            overflow: hidden;\n            opacity: 0;\n            transform: translateY(-10px);\n            transition: opacity 0.3s ease, transform 0.3s ease;\n        }\n        \/* Classe ajout\u00e9e via JS pour l'animation *\/\n        .hr-header-location-modal.show {\n            display: block;\n            opacity: 1;\n            transform: translateY(0);\n        }\n        .hr-header-location-modal-content div {\n            padding: 14px 20px;\n            cursor: pointer;\n            color: #444; \/* Gris tr\u00e8s fonc\u00e9, plus doux que noir pur *\/\n            font-weight: 600;\n            font-size: 13px;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n            transition: background-color 0.2s ease, color 0.2s ease, padding-left 0.2s ease;\n        }\n        .hr-header-location-modal-content div:hover {\n            background-color: #fff5f5;\n            color: #c10000;\n            padding-left: 24px; \/* Petit effet de d\u00e9calage au survol *\/\n        }\n\n        \/* Menu de navigation *\/\n        .hr-header-nav-menu {\n            display: flex;\n            list-style: none;\n            gap: 30px;\n            align-items: center;\n            margin-right: -30px;\n            margin-top: 0;\n        }\n        .hr-header-nav-menu a {\n            text-decoration: none;\n            color: #333;\n            font-weight: 500;\n            font-size: 16px;\n            position: relative; \/* N\u00e9cessaire pour l'animation ::after *\/\n            padding-bottom: 4px;\n            transition: color 0.3s ease;\n        }\n        \n        \/* Animation de soulignement moderne au survol *\/\n        .hr-header-nav-menu a::after {\n            content: '';\n            position: absolute;\n            width: 0;\n            height: 2px;\n            bottom: 0;\n            left: 0;\n            background-color: #c10000;\n            transition: width 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);\n        }\n        .hr-header-nav-menu a:hover {\n            color: #c10000;\n        }\n        .hr-header-nav-menu a:hover::after,\n        .hr-header-nav-menu a.active::after {\n            width: 100%;\n        }\n        .hr-header-nav-menu a.active {\n            color: #c10000;\n            font-weight: 700;\n        }\n\n        \/* Hamburger menu *\/\n        .hr-header-hamburger {\n            display: none;\n            cursor: pointer;\n            font-size: 24px;\n            color: #333;\n            z-index: 1001;\n            transition: color 0.3s ease, transform 0.3s ease;\n        }\n        .hr-header-hamburger:hover {\n            color: #c10000;\n        }\n\n        \/* Tablette *\/\n        @media (min-width: 769px) and (max-width: 1024px) {\n            .hr-header-logo {\n                margin-left: -10px;\n                margin-top: 5px;\n            }\n            .hr-header-nav-menu {\n                margin-right: -10px;\n                margin-top: 5px;\n                gap: 20px; \/* R\u00e9duction de l'espace sur tablette *\/\n            }\n            .hr-header-location-text {\n                padding: 6px 14px;\n                font-size: 12px;\n            }\n        }\n\n        \/* Mobile *\/\n        @media (max-width: 768px) {\n            .hr-header-nav-menu {\n                display: flex; \/* Pr\u00e9paration pour la transition *\/\n                flex-direction: column;\n                position: absolute;\n                top: 75px;\n                right: 20px;\n                background-color: #ffffff;\n                padding: 20px;\n                border-radius: 12px;\n                border: 1px solid rgba(0,0,0,0.05);\n                box-shadow: 0 15px 40px rgba(0, 0, 0, 0.12); \/* Ombre premium *\/\n                z-index: 1000;\n                width: 220px;\n                margin-right: -10px;\n                margin-top: 10px;\n                gap: 15px; \/* Plus a\u00e9r\u00e9 sur mobile *\/\n                \n                \/* Animation d'apparition *\/\n                opacity: 0;\n                visibility: hidden;\n                transform: translateY(-15px);\n                transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s;\n            }\n            .hr-header-nav-menu.active {\n                opacity: 1;\n                visibility: visible;\n                transform: translateY(0);\n            }\n            .hr-header-nav-menu li {\n                width: 100%;\n                text-align: left;\n            }\n            .hr-header-nav-menu a::after {\n                display: none; \/* D\u00e9sactive le soulignement anim\u00e9 sur mobile *\/\n            }\n            .hr-header-nav-menu a {\n                display: block;\n                width: 100%;\n            }\n            .hr-header-hamburger {\n                display: block;\n                margin-right: -10px;\n            }\n            .hr-header-logo {\n                margin-left: -10px;\n                margin-top: 10px;\n            }\n            .hr-header-location-text {\n                padding: 6px 12px;\n                font-size: 11px;\n                letter-spacing: 1px;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"hr-header-wrapper\">\n        <header class=\"hr-header\">\n            <div class=\"hr-header-logo\">\n                <a href=\"https:\/\/happynessradio.fr\/amiens\">\n                    <img decoding=\"async\" src=\"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/Logo-Happyness-couleurs.webp\" alt=\"Logo Happyness Radio\">\n                <\/a>\n                <div class=\"hr-header-location-container\">\n                    <div class=\"hr-header-location-text\" id=\"hrLocationText\">\n                        <span id=\"hrLocationName\">Amiens<\/span>\n                        <i class=\"fas fa-chevron-right hr-header-location-arrow\"><\/i>\n                    <\/div>\n                    <div id=\"hrLocationModal\" class=\"hr-header-location-modal\">\n                        <div class=\"hr-header-location-modal-content\">\n                            <div id=\"hrAmiensOption\">Amiens<\/div>\n                            <div id=\"hrOiseOption\">Oise<\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n            <div style=\"display: flex; align-items: center;\">\n                <nav>\n                    <ul class=\"hr-header-nav-menu\" id=\"hrNavMenu\">\n                        <li><a href=\"https:\/\/happynessradio.fr\/amiens\/\">Accueil<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/amiens\/grille-des-programmes\">Programmes<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/amiens\/podcasts\">Podcasts<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/amiens\/equipe\">\u00c9quipe<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/amiens\/articles\">\u00c0 la une<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/amiens\/a-propos\">Votre radio<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/amiens\/contact\">Contact<\/a><\/li>\n                    <\/ul>\n                <\/nav>\n                <div class=\"hr-header-hamburger\" id=\"hrHamburger\">\n                    <i class=\"fas fa-bars\"><\/i>\n                <\/div>\n            <\/div>\n        <\/header>\n    <\/div>\n\n    <script>\n        \/\/ Gestion du menu d\u00e9roulant de localisation avec animation fluide\n        const hrLocationText = document.getElementById('hrLocationText');\n        const hrLocationModal = document.getElementById('hrLocationModal');\n        const hrLocationArrow = document.querySelector('.hr-header-location-arrow');\n        const hrLocationName = document.getElementById('hrLocationName');\n        \n        hrLocationText.addEventListener('click', (e) => {\n            e.stopPropagation();\n            const isVisible = hrLocationModal.classList.contains('show');\n            \n            if (isVisible) {\n                hrLocationModal.classList.remove('show');\n                setTimeout(() => hrLocationModal.style.display = 'none', 300); \/\/ Attend la fin de la transition\n                hrLocationArrow.style.transform = 'rotate(0deg)';\n            } else {\n                hrLocationModal.style.display = 'block';\n                \/\/ Petit d\u00e9lai pour que le display block s'applique avant la transition d'opacit\u00e9\n                setTimeout(() => hrLocationModal.classList.add('show'), 10);\n                hrLocationArrow.style.transform = 'rotate(90deg)';\n            }\n        });\n\n        \/\/ Redirection et mise \u00e0 jour du texte pour les options de localisation\n        document.getElementById('hrAmiensOption').addEventListener('click', () => {\n            window.location.href = 'https:\/\/happynessradio.fr\/amiens';\n        });\n        document.getElementById('hrOiseOption').addEventListener('click', () => {\n            window.location.href = 'https:\/\/happynessradio.fr\/oise';\n        });\n\n        \/\/ Gestion du menu hamburger avec changement d'ic\u00f4ne\n        const hrHamburger = document.getElementById('hrHamburger');\n        const hrHamburgerIcon = hrHamburger.querySelector('i');\n        const hrNavMenu = document.getElementById('hrNavMenu');\n        \n        hrHamburger.addEventListener('click', () => {\n            hrNavMenu.classList.toggle('active');\n            if (hrNavMenu.classList.contains('active')) {\n                hrHamburgerIcon.classList.remove('fa-bars');\n                hrHamburgerIcon.classList.add('fa-times');\n            } else {\n                hrHamburgerIcon.classList.remove('fa-times');\n                hrHamburgerIcon.classList.add('fa-bars');\n            }\n        });\n\n        \/\/ Fermer les menus si clic en dehors\n        document.addEventListener('click', (e) => {\n            \/\/ Fermeture Modal Localisation\n            if (!hrLocationModal.contains(e.target) && e.target !== hrLocationText && !hrLocationText.contains(e.target)) {\n                hrLocationModal.classList.remove('show');\n                setTimeout(() => hrLocationModal.style.display = 'none', 300);\n                hrLocationArrow.style.transform = 'rotate(0deg)';\n            }\n            \n            \/\/ Fermeture Menu Mobile\n            if (window.innerWidth <= 768 && !hrNavMenu.contains(e.target) && !hrHamburger.contains(e.target)) {\n                hrNavMenu.classList.remove('active');\n                hrHamburgerIcon.classList.remove('fa-times');\n                hrHamburgerIcon.classList.add('fa-bars');\n            }\n        });\n\n        \/\/ D\u00e9tection de la page active (Ton code d'origine optimis\u00e9)\n        document.addEventListener('DOMContentLoaded', function() {\n            const currentPath = window.location.pathname;\n            const navLinks = document.querySelectorAll('.hr-header-nav-menu a');\n\n            navLinks.forEach(link => {\n                const linkPath = link.getAttribute('href').replace('https:\/\/happynessradio.fr\/amiens', '');\n                if ((currentPath.includes(linkPath) && linkPath !== '\/') || \n                    (currentPath === '\/amiens\/' && link.getAttribute('href') === 'https:\/\/happynessradio.fr\/amiens\/')) {\n                    link.classList.add('active');\n                }\n            });\n        });\n    <\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-06f7630 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"06f7630\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b6aa18a elementor-widget elementor-widget-heading\" data-id=\"b6aa18a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Conditions g\u00e9n\u00e9rales d'utilisation du site Happyness\n<\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9dbef35 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"9dbef35\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3a01606 elementor-widget elementor-widget-text-editor\" data-id=\"3a01606\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><b>Article 1<\/b> : Objet<br \/>Les pr\u00e9sentes CGU ou Conditions G\u00e9n\u00e9rales d\u2019Utilisation encadrent juridiquement l\u2019utilisation des services du site Happyness (ci-apr\u00e8s d\u00e9nomm\u00e9 \u00ab le site \u00bb). Constituant le contrat entre l\u2019association, l\u2019Utilisateur, l\u2019acc\u00e8s au site doit \u00eatre pr\u00e9c\u00e9d\u00e9 de l\u2019acceptation de ces CGU. L\u2019acc\u00e8s \u00e0 cette plateforme signifie l\u2019acceptation des pr\u00e9sentes CGU.\u00a0<\/p><p><b>Article 2<\/b> :\u00a0 L\u2019\u00e9dition du site Happyness est assur\u00e9e par l&rsquo;association Happyness inscrite au RNA sous le num\u00e9ro \u200bW601008123, dont le si\u00e8ge social est localis\u00e9 au 5, rue de Mouy, 60370 Hermes, France M\u00e9tropolitaine.<br \/>L\u2019h\u00e9bergeur du site happynessamiens.fr est o2switch \u2013 : Chem. des Pardiaux 63000 Clermont-Ferrand 04 44 44 60 40<\/p><p><b>Article 3<\/b> : Acc\u00e8s au site<br \/>Le site Happyness permet d\u2019acc\u00e9der gratuitement aux services suivants : <br \/>&#8211; \u00c9coute de la radio en direct ;<br \/>&#8211; Syst\u00e8me de d\u00e9dicaces ;<\/p><p>Le site est accessible gratuitement depuis n\u2019importe o\u00f9 par tout utilisateur disposant d\u2019un acc\u00e8s \u00e0 Internet. Tous les frais n\u00e9cessaires pour l\u2019acc\u00e8s aux services (mat\u00e9riel informatique, connexion Internet\u2026) sont \u00e0 la charge de l\u2019utilisateur.\u00a0<\/p><p><b>Article 4<\/b> : Propri\u00e9t\u00e9 intellectuelle<br \/>Les marques, logos ainsi que les contenus du site Happyness (illustrations graphiques, textes\u2026) sont prot\u00e9g\u00e9s par le Code de la propri\u00e9t\u00e9 intellectuelle et par le droit d\u2019auteur. La reproduction et la copie des contenus par l\u2019Utilisateur requi\u00e8rent une autorisation pr\u00e9alable du site. Dans ce cas, toute utilisation \u00e0 des usages commerciaux ou \u00e0 des fins publicitaires est proscrite.\u00a0<\/p><p><b>Article 5<\/b> : Responsabilit\u00e9<br \/>Bien que les informations publi\u00e9es sur le site soient r\u00e9put\u00e9es fiables, le site se r\u00e9serve la facult\u00e9 d\u2019une non-garantie de la fiabilit\u00e9 des sources. Les informations diffus\u00e9es sur le site Happyness sont pr\u00e9sent\u00e9es \u00e0 titre purement informatif et sont sans valeur contractuelle. En d\u00e9pit des mises \u00e0 jour r\u00e9guli\u00e8res, la responsabilit\u00e9 du site ne peut \u00eatre engag\u00e9e en cas de modification des dispositions administratives et juridiques apparaissant apr\u00e8s la publication. Il en est de m\u00eame pour l\u2019utilisation et l\u2019interpr\u00e9tation des informations communiqu\u00e9es sur la plateforme. Le site d\u00e9cline toute responsabilit\u00e9 concernant les \u00e9ventuels virus pouvant infecter le mat\u00e9riel informatique de l\u2019Utilisateur apr\u00e8s l\u2019utilisation ou l\u2019acc\u00e8s \u00e0 ce site. Le site ne peut \u00eatre tenu pour responsable en cas de force majeure ou du fait impr\u00e9visible et insurmontable d\u2019un tiers. La garantie totale de la s\u00e9curit\u00e9 et la confidentialit\u00e9 des donn\u00e9es n\u2019est pas assur\u00e9e par le site. Cependant, le site s\u2019engage \u00e0 mettre en \u0153uvre toutes les m\u00e9thodes requises pour le faire au mieux.\u00a0<\/p><p><b>Article 6<\/b> : Liens hypertextes<br \/>Le site peut \u00eatre constitu\u00e9 de liens hypertextes. En cliquant sur ces derniers, l\u2019Utilisateur sortira de la plateforme. Cette derni\u00e8re n\u2019a pas de contr\u00f4le et ne peut pas \u00eatre tenue responsable du contenu des pages web relatives \u00e0 ces liens.<\/p><p><b>Article 7<\/b> : Cookies<br \/>Lors des visites sur le site, l\u2019installation automatique d\u2019un cookie sur le logiciel de navigation de l\u2019Utilisateur peut survenir. Les cookies correspondent \u00e0 de petits fichiers d\u00e9pos\u00e9s temporairement sur le disque dur de l\u2019ordinateur de l\u2019Utilisateur. Ces cookies sont n\u00e9cessaires pour assurer l\u2019accessibilit\u00e9 et la navigation sur le site. Ces fichiers ne comportent pas d\u2019informations personnelles et ne peuvent pas \u00eatre utilis\u00e9s pour l\u2019identification d\u2019une personne. L\u2019information pr\u00e9sente dans les cookies est utilis\u00e9e pour am\u00e9liorer les performances de navigation sur le site happynessamiens.fr. En naviguant sur le site, l\u2019Utilisateur accepte les cookies. Leur d\u00e9sactivation peut s\u2019effectuer via les param\u00e8tres du logiciel de navigation.\u00a0<\/p><p><b>Article 8<\/b> : Publication par l\u2019Utilisateur<br \/>Le site Happyness permet aux visiteurs de publier des messages en bas \u00e0 droite du site. Les messages sont conserver 1 an dans les bases de donn\u00e9es de la soci\u00e9t\u00e9 3CX (externe au site) . Le visiteur est tenu de respecter les r\u00e8gles de la Netiquette ainsi que les r\u00e8gles de droit en vigueur.<\/p><p><b>Article 10<\/b> : Dur\u00e9e du contrat<br \/>Le pr\u00e9sent contrat est valable pour une dur\u00e9e ind\u00e9termin\u00e9e. Le d\u00e9but de l\u2019utilisation des services du site marque l\u2019application du contrat \u00e0 l\u2019\u00e9gard de l\u2019Utilisateur.\u00a0<\/p><p><b>Article 11<\/b> : Droit applicable et juridiction comp\u00e9tente<br \/>Le pr\u00e9sent contrat est soumis \u00e0 la l\u00e9gislation fran\u00e7aise. L\u2019absence de r\u00e9solution \u00e0 l\u2019amiable des cas de litige entre les parties implique le recours aux tribunaux fran\u00e7ais comp\u00e9tents pour r\u00e9gler le contentieux.\u00a0<\/p><p>Mise a jour le 15\/01\/2025<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-970e01f e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"970e01f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cb5df1a elementor-widget elementor-widget-html\" data-id=\"cb5df1a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3145\" class=\"elementor elementor-3145\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c13a6db e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-equal-height-no e-con e-parent\" data-id=\"c13a6db\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-039612e elementor-widget elementor-widget-html\" data-id=\"039612e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Footer Radio<\/title>\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0-beta3\/css\/all.min.css\">\n    <style>\n        body { font-family: 'Inter', sans-serif; background-color: #C10000; color: white; margin: 0; padding: 0; }\n        .footer { display: flex; flex-wrap: wrap; justify-content: space-between; padding: 30px 20px 10px; }\n        .footer-column { flex: 1 1 48%; margin-bottom: 20px; }\n        .footer-column ul { list-style: none; padding: 0; display: flex; flex-wrap: wrap; }\n        .footer-column ul li { margin-bottom: 10px; flex: 1 1 33.33%; }\n        .footer-column ul li a { color: white; text-decoration: none; font-size: 16px; }\n        .footer-column ul li a:hover { text-decoration: underline; }\n        .footer-column p { font-size: 14px; margin: 5px 0; }\n        .footer-column img { width: 150px; margin-bottom: 10px; }\n        .footer-column h3 { font-size: 18px; font-weight: bold; margin-bottom: 10px; }\n        .social-links { display: flex; justify-content: flex-start; margin-top: 10px; }\n        .social-links a { margin-right: 20px; color: white; text-decoration: none; }\n        .social-links i { font-size: 18px; }\n        @media (max-width: 768px) {\n            .footer-column { flex: 1 1 100%; }\n            .footer-column ul { flex-direction: row; flex-wrap: wrap; height: auto; }\n            .footer-column ul li { flex: 1 1 48%; margin-bottom: 10px; }\n            .footer-column ul li a { font-size: 14px; }\n        }\n        .footer-bottom { text-align: center; padding: 10px 0; border-top: 1px solid white; margin-top: 10px; font-size: 14px; }\n    <\/style>\n<\/head>\n<body>\n    <footer class=\"footer\">\n        <div class=\"footer-column\">\n            <img decoding=\"async\" src=\"https:\/\/happynessradio.fr\/amiens\/wp-content\/uploads\/sites\/3\/2025\/12\/Logo-Happyness-Blanc.webp\" alt=\"Logo Happyness\">\n            <h3>Toujours au plus proche de vous<\/h3>\n            <p>142 rue Baudoin d'Ailly, 80000 Amiens<\/p>\n            <p>contact@happynessamiens.fr<\/p>\n            <div class=\"social-links\">\n                <a href=\"https:\/\/www.instagram.com\/happyness.amiens\/\"><i class=\"fab fa-instagram\"><\/i><\/a>\n                <a href=\"https:\/\/www.facebook.com\/HappynessAmiens\"><i class=\"fab fa-facebook-f\"><\/i><\/a>\n                <a href=\"https:\/\/www.tiktok.com\/@happyness.amiens\"><i class=\"fab fa-tiktok\"><\/i><\/a>\n                <a href=\"https:\/\/www.linkedin.com\/company\/happynessamiens\/\"><i class=\"fab fa-linkedin-in\"><\/i><\/a>\n            <\/div>\n        <\/div>\n        <div class=\"footer-column\">\n            <ul>\n                <li><a href=\"https:\/\/happynessradio.fr\/amiens\/\">Accueil<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/amiens\/grille-des-programmes\/\">Programmes<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/amiens\/podcasts\/\">Podcasts<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/amiens\/equipe\/\">\u00c9quipe<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/amiens\/articles\/\">\u00c0 la une<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/amiens\/a-propos\/\">Votre radio<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/amiens\/contact\/\">Contact<\/a><\/li>\n            <\/ul>\n        <\/div>\n    <\/footer>\n    <div class=\"footer-bottom\">\n        <p>&copy; 2026 Happyness. Tous droits r\u00e9serv\u00e9s | <a href=\"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/\" style=\"color: white; text-decoration: none;\">Mentions l\u00e9gales<\/a><\/p>\n    <\/div>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Conditions g\u00e9n\u00e9rales d&rsquo;utilisation du site Happyness Article 1 : ObjetLes pr\u00e9sentes CGU ou Conditions G\u00e9n\u00e9rales d\u2019Utilisation encadrent juridiquement l\u2019utilisation des services du site Happyness (ci-apr\u00e8s d\u00e9nomm\u00e9 \u00ab le site \u00bb). Constituant le contrat entre l\u2019association, l\u2019Utilisateur, l\u2019acc\u00e8s au site doit \u00eatre pr\u00e9c\u00e9d\u00e9 de l\u2019acceptation de ces CGU. L\u2019acc\u00e8s \u00e0 cette plateforme signifie l\u2019acceptation des pr\u00e9sentes CGU.\u00a0 Article 2 :\u00a0 L\u2019\u00e9dition du site Happyness est assur\u00e9e par l&rsquo;association Happyness inscrite au RNA sous le num\u00e9ro \u200bW601008123, dont le si\u00e8ge social est localis\u00e9 au 5, rue de Mouy, 60370 Hermes, France M\u00e9tropolitaine.L\u2019h\u00e9bergeur du site happynessamiens.fr est o2switch \u2013 : Chem. des Pardiaux 63000 Clermont-Ferrand 04 44 44 60 40 Article 3 : Acc\u00e8s au siteLe site Happyness permet d\u2019acc\u00e9der gratuitement aux services suivants : &#8211; \u00c9coute de la radio en direct ;&#8211; Syst\u00e8me de d\u00e9dicaces ; Le site est accessible gratuitement depuis n\u2019importe o\u00f9 par tout utilisateur disposant d\u2019un acc\u00e8s \u00e0 Internet. Tous les frais n\u00e9cessaires pour l\u2019acc\u00e8s aux services (mat\u00e9riel informatique, connexion Internet\u2026) sont \u00e0 la charge de l\u2019utilisateur.\u00a0 Article 4 : Propri\u00e9t\u00e9 intellectuelleLes marques, logos ainsi que les contenus du site Happyness (illustrations graphiques, textes\u2026) sont prot\u00e9g\u00e9s par le Code de la propri\u00e9t\u00e9 intellectuelle et par le droit d\u2019auteur. La reproduction et la copie des contenus par l\u2019Utilisateur requi\u00e8rent une autorisation pr\u00e9alable du site. Dans ce cas, toute utilisation \u00e0 des usages commerciaux ou \u00e0 des fins publicitaires est proscrite.\u00a0 Article 5 : Responsabilit\u00e9Bien que les informations publi\u00e9es sur le site soient r\u00e9put\u00e9es fiables, le site se r\u00e9serve la facult\u00e9 d\u2019une non-garantie de la fiabilit\u00e9 des sources. Les informations diffus\u00e9es sur le site Happyness sont pr\u00e9sent\u00e9es \u00e0 titre purement informatif et sont sans valeur contractuelle. En d\u00e9pit des mises \u00e0 jour r\u00e9guli\u00e8res, la responsabilit\u00e9 du site ne peut \u00eatre engag\u00e9e en cas de modification des dispositions administratives et juridiques apparaissant apr\u00e8s la publication. Il en est de m\u00eame pour l\u2019utilisation et l\u2019interpr\u00e9tation des informations communiqu\u00e9es sur la plateforme. Le site d\u00e9cline toute responsabilit\u00e9 concernant les \u00e9ventuels virus pouvant infecter le mat\u00e9riel informatique de l\u2019Utilisateur apr\u00e8s l\u2019utilisation ou l\u2019acc\u00e8s \u00e0 ce site. Le site ne peut \u00eatre tenu pour responsable en cas de force majeure ou du fait impr\u00e9visible et insurmontable d\u2019un tiers. La garantie totale de la s\u00e9curit\u00e9 et la confidentialit\u00e9 des donn\u00e9es n\u2019est pas assur\u00e9e par le site. Cependant, le site s\u2019engage \u00e0 mettre en \u0153uvre toutes les m\u00e9thodes requises pour le faire au mieux.\u00a0 Article 6 : Liens hypertextesLe site peut \u00eatre constitu\u00e9 de liens hypertextes. En cliquant sur ces derniers, l\u2019Utilisateur sortira de la plateforme. Cette derni\u00e8re n\u2019a pas de contr\u00f4le et ne peut pas \u00eatre tenue responsable du contenu des pages web relatives \u00e0 ces liens. Article 7 : CookiesLors des visites sur le site, l\u2019installation automatique d\u2019un cookie sur le logiciel de navigation de l\u2019Utilisateur peut survenir. Les cookies correspondent \u00e0 de petits fichiers d\u00e9pos\u00e9s temporairement sur le disque dur de l\u2019ordinateur de l\u2019Utilisateur. Ces cookies sont n\u00e9cessaires pour assurer l\u2019accessibilit\u00e9 et la navigation sur le site. Ces fichiers ne comportent pas d\u2019informations personnelles et ne peuvent pas \u00eatre utilis\u00e9s pour l\u2019identification d\u2019une personne. L\u2019information pr\u00e9sente dans les cookies est utilis\u00e9e pour am\u00e9liorer les performances de navigation sur le site happynessamiens.fr. En naviguant sur le site, l\u2019Utilisateur accepte les cookies. Leur d\u00e9sactivation peut s\u2019effectuer via les param\u00e8tres du logiciel de navigation.\u00a0 Article 8 : Publication par l\u2019UtilisateurLe site Happyness permet aux visiteurs de publier des messages en bas \u00e0 droite du site. Les messages sont conserver 1 an dans les bases de donn\u00e9es de la soci\u00e9t\u00e9 3CX (externe au site) . Le visiteur est tenu de respecter les r\u00e8gles de la Netiquette ainsi que les r\u00e8gles de droit en vigueur. Article 10 : Dur\u00e9e du contratLe pr\u00e9sent contrat est valable pour une dur\u00e9e ind\u00e9termin\u00e9e. Le d\u00e9but de l\u2019utilisation des services du site marque l\u2019application du contrat \u00e0 l\u2019\u00e9gard de l\u2019Utilisateur.\u00a0 Article 11 : Droit applicable et juridiction comp\u00e9tenteLe pr\u00e9sent contrat est soumis \u00e0 la l\u00e9gislation fran\u00e7aise. L\u2019absence de r\u00e9solution \u00e0 l\u2019amiable des cas de litige entre les parties implique le recours aux tribunaux fran\u00e7ais comp\u00e9tents pour r\u00e9gler le contentieux.\u00a0 Mise a jour le 15\/01\/2025<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"class_list":["post-284","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Mentions l\u00e9gales - Happyness Amiens<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mentions l\u00e9gales - Happyness Amiens\" \/>\n<meta property=\"og:description\" content=\"Conditions g\u00e9n\u00e9rales d&rsquo;utilisation du site Happyness Article 1 : ObjetLes pr\u00e9sentes CGU ou Conditions G\u00e9n\u00e9rales d\u2019Utilisation encadrent juridiquement l\u2019utilisation des services du site Happyness (ci-apr\u00e8s d\u00e9nomm\u00e9 \u00ab le site \u00bb). Constituant le contrat entre l\u2019association, l\u2019Utilisateur, l\u2019acc\u00e8s au site doit \u00eatre pr\u00e9c\u00e9d\u00e9 de l\u2019acceptation de ces CGU. L\u2019acc\u00e8s \u00e0 cette plateforme signifie l\u2019acceptation des pr\u00e9sentes CGU.\u00a0 Article 2 :\u00a0 L\u2019\u00e9dition du site Happyness est assur\u00e9e par l&rsquo;association Happyness inscrite au RNA sous le num\u00e9ro \u200bW601008123, dont le si\u00e8ge social est localis\u00e9 au 5, rue de Mouy, 60370 Hermes, France M\u00e9tropolitaine.L\u2019h\u00e9bergeur du site happynessamiens.fr est o2switch \u2013 : Chem. des Pardiaux 63000 Clermont-Ferrand 04 44 44 60 40 Article 3 : Acc\u00e8s au siteLe site Happyness permet d\u2019acc\u00e9der gratuitement aux services suivants : &#8211; \u00c9coute de la radio en direct ;&#8211; Syst\u00e8me de d\u00e9dicaces ; Le site est accessible gratuitement depuis n\u2019importe o\u00f9 par tout utilisateur disposant d\u2019un acc\u00e8s \u00e0 Internet. Tous les frais n\u00e9cessaires pour l\u2019acc\u00e8s aux services (mat\u00e9riel informatique, connexion Internet\u2026) sont \u00e0 la charge de l\u2019utilisateur.\u00a0 Article 4 : Propri\u00e9t\u00e9 intellectuelleLes marques, logos ainsi que les contenus du site Happyness (illustrations graphiques, textes\u2026) sont prot\u00e9g\u00e9s par le Code de la propri\u00e9t\u00e9 intellectuelle et par le droit d\u2019auteur. La reproduction et la copie des contenus par l\u2019Utilisateur requi\u00e8rent une autorisation pr\u00e9alable du site. Dans ce cas, toute utilisation \u00e0 des usages commerciaux ou \u00e0 des fins publicitaires est proscrite.\u00a0 Article 5 : Responsabilit\u00e9Bien que les informations publi\u00e9es sur le site soient r\u00e9put\u00e9es fiables, le site se r\u00e9serve la facult\u00e9 d\u2019une non-garantie de la fiabilit\u00e9 des sources. Les informations diffus\u00e9es sur le site Happyness sont pr\u00e9sent\u00e9es \u00e0 titre purement informatif et sont sans valeur contractuelle. En d\u00e9pit des mises \u00e0 jour r\u00e9guli\u00e8res, la responsabilit\u00e9 du site ne peut \u00eatre engag\u00e9e en cas de modification des dispositions administratives et juridiques apparaissant apr\u00e8s la publication. Il en est de m\u00eame pour l\u2019utilisation et l\u2019interpr\u00e9tation des informations communiqu\u00e9es sur la plateforme. Le site d\u00e9cline toute responsabilit\u00e9 concernant les \u00e9ventuels virus pouvant infecter le mat\u00e9riel informatique de l\u2019Utilisateur apr\u00e8s l\u2019utilisation ou l\u2019acc\u00e8s \u00e0 ce site. Le site ne peut \u00eatre tenu pour responsable en cas de force majeure ou du fait impr\u00e9visible et insurmontable d\u2019un tiers. La garantie totale de la s\u00e9curit\u00e9 et la confidentialit\u00e9 des donn\u00e9es n\u2019est pas assur\u00e9e par le site. Cependant, le site s\u2019engage \u00e0 mettre en \u0153uvre toutes les m\u00e9thodes requises pour le faire au mieux.\u00a0 Article 6 : Liens hypertextesLe site peut \u00eatre constitu\u00e9 de liens hypertextes. En cliquant sur ces derniers, l\u2019Utilisateur sortira de la plateforme. Cette derni\u00e8re n\u2019a pas de contr\u00f4le et ne peut pas \u00eatre tenue responsable du contenu des pages web relatives \u00e0 ces liens. Article 7 : CookiesLors des visites sur le site, l\u2019installation automatique d\u2019un cookie sur le logiciel de navigation de l\u2019Utilisateur peut survenir. Les cookies correspondent \u00e0 de petits fichiers d\u00e9pos\u00e9s temporairement sur le disque dur de l\u2019ordinateur de l\u2019Utilisateur. Ces cookies sont n\u00e9cessaires pour assurer l\u2019accessibilit\u00e9 et la navigation sur le site. Ces fichiers ne comportent pas d\u2019informations personnelles et ne peuvent pas \u00eatre utilis\u00e9s pour l\u2019identification d\u2019une personne. L\u2019information pr\u00e9sente dans les cookies est utilis\u00e9e pour am\u00e9liorer les performances de navigation sur le site happynessamiens.fr. En naviguant sur le site, l\u2019Utilisateur accepte les cookies. Leur d\u00e9sactivation peut s\u2019effectuer via les param\u00e8tres du logiciel de navigation.\u00a0 Article 8 : Publication par l\u2019UtilisateurLe site Happyness permet aux visiteurs de publier des messages en bas \u00e0 droite du site. Les messages sont conserver 1 an dans les bases de donn\u00e9es de la soci\u00e9t\u00e9 3CX (externe au site) . Le visiteur est tenu de respecter les r\u00e8gles de la Netiquette ainsi que les r\u00e8gles de droit en vigueur. Article 10 : Dur\u00e9e du contratLe pr\u00e9sent contrat est valable pour une dur\u00e9e ind\u00e9termin\u00e9e. Le d\u00e9but de l\u2019utilisation des services du site marque l\u2019application du contrat \u00e0 l\u2019\u00e9gard de l\u2019Utilisateur.\u00a0 Article 11 : Droit applicable et juridiction comp\u00e9tenteLe pr\u00e9sent contrat est soumis \u00e0 la l\u00e9gislation fran\u00e7aise. L\u2019absence de r\u00e9solution \u00e0 l\u2019amiable des cas de litige entre les parties implique le recours aux tribunaux fran\u00e7ais comp\u00e9tents pour r\u00e9gler le contentieux.\u00a0 Mise a jour le 15\/01\/2025\" \/>\n<meta property=\"og:url\" content=\"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/\" \/>\n<meta property=\"og:site_name\" content=\"Happyness Amiens\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-23T15:22:25+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/mentions-legales\\\/\",\"url\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/mentions-legales\\\/\",\"name\":\"Mentions l\u00e9gales - Happyness Amiens\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/#website\"},\"datePublished\":\"2025-09-13T12:21:16+00:00\",\"dateModified\":\"2025-12-23T15:22:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/mentions-legales\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/mentions-legales\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/mentions-legales\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mentions l\u00e9gales\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/#website\",\"url\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/\",\"name\":\"Happyness Amiens\",\"description\":\"Toujours au plus proche de vous\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/happynessradio.fr\\\/amiens\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mentions l\u00e9gales - Happyness Amiens","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/","og_locale":"fr_FR","og_type":"article","og_title":"Mentions l\u00e9gales - Happyness Amiens","og_description":"Conditions g\u00e9n\u00e9rales d&rsquo;utilisation du site Happyness Article 1 : ObjetLes pr\u00e9sentes CGU ou Conditions G\u00e9n\u00e9rales d\u2019Utilisation encadrent juridiquement l\u2019utilisation des services du site Happyness (ci-apr\u00e8s d\u00e9nomm\u00e9 \u00ab le site \u00bb). Constituant le contrat entre l\u2019association, l\u2019Utilisateur, l\u2019acc\u00e8s au site doit \u00eatre pr\u00e9c\u00e9d\u00e9 de l\u2019acceptation de ces CGU. L\u2019acc\u00e8s \u00e0 cette plateforme signifie l\u2019acceptation des pr\u00e9sentes CGU.\u00a0 Article 2 :\u00a0 L\u2019\u00e9dition du site Happyness est assur\u00e9e par l&rsquo;association Happyness inscrite au RNA sous le num\u00e9ro \u200bW601008123, dont le si\u00e8ge social est localis\u00e9 au 5, rue de Mouy, 60370 Hermes, France M\u00e9tropolitaine.L\u2019h\u00e9bergeur du site happynessamiens.fr est o2switch \u2013 : Chem. des Pardiaux 63000 Clermont-Ferrand 04 44 44 60 40 Article 3 : Acc\u00e8s au siteLe site Happyness permet d\u2019acc\u00e9der gratuitement aux services suivants : &#8211; \u00c9coute de la radio en direct ;&#8211; Syst\u00e8me de d\u00e9dicaces ; Le site est accessible gratuitement depuis n\u2019importe o\u00f9 par tout utilisateur disposant d\u2019un acc\u00e8s \u00e0 Internet. Tous les frais n\u00e9cessaires pour l\u2019acc\u00e8s aux services (mat\u00e9riel informatique, connexion Internet\u2026) sont \u00e0 la charge de l\u2019utilisateur.\u00a0 Article 4 : Propri\u00e9t\u00e9 intellectuelleLes marques, logos ainsi que les contenus du site Happyness (illustrations graphiques, textes\u2026) sont prot\u00e9g\u00e9s par le Code de la propri\u00e9t\u00e9 intellectuelle et par le droit d\u2019auteur. La reproduction et la copie des contenus par l\u2019Utilisateur requi\u00e8rent une autorisation pr\u00e9alable du site. Dans ce cas, toute utilisation \u00e0 des usages commerciaux ou \u00e0 des fins publicitaires est proscrite.\u00a0 Article 5 : Responsabilit\u00e9Bien que les informations publi\u00e9es sur le site soient r\u00e9put\u00e9es fiables, le site se r\u00e9serve la facult\u00e9 d\u2019une non-garantie de la fiabilit\u00e9 des sources. Les informations diffus\u00e9es sur le site Happyness sont pr\u00e9sent\u00e9es \u00e0 titre purement informatif et sont sans valeur contractuelle. En d\u00e9pit des mises \u00e0 jour r\u00e9guli\u00e8res, la responsabilit\u00e9 du site ne peut \u00eatre engag\u00e9e en cas de modification des dispositions administratives et juridiques apparaissant apr\u00e8s la publication. Il en est de m\u00eame pour l\u2019utilisation et l\u2019interpr\u00e9tation des informations communiqu\u00e9es sur la plateforme. Le site d\u00e9cline toute responsabilit\u00e9 concernant les \u00e9ventuels virus pouvant infecter le mat\u00e9riel informatique de l\u2019Utilisateur apr\u00e8s l\u2019utilisation ou l\u2019acc\u00e8s \u00e0 ce site. Le site ne peut \u00eatre tenu pour responsable en cas de force majeure ou du fait impr\u00e9visible et insurmontable d\u2019un tiers. La garantie totale de la s\u00e9curit\u00e9 et la confidentialit\u00e9 des donn\u00e9es n\u2019est pas assur\u00e9e par le site. Cependant, le site s\u2019engage \u00e0 mettre en \u0153uvre toutes les m\u00e9thodes requises pour le faire au mieux.\u00a0 Article 6 : Liens hypertextesLe site peut \u00eatre constitu\u00e9 de liens hypertextes. En cliquant sur ces derniers, l\u2019Utilisateur sortira de la plateforme. Cette derni\u00e8re n\u2019a pas de contr\u00f4le et ne peut pas \u00eatre tenue responsable du contenu des pages web relatives \u00e0 ces liens. Article 7 : CookiesLors des visites sur le site, l\u2019installation automatique d\u2019un cookie sur le logiciel de navigation de l\u2019Utilisateur peut survenir. Les cookies correspondent \u00e0 de petits fichiers d\u00e9pos\u00e9s temporairement sur le disque dur de l\u2019ordinateur de l\u2019Utilisateur. Ces cookies sont n\u00e9cessaires pour assurer l\u2019accessibilit\u00e9 et la navigation sur le site. Ces fichiers ne comportent pas d\u2019informations personnelles et ne peuvent pas \u00eatre utilis\u00e9s pour l\u2019identification d\u2019une personne. L\u2019information pr\u00e9sente dans les cookies est utilis\u00e9e pour am\u00e9liorer les performances de navigation sur le site happynessamiens.fr. En naviguant sur le site, l\u2019Utilisateur accepte les cookies. Leur d\u00e9sactivation peut s\u2019effectuer via les param\u00e8tres du logiciel de navigation.\u00a0 Article 8 : Publication par l\u2019UtilisateurLe site Happyness permet aux visiteurs de publier des messages en bas \u00e0 droite du site. Les messages sont conserver 1 an dans les bases de donn\u00e9es de la soci\u00e9t\u00e9 3CX (externe au site) . Le visiteur est tenu de respecter les r\u00e8gles de la Netiquette ainsi que les r\u00e8gles de droit en vigueur. Article 10 : Dur\u00e9e du contratLe pr\u00e9sent contrat est valable pour une dur\u00e9e ind\u00e9termin\u00e9e. Le d\u00e9but de l\u2019utilisation des services du site marque l\u2019application du contrat \u00e0 l\u2019\u00e9gard de l\u2019Utilisateur.\u00a0 Article 11 : Droit applicable et juridiction comp\u00e9tenteLe pr\u00e9sent contrat est soumis \u00e0 la l\u00e9gislation fran\u00e7aise. L\u2019absence de r\u00e9solution \u00e0 l\u2019amiable des cas de litige entre les parties implique le recours aux tribunaux fran\u00e7ais comp\u00e9tents pour r\u00e9gler le contentieux.\u00a0 Mise a jour le 15\/01\/2025","og_url":"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/","og_site_name":"Happyness Amiens","article_modified_time":"2025-12-23T15:22:25+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/","url":"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/","name":"Mentions l\u00e9gales - Happyness Amiens","isPartOf":{"@id":"https:\/\/happynessradio.fr\/amiens\/#website"},"datePublished":"2025-09-13T12:21:16+00:00","dateModified":"2025-12-23T15:22:25+00:00","breadcrumb":{"@id":"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/happynessradio.fr\/amiens\/mentions-legales\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/happynessradio.fr\/amiens\/mentions-legales\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/happynessradio.fr\/amiens\/"},{"@type":"ListItem","position":2,"name":"Mentions l\u00e9gales"}]},{"@type":"WebSite","@id":"https:\/\/happynessradio.fr\/amiens\/#website","url":"https:\/\/happynessradio.fr\/amiens\/","name":"Happyness Amiens","description":"Toujours au plus proche de vous","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/happynessradio.fr\/amiens\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"}]}},"_links":{"self":[{"href":"https:\/\/happynessradio.fr\/amiens\/wp-json\/wp\/v2\/pages\/284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/happynessradio.fr\/amiens\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/happynessradio.fr\/amiens\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/happynessradio.fr\/amiens\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/happynessradio.fr\/amiens\/wp-json\/wp\/v2\/comments?post=284"}],"version-history":[{"count":16,"href":"https:\/\/happynessradio.fr\/amiens\/wp-json\/wp\/v2\/pages\/284\/revisions"}],"predecessor-version":[{"id":3176,"href":"https:\/\/happynessradio.fr\/amiens\/wp-json\/wp\/v2\/pages\/284\/revisions\/3176"}],"wp:attachment":[{"href":"https:\/\/happynessradio.fr\/amiens\/wp-json\/wp\/v2\/media?parent=284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}