-- Script OBS Lua : Arrêter le stream à la fin d'un fichier MP3 avec sélection déroulante de la scène et de la source, vérification de la scène active obs = obslua scene_name = "" -- Nom de la scène sélectionnée source_name = "" -- Nom de la source sélectionnée function script_description() return "Ce script arrête automatiquement le live à la fin de la lecture d'un fichier MP3 dans la scène sélectionnée uniquement lorsqu'elle est active." end function script_properties() local props = obs.obs_properties_create() -- Ajouter une liste déroulante pour choisir la scène local scene_list = obs.obs_properties_add_list(props, "scene_name", "Sélectionnez la scène", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING) populate_scene_list(scene_list) -- Ajouter une liste déroulante pour choisir la source local source_list = obs.obs_properties_add_list(props, "source_name", "Sélectionnez la source média", obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING) populate_source_list(source_list) return props end function populate_scene_list(list_property) -- Récupérer toutes les scènes et les ajouter à la liste déroulante local scenes = obs.obs_frontend_get_scenes() if scenes ~= nil then for _, scene in ipairs(scenes) do local name = obs.obs_source_get_name(scene) obs.obs_property_list_add_string(list_property, name, name) end obs.source_list_release(scenes) end end function populate_source_list(list_property) -- Récupérer toutes les sources et les ajouter à la liste déroulante local sources = obs.obs_enum_sources() if sources ~= nil then for _, source in ipairs(sources) do local source_id = obs.obs_source_get_id(source) -- Filtrer pour ne garder que les sources de type "media_source" if source_id == "ffmpeg_source" then local name = obs.obs_source_get_name(source) obs.obs_property_list_add_string(list_property, name, name) end end obs.source_list_release(sources) end end function script_update(settings) scene_name = obs.obs_data_get_string(settings, "scene_name") source_name = obs.obs_data_get_string(settings, "source_name") end function media_ended() obs.script_log(obs.LOG_INFO, "Le fichier MP3 est terminé, arrêt du live...") -- Arrêter le stream if obs.obs_frontend_streaming_active() then obs.obs_frontend_streaming_stop() end -- Si tu fais aussi du recording et veux l'arrêter : if obs.obs_frontend_recording_active() then obs.obs_frontend_recording_stop() end end function check_media_status() -- Vérifier si la scène active est bien celle spécifiée local current_scene = obs.obs_frontend_get_current_scene() local current_scene_name = obs.obs_source_get_name(current_scene) if current_scene_name ~= scene_name then obs.script_log(obs.LOG_INFO, "La scène active n'est pas '" .. scene_name .. "', rien à vérifier.") obs.obs_source_release(current_scene) return end -- Vérifier l'état de la source seulement si la scène active est la scène sélectionnée local scene = obs.obs_scene_from_source(current_scene) if not scene then obs.script_log(obs.LOG_WARNING, "Impossible de récupérer la scène '" .. scene_name .. "'.") obs.obs_source_release(current_scene) return end -- Récupérer l'élément de la scène (scene item) local scene_item = obs.obs_scene_find_source(scene, source_name) if not scene_item then obs.script_log(obs.LOG_WARNING, "La source '" .. source_name .. "' n'a pas été trouvée dans la scène '" .. scene_name .. "'.") obs.obs_source_release(current_scene) return end -- Récupérer la source depuis l'élément de la scène local source = obs.obs_sceneitem_get_source(scene_item) if not source then obs.script_log(obs.LOG_WARNING, "Impossible de récupérer la source pour '" .. source_name .. "'.") obs.obs_source_release(current_scene) return end -- Vérifier l'état du média local media_playing = obs.obs_source_media_get_state(source) obs.script_log(obs.LOG_INFO, "État de la source '" .. source_name .. "': " .. media_playing) if media_playing == obs.OBS_MEDIA_STATE_ENDED then media_ended() end -- Libérer la scène et la source obs.obs_source_release(current_scene) end function activate_on_event(event) if event == obs.OBS_FRONTEND_EVENT_STREAMING_STARTED then obs.timer_add(check_media_status, 1000) -- Ajout du timer avec vérifications elseif event == obs.OBS_FRONTEND_EVENT_STREAMING_STOPPED then obs.timer_remove(check_media_status) end end function script_load(settings) obs.obs_frontend_add_event_callback(activate_on_event) end