{"id":31218,"date":"2026-07-24T15:23:51","date_gmt":"2026-07-24T19:23:51","guid":{"rendered":"https:\/\/allianceenjesus.com\/?page_id=31218"},"modified":"2026-07-24T22:20:05","modified_gmt":"2026-07-25T02:20:05","slug":"jeu-karaoke","status":"publish","type":"page","link":"https:\/\/allianceenjesus.com\/?page_id=31218","title":{"rendered":"Jeu karaok\u00e9"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"31218\" class=\"elementor elementor-31218\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d7523ed elementor-section-full_width ang-section-padding-initial elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no elementor-repeater-item-none elementor-repeater-item-none_hover wpr-column-slider-no wpr-equal-height-no\" data-id=\"d7523ed\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-70c7420 elementor-repeater-item-none elementor-repeater-item-none_hover\" data-id=\"70c7420\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7597d55 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"7597d55\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-j6jr01l elementor-section-content-middle elementor-section-height-full elementor-section-full_width ang-section-padding-initial elementor-section-height-default elementor-section-items-middle wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no elementor-repeater-item-none elementor-repeater-item-none_hover wpr-column-slider-no wpr-equal-height-no\" data-id=\"j6jr01l\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b1eae7d elementor-repeater-item-none elementor-repeater-item-none_hover\" data-id=\"b1eae7d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e239bc3 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"e239bc3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-66f7555 elementor-section-boxed ang-section-padding-initial elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no elementor-repeater-item-none elementor-repeater-item-none_hover wpr-column-slider-no wpr-equal-height-no\" data-id=\"66f7555\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1f90a72 elementor-repeater-item-none elementor-repeater-item-none_hover\" data-id=\"1f90a72\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8eacd35 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"8eacd35\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-e212d8a e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"e212d8a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d32ea11 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"d32ea11\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\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-eaf0eb6 e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"eaf0eb6\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6eeee3f elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-heading\" data-id=\"6eeee3f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Une table de mixage pour modifer tes audios en Karaok\u00e9 !<\/h2>\t\t\t\t<\/div>\n\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-78ccb18 e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"78ccb18\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2286166 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-heading\" data-id=\"2286166\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Cool, amuses toi !<\/h2>\t\t\t\t<\/div>\n\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-aa23484 e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"aa23484\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-02a14af elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"02a14af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\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-39bcf7f e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"39bcf7f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-740fea9 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-heading\" data-id=\"740fea9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Va dans le menu import pour t\u00e9l\u00e9charger tes fichiers audio,<\/h2>\t\t\t\t<\/div>\n\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-67c5ec9 e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"67c5ec9\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-19e6967 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-heading\" data-id=\"19e6967\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">puis Playlist Audio et la table de mixage pour les r\u00e9glages !<\/h2>\t\t\t\t<\/div>\n\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-81c6fbb e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"81c6fbb\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2fd29ad elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"2fd29ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\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-7db05be e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"7db05be\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c7484e7 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-html\" data-id=\"c7484e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<!-- ============================================================\r\n KARAOKE STUDIO ULTIMATE V5\r\n ELEMENTOR - WIDGET HTML UNIQUE\r\n\r\n AJOUTS V5 :\r\n - Playlist Audio\r\n - Playlist Vid\u00e9o\r\n - Import fichiers audio\r\n - Import fichiers vid\u00e9o\r\n - Glisser-d\u00e9poser audio\/vid\u00e9o\r\n - URL directe audio\/vid\u00e9o\r\n - YouTube int\u00e9gr\u00e9 dans la page\r\n - Lecteur principal audio\/vid\u00e9o\r\n - Second lecteur\r\n - Table de mixage Web Audio\r\n - Microphone\r\n - Mode voix seule\r\n - Mode voix + musique\r\n - Mode voix + chanson\r\n - Enregistrement\r\n - Pause \/ reprise\r\n - Compte \u00e0 rebours\r\n - Playlist\r\n - Boucle morceau\r\n - Boucle playlist\r\n - Al\u00e9atoire\r\n - Boucle A-B\r\n - Vitesse\r\n - Paroles\r\n - SRT \/ LRC\r\n - \u00c9cran karaok\u00e9\r\n - Export\r\n - FFmpeg WebAssembly\r\n - Conversion c\u00f4t\u00e9 navigateur\r\n - Interface responsive\r\n ============================================================ -->\r\n\r\n<div id=\"KARAOKE_ULTIMATE_V5\">\r\n\r\n<style>\r\n\r\n\/* ============================================================\r\n VARIABLES\r\n============================================================ *\/\r\n\r\n#KARAOKE_ULTIMATE_V5{\r\n--blue:#2563eb;\r\n--blue2:#3b82f6;\r\n--blue-light:#dbeafe;\r\n--blue-bg:#93c5fd;\r\n--white:#ffffff;\r\n--text:#111827;\r\n--muted:#64748b;\r\n--border:#93c5fd;\r\n--green:#16a34a;\r\n--red:#dc2626;\r\n\r\nfont-family:\r\nArial,\r\nHelvetica,\r\nsans-serif;\r\n\r\ncolor:var(--text);\r\n\r\nbackground:\r\nvar(--blue-bg);\r\n\r\nmin-height:\r\n900px;\r\n\r\nborder-radius:\r\n20px;\r\n\r\noverflow:\r\nhidden;\r\n}\r\n\r\n#KARAOKE_ULTIMATE_V5 *{\r\nbox-sizing:border-box;\r\n}\r\n\r\n#KARAOKE_ULTIMATE_V5 button,\r\n#KARAOKE_ULTIMATE_V5 input,\r\n#KARAOKE_ULTIMATE_V5 select,\r\n#KARAOKE_ULTIMATE_V5 textarea{\r\nfont-family:inherit;\r\n}\r\n\r\n.k5-header{\r\n\r\nbackground:#fff;\r\n\r\npadding:\r\n16px 22px;\r\n\r\ndisplay:flex;\r\n\r\njustify-content:\r\nspace-between;\r\n\r\nalign-items:\r\ncenter;\r\n\r\ngap:15px;\r\n\r\nborder-bottom:\r\n1px solid var(--border);\r\n\r\n}\r\n\r\n.k5-brand{\r\n\r\ndisplay:flex;\r\n\r\nalign-items:center;\r\n\r\ngap:12px;\r\n\r\n}\r\n\r\n.k5-logo{\r\n\r\nwidth:52px;\r\n\r\nheight:52px;\r\n\r\nborder-radius:15px;\r\n\r\nbackground:\r\nvar(--blue);\r\n\r\ncolor:#fff;\r\n\r\ndisplay:flex;\r\n\r\nalign-items:center;\r\n\r\njustify-content:center;\r\n\r\nfont-size:26px;\r\n\r\n}\r\n\r\n.k5-title{\r\n\r\nfont-size:22px;\r\n\r\nfont-weight:bold;\r\n\r\n}\r\n\r\n.k5-subtitle{\r\n\r\nfont-size:12px;\r\n\r\ncolor:var(--muted);\r\n\r\nmargin-top:3px;\r\n\r\n}\r\n\r\n.k5-layout{\r\n\r\ndisplay:grid;\r\n\r\ngrid-template-columns:\r\n230px 1fr;\r\n\r\nmin-height:\r\n850px;\r\n\r\n}\r\n\r\n.k5-sidebar{\r\n\r\nbackground:\r\nvar(--blue-bg);\r\n\r\npadding:12px;\r\n\r\n}\r\n\r\n.k5-menu{\r\n\r\ndisplay:flex;\r\n\r\nflex-direction:column;\r\n\r\ngap:7px;\r\n\r\n}\r\n\r\n.k5-menu button{\r\n\r\nborder:0;\r\n\r\npadding:11px;\r\n\r\nborder-radius:10px;\r\n\r\nbackground:\r\nrgba(255,255,255,.85);\r\n\r\ncolor:\r\n#111827;\r\n\r\nfont-weight:bold;\r\n\r\ncursor:pointer;\r\n\r\ntext-align:left;\r\n\r\n}\r\n\r\n.k5-menu button:hover,\r\n.k5-menu button.active{\r\n\r\nbackground:\r\nvar(--blue);\r\n\r\ncolor:#fff;\r\n\r\n}\r\n\r\n.k5-main{\r\n\r\npadding:20px;\r\n\r\nmin-width:0;\r\n\r\n}\r\n\r\n.k5-page{\r\n\r\ndisplay:none;\r\n\r\n}\r\n\r\n.k5-page.active{\r\n\r\ndisplay:block;\r\n\r\n}\r\n\r\n.k5-card{\r\n\r\nbackground:#fff;\r\n\r\nborder:\r\n1px solid var(--border);\r\n\r\nborder-radius:16px;\r\n\r\npadding:18px;\r\n\r\nmargin-bottom:18px;\r\n\r\nbox-shadow:\r\n0 5px 20px\r\nrgba(30,64,175,.08);\r\n\r\n}\r\n\r\n.k5-card h2{\r\n\r\nmargin-top:0;\r\n\r\n}\r\n\r\n.k5-grid{\r\n\r\ndisplay:grid;\r\n\r\ngrid-template-columns:\r\nrepeat(2,minmax(0,1fr));\r\n\r\ngap:18px;\r\n\r\n}\r\n\r\n.k5-grid3{\r\n\r\ndisplay:grid;\r\n\r\ngrid-template-columns:\r\nrepeat(3,minmax(0,1fr));\r\n\r\ngap:15px;\r\n\r\n}\r\n\r\n.k5-btn{\r\n\r\nborder:0;\r\n\r\nborder-radius:9px;\r\n\r\npadding:\r\n10px 14px;\r\n\r\nmargin:3px;\r\n\r\nfont-weight:bold;\r\n\r\ncursor:pointer;\r\n\r\nbackground:\r\n#e2e8f0;\r\n\r\ncolor:\r\n#111827;\r\n\r\n}\r\n\r\n.k5-btn:hover{\r\n\r\nfilter:\r\nbrightness(.96);\r\n\r\n}\r\n\r\n.k5-primary{\r\n\r\nbackground:\r\nvar(--blue);\r\n\r\ncolor:#fff;\r\n\r\n}\r\n\r\n.k5-green{\r\n\r\nbackground:\r\n#dcfce7;\r\n\r\ncolor:\r\n#166534;\r\n\r\n}\r\n\r\n.k5-danger{\r\n\r\nbackground:\r\n#fee2e2;\r\n\r\ncolor:\r\n#991b1b;\r\n\r\n}\r\n\r\n.k5-input,\r\n.k5-select,\r\n.k5-textarea{\r\n\r\nwidth:100%;\r\n\r\npadding:11px;\r\n\r\nborder:\r\n1px solid #cbd5e1;\r\n\r\nborder-radius:9px;\r\n\r\nbackground:#fff;\r\n\r\ncolor:#111827;\r\n\r\nmargin:\r\n5px 0 10px;\r\n\r\n}\r\n\r\n.k5-textarea{\r\n\r\nmin-height:\r\n200px;\r\n\r\nresize:\r\nvertical;\r\n\r\n}\r\n\r\n.k5-drop{\r\n\r\nborder:\r\n2px dashed var(--blue2);\r\n\r\nbackground:\r\n#eff6ff;\r\n\r\npadding:\r\n35px;\r\n\r\ntext-align:center;\r\n\r\nborder-radius:\r\n15px;\r\n\r\ntransition:\r\n.2s;\r\n\r\n}\r\n\r\n.k5-drop.drag{\r\n\r\nbackground:\r\n#dbeafe;\r\n\r\nborder-color:\r\nvar(--blue);\r\n\r\ntransform:\r\nscale(1.01);\r\n\r\n}\r\n\r\n.k5-drop input{\r\n\r\ndisplay:none;\r\n\r\n}\r\n\r\n.k5-player{\r\n\r\nbackground:\r\n#eff6ff;\r\n\r\npadding:\r\n14px;\r\n\r\nborder-radius:\r\n12px;\r\n\r\n}\r\n\r\n.k5-player audio,\r\n.k5-player video{\r\n\r\nwidth:100%;\r\n\r\nmax-width:100%;\r\n\r\nborder-radius:\r\n8px;\r\n\r\nbackground:\r\n#000;\r\n\r\n}\r\n\r\n.k5-controls{\r\n\r\ndisplay:flex;\r\n\r\nflex-wrap:wrap;\r\n\r\ngap:4px;\r\n\r\nmargin-top:\r\n10px;\r\n\r\n}\r\n\r\n.k5-playlist{\r\n\r\nborder:\r\n1px solid #cbd5e1;\r\n\r\nborder-radius:\r\n10px;\r\n\r\nmax-height:\r\n400px;\r\n\r\noverflow:auto;\r\n\r\n}\r\n\r\n.k5-track{\r\n\r\ndisplay:flex;\r\n\r\njustify-content:\r\nspace-between;\r\n\r\nalign-items:center;\r\n\r\npadding:\r\n11px;\r\n\r\nborder-bottom:\r\n1px solid #e2e8f0;\r\n\r\ncursor:pointer;\r\n\r\ngap:10px;\r\n\r\n}\r\n\r\n.k5-track:hover,\r\n.k5-track.current{\r\n\r\nbackground:\r\n#dbeafe;\r\n\r\n}\r\n\r\n.k5-track-name{\r\n\r\noverflow:hidden;\r\n\r\ntext-overflow:\r\nellipsis;\r\n\r\nwhite-space:\r\nnowrap;\r\n\r\n}\r\n\r\n.k5-mixer{\r\n\r\ndisplay:grid;\r\n\r\ngrid-template-columns:\r\nrepeat(4,minmax(0,1fr));\r\n\r\ngap:12px;\r\n\r\n}\r\n\r\n.k5-channel{\r\n\r\nbackground:\r\n#f8fafc;\r\n\r\nborder:\r\n1px solid #cbd5e1;\r\n\r\nborder-radius:\r\n12px;\r\n\r\npadding:\r\n13px;\r\n\r\n}\r\n\r\n.k5-channel h3{\r\n\r\ntext-align:center;\r\n\r\nmargin-top:0;\r\n\r\n}\r\n\r\n.k5-channel label{\r\n\r\ndisplay:block;\r\n\r\nfont-size:12px;\r\n\r\nfont-weight:bold;\r\n\r\nmargin-top:\r\n10px;\r\n\r\ncolor:\r\n#475569;\r\n\r\n}\r\n\r\n.k5-channel input[type=range]{\r\n\r\nwidth:100%;\r\n\r\naccent-color:\r\nvar(--blue);\r\n\r\n}\r\n\r\n.k5-value{\r\n\r\ntext-align:center;\r\n\r\nfont-size:12px;\r\n\r\ncolor:\r\n#475569;\r\n\r\n}\r\n\r\n.k5-meter{\r\n\r\nheight:\r\n14px;\r\n\r\nbackground:\r\n#e2e8f0;\r\n\r\nborder-radius:\r\n10px;\r\n\r\noverflow:hidden;\r\n\r\n}\r\n\r\n.k5-meter-bar{\r\n\r\nheight:100%;\r\n\r\nwidth:0%;\r\n\r\nbackground:\r\n#2563eb;\r\n\r\n}\r\n\r\n.k5-mode{\r\n\r\nborder:\r\n2px solid #dbeafe;\r\n\r\npadding:\r\n14px;\r\n\r\nborder-radius:\r\n12px;\r\n\r\nmargin-bottom:\r\n8px;\r\n\r\ncursor:pointer;\r\n\r\n}\r\n\r\n.k5-mode.selected{\r\n\r\nborder-color:\r\nvar(--blue);\r\n\r\nbackground:\r\n#eff6ff;\r\n\r\n}\r\n\r\n.k5-lyrics{\r\n\r\nbackground:\r\n#0f172a;\r\n\r\ncolor:#fff;\r\n\r\nborder-radius:\r\n16px;\r\n\r\nmin-height:\r\n420px;\r\n\r\ndisplay:flex;\r\n\r\nflex-direction:column;\r\n\r\njustify-content:center;\r\n\r\nalign-items:center;\r\n\r\npadding:\r\n40px;\r\n\r\ntext-align:center;\r\n\r\n}\r\n\r\n.k5-current{\r\n\r\nfont-size:\r\n32px;\r\n\r\nfont-weight:bold;\r\n\r\ncolor:\r\n#93c5fd;\r\n\r\n}\r\n\r\n.k5-next{\r\n\r\nfont-size:\r\n18px;\r\n\r\ncolor:\r\n#94a3b8;\r\n\r\nmargin-top:\r\n20px;\r\n\r\n}\r\n\r\n.k5-status{\r\n\r\npadding:\r\n10px;\r\n\r\nborder-radius:\r\n9px;\r\n\r\nbackground:\r\n#eff6ff;\r\n\r\ncolor:\r\n#1e3a8a;\r\n\r\nmargin-top:\r\n10px;\r\n\r\n}\r\n\r\n.k5-time{\r\n\r\nfont-size:\r\n24px;\r\n\r\nfont-weight:bold;\r\n\r\ntext-align:center;\r\n\r\nmargin:\r\n10px;\r\n\r\n}\r\n\r\n.k5-youtube{\r\n\r\nposition:relative;\r\n\r\nwidth:100%;\r\n\r\npadding-bottom:\r\n56.25%;\r\n\r\nheight:0;\r\n\r\noverflow:hidden;\r\n\r\nborder-radius:\r\n12px;\r\n\r\n}\r\n\r\n.k5-youtube iframe{\r\n\r\nposition:absolute;\r\n\r\nwidth:100%;\r\n\r\nheight:100%;\r\n\r\nleft:0;\r\n\r\ntop:0;\r\n\r\nborder:0;\r\n\r\n}\r\n\r\n.k5-small{\r\n\r\nfont-size:\r\n12px;\r\n\r\ncolor:\r\nvar(--muted);\r\n\r\n}\r\n\r\n.k5-video-badge{\r\n\r\nfont-size:\r\n11px;\r\n\r\nbackground:\r\n#dbeafe;\r\n\r\ncolor:\r\n#1e40af;\r\n\r\npadding:\r\n3px 7px;\r\n\r\nborder-radius:\r\n20px;\r\n\r\nwhite-space:\r\nnowrap;\r\n\r\n}\r\n\r\n.k5-progress{\r\n\r\nwidth:100%;\r\n\r\nheight:\r\n8px;\r\n\r\nbackground:\r\n#e2e8f0;\r\n\r\nborder-radius:\r\n10px;\r\n\r\noverflow:hidden;\r\n\r\nmargin-top:\r\n10px;\r\n\r\n}\r\n\r\n.k5-progress-bar{\r\n\r\nheight:100%;\r\n\r\nwidth:0%;\r\n\r\nbackground:\r\nvar(--blue);\r\n\r\ntransition:\r\nwidth .1s linear;\r\n\r\n}\r\n\r\n.k5-ffmpeg-log{\r\n\r\nbackground:\r\n#0f172a;\r\n\r\ncolor:\r\n#dbeafe;\r\n\r\npadding:\r\n12px;\r\n\r\nborder-radius:\r\n10px;\r\n\r\nfont-family:\r\nmonospace;\r\n\r\nfont-size:\r\n12px;\r\n\r\nmax-height:\r\n200px;\r\n\r\noverflow:auto;\r\n\r\nwhite-space:\r\npre-wrap;\r\n\r\n}\r\n\r\n@media(max-width:1000px){\r\n\r\n.k5-layout{\r\n\r\ngrid-template-columns:\r\n1fr;\r\n\r\n}\r\n\r\n.k5-menu{\r\n\r\nflex-direction:\r\nrow;\r\n\r\noverflow-x:auto;\r\n\r\n}\r\n\r\n.k5-menu button{\r\n\r\nwhite-space:\r\nnowrap;\r\n\r\n}\r\n\r\n.k5-mixer{\r\n\r\ngrid-template-columns:\r\nrepeat(2,1fr);\r\n\r\n}\r\n\r\n}\r\n\r\n@media(max-width:650px){\r\n\r\n.k5-header{\r\n\r\nflex-direction:\r\ncolumn;\r\n\r\nalign-items:\r\nflex-start;\r\n\r\n}\r\n\r\n.k5-grid,\r\n.k5-grid3,\r\n.k5-mixer{\r\n\r\ngrid-template-columns:\r\n1fr;\r\n\r\n}\r\n\r\n.k5-main{\r\n\r\npadding:\r\n10px;\r\n\r\n}\r\n\r\n.k5-current{\r\n\r\nfont-size:\r\n23px;\r\n\r\n}\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n<!-- ============================================================\r\n HEADER\r\n============================================================ -->\r\n\r\n<header class=\"k5-header\">\r\n\r\n<div class=\"k5-brand\">\r\n\r\n<div class=\"k5-logo\">\r\n\ud83c\udfa4\r\n<\/div>\r\n\r\n<div>\r\n\r\n<div class=\"k5-title\">\r\nKaraoke Studio Ultimate\r\n<\/div>\r\n\r\n<div class=\"k5-subtitle\">\r\nStudio karaok\u00e9 audio \u2022 vid\u00e9o \u2022 mixage \u2022 enregistrement\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<button\r\nclass=\"k5-btn k5-primary\"\r\ndata-page=\"import\"\r\n>\r\n\uff0b Nouveau projet\r\n<\/button>\r\n\r\n<\/header>\r\n\r\n\r\n<div class=\"k5-layout\">\r\n\r\n\r\n<!-- ============================================================\r\n MENU GAUCHE\r\n============================================================ -->\r\n\r\n<aside class=\"k5-sidebar\">\r\n\r\n<nav class=\"k5-menu\">\r\n\r\n<button\r\nclass=\"active\"\r\ndata-page=\"home\"\r\n>\r\n\ud83c\udfe0 Accueil\r\n<\/button>\r\n\r\n<button\r\ndata-page=\"import\"\r\n>\r\n\ud83d\udce5 Import\r\n<\/button>\r\n\r\n<button\r\ndata-page=\"audio-playlist\"\r\n>\r\n\ud83c\udfb5 Playlist Audio\r\n<\/button>\r\n\r\n<button\r\ndata-page=\"video-playlist\"\r\n>\r\n\ud83c\udfac Playlist Vid\u00e9o\r\n<\/button>\r\n\r\n<button\r\ndata-page=\"mixer\"\r\n>\r\n\ud83c\udf9b\ufe0f Mixage\r\n<\/button>\r\n\r\n<button\r\ndata-page=\"karaoke\"\r\n>\r\n\ud83c\udfa4 Karaok\u00e9\r\n<\/button>\r\n\r\n<button\r\ndata-page=\"record\"\r\n>\r\n\ud83d\udd34 Enregistrer\r\n<\/button>\r\n\r\n<button\r\ndata-page=\"lyrics\"\r\n>\r\n\ud83d\udcdd Paroles\r\n<\/button>\r\n\r\n<button\r\ndata-page=\"export\"\r\n>\r\n\ud83d\udcbe Export\r\n<\/button>\r\n\r\n<\/nav>\r\n\r\n<\/aside>\r\n\r\n\r\n<main class=\"k5-main\">\r\n\r\n\r\n<!-- ============================================================\r\n ACCUEIL\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-home\"\r\nclass=\"k5-page active\"\r\n>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83c\udfa4 Karaoke Studio Ultimate\r\n<\/h2>\r\n\r\n<p>\r\nVotre studio karaok\u00e9 audio et vid\u00e9o directement dans Elementor.\r\n<\/p>\r\n\r\n<button\r\nclass=\"k5-btn k5-primary\"\r\ndata-page=\"import\"\r\n>\r\n\ud83d\udce5 Importer un morceau\r\n<\/button>\r\n\r\n<button\r\nclass=\"k5-btn\"\r\ndata-page=\"video-playlist\"\r\n>\r\n\ud83c\udfac Importer une vid\u00e9o\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<div class=\"k5-grid3\">\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h3>\r\n\ud83c\udfb5 Audio\r\n<\/h3>\r\n\r\n<p>\r\nChansons, instrumentaux, playlists et mixage.\r\n<\/p>\r\n\r\n<\/div>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h3>\r\n\ud83c\udfac Vid\u00e9o\r\n<\/h3>\r\n\r\n<p>\r\nClips locaux, MP4, WebM et int\u00e9gration YouTube.\r\n<\/p>\r\n\r\n<\/div>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h3>\r\n\ud83c\udfa4 Studio\r\n<\/h3>\r\n\r\n<p>\r\nEnregistrement et export.\r\n<\/p>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ============================================================\r\n IMPORT\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-import\"\r\nclass=\"k5-page\"\r\n>\r\n\r\n<div class=\"k5-grid\">\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83d\udce5 Import audio et vid\u00e9o\r\n<\/h2>\r\n\r\n<div\r\nid=\"k5-drop\"\r\nclass=\"k5-drop\"\r\n>\r\n\r\n<p>\r\nGlissez vos chansons ou vid\u00e9os ici\r\n<\/p>\r\n\r\n<label class=\"k5-btn k5-primary\">\r\n\r\n\ud83d\udcc1 Choisir des fichiers\r\n\r\n<input\r\nid=\"k5-files\"\r\ntype=\"file\"\r\nmultiple\r\naccept=\"audio\/*,video\/*\"\r\n>\r\n\r\n<\/label>\r\n\r\n<p class=\"k5-small\">\r\nMP3 \u2022 WAV \u2022 OGG \u2022 M4A \u2022 AAC \u2022 MP4 \u2022 WebM\r\n<\/p>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83d\udd17 URL directe\r\n<\/h2>\r\n\r\n<input\r\nid=\"k5-url\"\r\nclass=\"k5-input\"\r\nplaceholder=\"URL directe MP3, WAV, MP4, WebM...\"\r\n>\r\n\r\n<button\r\nid=\"k5-add-url\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\nAjouter\r\n<\/button>\r\n\r\n<p class=\"k5-small\">\r\nPour le mixage, privil\u00e9giez les fichiers directs compatibles CORS.\r\n<\/p>\r\n\r\n<hr>\r\n\r\n<h2>\r\n\ud83d\udcfa YouTube\r\n<\/h2>\r\n\r\n<input\r\nid=\"k5-youtube-url\"\r\nclass=\"k5-input\"\r\nplaceholder=\"https:\/\/www.youtube.com\/watch?v=...\"\r\n>\r\n\r\n<button\r\nid=\"k5-add-youtube\"\r\nclass=\"k5-btn\"\r\n>\r\nAfficher dans la page\r\n<\/button>\r\n\r\n<div id=\"k5-youtube-container\"><\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\u25b6\ufe0f Lecteur principal\r\n<\/h2>\r\n\r\n<div\r\nid=\"k5-player\"\r\nclass=\"k5-player\"\r\n>\r\nAucun m\u00e9dia charg\u00e9.\r\n<\/div>\r\n\r\n<div class=\"k5-controls\">\r\n\r\n<button\r\nid=\"k5-play\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\u25b6 Lecture\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-pause\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23f8 Pause\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-stop\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23f9 Stop\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-back\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23ea -10s\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-forward\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23e9 +10s\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<div class=\"k5-progress\">\r\n\r\n<div\r\nid=\"k5-progress-bar\"\r\nclass=\"k5-progress-bar\"\r\n><\/div>\r\n\r\n<\/div>\r\n\r\n<label>\r\nVitesse\r\n<\/label>\r\n\r\n<select\r\nid=\"k5-speed\"\r\nclass=\"k5-select\"\r\n>\r\n\r\n<option value=\".5\">\r\n0,5\u00d7\r\n<\/option>\r\n\r\n<option value=\".75\">\r\n0,75\u00d7\r\n<\/option>\r\n\r\n<option value=\"1\"\r\nselected\r\n>\r\n1\u00d7\r\n<\/option>\r\n\r\n<option value=\"1.25\">\r\n1,25\u00d7\r\n<\/option>\r\n\r\n<option value=\"1.5\">\r\n1,5\u00d7\r\n<\/option>\r\n\r\n<option value=\"2\">\r\n2\u00d7\r\n<\/option>\r\n\r\n<\/select>\r\n\r\n<div\r\nid=\"k5-status\"\r\nclass=\"k5-status\"\r\n>\r\nAucun morceau.\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ============================================================\r\n PLAYLIST AUDIO\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-audio-playlist\"\r\nclass=\"k5-page\"\r\n>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83c\udfb5 Playlist Audio\r\n<\/h2>\r\n\r\n<div\r\nid=\"k5-audio-list\"\r\nclass=\"k5-playlist\"\r\n>\r\nAucun fichier audio.\r\n<\/div>\r\n\r\n<div class=\"k5-controls\">\r\n\r\n<button\r\nid=\"k5-audio-prev\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23ee Pr\u00e9c\u00e9dent\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-audio-next\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\u23ed Suivant\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-audio-loop\"\r\nclass=\"k5-btn\"\r\n>\r\n\ud83d\udd01 Morceau OFF\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-audio-playlist-loop\"\r\nclass=\"k5-btn\"\r\n>\r\n\ud83d\udd01 Playlist OFF\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-audio-shuffle\"\r\nclass=\"k5-btn\"\r\n>\r\n\ud83d\udd00 Al\u00e9atoire OFF\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ============================================================\r\n PLAYLIST VIDEO\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-video-playlist\"\r\nclass=\"k5-page\"\r\n>\r\n\r\n<!-- ============================================================\r\n LECTEUR VIDEO PRINCIPAL\r\n============================================================ -->\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83c\udfac Lecteur Vid\u00e9o\r\n<\/h2>\r\n\r\n<div\r\nid=\"k5-video-player-container\"\r\nstyle=\"\r\nwidth:100%;\r\nbackground:#000;\r\nborder-radius:14px;\r\noverflow:hidden;\r\nposition:relative;\r\naspect-ratio:16\/9;\r\n\"\r\n>\r\n\r\n<!-- Lecteur vid\u00e9o MP4 \/ WebM \/ fichiers locaux -->\r\n\r\n<video\r\nid=\"k5-video-player\"\r\ncontrols\r\nplaysinline\r\npreload=\"metadata\"\r\nstyle=\"\r\nwidth:100%;\r\nheight:100%;\r\ndisplay:none;\r\nbackground:#000;\r\nobject-fit:contain;\r\n\"\r\n>\r\n<\/video>\r\n\r\n\r\n<!-- Lecteur YouTube int\u00e9gr\u00e9 -->\r\n\r\n<iframe\r\nid=\"k5-video-youtube-player\"\r\nstyle=\"\r\nwidth:100%;\r\nheight:100%;\r\ndisplay:none;\r\nborder:0;\r\nbackground:#000;\r\n\"\r\nallow=\"\r\nautoplay;\r\nencrypted-media;\r\npicture-in-picture;\r\nfullscreen\r\n\"\r\nallowfullscreen\r\n>\r\n<\/iframe>\r\n\r\n\r\n<!-- Message initial -->\r\n\r\n<div\r\nid=\"k5-video-player-placeholder\"\r\nstyle=\"\r\nposition:absolute;\r\ninset:0;\r\ndisplay:flex;\r\nalign-items:center;\r\njustify-content:center;\r\nflex-direction:column;\r\ncolor:white;\r\ntext-align:center;\r\npadding:30px;\r\n\"\r\n>\r\n\r\n<div\r\nstyle=\"\r\nfont-size:60px;\r\nmargin-bottom:15px;\r\n\"\r\n>\r\n\ud83c\udfac\r\n<\/div>\r\n\r\n<div>\r\nS\u00e9lectionnez une vid\u00e9o dans votre playlist\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<!-- TITRE DE LA VIDEO -->\r\n\r\n<div\r\nid=\"k5-video-current-title\"\r\nstyle=\"\r\nfont-size:18px;\r\nfont-weight:bold;\r\nmargin-top:15px;\r\n\"\r\n>\r\nAucune vid\u00e9o s\u00e9lectionn\u00e9e\r\n<\/div>\r\n\r\n\r\n<!-- POSITION DANS LA PLAYLIST -->\r\n\r\n<div\r\nid=\"k5-video-current-position\"\r\nstyle=\"\r\nfont-size:13px;\r\nopacity:.7;\r\nmargin-top:5px;\r\n\"\r\n>\r\n0 \/ 0\r\n<\/div>\r\n\r\n\r\n<!-- CONTROLES -->\r\n\r\n<div class=\"k5-controls\">\r\n\r\n<button\r\nid=\"k5-video-player-prev\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23ee Pr\u00e9c\u00e9dente\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-play\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\u25b6\ufe0f Lecture\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-pause\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23f8\ufe0f Pause\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-next\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23ed Suivante\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-loop\"\r\nclass=\"k5-btn\"\r\n>\r\n\ud83d\udd01 Boucle OFF\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-autoplay\"\r\nclass=\"k5-btn\"\r\n>\r\n\u25b6\ufe0f Lecture automatique OFF\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<!-- ============================================================\r\n IMPORT VIDEO\r\n============================================================ -->\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83c\udfac Importer des vid\u00e9os\r\n<\/h2>\r\n\r\n<p>\r\nImportez vos clips et vid\u00e9os pour les lire dans le lecteur principal.\r\n<\/p>\r\n\r\n<div\r\nid=\"k5-video-drop\"\r\nclass=\"k5-drop\"\r\n>\r\n\r\n<p>\r\n\ud83d\uddb1\ufe0f Glissez-d\u00e9posez vos vid\u00e9os ici\r\n<\/p>\r\n\r\n<label class=\"k5-btn k5-primary\">\r\n\r\n\ud83d\udcc1 T\u00e9l\u00e9charger depuis l'appareil\r\n\r\n<input\r\nid=\"k5-video-files\"\r\ntype=\"file\"\r\nmultiple\r\naccept=\"video\/*\"\r\n>\r\n\r\n<\/label>\r\n\r\n<p class=\"k5-small\">\r\nMP4 \u2022 WebM \u2022 OGG vid\u00e9o \u2022 autres formats compatibles navigateur\r\n<\/p>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<!-- ============================================================\r\n AJOUT URL VIDEO\r\n============================================================ -->\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83d\udd17 Ajouter une vid\u00e9o par URL\r\n<\/h2>\r\n\r\n<input\r\nid=\"k5-video-url\"\r\nclass=\"k5-input\"\r\nplaceholder=\"URL directe MP4 ou WebM\"\r\n>\r\n\r\n<button\r\nid=\"k5-add-video-url\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\uff0b Ajouter vid\u00e9o\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n\r\n<!-- ============================================================\r\n AJOUT YOUTUBE\r\n============================================================ -->\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83d\udcfa Ajouter YouTube\r\n<\/h2>\r\n\r\n<input\r\nid=\"k5-video-youtube-url\"\r\nclass=\"k5-input\"\r\nplaceholder=\"URL YouTube\"\r\n>\r\n\r\n<button\r\nid=\"k5-add-video-youtube\"\r\nclass=\"k5-btn\"\r\n>\r\n\uff0b Ajouter YouTube \u00e0 la playlist\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n\r\n<!-- ============================================================\r\n PLAYLIST\r\n============================================================ -->\r\n\r\n<!-- ============================================================\r\n LECTEUR DE LA PLAYLIST VIDEO\r\n============================================================ -->\r\n\r\n<div\r\nid=\"k5-video-playlist-player\"\r\nstyle=\"\r\nwidth:100%;\r\nmargin:15px 0;\r\nbackground:#000;\r\nborder-radius:12px;\r\noverflow:hidden;\r\nposition:relative;\r\naspect-ratio:16\/9;\r\n\"\r\n>\r\n\r\n<!-- Lecteur vid\u00e9o HTML5 -->\r\n<video\r\nid=\"k5-video-playlist-html5\"\r\ncontrols\r\nplaysinline\r\npreload=\"metadata\"\r\nstyle=\"\r\ndisplay:none;\r\nwidth:100%;\r\nheight:100%;\r\nbackground:#000;\r\nobject-fit:contain;\r\n\"\r\n><\/video>\r\n\r\n\r\n<!-- Lecteur YouTube -->\r\n<iframe\r\nid=\"k5-video-playlist-youtube\"\r\nstyle=\"\r\ndisplay:none;\r\nwidth:100%;\r\nheight:100%;\r\nborder:0;\r\nbackground:#000;\r\n\"\r\nallow=\"\r\nautoplay;\r\nencrypted-media;\r\npicture-in-picture;\r\nfullscreen\r\n\"\r\nallowfullscreen\r\n><\/iframe>\r\n\r\n\r\n<!-- Message initial -->\r\n<div\r\nid=\"k5-video-playlist-empty\"\r\nstyle=\"\r\nposition:absolute;\r\ninset:0;\r\ndisplay:flex;\r\nalign-items:center;\r\njustify-content:center;\r\nflex-direction:column;\r\ncolor:white;\r\nfont-size:18px;\r\ntext-align:center;\r\n\"\r\n>\r\n\r\n<div style=\"font-size:50px;\">\r\n\ud83c\udfac\r\n<\/div>\r\n\r\n<div>\r\nS\u00e9lectionnez une vid\u00e9o dans votre playlist\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<!-- INFORMATIONS VIDEO -->\r\n\r\n<div\r\nid=\"k5-video-playlist-current\"\r\nstyle=\"\r\nfont-weight:bold;\r\nfont-size:17px;\r\nmargin:10px 0;\r\n\"\r\n>\r\nAucune vid\u00e9o s\u00e9lectionn\u00e9e\r\n<\/div>\r\n\r\n\r\n<div\r\nid=\"k5-video-playlist-position\"\r\nstyle=\"\r\nfont-size:13px;\r\nopacity:.7;\r\nmargin-bottom:12px;\r\n\"\r\n>\r\n0 \/ 0\r\n<\/div>\r\n\r\n\r\n<!-- CONTROLES DU LECTEUR -->\r\n\r\n<div class=\"k5-controls\">\r\n\r\n<button\r\nid=\"k5-video-player-prev\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23ee Pr\u00e9c\u00e9dente\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-play\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\u25b6\ufe0f Lecture\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-pause\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23f8\ufe0f Pause\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-next\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23ed Suivante\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-player-auto\"\r\nclass=\"k5-btn\"\r\n>\r\n\u25b6\ufe0f Auto OFF\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83c\udfac Playlist Vid\u00e9o\r\n<\/h2>\r\n\r\n<div\r\nid=\"k5-video-list\"\r\nclass=\"k5-playlist\"\r\n>\r\nAucune vid\u00e9o.\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-controls\">\r\n\r\n<button\r\nid=\"k5-video-prev\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23ee Pr\u00e9c\u00e9dente\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-next\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\u23ed Suivante\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-loop\"\r\nclass=\"k5-btn\"\r\n>\r\n\ud83d\udd01 Boucle OFF\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-video-shuffle\"\r\nclass=\"k5-btn\"\r\n>\r\n\ud83d\udd00 Al\u00e9atoire OFF\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<\/section>\r\n\r\n<!-- ============================================================\r\n MIXAGE\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-mixer\"\r\nclass=\"k5-page\"\r\n>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83c\udf9b\ufe0f Table de mixage\r\n<\/h2>\r\n\r\n<p>\r\nLes fichiers audio et vid\u00e9os HTML5 compatibles sont trait\u00e9s\r\npar Web Audio API. Les vid\u00e9os YouTube int\u00e9gr\u00e9es par iframe\r\nrestent isol\u00e9es par les restrictions du navigateur.\r\n<\/p>\r\n\r\n<div class=\"k5-mixer\">\r\n\r\n\r\n<div class=\"k5-channel\">\r\n\r\n<h3>\r\n\ud83d\udd0a MASTER\r\n<\/h3>\r\n\r\n<label>\r\nVolume\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-master\"\r\ntype=\"range\"\r\nmin=\"0\"\r\nmax=\"100\"\r\nvalue=\"100\"\r\n>\r\n\r\n<div\r\nid=\"k5-master-val\"\r\nclass=\"k5-value\"\r\n>\r\n100%\r\n<\/div>\r\n\r\n<label>\r\nBalance\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-pan\"\r\ntype=\"range\"\r\nmin=\"-1\"\r\nmax=\"1\"\r\nstep=\".01\"\r\nvalue=\"0\"\r\n>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-channel\">\r\n\r\n<h3>\r\n\ud83c\udfa4 VOIX\r\n<\/h3>\r\n\r\n<label>\r\nGain\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-voice-gain\"\r\ntype=\"range\"\r\nmin=\"0\"\r\nmax=\"200\"\r\nvalue=\"100\"\r\n>\r\n\r\n<label>\r\nPr\u00e9sence\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-presence\"\r\ntype=\"range\"\r\nmin=\"-12\"\r\nmax=\"12\"\r\nvalue=\"0\"\r\n>\r\n\r\n<label>\r\nClart\u00e9\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-clarity\"\r\ntype=\"range\"\r\nmin=\"-12\"\r\nmax=\"12\"\r\nvalue=\"0\"\r\n>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-channel\">\r\n\r\n<h3>\r\n\ud83e\udd41 BASSE\r\n<\/h3>\r\n\r\n<label>\r\nGain\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-bass\"\r\ntype=\"range\"\r\nmin=\"-20\"\r\nmax=\"20\"\r\nvalue=\"0\"\r\n>\r\n\r\n<label>\r\nFr\u00e9quence\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-bass-freq\"\r\ntype=\"range\"\r\nmin=\"40\"\r\nmax=\"300\"\r\nvalue=\"120\"\r\n>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-channel\">\r\n\r\n<h3>\r\n\ud83c\udf9a\ufe0f \u00c9GALISEUR\r\n<\/h3>\r\n\r\n<label>\r\nGraves\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-low\"\r\ntype=\"range\"\r\nmin=\"-20\"\r\nmax=\"20\"\r\nvalue=\"0\"\r\n>\r\n\r\n<label>\r\nM\u00e9diums\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-mid\"\r\ntype=\"range\"\r\nmin=\"-20\"\r\nmax=\"20\"\r\nvalue=\"0\"\r\n>\r\n\r\n<label>\r\nAigus\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-high\"\r\ntype=\"range\"\r\nmin=\"-20\"\r\nmax=\"20\"\r\nvalue=\"0\"\r\n>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-channel\">\r\n\r\n<h3>\r\n\ud83d\udca5 COMPRESSEUR\r\n<\/h3>\r\n\r\n<label>\r\nThreshold\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-comp-threshold\"\r\ntype=\"range\"\r\nmin=\"-60\"\r\nmax=\"0\"\r\nvalue=\"0\"\r\n>\r\n\r\n<label>\r\nRatio\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-comp-ratio\"\r\ntype=\"range\"\r\nmin=\"1\"\r\nmax=\"20\"\r\nvalue=\"4\"\r\n>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-channel\">\r\n\r\n<h3>\r\n\ud83d\udd01 \u00c9CHO\r\n<\/h3>\r\n\r\n<label>\r\nIntensit\u00e9\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-delay\"\r\ntype=\"range\"\r\nmin=\"0\"\r\nmax=\"100\"\r\nvalue=\"0\"\r\n>\r\n\r\n<label>\r\nTemps\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-delay-time\"\r\ntype=\"range\"\r\nmin=\"0\"\r\nmax=\"1\"\r\nstep=\".01\"\r\nvalue=\".3\"\r\n>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-channel\">\r\n\r\n<h3>\r\n\ud83c\udfdb\ufe0f R\u00c9VERB\u00c9RATION\r\n<\/h3>\r\n\r\n<label>\r\nIntensit\u00e9\r\n<\/label>\r\n\r\n<input\r\nid=\"k5-reverb\"\r\ntype=\"range\"\r\nmin=\"0\"\r\nmax=\"100\"\r\nvalue=\"0\"\r\n>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-channel\">\r\n\r\n<h3>\r\n\ud83d\udcca VUM\u00c8TRE\r\n<\/h3>\r\n\r\n<div class=\"k5-meter\">\r\n\r\n<div\r\nid=\"k5-meter-bar\"\r\nclass=\"k5-meter-bar\"\r\n><\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<button\r\nid=\"k5-reset-mixer\"\r\nclass=\"k5-btn\"\r\n>\r\n\u21a9 R\u00e9initialiser\r\n<\/button>\r\n\r\n<div\r\nid=\"k5-mixer-status\"\r\nclass=\"k5-status\"\r\n>\r\nMixeur pr\u00eat.\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ============================================================\r\n KARAOKE\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-karaoke\"\r\nclass=\"k5-page\"\r\n>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83c\udfa4 \u00c9cran Karaok\u00e9\r\n<\/h2>\r\n\r\n<div\r\nclass=\"k5-lyrics\"\r\n>\r\n\r\n<div\r\nid=\"k5-current-line\"\r\nclass=\"k5-current\"\r\n>\r\nVotre texte\r\n<\/div>\r\n\r\n<div\r\nid=\"k5-next-line\"\r\nclass=\"k5-next\"\r\n>\r\nLes paroles appara\u00eetront ici.\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<button\r\nid=\"k5-fullscreen\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\u26f6 Plein \u00e9cran\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ============================================================\r\n ENREGISTREMENT\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-record\"\r\nclass=\"k5-page\"\r\n>\r\n\r\n<div class=\"k5-grid\">\r\n\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83d\udd34 Studio d'enregistrement\r\n<\/h2>\r\n\r\n<div\r\nclass=\"k5-mode selected\"\r\ndata-mode=\"voice\"\r\n>\r\n\r\n<strong>\r\nMode 1 \u2014 Voix seule\r\n<\/strong>\r\n\r\n<br>\r\n\r\n<span class=\"k5-small\">\r\nMicrophone uniquement.\r\nLa musique n'est pas enregistr\u00e9e.\r\n<\/span>\r\n\r\n<\/div>\r\n\r\n\r\n<div\r\nclass=\"k5-mode\"\r\ndata-mode=\"voiceMusic\"\r\n>\r\n\r\n<strong>\r\nMode 2 \u2014 Voix + instrumental\r\n<\/strong>\r\n\r\n<br>\r\n\r\n<span class=\"k5-small\">\r\nMicrophone + lecteur.\r\n<\/span>\r\n\r\n<\/div>\r\n\r\n\r\n<div\r\nclass=\"k5-mode\"\r\ndata-mode=\"song\"\r\n>\r\n\r\n<strong>\r\nMode 3 \u2014 Voix + chanson\r\n<\/strong>\r\n\r\n<br>\r\n\r\n<span class=\"k5-small\">\r\nMicrophone + lecteur.\r\n<\/span>\r\n\r\n<\/div>\r\n\r\n\r\n<div\r\nid=\"k5-timer\"\r\nclass=\"k5-time\"\r\n>\r\n00:00\r\n<\/div>\r\n\r\n\r\n<button\r\nid=\"k5-mic\"\r\nclass=\"k5-btn\"\r\n>\r\n\ud83c\udf99\ufe0f Activer microphone\r\n<\/button>\r\n\r\n\r\n<button\r\nid=\"k5-countdown\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23f1\ufe0f Compte \u00e0 rebours ON\r\n<\/button>\r\n\r\n\r\n<br>\r\n\r\n\r\n<button\r\nid=\"k5-record-start\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\ud83d\udd34 Enregistrer\r\n<\/button>\r\n\r\n\r\n<button\r\nid=\"k5-record-pause\"\r\nclass=\"k5-btn\"\r\n>\r\n\u23f8 Pause\r\n<\/button>\r\n\r\n\r\n<button\r\nid=\"k5-record-stop\"\r\nclass=\"k5-btn k5-danger\"\r\n>\r\n\u23f9 Arr\u00eater\r\n<\/button>\r\n\r\n\r\n<div\r\nid=\"k5-record-status\"\r\nclass=\"k5-status\"\r\n>\r\nPr\u00eat.\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83c\udfa7 R\u00e9sultat\r\n<\/h2>\r\n\r\n<div\r\nid=\"k5-record-result\"\r\n>\r\nAucun enregistrement.\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ============================================================\r\n PAROLES\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-lyrics\"\r\nclass=\"k5-page\"\r\n>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83d\udcdd Paroles et sous-titres\r\n<\/h2>\r\n\r\n<textarea\r\nid=\"k5-lyrics-text\"\r\nclass=\"k5-textarea\"\r\nplaceholder=\"Collez les paroles ici...\"\r\n><\/textarea>\r\n\r\n<div class=\"k5-grid\">\r\n\r\n<div>\r\n\r\n<h3>\r\nImporter SRT\r\n<\/h3>\r\n\r\n<input\r\nid=\"k5-srt-file\"\r\ntype=\"file\"\r\naccept=\".srt\"\r\nclass=\"k5-input\"\r\n>\r\n\r\n<\/div>\r\n\r\n<div>\r\n\r\n<h3>\r\nImporter LRC\r\n<\/h3>\r\n\r\n<input\r\nid=\"k5-lrc-file\"\r\ntype=\"file\"\r\naccept=\".lrc\"\r\nclass=\"k5-input\"\r\n>\r\n\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<button\r\nid=\"k5-show-lyrics\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\nAfficher\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-download-txt\"\r\nclass=\"k5-btn\"\r\n>\r\nTXT\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-download-srt\"\r\nclass=\"k5-btn\"\r\n>\r\nSRT\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-download-lrc\"\r\nclass=\"k5-btn\"\r\n>\r\nLRC\r\n<\/button>\r\n\r\n<\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<!-- ============================================================\r\n EXPORT \/ FFMPEG\r\n============================================================ -->\r\n\r\n<section\r\nid=\"k5-export\"\r\nclass=\"k5-page\"\r\n>\r\n\r\n<div class=\"k5-card\">\r\n\r\n<h2>\r\n\ud83d\udcbe Export avec FFmpeg WebAssembly\r\n<\/h2>\r\n\r\n<p>\r\nLe moteur FFmpeg WebAssembly est charg\u00e9 uniquement lorsque\r\nvous utilisez la conversion. Le traitement se fait dans\r\nle navigateur.\r\n<\/p>\r\n\r\n<label>\r\nFormat de sortie\r\n<\/label>\r\n\r\n<select\r\nid=\"k5-export-format\"\r\nclass=\"k5-select\"\r\n>\r\n\r\n<option value=\"mp3\">\r\nMP3\r\n<\/option>\r\n\r\n<option value=\"wav\">\r\nWAV\r\n<\/option>\r\n\r\n<option value=\"ogg\">\r\nOGG\r\n<\/option>\r\n\r\n<option value=\"webm\">\r\nWebM\r\n<\/option>\r\n\r\n<option value=\"mp4\">\r\nMP4\r\n<\/option>\r\n\r\n<\/select>\r\n\r\n<label>\r\nQualit\u00e9 audio\r\n<\/label>\r\n\r\n<select\r\nid=\"k5-quality\"\r\nclass=\"k5-select\"\r\n>\r\n\r\n<option value=\"128\">\r\n128 kbps\r\n<\/option>\r\n\r\n<option value=\"192\">\r\n192 kbps\r\n<\/option>\r\n\r\n<option value=\"256\">\r\n256 kbps\r\n<\/option>\r\n\r\n<option value=\"320\">\r\n320 kbps\r\n<\/option>\r\n\r\n<\/select>\r\n\r\n<button\r\nid=\"k5-load-ffmpeg\"\r\nclass=\"k5-btn\"\r\n>\r\n\ud83e\uddf0 Charger FFmpeg\r\n<\/button>\r\n\r\n<button\r\nid=\"k5-export-btn\"\r\nclass=\"k5-btn k5-primary\"\r\n>\r\n\u2b07 Convertir et t\u00e9l\u00e9charger\r\n<\/button>\r\n\r\n<div\r\nid=\"k5-export-status\"\r\nclass=\"k5-status\"\r\n>\r\nFFmpeg non charg\u00e9.\r\n<\/div>\r\n\r\n<div\r\nid=\"k5-ffmpeg-log\"\r\nclass=\"k5-ffmpeg-log\"\r\n>\r\nEn attente.\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<\/section>\r\n\r\n\r\n<\/main>\r\n\r\n<\/div>\r\n\r\n\r\n<script>\r\n\r\n\/* ============================================================\r\n KARAOKE STUDIO ULTIMATE V5\r\n JAVASCRIPT\r\n============================================================ *\/\r\n\r\n(function(){\r\n\r\n\"use strict\";\r\n\r\n\r\n\/* ============================================================\r\n VARIABLES\r\n============================================================ *\/\r\n\r\nlet audioPlaylist=[];\r\n\r\nlet videoPlaylist=[];\r\n\r\nlet currentAudioIndex=-1;\r\n\r\nlet currentVideoIndex=-1;\r\n\r\nlet media=null;\r\n\r\nlet secondary=null;\r\n\r\nlet audioContext=null;\r\n\r\nlet sourceNode=null;\r\n\r\nlet micStream=null;\r\n\r\nlet micSource=null;\r\n\r\nlet masterGain=null;\r\n\r\nlet panNode=null;\r\n\r\nlet lowNode=null;\r\n\r\nlet midNode=null;\r\n\r\nlet highNode=null;\r\n\r\nlet compressor=null;\r\n\r\nlet analyser=null;\r\n\r\nlet delayNode=null;\r\n\r\nlet delayGain=null;\r\n\r\nlet mixDestination=null;\r\n\r\nlet micDestination=null;\r\n\r\nlet recorder=null;\r\n\r\nlet chunks=[];\r\n\r\nlet currentMode=\"voice\";\r\n\r\nlet audioLoop=false;\r\n\r\nlet audioPlaylistLoop=false;\r\n\r\nlet audioShuffle=false;\r\n\r\nlet videoLoop=false;\r\n\r\nlet videoShuffle=false;\r\n\r\nlet loopAB=false;\r\n\r\nlet loopA=0;\r\n\r\nlet loopB=30;\r\n\r\nlet countdownEnabled=true;\r\n\r\nlet timerInterval=null;\r\n\r\nlet recordSeconds=0;\r\n\r\nlet isPaused=false;\r\n\r\nlet ffmpeg=null;\r\n\r\nlet ffmpegLoaded=false;\r\n\r\n\r\n\/* ============================================================\r\n NAVIGATION\r\n============================================================ *\/\r\n\r\ndocument.querySelectorAll(\r\n\"#KARAOKE_ULTIMATE_V5 [data-page]\"\r\n).forEach(function(btn){\r\n\r\nbtn.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet page=\r\nthis.dataset.page;\r\n\r\ndocument.querySelectorAll(\r\n\"#KARAOKE_ULTIMATE_V5 .k5-page\"\r\n).forEach(\r\nfunction(p){\r\n\r\np.classList.remove(\r\n\"active\"\r\n);\r\n\r\n}\r\n);\r\n\r\nlet target=\r\ndocument.getElementById(\r\n\"k5-\"+page\r\n);\r\n\r\nif(target){\r\n\r\ntarget.classList.add(\r\n\"active\"\r\n);\r\n\r\n}\r\n\r\ndocument.querySelectorAll(\r\n\"#KARAOKE_ULTIMATE_V5 .k5-menu button\"\r\n).forEach(\r\nfunction(b){\r\n\r\nb.classList.remove(\r\n\"active\"\r\n);\r\n\r\n}\r\n);\r\n\r\nif(\r\nthis.closest(\".k5-menu\")\r\n){\r\n\r\nthis.classList.add(\r\n\"active\"\r\n);\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n});\r\n\r\n\r\n\/* ============================================================\r\n AUDIO ENGINE\r\n============================================================ *\/\r\n\r\nfunction initAudio(){\r\n\r\nif(audioContext)\r\nreturn;\r\n\r\nlet AC=\r\nwindow.AudioContext ||\r\nwindow.webkitAudioContext;\r\n\r\nif(!AC){\r\n\r\nalert(\r\n\"Web Audio API n'est pas disponible.\"\r\n);\r\n\r\nreturn;\r\n\r\n}\r\n\r\naudioContext=\r\nnew AC();\r\n\r\nmasterGain=\r\naudioContext.createGain();\r\n\r\npanNode=\r\naudioContext.createStereoPanner();\r\n\r\nlowNode=\r\naudioContext.createBiquadFilter();\r\n\r\nmidNode=\r\naudioContext.createBiquadFilter();\r\n\r\nhighNode=\r\naudioContext.createBiquadFilter();\r\n\r\ncompressor=\r\naudioContext.createDynamicsCompressor();\r\n\r\nanalyser=\r\naudioContext.createAnalyser();\r\n\r\ndelayNode=\r\naudioContext.createDelay(2);\r\n\r\ndelayGain=\r\naudioContext.createGain();\r\n\r\nmixDestination=\r\naudioContext.createMediaStreamDestination();\r\n\r\nmicDestination=\r\naudioContext.createMediaStreamDestination();\r\n\r\n\r\nlowNode.type=\r\n\"lowshelf\";\r\n\r\nlowNode.frequency.value=\r\n120;\r\n\r\nmidNode.type=\r\n\"peaking\";\r\n\r\nmidNode.frequency.value=\r\n1000;\r\n\r\nmidNode.Q.value=\r\n1;\r\n\r\nhighNode.type=\r\n\"highshelf\";\r\n\r\nhighNode.frequency.value=\r\n5000;\r\n\r\n\r\ncompressor.threshold.value=\r\n0;\r\n\r\ncompressor.ratio.value=\r\n4;\r\n\r\ncompressor.attack.value=\r\n.003;\r\n\r\ncompressor.release.value=\r\n.25;\r\n\r\n\r\ndelayNode.delayTime.value=\r\n.3;\r\n\r\ndelayGain.gain.value=\r\n0;\r\n\r\n\r\n\/* CHAINE PRINCIPALE *\/\r\n\r\nmasterGain\r\n.connect(panNode)\r\n.connect(lowNode)\r\n.connect(midNode)\r\n.connect(highNode)\r\n.connect(compressor)\r\n.connect(analyser);\r\n\r\n\r\n\/* SORTIE HAUT-PARLEURS *\/\r\n\r\nanalyser.connect(\r\naudioContext.destination\r\n);\r\n\r\n\r\n\/* SORTIE MIX ENREGISTREMENT *\/\r\n\r\nanalyser.connect(\r\nmixDestination\r\n);\r\n\r\n\r\n\/* ECHO *\/\r\n\r\nhighNode.connect(\r\ndelayNode\r\n);\r\n\r\ndelayNode.connect(\r\ndelayGain\r\n);\r\n\r\ndelayGain.connect(\r\ncompressor\r\n);\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n CONNECTER MEDIA HTML5 AU MIXEUR\r\n============================================================ *\/\r\n\r\nfunction connectMedia(){\r\n\r\nif(!media)\r\nreturn;\r\n\r\ninitAudio();\r\n\r\nif(sourceNode){\r\n\r\ntry{\r\n\r\nsourceNode.disconnect();\r\n\r\n}catch(e){}\r\n\r\nsourceNode=null;\r\n\r\n}\r\n\r\ntry{\r\n\r\nsourceNode=\r\naudioContext.createMediaElementSource(\r\nmedia\r\n);\r\n\r\nsourceNode.connect(\r\nmasterGain\r\n);\r\n\r\ndocument.getElementById(\r\n\"k5-mixer-status\"\r\n).textContent=\r\n\"\u2705 M\u00e9dia HTML5 connect\u00e9 au mixeur.\";\r\n\r\n}catch(error){\r\n\r\nconsole.warn(\r\n\"Connexion Web Audio impossible\",\r\nerror\r\n);\r\n\r\ndocument.getElementById(\r\n\"k5-mixer-status\"\r\n).textContent=\r\n\"\u26a0\ufe0f Ce m\u00e9dia ne peut pas \u00eatre connect\u00e9 au mixeur. V\u00e9rifiez CORS ou utilisez un fichier local.\";\r\n\r\n}\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n MICROPHONE\r\n============================================================ *\/\r\n\r\nasync function enableMicrophone(){\r\n\r\ntry{\r\n\r\nmicStream=\r\nawait navigator.mediaDevices.getUserMedia({\r\n\r\naudio:{\r\n\r\nechoCancellation:true,\r\n\r\nnoiseSuppression:true,\r\n\r\nautoGainControl:false\r\n\r\n}\r\n\r\n});\r\n\r\n\r\ninitAudio();\r\n\r\nif(\r\nmicSource\r\n){\r\n\r\ntry{\r\n\r\nmicSource.disconnect();\r\n\r\n}catch(e){}\r\n\r\n}\r\n\r\nmicSource=\r\naudioContext.createMediaStreamSource(\r\nmicStream\r\n);\r\n\r\n\r\n\/* Micro vers mixeur *\/\r\n\r\nmicSource.connect(\r\nmasterGain\r\n);\r\n\r\n\r\n\/* Micro direct vers voix seule *\/\r\n\r\nmicSource.connect(\r\nmicDestination\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-record-status\"\r\n).textContent=\r\n\"\ud83c\udf99\ufe0f Microphone activ\u00e9.\";\r\n\r\n}catch(error){\r\n\r\nalert(\r\n\"Impossible d'acc\u00e9der au microphone : \"+\r\nerror.message\r\n);\r\n\r\n}\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-mic\"\r\n).addEventListener(\r\n\"click\",\r\nenableMicrophone\r\n);\r\n\r\n\r\n\/* ============================================================\r\n DETECTER TYPE MEDIA\r\n============================================================ *\/\r\n\r\nfunction detectMediaType(\r\nfileOrUrl,\r\nmime\r\n){\r\n\r\nif(\r\nmime &&\r\nmime.startsWith(\r\n\"audio\/\"\r\n)\r\n){\r\n\r\nreturn \"audio\";\r\n\r\n}\r\n\r\nif(\r\nmime &&\r\nmime.startsWith(\r\n\"video\/\"\r\n)\r\n){\r\n\r\nreturn \"video\";\r\n\r\n}\r\n\r\nlet value=\r\nString(\r\nfileOrUrl\r\n).toLowerCase();\r\n\r\nif(\r\nvalue.match(\r\n\/\\.(mp3|wav|ogg|m4a|aac|flac)(\\?|$)\/\r\n)\r\n){\r\n\r\nreturn \"audio\";\r\n\r\n}\r\n\r\nreturn \"video\";\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n IMPORT FICHIERS\r\n============================================================ *\/\r\n\r\nfunction addImportedFile(\r\nfile\r\n){\r\n\r\nlet url=\r\nURL.createObjectURL(\r\nfile\r\n);\r\n\r\nlet type=\r\ndetectMediaType(\r\nfile.name,\r\nfile.type\r\n);\r\n\r\nlet item={\r\n\r\nname:\r\nfile.name,\r\n\r\nurl:\r\nurl,\r\n\r\ntype:\r\ntype,\r\n\r\nfile:\r\nfile,\r\n\r\nyoutube:false\r\n\r\n};\r\n\r\n\r\nif(\r\ntype===\"audio\"\r\n){\r\n\r\naudioPlaylist.push(\r\nitem\r\n);\r\n\r\nrenderAudioPlaylist();\r\n\r\nif(\r\ncurrentAudioIndex===-1\r\n){\r\n\r\nloadAudioTrack(\r\n0\r\n);\r\n\r\n}\r\n\r\n}else{\r\n\r\nvideoPlaylist.push(\r\nitem\r\n);\r\n\r\nrenderVideoPlaylist();\r\n\r\nif(\r\ncurrentVideoIndex===-1\r\n){\r\n\r\nloadVideoTrack(\r\n0\r\n);\r\n\r\n}\r\n\r\n}\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-files\"\r\n).addEventListener(\r\n\"change\",\r\nfunction(){\r\n\r\nArray.from(\r\nthis.files\r\n).forEach(\r\naddImportedFile\r\n);\r\n\r\nthis.value=\"\";\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n DRAG DROP GENERAL\r\n============================================================ *\/\r\n\r\nlet generalDrop=\r\ndocument.getElementById(\r\n\"k5-drop\"\r\n);\r\n\r\ngeneralDrop.addEventListener(\r\n\"dragover\",\r\nfunction(e){\r\n\r\ne.preventDefault();\r\n\r\ngeneralDrop.classList.add(\r\n\"drag\"\r\n);\r\n\r\n}\r\n);\r\n\r\ngeneralDrop.addEventListener(\r\n\"dragleave\",\r\nfunction(){\r\n\r\ngeneralDrop.classList.remove(\r\n\"drag\"\r\n);\r\n\r\n}\r\n);\r\n\r\ngeneralDrop.addEventListener(\r\n\"drop\",\r\nfunction(e){\r\n\r\ne.preventDefault();\r\n\r\ngeneralDrop.classList.remove(\r\n\"drag\"\r\n);\r\n\r\nArray.from(\r\ne.dataTransfer.files\r\n).forEach(\r\naddImportedFile\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n DRAG DROP VIDEO\r\n============================================================ *\/\r\n\r\nlet videoDrop=\r\ndocument.getElementById(\r\n\"k5-video-drop\"\r\n);\r\n\r\nvideoDrop.addEventListener(\r\n\"dragover\",\r\nfunction(e){\r\n\r\ne.preventDefault();\r\n\r\nvideoDrop.classList.add(\r\n\"drag\"\r\n);\r\n\r\n}\r\n);\r\n\r\nvideoDrop.addEventListener(\r\n\"dragleave\",\r\nfunction(){\r\n\r\nvideoDrop.classList.remove(\r\n\"drag\"\r\n);\r\n\r\n}\r\n);\r\n\r\nvideoDrop.addEventListener(\r\n\"drop\",\r\nfunction(e){\r\n\r\ne.preventDefault();\r\n\r\nvideoDrop.classList.remove(\r\n\"drag\"\r\n);\r\n\r\nArray.from(\r\ne.dataTransfer.files\r\n).forEach(\r\nfunction(file){\r\n\r\nif(\r\nfile.type.startsWith(\r\n\"video\/\"\r\n)\r\n){\r\n\r\nlet url=\r\nURL.createObjectURL(\r\nfile\r\n);\r\n\r\nvideoPlaylist.push({\r\n\r\nname:\r\nfile.name,\r\n\r\nurl:\r\nurl,\r\n\r\ntype:\r\n\"video\",\r\n\r\nfile:\r\nfile,\r\n\r\nyoutube:false\r\n\r\n});\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\nrenderVideoPlaylist();\r\n\r\nif(\r\ncurrentVideoIndex===-1 &&\r\nvideoPlaylist.length\r\n){\r\n\r\nloadVideoTrack(\r\n0\r\n);\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n URL DIRECTE GENERAL\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-add-url\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet url=\r\ndocument.getElementById(\r\n\"k5-url\"\r\n).value.trim();\r\n\r\nif(!url)\r\nreturn;\r\n\r\nlet type=\r\ndetectMediaType(\r\nurl\r\n);\r\n\r\nlet item={\r\n\r\nname:\r\nurl.split(\"\/\").pop() ||\r\n\"Media URL\",\r\n\r\nurl:\r\nurl,\r\n\r\ntype:\r\ntype,\r\n\r\nyoutube:false\r\n\r\n};\r\n\r\nif(\r\ntype===\"audio\"\r\n){\r\n\r\naudioPlaylist.push(\r\nitem\r\n);\r\n\r\nrenderAudioPlaylist();\r\n\r\nif(\r\ncurrentAudioIndex===-1\r\n){\r\n\r\nloadAudioTrack(\r\n0\r\n);\r\n\r\n}\r\n\r\n}else{\r\n\r\nvideoPlaylist.push(\r\nitem\r\n);\r\n\r\nrenderVideoPlaylist();\r\n\r\nif(\r\ncurrentVideoIndex===-1\r\n){\r\n\r\nloadVideoTrack(\r\n0\r\n);\r\n\r\n}\r\n\r\n}\r\n\r\ndocument.getElementById(\r\n\"k5-url\"\r\n).value=\"\";\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n URL VIDEO\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-add-video-url\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet url=\r\ndocument.getElementById(\r\n\"k5-video-url\"\r\n).value.trim();\r\n\r\nif(!url)\r\nreturn;\r\n\r\nvideoPlaylist.push({\r\n\r\nname:\r\nurl.split(\"\/\").pop() ||\r\n\"Vid\u00e9o URL\",\r\n\r\nurl:\r\nurl,\r\n\r\ntype:\r\n\"video\",\r\n\r\nyoutube:false\r\n\r\n});\r\n\r\nrenderVideoPlaylist();\r\n\r\nif(\r\ncurrentVideoIndex===-1\r\n){\r\n\r\nloadVideoTrack(\r\n0\r\n);\r\n\r\n}\r\n\r\ndocument.getElementById(\r\n\"k5-video-url\"\r\n).value=\"\";\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n YOUTUBE ID\r\n============================================================ *\/\r\n\r\nfunction getYouTubeId(\r\nurl\r\n){\r\n\r\nlet match=\r\nurl.match(\r\n\/(?:youtube\\.com\\\/watch\\?v=|youtu\\.be\\\/|youtube\\.com\\\/embed\\\/)([^&?\/]+)\/\r\n);\r\n\r\nreturn match?\r\nmatch[1]:\r\nnull;\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n YOUTUBE IMPORT PAGE PRINCIPALE\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-add-youtube\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet url=\r\ndocument.getElementById(\r\n\"k5-youtube-url\"\r\n).value.trim();\r\n\r\nlet id=\r\ngetYouTubeId(\r\nurl\r\n);\r\n\r\nif(!id){\r\n\r\nalert(\r\n\"URL YouTube non reconnue.\"\r\n);\r\n\r\nreturn;\r\n\r\n}\r\n\r\ndocument.getElementById(\r\n\"k5-youtube-container\"\r\n).innerHTML=\r\n\r\n'<div class=\"k5-youtube\">'+\r\n\r\n'<iframe src=\"https:\/\/www.youtube.com\/embed\/'+\r\nid+\r\n'?enablejsapi=1\" '+\r\n'allow=\"autoplay; encrypted-media; picture-in-picture\" '+\r\n'allowfullscreen><\/iframe>'+\r\n\r\n'<\/div>';\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n YOUTUBE AJOUT PLAYLIST\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-add-video-youtube\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet url=\r\ndocument.getElementById(\r\n\"k5-video-youtube-url\"\r\n).value.trim();\r\n\r\nlet id=\r\ngetYouTubeId(\r\nurl\r\n);\r\n\r\nif(!id){\r\n\r\nalert(\r\n\"URL YouTube non reconnue.\"\r\n);\r\n\r\nreturn;\r\n\r\n}\r\n\r\nvideoPlaylist.push({\r\n\r\nname:\r\n\"YouTube - \"+\r\nid,\r\n\r\nurl:\r\nurl,\r\n\r\nyoutubeId:\r\nid,\r\n\r\ntype:\r\n\"youtube\",\r\n\r\nyoutube:true\r\n\r\n});\r\n\r\nrenderVideoPlaylist();\r\n\r\ndocument.getElementById(\r\n\"k5-video-youtube-url\"\r\n).value=\"\";\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n CHARGER AUDIO\r\n============================================================ *\/\r\n\r\nfunction loadAudioTrack(\r\nindex\r\n){\r\n\r\nif(\r\nindex<0 ||\r\nindex>=audioPlaylist.length\r\n)\r\nreturn;\r\n\r\ncurrentAudioIndex=\r\nindex;\r\n\r\nlet track=\r\naudioPlaylist[index];\r\n\r\nif(media){\r\n\r\ntry{\r\n\r\nmedia.pause();\r\n\r\n}catch(e){}\r\n\r\n}\r\n\r\nlet player=\r\ndocument.getElementById(\r\n\"k5-player\"\r\n);\r\n\r\nplayer.innerHTML=\"\";\r\n\r\nmedia=\r\ndocument.createElement(\r\n\"audio\"\r\n);\r\n\r\nmedia.controls=\r\ntrue;\r\n\r\nmedia.crossOrigin=\r\n\"anonymous\";\r\n\r\nmedia.preload=\r\n\"auto\";\r\n\r\nmedia.src=\r\ntrack.url;\r\n\r\nplayer.appendChild(\r\nmedia\r\n);\r\n\r\nmedia.addEventListener(\r\n\"loadedmetadata\",\r\nfunction(){\r\n\r\nconnectMedia();\r\n\r\n}\r\n);\r\n\r\n\r\nmedia.addEventListener(\r\n\"timeupdate\",\r\nupdateProgress\r\n);\r\n\r\n\r\nmedia.addEventListener(\r\n\"ended\",\r\nfunction(){\r\n\r\nif(\r\naudioLoop\r\n)\r\nreturn;\r\n\r\nif(\r\ncurrentAudioIndex<\r\naudioPlaylist.length-1\r\n){\r\n\r\nnextAudio();\r\n\r\n}else if(\r\naudioPlaylistLoop\r\n){\r\n\r\nloadAudioTrack(\r\n0\r\n);\r\n\r\nplayMedia();\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\nmedia.addEventListener(\r\n\"timeupdate\",\r\ncheckAB\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-status\"\r\n).textContent=\r\n\"\ud83c\udfb5 \"+\r\ntrack.name;\r\n\r\nrenderAudioPlaylist();\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n CHARGER VIDEO\r\n============================================================ *\/\r\n\r\nfunction loadVideoTrack(\r\nindex\r\n){\r\n\r\nif(\r\nindex<0 ||\r\nindex>=videoPlaylist.length\r\n)\r\nreturn;\r\n\r\ncurrentVideoIndex=\r\nindex;\r\n\r\nlet track=\r\nvideoPlaylist[index];\r\n\r\nif(track.youtube){\r\n\r\nloadYouTubeVideo(\r\ntrack\r\n);\r\n\r\nreturn;\r\n\r\n}\r\n\r\nif(media){\r\n\r\ntry{\r\n\r\nmedia.pause();\r\n\r\n}catch(e){}\r\n\r\n}\r\n\r\nlet player=\r\ndocument.getElementById(\r\n\"k5-player\"\r\n);\r\n\r\nplayer.innerHTML=\"\";\r\n\r\nmedia=\r\ndocument.createElement(\r\n\"video\"\r\n);\r\n\r\nmedia.controls=\r\ntrue;\r\n\r\nmedia.crossOrigin=\r\n\"anonymous\";\r\n\r\nmedia.preload=\r\n\"auto\";\r\n\r\nmedia.playsInline=\r\ntrue;\r\n\r\nmedia.src=\r\ntrack.url;\r\n\r\nplayer.appendChild(\r\nmedia\r\n);\r\n\r\nmedia.addEventListener(\r\n\"loadedmetadata\",\r\nfunction(){\r\n\r\nconnectMedia();\r\n\r\n}\r\n);\r\n\r\nmedia.addEventListener(\r\n\"timeupdate\",\r\nupdateProgress\r\n);\r\n\r\nmedia.addEventListener(\r\n\"timeupdate\",\r\ncheckAB\r\n);\r\n\r\nmedia.addEventListener(\r\n\"ended\",\r\nfunction(){\r\n\r\nif(\r\nvideoLoop\r\n)\r\nreturn;\r\n\r\nnextVideo();\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-status\"\r\n).textContent=\r\n\"\ud83c\udfac \"+\r\ntrack.name;\r\n\r\nrenderVideoPlaylist();\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n YOUTUBE PLAYER\r\n============================================================ *\/\r\n\r\nfunction loadYouTubeVideo(\r\ntrack\r\n){\r\n\r\nlet player=\r\ndocument.getElementById(\r\n\"k5-player\"\r\n);\r\n\r\nplayer.innerHTML=\r\n\r\n'<div class=\"k5-youtube\">'+\r\n\r\n'<iframe src=\"https:\/\/www.youtube.com\/embed\/'+\r\ntrack.youtubeId+\r\n'?enablejsapi=1\" '+\r\n'allow=\"autoplay; encrypted-media; picture-in-picture\" '+\r\n'allowfullscreen><\/iframe>'+\r\n\r\n'<\/div>';\r\n\r\nmedia=\r\nnull;\r\n\r\ndocument.getElementById(\r\n\"k5-status\"\r\n).textContent=\r\n\"\ud83d\udcfa \"+\r\ntrack.name+\r\n\" \u2014 YouTube\";\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n PLAY\r\n============================================================ *\/\r\n\r\nfunction playMedia(){\r\n\r\nif(!media)\r\nreturn;\r\n\r\ninitAudio();\r\n\r\nif(\r\naudioContext.state===\r\n\"suspended\"\r\n){\r\n\r\naudioContext.resume();\r\n\r\n}\r\n\r\nmedia.play()\r\n.catch(\r\nfunction(error){\r\n\r\nconsole.log(\r\nerror\r\n);\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-play\"\r\n).addEventListener(\r\n\"click\",\r\nplayMedia\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-pause\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(media)\r\nmedia.pause();\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-stop\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(media){\r\n\r\nmedia.pause();\r\n\r\nmedia.currentTime=\r\n0;\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-back\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(media){\r\n\r\nmedia.currentTime=\r\nMath.max(\r\n0,\r\nmedia.currentTime-10\r\n);\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-forward\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(media){\r\n\r\nmedia.currentTime+=10;\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n VITESSE\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-speed\"\r\n).addEventListener(\r\n\"change\",\r\nfunction(){\r\n\r\nif(media){\r\n\r\nmedia.playbackRate=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n PROGRESSION\r\n============================================================ *\/\r\n\r\nfunction updateProgress(){\r\n\r\nif(\r\n!media ||\r\n!media.duration\r\n)\r\nreturn;\r\n\r\nlet percent=\r\nmedia.currentTime\/\r\nmedia.duration*\r\n100;\r\n\r\ndocument.getElementById(\r\n\"k5-progress-bar\"\r\n).style.width=\r\npercent+\r\n\"%\";\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n PLAYLIST AUDIO\r\n============================================================ *\/\r\n\r\nfunction renderAudioPlaylist(){\r\n\r\nlet list=\r\ndocument.getElementById(\r\n\"k5-audio-list\"\r\n);\r\n\r\nlist.innerHTML=\"\";\r\n\r\nif(\r\n!audioPlaylist.length\r\n){\r\n\r\nlist.textContent=\r\n\"Aucun fichier audio.\";\r\n\r\nreturn;\r\n\r\n}\r\n\r\naudioPlaylist.forEach(\r\nfunction(track,index){\r\n\r\nlet item=\r\ndocument.createElement(\r\n\"div\"\r\n);\r\n\r\nitem.className=\r\n\"k5-track\"+\r\n(\r\nindex===currentAudioIndex?\r\n\" current\":\r\n\"\"\r\n);\r\n\r\nitem.innerHTML=\r\n\r\n'<span class=\"k5-track-name\">'+\r\ntrack.name+\r\n'<\/span>'+\r\n\r\n'<span class=\"k5-video-badge\">'+\r\n\"Audio\"+\r\n'<\/span>';\r\n\r\nitem.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nloadAudioTrack(\r\nindex\r\n);\r\n\r\nplayMedia();\r\n\r\n}\r\n);\r\n\r\nlist.appendChild(\r\nitem\r\n);\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\nfunction nextAudio(){\r\n\r\nif(\r\n!audioPlaylist.length\r\n)\r\nreturn;\r\n\r\nlet next;\r\n\r\nif(\r\naudioShuffle\r\n){\r\n\r\nnext=\r\nMath.floor(\r\nMath.random()*\r\naudioPlaylist.length\r\n);\r\n\r\n}else{\r\n\r\nnext=\r\ncurrentAudioIndex+1;\r\n\r\n}\r\n\r\nif(\r\nnext>=audioPlaylist.length\r\n){\r\n\r\nif(\r\naudioPlaylistLoop\r\n){\r\n\r\nnext=0;\r\n\r\n}else{\r\n\r\nreturn;\r\n\r\n}\r\n\r\n}\r\n\r\nloadAudioTrack(\r\nnext\r\n);\r\n\r\nplayMedia();\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-audio-next\"\r\n).addEventListener(\r\n\"click\",\r\nnextAudio\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-audio-prev\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet previous=\r\ncurrentAudioIndex-1;\r\n\r\nif(\r\nprevious<0\r\n){\r\n\r\nprevious=\r\naudioPlaylist.length-1;\r\n\r\n}\r\n\r\nloadAudioTrack(\r\nprevious\r\n);\r\n\r\nplayMedia();\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-audio-loop\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\naudioLoop=\r\n!audioLoop;\r\n\r\nif(media)\r\nmedia.loop=\r\naudioLoop;\r\n\r\nthis.textContent=\r\n\"\ud83d\udd01 Morceau \"+\r\n(\r\naudioLoop?\r\n\"ON\":\r\n\"OFF\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-audio-playlist-loop\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\naudioPlaylistLoop=\r\n!audioPlaylistLoop;\r\n\r\nthis.textContent=\r\n\"\ud83d\udd01 Playlist \"+\r\n(\r\naudioPlaylistLoop?\r\n\"ON\":\r\n\"OFF\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-audio-shuffle\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\naudioShuffle=\r\n!audioShuffle;\r\n\r\nthis.textContent=\r\n\"\ud83d\udd00 Al\u00e9atoire \"+\r\n(\r\naudioShuffle?\r\n\"ON\":\r\n\"OFF\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n PLAYLIST VIDEO\r\n============================================================ *\/\r\n\r\nfunction renderVideoPlaylist(){\r\n\r\nlet list=\r\ndocument.getElementById(\r\n\"k5-video-list\"\r\n);\r\n\r\nlist.innerHTML=\"\";\r\n\r\nif(\r\n!videoPlaylist.length\r\n){\r\n\r\nlist.textContent=\r\n\"Aucune vid\u00e9o.\";\r\n\r\nreturn;\r\n\r\n}\r\n\r\nvideoPlaylist.forEach(\r\nfunction(track,index){\r\n\r\nlet item=\r\ndocument.createElement(\r\n\"div\"\r\n);\r\n\r\nitem.className=\r\n\"k5-track\"+\r\n(\r\nindex===currentVideoIndex?\r\n\" current\":\r\n\"\"\r\n);\r\n\r\nlet type=\r\ntrack.youtube?\r\n\"YouTube\":\r\n\"Vid\u00e9o\";\r\n\r\nitem.innerHTML=\r\n\r\n'<span class=\"k5-track-name\">'+\r\ntrack.name+\r\n'<\/span>'+\r\n\r\n'<span class=\"k5-video-badge\">'+\r\ntype+\r\n'<\/span>';\r\n\r\nitem.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nloadVideoTrack(\r\nindex\r\n);\r\n\r\nif(\r\n!track.youtube\r\n){\r\n\r\nplayMedia();\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\nlist.appendChild(\r\nitem\r\n);\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\nfunction nextVideo(){\r\n\r\nif(\r\n!videoPlaylist.length\r\n)\r\nreturn;\r\n\r\nlet next;\r\n\r\nif(\r\nvideoShuffle\r\n){\r\n\r\nnext=\r\nMath.floor(\r\nMath.random()*\r\nvideoPlaylist.length\r\n);\r\n\r\n}else{\r\n\r\nnext=\r\ncurrentVideoIndex+1;\r\n\r\n}\r\n\r\nif(\r\nnext>=videoPlaylist.length\r\n){\r\n\r\nnext=0;\r\n\r\n}\r\n\r\nloadVideoTrack(\r\nnext\r\n);\r\n\r\nif(\r\n!videoPlaylist[next].youtube\r\n){\r\n\r\nplayMedia();\r\n\r\n}\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-video-next\"\r\n).addEventListener(\r\n\"click\",\r\nnextVideo\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-video-prev\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet previous=\r\ncurrentVideoIndex-1;\r\n\r\nif(\r\nprevious<0\r\n){\r\n\r\nprevious=\r\nvideoPlaylist.length-1;\r\n\r\n}\r\n\r\nloadVideoTrack(\r\nprevious\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-video-loop\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nvideoLoop=\r\n!videoLoop;\r\n\r\nif(media)\r\nmedia.loop=\r\nvideoLoop;\r\n\r\nthis.textContent=\r\n\"\ud83d\udd01 Boucle \"+\r\n(\r\nvideoLoop?\r\n\"ON\":\r\n\"OFF\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-video-shuffle\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nvideoShuffle=\r\n!videoShuffle;\r\n\r\nthis.textContent=\r\n\"\ud83d\udd00 Al\u00e9atoire \"+\r\n(\r\nvideoShuffle?\r\n\"ON\":\r\n\"OFF\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\/* ============================================================\r\n LECTEUR PLAYLIST VIDEO \u2014 EXTENSION\r\n Se connecte au syst\u00e8me videoPlaylist existant\r\n============================================================ *\/\r\n\r\n(function(){\r\n\r\n\"use strict\";\r\n\r\n\r\n\/* ============================================================\r\n ELEMENTS DU NOUVEAU LECTEUR\r\n============================================================ *\/\r\n\r\nconst playlistVideo=\r\ndocument.getElementById(\r\n\"k5-video-playlist-html5\"\r\n);\r\n\r\nconst playlistYoutube=\r\ndocument.getElementById(\r\n\"k5-video-playlist-youtube\"\r\n);\r\n\r\nconst playlistEmpty=\r\ndocument.getElementById(\r\n\"k5-video-playlist-empty\"\r\n);\r\n\r\nconst playlistTitle=\r\ndocument.getElementById(\r\n\"k5-video-playlist-current\"\r\n);\r\n\r\nconst playlistPosition=\r\ndocument.getElementById(\r\n\"k5-video-playlist-position\"\r\n);\r\n\r\nconst playlistPlay=\r\ndocument.getElementById(\r\n\"k5-video-player-play\"\r\n);\r\n\r\nconst playlistPause=\r\ndocument.getElementById(\r\n\"k5-video-player-pause\"\r\n);\r\n\r\nconst playlistPrev=\r\ndocument.getElementById(\r\n\"k5-video-player-prev\"\r\n);\r\n\r\nconst playlistNext=\r\ndocument.getElementById(\r\n\"k5-video-player-next\"\r\n);\r\n\r\nconst playlistAuto=\r\ndocument.getElementById(\r\n\"k5-video-player-auto\"\r\n);\r\n\r\n\r\n\/* ============================================================\r\n LECTURE AUTOMATIQUE\r\n============================================================ *\/\r\n\r\nlet playlistAutoPlay=\r\nfalse;\r\n\r\n\r\n\/* ============================================================\r\n AFFICHER INFOS\r\n============================================================ *\/\r\n\r\nfunction updatePlaylistInfo(){\r\n\r\nif(\r\ntypeof videoPlaylist===\"undefined\" ||\r\n!videoPlaylist.length\r\n){\r\n\r\nplaylistTitle.textContent=\r\n\"Aucune vid\u00e9o s\u00e9lectionn\u00e9e\";\r\n\r\nplaylistPosition.textContent=\r\n\"0 \/ 0\";\r\n\r\nreturn;\r\n\r\n}\r\n\r\n\r\nlet track=\r\nvideoPlaylist[currentVideoIndex];\r\n\r\nif(!track)\r\nreturn;\r\n\r\n\r\nplaylistTitle.textContent=\r\ntrack.name ||\r\n\"Vid\u00e9o\";\r\n\r\n\r\nplaylistPosition.textContent=\r\n(\r\ncurrentVideoIndex+1\r\n)+\r\n\" \/ \"+\r\nvideoPlaylist.length;\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n AFFICHER VIDEO LOCALE \/ MP4 \/ WEBM\r\n============================================================ *\/\r\n\r\nfunction showHTML5Video(\r\ntrack,\r\nautoPlay\r\n){\r\n\r\nif(!playlistVideo)\r\nreturn;\r\n\r\n\r\n\/* Cacher YouTube *\/\r\n\r\nplaylistYoutube.style.display=\r\n\"none\";\r\n\r\nplaylistYoutube.src=\r\n\"\";\r\n\r\n\r\n\/* Cacher message *\/\r\n\r\nplaylistEmpty.style.display=\r\n\"none\";\r\n\r\n\r\n\/* Afficher lecteur *\/\r\n\r\nplaylistVideo.style.display=\r\n\"block\";\r\n\r\n\r\n\/* Arr\u00eater ancienne vid\u00e9o *\/\r\n\r\ntry{\r\n\r\nplaylistVideo.pause();\r\n\r\n}catch(e){}\r\n\r\n\r\n\/* Charger nouvelle vid\u00e9o *\/\r\n\r\nplaylistVideo.src=\r\ntrack.url;\r\n\r\nplaylistVideo.load();\r\n\r\n\r\nupdatePlaylistInfo();\r\n\r\n\r\n\/* Lecture automatique *\/\r\n\r\nif(autoPlay){\r\n\r\nlet promise=\r\nplaylistVideo.play();\r\n\r\nif(\r\npromise &&\r\npromise.catch\r\n){\r\n\r\npromise.catch(\r\nfunction(error){\r\n\r\nconsole.warn(\r\n\"Lecture automatique bloqu\u00e9e par le navigateur\",\r\nerror\r\n);\r\n\r\n});\r\n\r\n}\r\n\r\n}\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n AFFICHER YOUTUBE\r\n============================================================ *\/\r\n\r\nfunction showYouTubeVideo(\r\ntrack,\r\nautoPlay\r\n){\r\n\r\nif(!playlistYoutube)\r\nreturn;\r\n\r\n\r\n\/* Cacher lecteur HTML5 *\/\r\n\r\nplaylistVideo.style.display=\r\n\"none\";\r\n\r\ntry{\r\n\r\nplaylistVideo.pause();\r\n\r\n}catch(e){}\r\n\r\nplaylistVideo.removeAttribute(\r\n\"src\"\r\n);\r\n\r\n\r\n\/* Afficher iframe *\/\r\n\r\nplaylistYoutube.style.display=\r\n\"block\";\r\n\r\n\r\nplaylistEmpty.style.display=\r\n\"none\";\r\n\r\n\r\nlet autoplay=\r\nautoPlay?\r\n\"1\":\r\n\"0\";\r\n\r\n\r\nplaylistYoutube.src=\r\n\"https:\/\/www.youtube.com\/embed\/\"+\r\ntrack.youtubeId+\r\n\"?autoplay=\"+\r\nautoplay+\r\n\"&enablejsapi=1\"+\r\n\"&rel=0\";\r\n\r\n\r\nupdatePlaylistInfo();\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n CHARGER LA VIDEO SELECTIONNEE\r\n============================================================ *\/\r\n\r\nfunction loadPlaylistVideoPlayer(\r\nindex,\r\nautoPlay\r\n){\r\n\r\nif(\r\ntypeof videoPlaylist===\"undefined\"\r\n)\r\nreturn;\r\n\r\n\r\nif(\r\nindex<0 ||\r\nindex>=videoPlaylist.length\r\n)\r\nreturn;\r\n\r\n\r\nlet track=\r\nvideoPlaylist[index];\r\n\r\nif(!track)\r\nreturn;\r\n\r\n\r\n\/* Mettre \u00e0 jour l'index global *\/\r\n\r\ncurrentVideoIndex=\r\nindex;\r\n\r\n\r\n\/* Afficher selon le type *\/\r\n\r\nif(\r\ntrack.youtube===true ||\r\ntrack.type===\"youtube\"\r\n){\r\n\r\nshowYouTubeVideo(\r\ntrack,\r\nautoPlay\r\n);\r\n\r\n}else{\r\n\r\nshowHTML5Video(\r\ntrack,\r\nautoPlay\r\n);\r\n\r\n}\r\n\r\n\r\n\/* Mise \u00e0 jour informations *\/\r\n\r\nupdatePlaylistInfo();\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n BOUTON LECTURE\r\n============================================================ *\/\r\n\r\nif(playlistPlay){\r\n\r\nplaylistPlay.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(\r\ntypeof videoPlaylist===\"undefined\" ||\r\n!videoPlaylist.length\r\n)\r\nreturn;\r\n\r\n\r\nif(\r\ncurrentVideoIndex<0\r\n){\r\n\r\nloadPlaylistVideoPlayer(\r\n0,\r\ntrue\r\n);\r\n\r\nreturn;\r\n\r\n}\r\n\r\n\r\n\/* YouTube *\/\r\n\r\nlet track=\r\nvideoPlaylist[\r\ncurrentVideoIndex\r\n];\r\n\r\nif(\r\ntrack.youtube\r\n){\r\n\r\nplaylistYoutube.src=\r\n\"https:\/\/www.youtube.com\/embed\/\"+\r\ntrack.youtubeId+\r\n\"?autoplay=1\"+\r\n\"&enablejsapi=1\"+\r\n\"&rel=0\";\r\n\r\nreturn;\r\n\r\n}\r\n\r\n\r\n\/* Vid\u00e9o HTML5 *\/\r\n\r\nif(\r\nplaylistVideo\r\n){\r\n\r\nplaylistVideo.play()\r\n.catch(\r\nfunction(error){\r\n\r\nconsole.warn(\r\nerror\r\n);\r\n\r\n});\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n BOUTON PAUSE\r\n============================================================ *\/\r\n\r\nif(playlistPause){\r\n\r\nplaylistPause.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(playlistVideo){\r\n\r\nplaylistVideo.pause();\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n PRECEDENTE\r\n============================================================ *\/\r\n\r\nif(playlistPrev){\r\n\r\nplaylistPrev.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(\r\ntypeof videoPlaylist===\"undefined\" ||\r\n!videoPlaylist.length\r\n)\r\nreturn;\r\n\r\n\r\nlet previous=\r\ncurrentVideoIndex-1;\r\n\r\n\r\nif(\r\nprevious<0\r\n){\r\n\r\nprevious=\r\nvideoPlaylist.length-1;\r\n\r\n}\r\n\r\n\r\nloadPlaylistVideoPlayer(\r\nprevious,\r\ntrue\r\n);\r\n\r\nrenderVideoPlaylist();\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n SUIVANTE\r\n============================================================ *\/\r\n\r\nif(playlistNext){\r\n\r\nplaylistNext.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(\r\ntypeof videoPlaylist===\"undefined\" ||\r\n!videoPlaylist.length\r\n)\r\nreturn;\r\n\r\n\r\nlet next=\r\ncurrentVideoIndex+1;\r\n\r\n\r\nif(\r\nnext>=videoPlaylist.length\r\n){\r\n\r\nnext=0;\r\n\r\n}\r\n\r\n\r\nloadPlaylistVideoPlayer(\r\nnext,\r\ntrue\r\n);\r\n\r\nrenderVideoPlaylist();\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n LECTURE AUTOMATIQUE\r\n============================================================ *\/\r\n\r\nif(playlistAuto){\r\n\r\nplaylistAuto.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nplaylistAutoPlay=\r\n!playlistAutoPlay;\r\n\r\n\r\nthis.textContent=\r\nplaylistAutoPlay?\r\n\"\u25b6\ufe0f Auto ON\":\r\n\"\u25b6\ufe0f Auto OFF\";\r\n\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n FIN VIDEO HTML5\r\n============================================================ *\/\r\n\r\nif(playlistVideo){\r\n\r\nplaylistVideo.addEventListener(\r\n\"ended\",\r\nfunction(){\r\n\r\n\/* Boucle vid\u00e9o *\/\r\n\r\nif(\r\nvideoLoop\r\n){\r\n\r\nplaylistVideo.currentTime=\r\n0;\r\n\r\nplaylistVideo.play();\r\n\r\nreturn;\r\n\r\n}\r\n\r\n\r\n\/* Lecture automatique d\u00e9sactiv\u00e9e *\/\r\n\r\nif(\r\n!playlistAutoPlay\r\n){\r\n\r\nreturn;\r\n\r\n}\r\n\r\n\r\n\/* Passer \u00e0 la suivante *\/\r\n\r\nif(\r\ntypeof videoPlaylist===\"undefined\" ||\r\n!videoPlaylist.length\r\n)\r\nreturn;\r\n\r\n\r\nlet next=\r\ncurrentVideoIndex+1;\r\n\r\n\r\n\/* Fin playlist *\/\r\n\r\nif(\r\nnext>=videoPlaylist.length\r\n){\r\n\r\nif(\r\nvideoLoop\r\n){\r\n\r\nnext=0;\r\n\r\n}else{\r\n\r\nreturn;\r\n\r\n}\r\n\r\n}\r\n\r\n\r\nloadPlaylistVideoPlayer(\r\nnext,\r\ntrue\r\n);\r\n\r\nrenderVideoPlaylist();\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n SURVEILLER LA PLAYLIST EXISTANTE\r\n============================================================ *\/\r\n\r\nlet oldLoadVideoTrack=\r\nwindow.loadVideoTrack;\r\n\r\n\r\n\/*\r\n Important :\r\n La fonction loadVideoTrack de ton code est\r\n dans le m\u00eame script global.\r\n On \u00e9coute les clics sur la playlist pour\r\n synchroniser le nouveau lecteur.\r\n*\/\r\n\r\n\r\ndocument.addEventListener(\r\n\"click\",\r\nfunction(event){\r\n\r\nlet item=\r\nevent.target.closest(\r\n\"#k5-video-list .k5-track\"\r\n);\r\n\r\nif(!item)\r\nreturn;\r\n\r\n\r\nlet items=\r\nArray.from(\r\ndocument.querySelectorAll(\r\n\"#k5-video-list .k5-track\"\r\n)\r\n);\r\n\r\n\r\nlet index=\r\nitems.indexOf(\r\nitem\r\n);\r\n\r\n\r\nif(\r\nindex<0\r\n)\r\nreturn;\r\n\r\n\r\n\/* Attendre que le syst\u00e8me principal\r\n   ait mis \u00e0 jour currentVideoIndex *\/\r\n\r\nsetTimeout(\r\nfunction(){\r\n\r\nloadPlaylistVideoPlayer(\r\ncurrentVideoIndex>=0?\r\ncurrentVideoIndex:\r\nindex,\r\nfalse\r\n);\r\n\r\n},\r\n50\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n SYNCHRONISATION INITIALE\r\n============================================================ *\/\r\n\r\nsetTimeout(\r\nfunction(){\r\n\r\nif(\r\ntypeof videoPlaylist!==\"undefined\" &&\r\nvideoPlaylist.length &&\r\ncurrentVideoIndex>=0\r\n){\r\n\r\nloadPlaylistVideoPlayer(\r\ncurrentVideoIndex,\r\nfalse\r\n);\r\n\r\n}\r\n\r\n},\r\n300\r\n);\r\n\r\n\r\n})();\r\n\r\n\r\n\/* ============================================================\r\n BOUCLE A-B\r\n============================================================ *\/\r\n\r\nfunction checkAB(){\r\n\r\nif(\r\n!media ||\r\n!loopAB\r\n)\r\nreturn;\r\n\r\nif(\r\nmedia.currentTime>=loopB\r\n){\r\n\r\nmedia.currentTime=\r\nloopA;\r\n\r\n}\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-set-a\"\r\n)?.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(media){\r\n\r\nloopA=\r\nmedia.currentTime;\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-set-b\"\r\n)?.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(media){\r\n\r\nloopB=\r\nmedia.currentTime;\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n MIXER\r\n============================================================ *\/\r\n\r\nfunction bindInput(\r\nid,\r\ncallback\r\n){\r\n\r\nlet el=\r\ndocument.getElementById(\r\nid\r\n);\r\n\r\nif(el){\r\n\r\nel.addEventListener(\r\n\"input\",\r\ncallback\r\n);\r\n\r\n}\r\n\r\n}\r\n\r\n\r\nbindInput(\r\n\"k5-master\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\nmasterGain.gain.value=\r\nthis.value\/100;\r\n\r\ndocument.getElementById(\r\n\"k5-master-val\"\r\n).textContent=\r\nthis.value+\r\n\"%\";\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-pan\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\npanNode.pan.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-voice-gain\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\nmasterGain.gain.value=\r\nthis.value\/100;\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-bass\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\nlowNode.gain.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-bass-freq\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\nlowNode.frequency.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-low\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\nlowNode.gain.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-mid\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\nmidNode.gain.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-high\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\nhighNode.gain.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-comp-threshold\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\ncompressor.threshold.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-comp-ratio\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\ncompressor.ratio.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-delay\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\ndelayGain.gain.value=\r\nparseFloat(\r\nthis.value\r\n)\/\r\n100;\r\n\r\n}\r\n);\r\n\r\n\r\nbindInput(\r\n\"k5-delay-time\",\r\nfunction(){\r\n\r\ninitAudio();\r\n\r\ndelayNode.delayTime.value=\r\nparseFloat(\r\nthis.value\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n VUMETRE\r\n============================================================ *\/\r\n\r\nfunction meter(){\r\n\r\nif(\r\nanalyser\r\n){\r\n\r\nlet data=\r\nnew Uint8Array(\r\nanalyser.frequencyBinCount\r\n);\r\n\r\nanalyser.getByteTimeDomainData(\r\ndata\r\n);\r\n\r\nlet max=0;\r\n\r\nfor(\r\nlet i=0;\r\ni<data.length;\r\ni++\r\n){\r\n\r\nlet value=\r\nMath.abs(\r\ndata[i]-128\r\n);\r\n\r\nif(\r\nvalue>max\r\n)\r\nmax=value;\r\n\r\n}\r\n\r\ndocument.getElementById(\r\n\"k5-meter-bar\"\r\n).style.width=\r\nMath.min(\r\n100,\r\nmax\/128*100\r\n)+\r\n\"%\";\r\n\r\n}\r\n\r\nrequestAnimationFrame(\r\nmeter\r\n);\r\n\r\n}\r\n\r\nmeter();\r\n\r\n\r\n\/* ============================================================\r\n MODES ENREGISTREMENT\r\n============================================================ *\/\r\n\r\ndocument.querySelectorAll(\r\n\"#KARAOKE_ULTIMATE_V5 .k5-mode\"\r\n).forEach(\r\nfunction(mode){\r\n\r\nmode.addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\ndocument.querySelectorAll(\r\n\"#KARAOKE_ULTIMATE_V5 .k5-mode\"\r\n).forEach(\r\nfunction(m){\r\n\r\nm.classList.remove(\r\n\"selected\"\r\n);\r\n\r\n}\r\n);\r\n\r\nthis.classList.add(\r\n\"selected\"\r\n);\r\n\r\ncurrentMode=\r\nthis.dataset.mode;\r\n\r\n}\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n MICRO + MODE VOIX SEULE\r\n============================================================ *\/\r\n\r\nasync function prepareRecordingStream(){\r\n\r\nif(\r\n!micStream\r\n){\r\n\r\nawait enableMicrophone();\r\n\r\n}\r\n\r\nif(\r\n!micStream\r\n){\r\n\r\nreturn null;\r\n\r\n}\r\n\r\ninitAudio();\r\n\r\nif(\r\ncurrentMode===\r\n\"voice\"\r\n){\r\n\r\nreturn micDestination.stream;\r\n\r\n}\r\n\r\nreturn mixDestination.stream;\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n TIMER\r\n============================================================ *\/\r\n\r\nfunction startTimer(){\r\n\r\nrecordSeconds=\r\n0;\r\n\r\nclearInterval(\r\ntimerInterval\r\n);\r\n\r\ntimerInterval=\r\nsetInterval(\r\nfunction(){\r\n\r\nif(\r\n!isPaused\r\n){\r\n\r\nrecordSeconds++;\r\n\r\nlet minutes=\r\nString(\r\nMath.floor(\r\nrecordSeconds\/60\r\n)\r\n).padStart(\r\n2,\r\n\"0\"\r\n);\r\n\r\nlet seconds=\r\nString(\r\nrecordSeconds%60\r\n).padStart(\r\n2,\r\n\"0\"\r\n);\r\n\r\ndocument.getElementById(\r\n\"k5-timer\"\r\n).textContent=\r\nminutes+\r\n\":\"+\r\nseconds;\r\n\r\n}\r\n\r\n},\r\n1000\r\n);\r\n\r\n}\r\n\r\n\r\nfunction stopTimer(){\r\n\r\nclearInterval(\r\ntimerInterval\r\n);\r\n\r\n}\r\n\r\n\r\n\/* ============================================================\r\n START ENREGISTREMENT\r\n============================================================ *\/\r\n\r\nasync function startRecording(){\r\n\r\nlet stream=\r\nawait prepareRecordingStream();\r\n\r\nif(\r\n!stream\r\n)\r\nreturn;\r\n\r\nchunks=[];\r\n\r\nlet options={};\r\n\r\nif(\r\nMediaRecorder.isTypeSupported(\r\n\"audio\/webm;codecs=opus\"\r\n)\r\n){\r\n\r\noptions.mimeType=\r\n\"audio\/webm;codecs=opus\";\r\n\r\n}\r\n\r\ntry{\r\n\r\nrecorder=\r\nnew MediaRecorder(\r\nstream,\r\noptions\r\n);\r\n\r\n}catch(error){\r\n\r\nalert(\r\n\"MediaRecorder indisponible : \"+\r\nerror.message\r\n);\r\n\r\nreturn;\r\n\r\n}\r\n\r\n\r\nrecorder.ondataavailable=\r\nfunction(event){\r\n\r\nif(\r\nevent.data.size>0\r\n){\r\n\r\nchunks.push(\r\nevent.data\r\n);\r\n\r\n}\r\n\r\n};\r\n\r\n\r\nrecorder.onstop=\r\nfunction(){\r\n\r\nlet blob=\r\nnew Blob(\r\nchunks,\r\n{\r\ntype:\r\n\"audio\/webm\"\r\n}\r\n);\r\n\r\nlet url=\r\nURL.createObjectURL(\r\nblob\r\n);\r\n\r\nwindow.karaokeLastBlob=\r\nblob;\r\n\r\nwindow.karaokeLastUrl=\r\nurl;\r\n\r\ndocument.getElementById(\r\n\"k5-record-result\"\r\n).innerHTML=\r\n\r\n'<audio controls style=\"width:100%\" src=\"'+\r\nurl+\r\n'\"><\/audio>'+\r\n\r\n'<br><br>'+\r\n\r\n'<a class=\"k5-btn k5-primary\" href=\"'+\r\nurl+\r\n'\" download=\"karaoke-enregistrement.webm\">'+\r\n'\u2b07 T\u00e9l\u00e9charger WebM'+\r\n'<\/a>';\r\n\r\ndocument.getElementById(\r\n\"k5-record-status\"\r\n).textContent=\r\n\"\u2705 Enregistrement termin\u00e9.\";\r\n\r\n};\r\n\r\n\r\nrecorder.start();\r\n\r\nstartTimer();\r\n\r\nisPaused=\r\nfalse;\r\n\r\ndocument.getElementById(\r\n\"k5-record-status\"\r\n).textContent=\r\n\"\ud83d\udd34 Enregistrement en cours.\";\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-record-start\"\r\n).addEventListener(\r\n\"click\",\r\nasync function(){\r\n\r\nif(\r\ncountdownEnabled\r\n){\r\n\r\nfor(\r\nlet i=3;\r\ni>0;\r\ni--\r\n){\r\n\r\ndocument.getElementById(\r\n\"k5-record-status\"\r\n).textContent=\r\n\"Enregistrement dans \"+\r\ni+\r\n\"...\";\r\n\r\nawait new Promise(\r\nfunction(resolve){\r\n\r\nsetTimeout(\r\nresolve,\r\n1000\r\n);\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n}\r\n\r\nstartRecording();\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n PAUSE\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-record-pause\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(\r\n!recorder\r\n)\r\nreturn;\r\n\r\nif(\r\nrecorder.state===\r\n\"recording\"\r\n){\r\n\r\nrecorder.pause();\r\n\r\nisPaused=\r\ntrue;\r\n\r\nthis.textContent=\r\n\"\u25b6 Reprendre\";\r\n\r\n}else if(\r\nrecorder.state===\r\n\"paused\"\r\n){\r\n\r\nrecorder.resume();\r\n\r\nisPaused=\r\nfalse;\r\n\r\nthis.textContent=\r\n\"\u23f8 Pause\";\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n STOP\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-record-stop\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nif(\r\nrecorder &&\r\n(\r\nrecorder.state===\r\n\"recording\" ||\r\nrecorder.state===\r\n\"paused\"\r\n)\r\n){\r\n\r\nrecorder.stop();\r\n\r\nstopTimer();\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n COMPTE A REBOURS\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-countdown\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\ncountdownEnabled=\r\n!countdownEnabled;\r\n\r\nthis.textContent=\r\n\"\u23f1\ufe0f Compte \u00e0 rebours \"+\r\n(\r\ncountdownEnabled?\r\n\"ON\":\r\n\"OFF\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n PAROLES\r\n============================================================ *\/\r\n\r\nlet lyrics=[];\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-show-lyrics\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet text=\r\ndocument.getElementById(\r\n\"k5-lyrics-text\"\r\n).value;\r\n\r\nlyrics=\r\ntext\r\n.split(\r\n\"\\n\"\r\n)\r\n.map(\r\nfunction(line){\r\n\r\nreturn{\r\n\r\ntime:\r\n0,\r\n\r\ntext:\r\nline\r\n\r\n};\r\n\r\n}\r\n);\r\n\r\nif(\r\nlyrics.length\r\n){\r\n\r\ndocument.getElementById(\r\n\"k5-current-line\"\r\n).textContent=\r\nlyrics[0].text;\r\n\r\ndocument.getElementById(\r\n\"k5-next-line\"\r\n).textContent=\r\nlyrics[1]?\r\nlyrics[1].text:\r\n\"\";\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n TELECHARGEMENT TEXTE\r\n============================================================ *\/\r\n\r\nfunction downloadText(\r\ncontent,\r\nname,\r\ntype\r\n){\r\n\r\nlet blob=\r\nnew Blob(\r\n[\r\ncontent\r\n],\r\n{\r\ntype:\r\ntype\r\n}\r\n);\r\n\r\nlet url=\r\nURL.createObjectURL(\r\nblob\r\n);\r\n\r\nlet a=\r\ndocument.createElement(\r\n\"a\"\r\n);\r\n\r\na.href=\r\nurl;\r\n\r\na.download=\r\nname;\r\n\r\na.click();\r\n\r\nsetTimeout(\r\nfunction(){\r\n\r\nURL.revokeObjectURL(\r\nurl\r\n);\r\n\r\n},\r\n1000\r\n);\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-download-txt\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\ndownloadText(\r\ndocument.getElementById(\r\n\"k5-lyrics-text\"\r\n).value,\r\n\"paroles.txt\",\r\n\"text\/plain\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-download-srt\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet text=\r\nlyrics.map(\r\nfunction(line,index){\r\n\r\nreturn(\r\nindex+1\r\n)+\r\n\"\\n\"+\r\n\"00:00:00,000 --> 00:00:05,000\\n\"+\r\nline.text+\r\n\"\\n\";\r\n\r\n}\r\n).join(\r\n\"\\n\"\r\n);\r\n\r\ndownloadText(\r\ntext,\r\n\"paroles.srt\",\r\n\"application\/x-subrip\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-download-lrc\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet text=\r\nlyrics.map(\r\nfunction(line){\r\n\r\nreturn(\r\n\"[00:00.00] \"+\r\nline.text\r\n);\r\n\r\n}\r\n).join(\r\n\"\\n\"\r\n);\r\n\r\ndownloadText(\r\ntext,\r\n\"paroles.lrc\",\r\n\"text\/plain\"\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n IMPORT SRT\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-srt-file\"\r\n).addEventListener(\r\n\"change\",\r\nfunction(){\r\n\r\nlet file=\r\nthis.files[0];\r\n\r\nif(\r\n!file\r\n)\r\nreturn;\r\n\r\nlet reader=\r\nnew FileReader();\r\n\r\nreader.onload=\r\nfunction(){\r\n\r\ndocument.getElementById(\r\n\"k5-lyrics-text\"\r\n).value=\r\nreader.result;\r\n\r\n};\r\n\r\nreader.readAsText(\r\nfile\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n IMPORT LRC\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-lrc-file\"\r\n).addEventListener(\r\n\"change\",\r\nfunction(){\r\n\r\nlet file=\r\nthis.files[0];\r\n\r\nif(\r\n!file\r\n)\r\nreturn;\r\n\r\nlet reader=\r\nnew FileReader();\r\n\r\nreader.onload=\r\nfunction(){\r\n\r\nlet lines=\r\nreader.result.split(\r\n\"\\n\"\r\n);\r\n\r\nlet clean=\r\nlines\r\n.map(\r\nfunction(line){\r\n\r\nreturn line.replace(\r\n\/\\[[0-9:.]+\\]\/g,\r\n\"\"\r\n).trim();\r\n\r\n}\r\n)\r\n.join(\r\n\"\\n\"\r\n);\r\n\r\ndocument.getElementById(\r\n\"k5-lyrics-text\"\r\n).value=\r\nclean;\r\n\r\n};\r\n\r\nreader.readAsText(\r\nfile\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n PLEIN ECRAN\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-fullscreen\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet el=\r\ndocument.querySelector(\r\n\"#k5-karaoke .k5-lyrics\"\r\n);\r\n\r\nif(\r\nel.requestFullscreen\r\n){\r\n\r\nel.requestFullscreen();\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n FFmpeg WebAssembly\r\n CHARGEMENT DYNAMIQUE\r\n============================================================ *\/\r\n\r\nasync function loadFFmpeg(){\r\n\r\nif(\r\nffmpegLoaded\r\n){\r\n\r\nreturn;\r\n\r\n}\r\n\r\nlet status=\r\ndocument.getElementById(\r\n\"k5-export-status\"\r\n);\r\n\r\nlet log=\r\ndocument.getElementById(\r\n\"k5-ffmpeg-log\"\r\n);\r\n\r\nstatus.textContent=\r\n\"\u23f3 Chargement de FFmpeg WebAssembly...\";\r\n\r\ntry{\r\n\r\n\/*\r\n Charger les scripts FFmpeg.\r\n *\/\r\n\r\nawait loadScript(\r\n\"https:\/\/cdn.jsdelivr.net\/npm\/@ffmpeg\/ffmpeg@0.12.10\/dist\/umd\/ffmpeg.js\"\r\n);\r\n\r\nawait loadScript(\r\n\"https:\/\/cdn.jsdelivr.net\/npm\/@ffmpeg\/util@0.12.1\/dist\/umd\/index.js\"\r\n);\r\n\r\n\r\nlet FFmpegClass=\r\nwindow.FFmpegWASM?\r\nwindow.FFmpegWASM.FFmpeg:\r\nwindow.FFmpeg?.FFmpeg;\r\n\r\nlet util=\r\nwindow.FFmpegUtil ||\r\nwindow.FFmpegUtil;\r\n\r\n\r\nif(\r\n!FFmpegClass\r\n){\r\n\r\nthrow new Error(\r\n\"Biblioth\u00e8que FFmpeg non disponible.\"\r\n);\r\n\r\n}\r\n\r\nffmpeg=\r\nnew FFmpegClass();\r\n\r\nffmpeg.on(\r\n\"log\",\r\nfunction(\r\nmessage\r\n){\r\n\r\nlog.textContent+=\r\n\"\\n\"+\r\n(\r\nmessage.message ||\r\nmessage\r\n);\r\n\r\nlog.scrollTop=\r\nlog.scrollHeight;\r\n\r\n}\r\n);\r\n\r\n\r\nawait ffmpeg.load({\r\n\r\ncoreURL:\r\n\"https:\/\/cdn.jsdelivr.net\/npm\/@ffmpeg\/core@0.12.6\/dist\/umd\/ffmpeg-core.js\",\r\n\r\nwasmURL:\r\n\"https:\/\/cdn.jsdelivr.net\/npm\/@ffmpeg\/core@0.12.6\/dist\/umd\/ffmpeg-core.wasm\"\r\n\r\n});\r\n\r\n\r\nffmpegLoaded=\r\ntrue;\r\n\r\nstatus.textContent=\r\n\"\u2705 FFmpeg WebAssembly charg\u00e9.\";\r\n\r\n}catch(error){\r\n\r\nconsole.error(\r\nerror\r\n);\r\n\r\nstatus.textContent=\r\n\"\u274c Impossible de charger FFmpeg.\";\r\n\r\nlog.textContent=\r\nString(\r\nerror\r\n);\r\n\r\n}\r\n\r\n}\r\n\r\n\r\nfunction loadScript(\r\nsrc\r\n){\r\n\r\nreturn new Promise(\r\nfunction(resolve,reject){\r\n\r\nlet script=\r\ndocument.createElement(\r\n\"script\"\r\n);\r\n\r\nscript.src=\r\nsrc;\r\n\r\nscript.onload=\r\nresolve;\r\n\r\nscript.onerror=\r\nreject;\r\n\r\ndocument.head.appendChild(\r\nscript\r\n);\r\n\r\n}\r\n);\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-load-ffmpeg\"\r\n).addEventListener(\r\n\"click\",\r\nloadFFmpeg\r\n);\r\n\r\n\r\n\/* ============================================================\r\n CONVERSION FFMPEG\r\n============================================================ *\/\r\n\r\nasync function convertWithFFmpeg(){\r\n\r\nif(\r\n!window.karaokeLastBlob\r\n){\r\n\r\ndocument.getElementById(\r\n\"k5-export-status\"\r\n).textContent=\r\n\"\u26a0\ufe0f Faites d'abord un enregistrement.\";\r\n\r\nreturn;\r\n\r\n}\r\n\r\nif(\r\n!ffmpegLoaded\r\n){\r\n\r\nawait loadFFmpeg();\r\n\r\n}\r\n\r\nif(\r\n!ffmpeg\r\n){\r\n\r\nreturn;\r\n\r\n}\r\n\r\nlet format=\r\ndocument.getElementById(\r\n\"k5-export-format\"\r\n).value;\r\n\r\nlet quality=\r\ndocument.getElementById(\r\n\"k5-quality\"\r\n).value;\r\n\r\nlet status=\r\ndocument.getElementById(\r\n\"k5-export-status\"\r\n);\r\n\r\ntry{\r\n\r\nstatus.textContent=\r\n\"\u23f3 Conversion en cours...\";\r\n\r\n\r\nlet inputData=\r\nnew Uint8Array(\r\nawait window.karaokeLastBlob.arrayBuffer()\r\n);\r\n\r\n\r\n\/*\r\n Nom temporaire.\r\n *\/\r\n\r\nawait ffmpeg.writeFile(\r\n\"input.webm\",\r\ninputData\r\n);\r\n\r\n\r\n\/*\r\n Param\u00e8tres.\r\n *\/\r\n\r\nlet args=[];\r\n\r\n\r\n\/*\r\n MP3\r\n *\/\r\n\r\nif(\r\nformat===\r\n\"mp3\"\r\n){\r\n\r\nargs=[\r\n\"-i\",\r\n\"input.webm\",\r\n\"-vn\",\r\n\"-b:a\",\r\nquality+\r\n\"k\",\r\n\"output.mp3\"\r\n];\r\n\r\n}\r\n\r\n\r\n\/*\r\n WAV\r\n *\/\r\n\r\nelse if(\r\nformat===\r\n\"wav\"\r\n){\r\n\r\nargs=[\r\n\"-i\",\r\n\"input.webm\",\r\n\"-vn\",\r\n\"output.wav\"\r\n];\r\n\r\n}\r\n\r\n\r\n\/*\r\n OGG\r\n *\/\r\n\r\nelse if(\r\nformat===\r\n\"ogg\"\r\n){\r\n\r\nargs=[\r\n\"-i\",\r\n\"input.webm\",\r\n\"-vn\",\r\n\"-c:a\",\r\n\"libvorbis\",\r\n\"-q:a\",\r\n\"5\",\r\n\"output.ogg\"\r\n];\r\n\r\n}\r\n\r\n\r\n\/*\r\n WEBM\r\n *\/\r\n\r\nelse if(\r\nformat===\r\n\"webm\"\r\n){\r\n\r\nargs=[\r\n\"-i\",\r\n\"input.webm\",\r\n\"-c:a\",\r\n\"libopus\",\r\n\"output.webm\"\r\n];\r\n\r\n}\r\n\r\n\r\n\/*\r\n MP4\r\n *\/\r\n\r\nelse if(\r\nformat===\r\n\"mp4\"\r\n){\r\n\r\nargs=[\r\n\"-i\",\r\n\"input.webm\",\r\n\"-c:a\",\r\n\"aac\",\r\n\"-b:a\",\r\nquality+\r\n\"k\",\r\n\"-vn\",\r\n\"output.mp4\"\r\n];\r\n\r\n}\r\n\r\n\r\nawait ffmpeg.exec(\r\nargs\r\n);\r\n\r\n\r\nlet outputName=\r\n\"output.\"+\r\nformat;\r\n\r\nlet data=\r\nawait ffmpeg.readFile(\r\noutputName\r\n);\r\n\r\nlet mime=\r\nformat===\r\n\"mp3\"?\r\n\"audio\/mpeg\":\r\nformat===\r\n\"wav\"?\r\n\"audio\/wav\":\r\nformat===\r\n\"ogg\"?\r\n\"audio\/ogg\":\r\nformat===\r\n\"mp4\"?\r\n\"video\/mp4\":\r\n\"audio\/webm\";\r\n\r\n\r\nlet blob=\r\nnew Blob(\r\n[\r\ndata.buffer\r\n],\r\n{\r\ntype:\r\nmime\r\n}\r\n);\r\n\r\nlet url=\r\nURL.createObjectURL(\r\nblob\r\n);\r\n\r\nlet a=\r\ndocument.createElement(\r\n\"a\"\r\n);\r\n\r\na.href=\r\nurl;\r\n\r\na.download=\r\n\"karaoke-export.\"+\r\nformat;\r\n\r\na.click();\r\n\r\n\r\nstatus.textContent=\r\n\"\u2705 Export \"+\r\nformat.toUpperCase()+\r\n\" termin\u00e9.\";\r\n\r\n}catch(error){\r\n\r\nconsole.error(\r\nerror\r\n);\r\n\r\nstatus.textContent=\r\n\"\u274c Erreur FFmpeg : \"+\r\nerror.message;\r\n\r\n}\r\n\r\n}\r\n\r\n\r\ndocument.getElementById(\r\n\"k5-export-btn\"\r\n).addEventListener(\r\n\"click\",\r\nconvertWithFFmpeg\r\n);\r\n\r\n\r\n\/* ============================================================\r\n RESET MIXER\r\n============================================================ *\/\r\n\r\ndocument.getElementById(\r\n\"k5-reset-mixer\"\r\n).addEventListener(\r\n\"click\",\r\nfunction(){\r\n\r\nlet defaults={\r\n\r\n\"k5-master\":\r\n100,\r\n\r\n\"k5-pan\":\r\n0,\r\n\r\n\"k5-voice-gain\":\r\n100,\r\n\r\n\"k5-bass\":\r\n0,\r\n\r\n\"k5-bass-freq\":\r\n120,\r\n\r\n\"k5-low\":\r\n0,\r\n\r\n\"k5-mid\":\r\n0,\r\n\r\n\"k5-high\":\r\n0,\r\n\r\n\"k5-comp-threshold\":\r\n0,\r\n\r\n\"k5-comp-ratio\":\r\n4,\r\n\r\n\"k5-delay\":\r\n0,\r\n\r\n\"k5-delay-time\":\r\n.3,\r\n\r\n\"k5-reverb\":\r\n0\r\n\r\n};\r\n\r\n\r\nObject.keys(\r\ndefaults\r\n).forEach(\r\nfunction(id){\r\n\r\nlet el=\r\ndocument.getElementById(\r\nid\r\n);\r\n\r\nif(\r\nel\r\n){\r\n\r\nel.value=\r\ndefaults[id];\r\n\r\nel.dispatchEvent(\r\nnew Event(\r\n\"input\"\r\n)\r\n);\r\n\r\n}\r\n\r\n}\r\n);\r\n\r\n}\r\n);\r\n\r\n\r\n\/* ============================================================\r\n INITIALISATION\r\n============================================================ *\/\r\n\r\nrenderAudioPlaylist();\r\n\r\nrenderVideoPlaylist();\r\n\r\ndocument.getElementById(\r\n\"k5-status\"\r\n).textContent=\r\n\"Pr\u00eat. Importez un fichier audio ou vid\u00e9o.\";\r\n\r\n})();\r\n\r\n<\/script>\r\n\r\n<\/div>\r\n```\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2ce192c elementor-section-boxed ang-section-padding-initial elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no elementor-repeater-item-none elementor-repeater-item-none_hover wpr-column-slider-no wpr-equal-height-no\" data-id=\"2ce192c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8eb8c8f elementor-repeater-item-none elementor-repeater-item-none_hover\" data-id=\"8eb8c8f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6a458a7 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"6a458a7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d3f6e90 elementor-section-boxed ang-section-padding-initial elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no elementor-repeater-item-none elementor-repeater-item-none_hover wpr-column-slider-no wpr-equal-height-no\" data-id=\"d3f6e90\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7d44ab9 elementor-repeater-item-none elementor-repeater-item-none_hover\" data-id=\"7d44ab9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-692c640 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"692c640\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-4e2a990 e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"4e2a990\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4a7676d elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-html\" data-id=\"4a7676d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ============================================================\r\n MASQUER LES BOUTONS DU LECTEUR \u2014 PLAYLIST VID\u00c9O\r\n============================================================ -->\r\n\r\n<style>\r\n\r\n#k5-video-playlist\r\n#k5-video-player-prev,\r\n#k5-video-playlist\r\n#k5-video-player-play,\r\n#k5-video-playlist\r\n#k5-video-player-pause,\r\n#k5-video-playlist\r\n#k5-video-player-next,\r\n#k5-video-playlist\r\n#k5-video-player-loop,\r\n#k5-video-playlist\r\n#k5-video-player-autoplay {\r\n\r\n    display: none !important;\r\n\r\n}\r\n\r\n<\/style>\t\t\t\t<\/div>\n\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-84155f0 e-flex e-con-boxed elementor-repeater-item-default_padding elementor-repeater-item-none elementor-repeater-item-none_hover wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"84155f0\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ang_container_spacing_size&quot;:&quot;default_padding&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fa19759 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"fa19759\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f6717ef animated-slow elementor-section-boxed ang-section-padding-initial elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no elementor-repeater-item-none elementor-repeater-item-none_hover wpr-column-slider-no wpr-equal-height-no elementor-invisible\" data-id=\"f6717ef\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;animation&quot;:&quot;swing&quot;,&quot;animation_delay&quot;:200}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-727cd58 elementor-repeater-item-none elementor-repeater-item-none_hover\" data-id=\"727cd58\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-43a556e animated-slow external_elementor-repeater-item-none_external elementor-repeater-item-none elementor-repeater-item-none_hover elementor-invisible elementor-widget elementor-widget-image\" data-id=\"43a556e\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeIn&quot;,&quot;_animation_delay&quot;:1500}\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"275\" height=\"183\" src=\"https:\/\/allianceenjesus.com\/wp-content\/uploads\/2022\/03\/alliance-en-jesus-1-1.jpg\" class=\"attachment-large size-large wp-image-3707\" alt=\"\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-df14b24 elementor-section-boxed ang-section-padding-initial elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no elementor-repeater-item-none elementor-repeater-item-none_hover wpr-column-slider-no wpr-equal-height-no\" data-id=\"df14b24\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4c946b9 elementor-repeater-item-none elementor-repeater-item-none_hover\" data-id=\"4c946b9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3ce6178 elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"3ce6178\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-268005c elementor-section-boxed ang-section-padding-initial elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no elementor-repeater-item-none elementor-repeater-item-none_hover wpr-column-slider-no wpr-equal-height-no\" data-id=\"268005c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8603f28 elementor-repeater-item-none elementor-repeater-item-none_hover\" data-id=\"8603f28\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f32f6ca elementor-repeater-item-none elementor-repeater-item-none_hover elementor-widget elementor-widget-spacer\" data-id=\"f32f6ca\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Une table de mixage pour modifer tes audios en Karaok\u00e9 ! Cool, amuses toi ! Va dans le menu import pour t\u00e9l\u00e9charger tes fichiers audio, puis Playlist Audio et la table de mixage pour les r\u00e9glages ! \ud83c\udfa4 Karaoke Studio Ultimate Studio karaok\u00e9 audio \u2022 vid\u00e9o \u2022 mixage \u2022 enregistrement \uff0b Nouveau projet \ud83c\udfe0 Accueil \ud83d\udce5 Import \ud83c\udfb5 Playlist Audio \ud83c\udfac Playlist Vid\u00e9o \ud83c\udf9b\ufe0f Mixage \ud83c\udfa4 Karaok\u00e9 \ud83d\udd34 Enregistrer \ud83d\udcdd Paroles \ud83d\udcbe Export \ud83c\udfa4 Karaoke Studio Ultimate Votre studio karaok\u00e9 audio et vid\u00e9o directement dans Elementor. \ud83d\udce5 Importer un morceau \ud83c\udfac Importer une vid\u00e9o \ud83c\udfb5 Audio Chansons, instrumentaux, playlists et mixage. \ud83c\udfac Vid\u00e9o Clips locaux, MP4, WebM et int\u00e9gration YouTube. \ud83c\udfa4 Studio Enregistrement et export. \ud83d\udce5 Import audio et vid\u00e9o Glissez vos chansons ou vid\u00e9os ici \ud83d\udcc1 Choisir des fichiers MP3 \u2022 WAV \u2022 OGG \u2022 M4A \u2022 AAC \u2022 MP4 \u2022 WebM \ud83d\udd17 URL directe Ajouter Pour le mixage, privil\u00e9giez les fichiers directs compatibles CORS. \ud83d\udcfa YouTube Afficher dans la page \u25b6\ufe0f Lecteur principal Aucun m\u00e9dia charg\u00e9. \u25b6 Lecture \u23f8 Pause \u23f9 Stop \u23ea -10s \u23e9 +10s Vitesse 0,5\u00d7 0,75\u00d7 1\u00d7 1,25\u00d7 1,5\u00d7 2\u00d7 Aucun morceau. \ud83c\udfb5 Playlist Audio Aucun fichier audio. \u23ee Pr\u00e9c\u00e9dent \u23ed Suivant \ud83d\udd01 Morceau OFF \ud83d\udd01 Playlist OFF \ud83d\udd00 Al\u00e9atoire OFF \ud83c\udfac Lecteur Vid\u00e9o \ud83c\udfac S\u00e9lectionnez une vid\u00e9o dans votre playlist Aucune vid\u00e9o s\u00e9lectionn\u00e9e 0 \/ 0 \u23ee Pr\u00e9c\u00e9dente \u25b6\ufe0f Lecture \u23f8\ufe0f Pause \u23ed Suivante \ud83d\udd01 Boucle OFF \u25b6\ufe0f Lecture automatique OFF \ud83c\udfac Importer des vid\u00e9os Importez vos clips et vid\u00e9os pour les lire dans le lecteur principal. \ud83d\uddb1\ufe0f Glissez-d\u00e9posez vos vid\u00e9os ici \ud83d\udcc1 T\u00e9l\u00e9charger depuis l&rsquo;appareil MP4 \u2022 WebM \u2022 OGG vid\u00e9o \u2022 autres formats compatibles navigateur \ud83d\udd17 Ajouter une vid\u00e9o par URL \uff0b Ajouter vid\u00e9o \ud83d\udcfa Ajouter YouTube \uff0b Ajouter YouTube \u00e0 la playlist \ud83c\udfac S\u00e9lectionnez une vid\u00e9o dans votre playlist Aucune vid\u00e9o s\u00e9lectionn\u00e9e 0 \/ 0 \u23ee Pr\u00e9c\u00e9dente \u25b6\ufe0f Lecture \u23f8\ufe0f Pause \u23ed Suivante \u25b6\ufe0f Auto OFF \ud83c\udfac Playlist Vid\u00e9o Aucune vid\u00e9o. \u23ee Pr\u00e9c\u00e9dente \u23ed Suivante \ud83d\udd01 Boucle OFF \ud83d\udd00 Al\u00e9atoire OFF \ud83c\udf9b\ufe0f Table de mixage Les fichiers audio et vid\u00e9os HTML5 compatibles sont trait\u00e9s par Web Audio API. Les vid\u00e9os YouTube int\u00e9gr\u00e9es par iframe restent isol\u00e9es par les restrictions du navigateur. \ud83d\udd0a MASTER Volume 100% Balance \ud83c\udfa4 VOIX Gain Pr\u00e9sence Clart\u00e9 \ud83e\udd41 BASSE Gain Fr\u00e9quence \ud83c\udf9a\ufe0f \u00c9GALISEUR Graves M\u00e9diums Aigus \ud83d\udca5 COMPRESSEUR Threshold Ratio \ud83d\udd01 \u00c9CHO Intensit\u00e9 Temps \ud83c\udfdb\ufe0f R\u00c9VERB\u00c9RATION Intensit\u00e9 \ud83d\udcca VUM\u00c8TRE \u21a9 R\u00e9initialiser Mixeur pr\u00eat. \ud83c\udfa4 \u00c9cran Karaok\u00e9 Votre texte Les paroles appara\u00eetront ici. \u26f6 Plein \u00e9cran \ud83d\udd34 Studio d&rsquo;enregistrement Mode 1 \u2014 Voix seule Microphone uniquement. La musique n&rsquo;est pas enregistr\u00e9e. Mode 2 \u2014 Voix + instrumental Microphone + lecteur. Mode 3 \u2014 Voix + chanson Microphone + lecteur. 00:00 \ud83c\udf99\ufe0f Activer microphone \u23f1\ufe0f Compte \u00e0 rebours ON \ud83d\udd34 Enregistrer \u23f8 Pause \u23f9 Arr\u00eater Pr\u00eat. \ud83c\udfa7 R\u00e9sultat Aucun enregistrement. \ud83d\udcdd Paroles et sous-titres Importer SRT Importer LRC Afficher TXT SRT LRC \ud83d\udcbe Export avec FFmpeg WebAssembly Le moteur FFmpeg WebAssembly est charg\u00e9 uniquement lorsque vous utilisez la conversion. Le traitement se fait dans le navigateur. Format de sortie MP3 WAV OGG WebM MP4 Qualit\u00e9 audio 128 kbps 192 kbps 256 kbps 320 kbps \ud83e\uddf0 Charger FFmpeg \u2b07 Convertir et t\u00e9l\u00e9charger FFmpeg non charg\u00e9. En attente. \u00ab\u00a0`<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_eb_attr":"","_uag_custom_page_level_css":"","site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"unboxed","site-sidebar-style":"unboxed","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"enabled","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":"","_members_access_role":[],"_members_access_error":""},"class_list":["post-31218","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"tp-image-grid":false,"ca-people-thumb":false,"ca-address-thumb":false,"ultp_layout_landscape_large":false,"ultp_layout_landscape":false,"ultp_layout_portrait":false,"ultp_layout_square":false,"mailpoet_newsletter_max":false,"masvideos_video_large":false,"masvideos_video_medium":false,"masvideos_video_thumbnail":false,"masvideos_movie_large":false,"masvideos_movie_medium":false,"masvideos_movie_thumbnail":false,"woocommerce_thumbnail":false,"woocommerce_single":false,"woocommerce_gallery_thumbnail":false},"uagb_author_info":{"display_name":"Serviteur","author_link":"https:\/\/allianceenjesus.com\/author\/jaijp3a12g7"},"uagb_comment_info":0,"uagb_excerpt":"Une table de mixage pour modifer tes audios en Karaok\u00e9 ! Cool, amuses toi ! Va dans le menu import pour t\u00e9l\u00e9charger tes fichiers audio, puis Playlist Audio et la table de mixage pour les r\u00e9glages ! \ud83c\udfa4 Karaoke Studio Ultimate Studio karaok\u00e9 audio \u2022 vid\u00e9o \u2022 mixage \u2022 enregistrement \uff0b Nouveau projet \ud83c\udfe0 Accueil\u2026","_links":{"self":[{"href":"https:\/\/allianceenjesus.com\/index.php?rest_route=\/wp\/v2\/pages\/31218","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/allianceenjesus.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/allianceenjesus.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/allianceenjesus.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/allianceenjesus.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=31218"}],"version-history":[{"count":181,"href":"https:\/\/allianceenjesus.com\/index.php?rest_route=\/wp\/v2\/pages\/31218\/revisions"}],"predecessor-version":[{"id":31407,"href":"https:\/\/allianceenjesus.com\/index.php?rest_route=\/wp\/v2\/pages\/31218\/revisions\/31407"}],"wp:attachment":[{"href":"https:\/\/allianceenjesus.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=31218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}