commit 96bdccfe9f7844207ebd1be59ba469769158815f Author: Vincent Guillet Date: Sat Jul 12 11:17:34 2025 +0200 first commit with existing project files diff --git a/1-HTMLMediaElement V2/Playlist.js b/1-HTMLMediaElement V2/Playlist.js new file mode 100644 index 0000000..b2c340f --- /dev/null +++ b/1-HTMLMediaElement V2/Playlist.js @@ -0,0 +1,50 @@ +export class Playlist { + constructor() { + this._tracks = []; + } + + get tracks() { + return this._tracks; + } + + addTrack(track) { + this._tracks.push(track); + + const div = document.createElement('div'); + + div.classList.add('d-flex'); + div.classList.add('align-items-center'); + div.classList.add('justify-content-between'); + + const deleteBtn = document.createElement('button'); + deleteBtn.innerHTML = ``; + deleteBtn.classList.add("btn"); + deleteBtn.classList.add("btn-danger"); + deleteBtn.classList.add("col-md-1"); + deleteBtn.style.marginRight = "10px"; + deleteBtn.addEventListener('click', (e) => { + e.preventDefault(); + this._tracks.splice(this._tracks.indexOf(track), 1); + div.remove(); + }); + div.appendChild(deleteBtn); + const li = document.createElement('li'); + li.classList.add("card"); + li.classList.add("shadow-sm"); + li.classList.add("p-4"); + li.classList.add("col-md-11"); + li.textContent = track.name; + li.style.margin = "5px 0"; + + div.appendChild(li); + + div.setAttribute('id', this._tracks.indexOf(track).toString()); + div.setAttribute('draggable', 'true'); + + div.addEventListener('dragstart', (e) => { + e.dataTransfer.setData('text/plain', e.target.id); + }); + + return div; + } +} \ No newline at end of file diff --git a/1-HTMLMediaElement V2/Track.js b/1-HTMLMediaElement V2/Track.js new file mode 100644 index 0000000..d418089 --- /dev/null +++ b/1-HTMLMediaElement V2/Track.js @@ -0,0 +1,22 @@ +export class Track { + constructor(name, url) { + this.name = name; + this.url = url; + } + + get name() { + return this._name; + } + + set name(value) { + this._name = value; + } + + get url() { + return this._url; + } + + set url(value) { + this._url = value; + } +} \ No newline at end of file diff --git a/1-HTMLMediaElement V2/app.js b/1-HTMLMediaElement V2/app.js new file mode 100644 index 0000000..cb6a19e --- /dev/null +++ b/1-HTMLMediaElement V2/app.js @@ -0,0 +1,102 @@ +import { Track } from './Track.js'; +import { Playlist } from './Playlist.js'; + +const audio = document.getElementById('audioPlayer'); + +const playBtn = document.getElementById('playBtn'); +const pauseBtn = document.getElementById('pauseBtn'); +const resetBtn = document.getElementById('resetBtn'); + +const currentTimeSpan = document.getElementById('currentTime'); +const totalTimeSpan = document.getElementById('totalTime'); + +const fileInput = document.getElementById('fileInput'); +const loadFileBtn = document.getElementById('loadFileBtn'); + +const volume = document.getElementById('volume-slider'); + +const mediaInfo = document.querySelector('.media-info'); + +let timer = null; + +let fileName; +let audioSrc; + +let playlistElement = document.getElementById('playlist'); + +let playlist = new Playlist(); + +/* Functions */ + +function toReadableTime(seconds) { + return new Date(seconds * 1000).toISOString().substring(14, 19); +} + +function updateTime() { + currentTimeSpan.textContent = toReadableTime(audio.currentTime); +} + +fileInput.addEventListener('change', (event) => { + const file = event.target.files[0]; + if (file) { + audioSrc = URL.createObjectURL(file); + fileName = file.name.split('.mp3')[0]; + } +}); + +/* Events */ + +loadFileBtn.addEventListener('click', () => { + const track = new Track(fileName, audioSrc); + playlistElement.appendChild(playlist.addTrack(track, playlistElement)); +}); + +audio.addEventListener('loadedmetadata', () => { + totalTimeSpan.textContent = toReadableTime(audio.duration); +}); + +playBtn.addEventListener('click', () => { + + audio.src = audioSrc; + audio.load(); + mediaInfo.innerText = fileName; + updateTime(); + + audio.play(); + if (!timer) { + timer = setInterval(updateTime, 500); + } + document.title = `Playing ${fileName}`; +}); + +pauseBtn.addEventListener('click', () => { + audio.pause(); +}); + +if (audio.play()) { + + resetBtn.addEventListener('click', () => { + audio.pause(); + audio.currentTime = 0; + updateTime(); + }); +} + +audio.addEventListener('ended', () => { + clearInterval(timer); + timer = null; +}); + +audio.addEventListener('pause', () => { + clearInterval(timer); + timer = null; +}); + +volume.addEventListener("input", function (e) { + audio.volume = e.currentTarget.value / 100; +}); + +volume.addEventListener("dblclick", function (e) { + audio.volume = 0.5; + e.currentTarget.value = 50; +}); \ No newline at end of file diff --git a/1-HTMLMediaElement V2/index.html b/1-HTMLMediaElement V2/index.html new file mode 100644 index 0000000..2d15564 --- /dev/null +++ b/1-HTMLMediaElement V2/index.html @@ -0,0 +1,55 @@ + + + + + + Lecteur Audio HTML5 + + + + + +
+

