Advertisement
N2AZ

musicv2

Oct 4th, 2024 (edited)
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.28 KB | Gaming | 0 0
  1. -- Chargement du module dfpwm pour la gestion audio et recherche du périphérique "speaker"
  2. local dfpwm = require("cc.audio.dfpwm")
  3. local speaker = peripheral.find("speaker")
  4. local decoder = dfpwm.make_decoder()
  5.  
  6. -- Ajout des variables pour le titre de la musique
  7. local currentTitle = ""
  8.  
  9. -- Fonctions d'aide pour l'interface
  10. local function pos(...) term.setCursorPos(...) end
  11. local function cls() term.clear() end
  12. local function tCol(...) term.setTextColor(...) end
  13. local function bCol(...) term.setBackgroundColor(...) end
  14. local function box(...) paintutils.drawFilledBox(...) end
  15. local function line(...) paintutils.drawLine(...) end
  16.  
  17. -- Récupération de la taille du terminal
  18. local x, y = term.getSize()
  19.  
  20. -- Variable globale pour contrôler la lecture
  21. local isPlaying = false
  22. local currentLink = nil
  23.  
  24. -- Fonction pour jouer un lien direct de manière non bloquante
  25. local function playDirectLink(lien)
  26.     local handle = assert(http.get(lien, nil, true))
  27.    
  28.     -- Récupération des métadonnées
  29.     local responseHeaders = handle.getResponseHeaders()
  30.     if responseHeaders["icy-metaint"] then
  31.         -- Traitement des métadonnées ICY si présentes
  32.         currentTitle = responseHeaders["icy-name"] or "Titre inconnu"
  33.     else
  34.         -- Si pas de métadonnées ICY, on essaie de récupérer le titre depuis l'URL
  35.         currentTitle = string.match(lien, "/([^/]+)%.%w+$") or "Titre inconnu"
  36.         currentTitle = currentTitle:gsub("%%(%x%x)", function(h) return string.char(tonumber(h, 16)) end)
  37.     end
  38.    
  39.     drawMenu() -- Rafraîchir l'affichage avec le nouveau titre
  40.    
  41.     return function()
  42.         local chunk = handle.read(16 * 1024)
  43.         if chunk then
  44.             local buffer = decoder(chunk)
  45.             while not speaker.playAudio(buffer) do
  46.                 os.pullEvent("speaker_audio_empty")
  47.                 if not isPlaying then
  48.                     handle.close()
  49.                     return false
  50.                 end
  51.             end
  52.             return true
  53.         else
  54.             handle.close()
  55.             return false
  56.         end
  57.     end
  58. end
  59.  
  60. -- Fonction pour dessiner le menu principal de l'interface
  61. local function drawMenu()
  62.     cls()
  63.     box(1,1,x,y,colors.lightBlue) -- Fond d'écran
  64.  
  65.     local menuWidth = math.min(x - 2, 28)
  66.     local menuHeight = math.min(y - 2, 4) -- Réduit encore la hauteur du menu
  67.     local menuX = math.floor((x - menuWidth) / 2)
  68.     local menuY = math.floor((y - menuHeight) / 2)
  69.  
  70.     box(menuX, menuY, menuX + menuWidth, menuY + menuHeight, colors.gray) -- Menu
  71.     line(menuX, menuY, menuX + menuWidth, menuY, colors.lightGray) -- Barre du haut
  72.     line(menuX + menuWidth - 2, menuY, menuX + menuWidth, menuY, colors.red) -- Zone de fermeture
  73.  
  74.     local inputWidth = menuWidth - 10
  75.     line(menuX + 9, menuY + 2, menuX + 9 + inputWidth, menuY + 2, colors.black) -- Zone MUSIC
  76.  
  77.     tCol(colors.black) bCol(colors.red)
  78.     pos(menuX + menuWidth - 1, menuY)
  79.     write("X")
  80.  
  81.     tCol(colors.yellow) bCol(colors.gray)
  82.     pos(menuX + 1, menuY + 2)
  83.     write("MUSIC")
  84.  
  85.     tCol(colors.white) bCol(colors.black)
  86.    
  87.     -- Ajout de l'affichage du titre
  88.     tCol(colors.white) bCol(colors.gray)
  89.     local titleText = "Titre : " .. (currentTitle ~= "" and currentTitle or "Aucune musique en cours")
  90.     local titleX = math.floor((x - #titleText) / 2)
  91.     pos(titleX, menuY + 3)
  92.     write(titleText)
  93.  
  94.     tCol(colors.white) bCol(colors.black)
  95. end
  96.  
  97. -- Fonction pour jouer de la musique
  98. local function musicPlay()
  99.     local menuX = math.floor((x - math.min(x - 2, 28)) / 2)
  100.     local menuY = math.floor((y - math.min(y - 2, 4)) / 2)
  101.     pos(menuX + 9, menuY + 2)
  102.     local input = read()
  103.    
  104.     if input:sub(1,4) == "http" then
  105.         if isPlaying then
  106.             isPlaying = false -- Arrête la musique en cours
  107.             os.sleep(0.5) -- Attente pour s'assurer que la lecture précédente est arrêtée
  108.         end
  109.         currentLink = input
  110.         isPlaying = true
  111.         playNextChunk = playDirectLink(currentLink)
  112.     else
  113.         print("Lien invalide")
  114.         os.sleep(2)
  115.     end
  116.     drawMenu()
  117. end
  118.  
  119. -- Fonction principale
  120. local function main()
  121.     drawMenu()
  122.    
  123.     while true do
  124.         local event, button, mx, my = os.pullEvent()
  125.         if event == "mouse_click" and button == 1 then
  126.             local menuWidth = math.min(x - 2, 28)
  127.             local menuHeight = math.min(y - 2, 4)
  128.             local menuX = math.floor((x - menuWidth) / 2)
  129.             local menuY = math.floor((y - menuHeight) / 2)
  130.             local inputWidth = menuWidth - 10
  131.  
  132.             if mx >= menuX + 9 and mx <= menuX + 9 + inputWidth and my == menuY + 2 then
  133.                 musicPlay()
  134.             elseif mx >= menuX + menuWidth - 2 and mx <= menuX + menuWidth and my == menuY then
  135.                 isPlaying = false -- Arrête la musique si elle est en cours
  136.                 os.reboot()
  137.             end
  138.         end
  139.     end
  140. end
  141.  
  142. -- Modification du lancement du programme
  143. parallel.waitForAny(
  144.     main,
  145.     function()
  146.         while true do
  147.             if isPlaying and playNextChunk then
  148.                 if not playNextChunk() then
  149.                     isPlaying = false
  150.                     drawMenu()
  151.                 end
  152.             end
  153.             os.sleep(0)
  154.         end
  155.     end
  156. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement