{"id":141,"date":"2025-10-17T15:31:50","date_gmt":"2025-10-17T13:31:50","guid":{"rendered":"https:\/\/happynessradio.fr\/oise\/?page_id=141"},"modified":"2025-12-23T16:15:42","modified_gmt":"2025-12-23T15:15:42","slug":"mentions-legales","status":"publish","type":"page","link":"https:\/\/happynessradio.fr\/oise\/mentions-legales\/","title":{"rendered":"Mentions l\u00e9gales"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"141\" class=\"elementor elementor-141\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d6c5a09 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=\"d6c5a09\" 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-1ad9b78 elementor-widget elementor-widget-html\" data-id=\"1ad9b78\" 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=\"670\" class=\"elementor elementor-670\">\n\t\t\t\t<div class=\"elementor-element elementor-element-69b0228 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=\"69b0228\" 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-f7eb4d4 elementor-widget elementor-widget-html\" data-id=\"f7eb4d4\" 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-Happyness-oise@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        .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        .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        .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        .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        \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        @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        @media (min-width: 900px) {\n            .scrollable-content-wrapper { flex-direction: row; overflow: hidden; max-width: 100%; margin: 0 auto; }\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            .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            .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            .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\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/Mention-HappynessOise.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            <div class=\"player-section\">\n                <div id=\"sourceBadge\" class=\"source-badge\">DIRECT<\/div>\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                <div class=\"fs-info\">\n                    <h2 id=\"fsTitle\">Happyness Radio<\/h2>\n                    <h3 id=\"fsArtist\">Le Son du Bonheur<\/h3>\n                <\/div>\n                <div class=\"fs-controls\">\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                    <div class=\"control-buttons\">\n                        <button class=\"btn-speed\" id=\"speedBtn\">1x<\/button>\n                        <button class=\"btn-skip\" id=\"btnRewind\">\n                            <i class=\"fas fa-rotate-left\"><\/i>\n                            <span>-10<\/span>\n                        <\/button>\n                        <button id=\"fsPlayBtn\" class=\"btn-fs-play\"><i class=\"fas fa-play\"><\/i><\/button>\n                        <button class=\"btn-skip\" id=\"btnForward\">\n                            <i class=\"fas fa-rotate-right\"><\/i>\n                            <span>+10<\/span>\n                        <\/button>\n                        <button class=\"btn-icon\" style=\"opacity:0; pointer-events:none;\"><i class=\"fas fa-ellipsis\"><\/i><\/button>\n                    <\/div>\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                <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                <div id=\"tab-podcasts\" class=\"tab-view\">\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                    <div id=\"searchResultsView\">\n                        <div class=\"search-section-title\">\u00c9MISSIONS<\/div>\n                        <div class=\"podcasts-grid\" id=\"searchResultShows\"><\/div>\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                    <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                        <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                            <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                <\/div>\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_oise\/player\",\n            liveApiUrl: \"https:\/\/azuracast-scrs-2.foxoud.synology.me\/api\/nowplaying\/happyness_oise\",\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        const PODCAST_SHOWS = [\n            { id: 1, title: \"Happyness Interview\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/Visuel-Happyness-Interview.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@happynessinterview\/feed.xml\" },\n            { id: 2, title: \"Le R\u00e9veil Happyness\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/LRH-Visuel-Podcast-site-25-26-avec-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@lereveilhappyness\/feed.xml\" },\n            { id: 3, title: \"L'Antre du Geek\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/ADG-visuel-podcst-site-25-26-avec-logo-2.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@lantredugeek\/feed.xml\" },\n            { id: 4, title: \"Riff and Jack\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/RAJ-visuel-podcst-site-25-26-sans-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@riffandjack\/feed.xml\" },\n            { id: 7, title: \"Les chroniques du JDR\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/JDR-visuel-podcast-site-25-26-avec-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@les_chroniques_du_jdr\/feed.xml\" },\n            { id: 8, title: \"Quoi d'neuf ? Compi\u00e8gne\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/2026\/02\/QDN-Compiegne-Visuel-Player.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@qdncmp\/feed.xml\" },\n            { id: 9, title: \"Quoi d'neuf ? Amiens\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/2026\/02\/QDN-Amiens-Visuel-Player.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@qdnamiens\/feed.xml\" },\n            { id: 10, title: \"\u00c7a vient du coeur\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/NES-Oise-visuel-avec-logo-25-26.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@nos_entrepreneurs_BGE_Picardie\/feed.xml\" },\n            { id: 15, title: \"Saveurs et confidences\", image: \"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/100Lifestyle-25-26-sans-logo.webp\", rss: \"https:\/\/www.castopod.happynessradio.fr\/@100lifestyle\/feed.xml\" },            \n        ];\n\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        let currentPodcastEpisodes = []; \n        let displayedEpisodeCount = 0;   \n        const EPISODES_PER_BATCH = 50;   \n        let currentContext = {};        \n\n        let globalEpisodeIndex = [];\n        let isIndexing = false;\n        let fuseShows;\n        let fuseEpisodes;\n\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            scrollWrapper: document.getElementById('scrollWrapper'),\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            btnReturnOverlay: document.getElementById('btnReturnOverlay'),\n            loadMoreBtn: document.getElementById('loadMoreBtn'),\n            loadMoreContainer: document.getElementById('loadMoreContainer'),\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            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            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 Heure : Minutes : Secondes dynamiquement\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        function initShowSearch() {\n            fuseShows = new Fuse(PODCAST_SHOWS, {\n                ...fuseOptionsBase,\n                keys: ['title']\n            });\n        }\n        initShowSearch();\n\n        function playStream(url, isPodcast = false, meta = null) {\n            if (audio.src !== url) {\n                updatePlayButtons('loading');\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                    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                    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        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                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            ui.playBtns.forEach(btn => btn.innerHTML = iconHtml);\n            updateEpisodeListIcons(state);\n            if(isPlayingBool) {\n                ui.artworkContainer.classList.add('playing');\n                ui.artworkContainer.classList.remove('paused');\n            } else {\n                ui.artworkContainer.classList.remove('playing');\n                ui.artworkContainer.classList.add('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        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        ui.btnRewind.onclick = doRewind;\n        ui.btnForward.onclick = doForward;\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        function updateDisplay(title, artist, cover, isPodcastMode) {\n            if (isPlayingPodcast && !isPodcastMode) return;\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            if ('mediaSession' in navigator) {\n                navigator.mediaSession.metadata = new MediaMetadata({\n                    title: title, artist: artist,\n                    album: isPodcastMode ? \"Happyness Podcast\" : \"Happyness Radio\",\n                    artwork: [{ src: cover, sizes: '512x512', type: 'image\/png' }]\n                });\n            }\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        function renderShows() {\n            ui.podcastsGrid.innerHTML = '';\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            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            ui.episodesList.innerHTML = '<div class=\"loading-spinner\"><i class=\"fas fa-circle-notch fa-spin\"><\/i> R\u00e9cup\u00e9ration...<\/div>';\n            ui.loadMoreContainer.style.display = 'none';\n            fetchRSS_Robust(show.rss, show.image, show.title, (items) => setupPodcastView(items, show.image, show.title));\n        }\n\n        function setupPodcastView(items, showImage, showTitle) {\n            currentPodcastEpisodes = items;\n            currentContext = { image: showImage, title: showTitle };\n            displayedEpisodeCount = 0;\n            ui.episodesList.innerHTML = '';\n            loadNextBatch();\n        }\n\n        function loadNextBatch() {\n            const start = displayedEpisodeCount;\n            const end = start + EPISODES_PER_BATCH;\n            const batch = currentPodcastEpisodes.slice(start, end); \n            renderEpisodesList(batch, currentContext.image, currentContext.title, ui.episodesList, true);\n            displayedEpisodeCount += batch.length;\n            ui.loadMoreContainer.style.display = (displayedEpisodeCount < currentPodcastEpisodes.length) ? 'flex' : 'none';\n        }\n        \n        ui.loadMoreBtn.onclick = loadNextBatch;\n        ui.backToShowsBtn.onclick = () => { ui.episodesView.style.display = 'none'; ui.showsView.style.display = 'block'; };\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\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) container.innerHTML = '';\n            items.forEach(item => {\n                const li = document.createElement('li');\n                let iconClass = (item.audioUrl === audio.src && !audio.paused) ? \"fas fa-pause-circle\" : \"fas fa-play-circle\";\n                li.onclick = () => {\n                    if(audio.src === item.audioUrl) 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                    }\n                };\n                const displaySubtitle = `${item.duration ? item.duration + ' \u2022 ' : ''}${item.dateStr}`;\n                li.innerHTML = `\n                    <img decoding=\"async\" src=\"${item.epImage}\" alt=\"cover\">\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        function startGlobalIndexing() {\n            if(isIndexing || globalEpisodeIndex.length > 0) return;\n            isIndexing = true;\n            PODCAST_SHOWS.forEach(show => {\n                fetchRSS_Robust(show.rss, show.image, show.title, (items) => {\n                    globalEpisodeIndex.push(...items);\n                    if(globalEpisodeIndex.length > 100) {\n                        fuseEpisodes = new Fuse(globalEpisodeIndex, {...fuseOptionsBase, keys: ['title', 'showTitle']});\n                    }\n                });\n            });\n        }\n\n        ui.searchInput.addEventListener('input', (e) => {\n            const term = e.target.value.trim();\n            if (term.length > 0) {\n                ui.clearSearchBtn.style.display = 'block';\n                ui.browsingContainer.classList.add('hidden');\n                ui.searchResultsView.classList.add('active');\n                ui.searchResultShows.innerHTML = '';\n                const showResults = fuseShows ? fuseShows.search(term) : [];\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.searchResultEpisodes.innerHTML = '';\n                const results = globalEpisodeIndex.filter(ep => ep.title.toLowerCase().includes(term.toLowerCase())).slice(0, 50);\n                renderEpisodesList(results, CONFIG.defaultCover, \"Recherche\", ui.searchResultEpisodes, false);\n            } else resetSearchUI();\n        });\n\n        ui.clearSearchBtn.onclick = resetSearch;\n        function resetSearch() { ui.searchInput.value = ''; resetSearchUI(); }\n        function resetSearchUI() { ui.clearSearchBtn.style.display = 'none'; ui.searchResultsView.classList.remove('active'); ui.browsingContainer.classList.remove('hidden'); }\n\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 { ui.currTime.textContent = \"LIVE\"; ui.totTime.textContent = \"\"; }\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        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        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 = () => { ui.navLive.classList.add('active'); ui.navPodcasts.classList.remove('active'); ui.tabLive.classList.add('active'); ui.tabPodcasts.classList.remove('active'); };\n        ui.navPodcasts.onclick = () => { ui.navPodcasts.classList.add('active'); ui.navLive.classList.remove('active'); ui.tabPodcasts.classList.add('active'); ui.tabLive.classList.remove('active'); startGlobalIndexing(); };\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        ui.miniCover.src = CONFIG.defaultCover;\n        ui.fsCover.src = CONFIG.defaultCover;\n        ui.fsBg.style.backgroundImage = `url('${CONFIG.defaultCover}')`;\n        renderShows();\n        fetchLiveMetadata();\n        audio.volume = 0.5;\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-062c2d4 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=\"062c2d4\" 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-d1e2f47 elementor-widget elementor-widget-html\" data-id=\"d1e2f47\" 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=\"61\" class=\"elementor elementor-61\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d4cfe17 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=\"d4cfe17\" 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-5722087 elementor-widget elementor-widget-html\" data-id=\"5722087\" 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%; \/* Largeur strictement conserv\u00e9e *\/\n        }\n        .hr-header {\n            padding: 15px 20px;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            width: 100%; \/* Largeur strictement conserv\u00e9e *\/\n            position: relative;\n            background-color: transparent;\n        }\n        \n        \/* Logo \u00e0 gauche *\/\n        .hr-header-logo {\n            display: flex;\n            align-items: center;\n            gap: 15px;\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);\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);\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 (Modal modernis\u00e9) *\/\n        .hr-header-location-modal {\n            display: none;\n            position: absolute;\n            top: calc(100% + 12px);\n            left: 0;\n            background-color: #ffffff;\n            border: 1px solid rgba(0,0,0,0.05);\n            border-radius: 12px;\n            min-width: 140px;\n            z-index: 1000;\n            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);\n            overflow: hidden;\n            opacity: 0;\n            transform: translateY(-10px);\n            transition: opacity 0.3s ease, transform 0.3s ease;\n        }\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;\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;\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            padding-bottom: 4px;\n            transition: color 0.3s ease;\n        }\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;\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;\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);\n                z-index: 1000;\n                width: 220px;\n                margin-right: -10px;\n                margin-top: 10px;\n                gap: 15px;\n                \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;\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 id=\"hrLogoLink\" href=\"#\">\n                    <img decoding=\"async\" src=\"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/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\/oise\/\">Accueil<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/oise\/grille-des-programmes\">Programmes<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/oise\/podcasts\">Podcasts<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/oise\/equipe\">\u00c9quipe<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/oise\/articles\">\u00c0 la une<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/oise\/a-propos\">Votre radio<\/a><\/li>\n                        <li><a href=\"https:\/\/happynessradio.fr\/oise\/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    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            \/\/ Gestion dynamique du logo et de la localisation selon l'URL\n            const url = window.location.href;\n            const logoLink = document.getElementById('hrLogoLink');\n            const locationNameElement = document.getElementById('hrLocationName');\n            \n            if (url.includes('\/amiens\/')) {\n                locationNameElement.textContent = 'Amiens';\n                logoLink.href = 'https:\/\/happynessradio.fr\/amiens';\n            } else if (url.includes('\/oise\/')) {\n                locationNameElement.textContent = 'Oise';\n                logoLink.href = 'https:\/\/happynessradio.fr\/oise';\n            } else {\n                locationNameElement.textContent = 'Amiens';\n                logoLink.href = 'https:\/\/happynessradio.fr\/amiens';\n            }\n\n            \/\/ Gestion du menu d\u00e9roulant de localisation (Anim\u00e9)\n            const hrLocationText = document.getElementById('hrLocationText');\n            const hrLocationModal = document.getElementById('hrLocationModal');\n            const hrLocationArrow = document.querySelector('.hr-header-location-arrow');\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);\n                    hrLocationArrow.style.transform = 'rotate(0deg)';\n                } else {\n                    hrLocationModal.style.display = 'block';\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                locationNameElement.textContent = 'Amiens'; \/\/ Sera \u00e9cras\u00e9 par le rechargement mais bon pour l'UX imm\u00e9diate\n            });\n            document.getElementById('hrOiseOption').addEventListener('click', () => {\n                window.location.href = 'https:\/\/happynessradio.fr\/oise';\n                locationNameElement.textContent = '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 pour le menu Oise\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\/oise', '');\n                if ((currentPath.includes(linkPath) && linkPath !== '\/') || \n                    (currentPath === '\/oise\/' && link.getAttribute('href') === 'https:\/\/happynessradio.fr\/oise\/')) {\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-596b61e 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=\"596b61e\" 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-3071a61 elementor-widget elementor-widget-heading\" data-id=\"3071a61\" 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\">\nConditions 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-e5c8d5c 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=\"e5c8d5c\" 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-2a79a61 elementor-widget elementor-widget-text-editor\" data-id=\"2a79a61\" 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 Oise (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 \u00c9dition<br \/>L\u2019\u00e9dition du site Happyness Oise est assur\u00e9e par l&rsquo;association Happyness Oise 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 Oise permet d\u2019acc\u00e9der gratuitement aux services suivants : <br \/>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0-Ecoute de la radio en direct\u00a0;<br \/>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0-Syst\u00e8me de d\u00e9dicaces\u00a0;<\/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 Oise (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 Amiens 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 Amiens permet aux visiteurs de publier des messages en bas a\u00a0 \u00a0droite du site. Les messages sont conserver 1 an dans les bases de donn\u00e9es de la soci\u00e9t\u00e9 3CX (externe au site) .\u00a0Le 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-a3724b5 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=\"a3724b5\" 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-32220d1 elementor-widget elementor-widget-html\" data-id=\"32220d1\" 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=\"1211\" class=\"elementor elementor-1211\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2cb1aff 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=\"2cb1aff\" 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-34d1ab4 elementor-widget elementor-widget-html\" data-id=\"34d1ab4\" 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        .footer {\n            display: flex;\n            flex-wrap: wrap;\n            justify-content: space-between;\n            padding: 30px 20px 10px;\n            background-color: transparent;\n            color: white;\n        }\n        .footer-column {\n            flex: 1 1 48%;\n            margin-bottom: 20px;\n        }\n        .footer-column ul {\n            list-style: none;\n            padding: 0;\n            display: flex;\n            flex-wrap: wrap;\n        }\n        .footer-column ul li {\n            margin-bottom: 10px;\n            flex: 1 1 33.33%;\n        }\n        .footer-column ul li a {\n            color: white;\n            text-decoration: none;\n            font-size: 16px;\n        }\n        .footer-column ul li a:hover {\n            text-decoration: underline;\n        }\n        .footer-column p {\n            color: white;\n            font-size: 14px;\n            margin: 5px 0;\n        }\n        .footer-column img {\n            width: 150px;\n            margin-bottom: 10px;\n        }\n        .footer-column h3 {\n            color: white;\n            font-size: 18px;\n            font-weight: bold;\n            margin-bottom: 10px;\n        }\n        .social-links {\n            display: flex;\n            justify-content: flex-start;\n            margin-top: 10px;\n        }\n        .social-links a {\n            margin-right: 20px;\n            color: white;\n            text-decoration: none;\n        }\n        .social-links i {\n            font-size: 18px;\n        }\n        @media (max-width: 768px) {\n            .footer-column {\n                flex: 1 1 100%;\n            }\n            .footer-column ul {\n                flex-direction: row;\n                flex-wrap: wrap;\n                height: auto;\n            }\n            .footer-column ul li {\n                flex: 1 1 48%;\n                margin-bottom: 10px;\n            }\n            .footer-column ul li a {\n                font-size: 14px;\n            }\n        }\n        .footer-bottom {\n            text-align: center;\n            padding: 10px 0;\n            border-top: 1px solid white;\n            margin-top: 10px;\n            font-size: 14px;\n            color: white;\n            background-color: transparent;\n        }\n        .footer-bottom a {\n            color: white;\n            text-decoration: none;\n        }\n    <\/style>\n<\/head>\n<body>\n    <footer class=\"footer\">\n        <div class=\"footer-column\">\n            <img decoding=\"async\" src=\"https:\/\/happynessradio.fr\/oise\/wp-content\/uploads\/sites\/2\/2025\/12\/Logo-Happyness-Blanc.webp\" alt=\"Logo Happyness\">\n            <h3>Toujours au plus proche de vous<\/h3>\n            <p>5, rue de Mouy, 60370 Hermes<\/p>\n            <p>contact@happynessoise.fr<\/p>\n            <div class=\"social-links\">\n                <a href=\"https:\/\/www.instagram.com\/happyness.oise\/\"><i class=\"fab fa-instagram\"><\/i><\/a>\n                <a href=\"https:\/\/www.facebook.com\/HappynessOise\"><i class=\"fab fa-facebook-f\"><\/i><\/a>\n                <a href=\"https:\/\/www.linkedin.com\/company\/happyness-radio\/\"><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\/oise\/\">Accueil<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/oise\/grille-des-programmes\/\">Programmes<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/oise\/podcasts\/\">Podcasts<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/oise\/equipe\/\">\u00c9quipe<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/oise\/articles\/\">\u00c0 la une<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/oise\/a-propos\/\">Votre radio<\/a><\/li>\n                <li><a href=\"https:\/\/happynessradio.fr\/oise\/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\/oise\/mentions-legales\/\">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 Oise (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 \u00c9ditionL\u2019\u00e9dition du site Happyness Oise est assur\u00e9e par l&rsquo;association Happyness Oise 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 Oise permet d\u2019acc\u00e9der gratuitement aux services suivants : \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0-Ecoute de la radio en direct\u00a0;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0-Syst\u00e8me de d\u00e9dicaces\u00a0; 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 Oise (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 Amiens 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 Amiens permet aux visiteurs de publier des messages en bas a\u00a0 \u00a0droite du site. Les messages sont conserver 1 an dans les bases de donn\u00e9es de la soci\u00e9t\u00e9 3CX (externe au site) .\u00a0Le 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-141","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 Oise<\/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\/oise\/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 Oise\" \/>\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 Oise (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 \u00c9ditionL\u2019\u00e9dition du site Happyness Oise est assur\u00e9e par l&rsquo;association Happyness Oise 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 Oise permet d\u2019acc\u00e9der gratuitement aux services suivants : \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0-Ecoute de la radio en direct\u00a0;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0-Syst\u00e8me de d\u00e9dicaces\u00a0; 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 Oise (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 Amiens 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 Amiens permet aux visiteurs de publier des messages en bas a\u00a0 \u00a0droite du site. Les messages sont conserver 1 an dans les bases de donn\u00e9es de la soci\u00e9t\u00e9 3CX (externe au site) .\u00a0Le 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\/oise\/mentions-legales\/\" \/>\n<meta property=\"og:site_name\" content=\"Happyness Oise\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-23T15:15:42+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=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/mentions-legales\\\/\",\"url\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/mentions-legales\\\/\",\"name\":\"Mentions l\u00e9gales - Happyness Oise\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/#website\"},\"datePublished\":\"2025-10-17T13:31:50+00:00\",\"dateModified\":\"2025-12-23T15:15:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/mentions-legales\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/mentions-legales\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/mentions-legales\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mentions l\u00e9gales\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/#website\",\"url\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/\",\"name\":\"Happyness Oise\",\"description\":\"Toujours au plus proche de vous\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/happynessradio.fr\\\/oise\\\/?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 Oise","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\/oise\/mentions-legales\/","og_locale":"fr_FR","og_type":"article","og_title":"Mentions l\u00e9gales - Happyness Oise","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 Oise (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 \u00c9ditionL\u2019\u00e9dition du site Happyness Oise est assur\u00e9e par l&rsquo;association Happyness Oise 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 Oise permet d\u2019acc\u00e9der gratuitement aux services suivants : \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0-Ecoute de la radio en direct\u00a0;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0-Syst\u00e8me de d\u00e9dicaces\u00a0; 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 Oise (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 Amiens 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 Amiens permet aux visiteurs de publier des messages en bas a\u00a0 \u00a0droite du site. Les messages sont conserver 1 an dans les bases de donn\u00e9es de la soci\u00e9t\u00e9 3CX (externe au site) .\u00a0Le 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\/oise\/mentions-legales\/","og_site_name":"Happyness Oise","article_modified_time":"2025-12-23T15:15:42+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/happynessradio.fr\/oise\/mentions-legales\/","url":"https:\/\/happynessradio.fr\/oise\/mentions-legales\/","name":"Mentions l\u00e9gales - Happyness Oise","isPartOf":{"@id":"https:\/\/happynessradio.fr\/oise\/#website"},"datePublished":"2025-10-17T13:31:50+00:00","dateModified":"2025-12-23T15:15:42+00:00","breadcrumb":{"@id":"https:\/\/happynessradio.fr\/oise\/mentions-legales\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/happynessradio.fr\/oise\/mentions-legales\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/happynessradio.fr\/oise\/mentions-legales\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/happynessradio.fr\/oise\/"},{"@type":"ListItem","position":2,"name":"Mentions l\u00e9gales"}]},{"@type":"WebSite","@id":"https:\/\/happynessradio.fr\/oise\/#website","url":"https:\/\/happynessradio.fr\/oise\/","name":"Happyness Oise","description":"Toujours au plus proche de vous","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/happynessradio.fr\/oise\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"}]}},"_links":{"self":[{"href":"https:\/\/happynessradio.fr\/oise\/wp-json\/wp\/v2\/pages\/141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/happynessradio.fr\/oise\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/happynessradio.fr\/oise\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/happynessradio.fr\/oise\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/happynessradio.fr\/oise\/wp-json\/wp\/v2\/comments?post=141"}],"version-history":[{"count":13,"href":"https:\/\/happynessradio.fr\/oise\/wp-json\/wp\/v2\/pages\/141\/revisions"}],"predecessor-version":[{"id":1244,"href":"https:\/\/happynessradio.fr\/oise\/wp-json\/wp\/v2\/pages\/141\/revisions\/1244"}],"wp:attachment":[{"href":"https:\/\/happynessradio.fr\/oise\/wp-json\/wp\/v2\/media?parent=141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}