Lecteur Audio

+ +
+ + +
+

Aucun fichier chargé

+
+ +
+ + + +
+
+ +
+ +
+ Temps écoulé : 00.00 / 00.00 sec +
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+

Playlist

+
    +
+
+ +
+ + diff --git a/1-HTMLMediaElement/app.js b/1-HTMLMediaElement/app.js new file mode 100644 index 0000000..6bbee6d --- /dev/null +++ b/1-HTMLMediaElement/app.js @@ -0,0 +1,88 @@ +const audio = document.getElementById('audioPlayer'); + +const playBtn = document.getElementById('playBtn'); +const pauseBtn = document.getElementById('pauseBtn'); +const resetBtn = document.getElementById('resetBtn'); + +const currentTimeSpan = document.getElementById('currentTime'); +const totalTimeSpan = document.getElementById('totalTime'); + +const fileInput = document.getElementById('fileInput'); +const loadFileBtn = document.getElementById('loadFileBtn'); + +const volume = document.getElementById('volume-slider'); + +const mediaInfo = document.querySelector('.media-info'); + +let timer = null; + +let fileName; +let audioSrc; + +/* Functions */ + +function toReadableTime(seconds) { + return new Date(seconds * 1000).toISOString().substring(14, 19); +} + +function updateTime() { + currentTimeSpan.textContent = toReadableTime(audio.currentTime); +} + +fileInput.addEventListener('change', (event) => { + const file = event.target.files[0]; + if (file) { + audioSrc = URL.createObjectURL(file); + fileName = file.name.split('.mp3')[0]; + } +}); + +/* Events */ + +loadFileBtn.addEventListener('click', () => { + audio.src = audioSrc; + audio.load(); + mediaInfo.innerText = fileName; + updateTime(); +}); + +audio.addEventListener('loadedmetadata', () => { + totalTimeSpan.textContent = toReadableTime(audio.duration); +}); + +playBtn.addEventListener('click', () => { + audio.play(); + if (!timer) { + timer = setInterval(updateTime, 500); + } + document.title = `Playing ${fileName}`; +}); + +pauseBtn.addEventListener('click', () => { + audio.pause(); +}); + +resetBtn.addEventListener('click', () => { + audio.pause(); + audio.currentTime = 0; + updateTime(); +}); + +audio.addEventListener('ended', () => { + clearInterval(timer); + timer = null; +}); + +audio.addEventListener('pause', () => { + clearInterval(timer); + timer = null; +}); + +volume.addEventListener("input", function (e) { + audio.volume = e.currentTarget.value / 100; +}); + +volume.addEventListener("dblclick", function (e) { + audio.volume = 0.5; + e.currentTarget.value = 50; +}); \ No newline at end of file diff --git a/1-HTMLMediaElement/index.html b/1-HTMLMediaElement/index.html new file mode 100644 index 0000000..e28c768 --- /dev/null +++ b/1-HTMLMediaElement/index.html @@ -0,0 +1,47 @@ + + + + + + Lecteur Audio HTML5 + + + + + +
+

Lecteur Audio

+ +
+ + +
+

Aucun fichier chargé

+
+ +
+ + + +
+
+ +
+ +
+ Temps écoulé : 00.00 / 00.00 sec +
+
+ +
+ +
+ +
+ +
+
+ +
+ + diff --git a/4-Geolocation/app.js b/4-Geolocation/app.js new file mode 100644 index 0000000..175e374 --- /dev/null +++ b/4-Geolocation/app.js @@ -0,0 +1,33 @@ +const options = { + enableHighAccuracy: true, + timeout: 5000, + maximumAge: 0, +}; + +function success(pos) { + localStorage.setItem('position', + JSON.stringify(pos.coords) + ); +} + +function error(err) { + console.warn(`ERROR(${err.code}): ${err.message}`); +} + +navigator.geolocation.getCurrentPosition(success, error, options); + +const getCoordinates = () => { + const parsed = JSON.parse(localStorage.getItem('position')); + return { + latitude: parsed.latitude, + longitude: parsed.longitude, + accuracy: parsed.accuracy, + altitude: parsed.altitude, + altitudeAccuracy: parsed.altitudeAccuracy, + heading: parsed.heading, + speed: parsed.speed + }; +} + +console.log(`Latitude: ${getCoordinates().latitude}, Longitude: ${getCoordinates().longitude} +Accuracy: ${getCoordinates().accuracy.toFixed()} meters`); diff --git a/4-Geolocation/index.html b/4-Geolocation/index.html new file mode 100644 index 0000000..c064aaf --- /dev/null +++ b/4-Geolocation/index.html @@ -0,0 +1,15 @@ + + + + + + + + Document + + + + + + + \ No newline at end of file