@ozdao/martyrs 0.2.565 → 0.2.567
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{main-B9o1iBAZ.js → main-BFvlam0J.js} +9 -6
- package/dist/martyrs/dist/main-BFvlam0J.js +943 -0
- package/dist/martyrs/dist/main-BFvlam0J.js.map +1 -0
- package/dist/martyrs/dist/web-CH5wzMHy.js +55 -0
- package/dist/martyrs/dist/web-CH5wzMHy.js.map +1 -0
- package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.js +96 -0
- package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Carousel.vue.js +2 -2
- package/dist/martyrs/src/components/Feed/Carousel.vue.js.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +6 -3
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
- package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
- package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/sections/HotPosts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/App.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +1 -0
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Walkthrough.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.js +17 -1
- package/dist/martyrs/src/modules/events/components/sections/EventsHot.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/events.client.js +15 -12
- package/dist/martyrs/src/modules/events/events.client.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +95 -0
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js.map +1 -0
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +5 -2
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +24 -24
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +3 -3
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +31 -6
- package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +120 -205
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +9 -13
- package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +166 -245
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +135 -220
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js +171 -0
- package/dist/martyrs/src/modules/music/components/player/FullscreenPlayer.vue.js.map +1 -0
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +31 -153
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +96 -0
- package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js.map +1 -0
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +55 -27
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/player/tonar.png.js +5 -0
- package/dist/martyrs/src/modules/music/components/player/tonar.png.js.map +1 -0
- package/dist/martyrs/src/modules/music/store/albums.js +8 -2
- package/dist/martyrs/src/modules/music/store/albums.js.map +1 -1
- package/dist/martyrs/src/modules/music/store/player.js +83 -65
- package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
- package/dist/martyrs/src/modules/music/store/tracks.js +4 -13
- package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/notifications.client.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/music.server.js +33 -6
- package/dist/node_modules/.pnpm/{@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1 → @capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4}/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/definitions.js +1 -0
- package/dist/node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/definitions.js.map +1 -0
- package/dist/node_modules/.pnpm/{@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1 → @capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4}/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/index.js +1 -1
- package/dist/node_modules/.pnpm/{@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1 → @capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4}/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/index.js.map +1 -1
- package/dist/node_modules/.pnpm/{@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1 → @capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4}/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/web.js +16 -1
- package/dist/node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/web.js.map +1 -0
- package/dist/node_modules/.pnpm/{@capacitor_core@7.0.1 → @capacitor_core@7.4.4}/node_modules/@capacitor/core/dist/index.js +2 -1
- package/dist/node_modules/.pnpm/@capacitor_core@7.4.4/node_modules/@capacitor/core/dist/index.js.map +1 -0
- package/dist/node_modules/.pnpm/{@capacitor_device@7.0.0_@capacitor_core@7.0.1 → @capacitor_device@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/device/dist/esm/index.js +1 -1
- package/dist/node_modules/.pnpm/{@capacitor_device@7.0.0_@capacitor_core@7.0.1 → @capacitor_device@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/device/dist/esm/index.js.map +1 -1
- package/dist/node_modules/.pnpm/{@capacitor_device@7.0.0_@capacitor_core@7.0.1 → @capacitor_device@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/device/dist/esm/web.js +1 -1
- package/dist/node_modules/.pnpm/{@capacitor_device@7.0.0_@capacitor_core@7.0.1 → @capacitor_device@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/device/dist/esm/web.js.map +1 -1
- package/dist/node_modules/.pnpm/{@capacitor_keyboard@7.0.0_@capacitor_core@7.0.1 → @capacitor_keyboard@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/keyboard/dist/esm/definitions.js.map +1 -1
- package/dist/node_modules/.pnpm/{@capacitor_keyboard@7.0.0_@capacitor_core@7.0.1 → @capacitor_keyboard@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/keyboard/dist/esm/index.js +1 -1
- package/dist/node_modules/.pnpm/{@capacitor_keyboard@7.0.0_@capacitor_core@7.0.1 → @capacitor_keyboard@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/keyboard/dist/esm/index.js.map +1 -1
- package/dist/node_modules/.pnpm/{@capacitor_push-notifications@7.0.0_@capacitor_core@7.0.1 → @capacitor_push-notifications@7.0.3_@capacitor_core@7.4.4}/node_modules/@capacitor/push-notifications/dist/esm/index.js +1 -1
- package/dist/node_modules/.pnpm/{@capacitor_push-notifications@7.0.0_@capacitor_core@7.0.1 → @capacitor_push-notifications@7.0.3_@capacitor_core@7.4.4}/node_modules/@capacitor/push-notifications/dist/esm/index.js.map +1 -1
- package/dist/node_modules/.pnpm/{capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.0.1 → capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.4.4}/node_modules/capacitor-plugin-app-tracking-transparency/dist/esm/index.js +1 -1
- package/dist/node_modules/.pnpm/{capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.0.1 → capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.4.4}/node_modules/capacitor-plugin-app-tracking-transparency/dist/esm/index.js.map +1 -1
- package/dist/node_modules/.pnpm/{capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.0.1 → capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.4.4}/node_modules/capacitor-plugin-app-tracking-transparency/dist/esm/web.js +1 -1
- package/dist/node_modules/.pnpm/{capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.0.1 → capacitor-plugin-app-tracking-transparency@2.0.5_@capacitor_core@7.4.4}/node_modules/capacitor-plugin-app-tracking-transparency/dist/esm/web.js.map +1 -1
- package/dist/style.css +221 -145
- package/dist/{web-BF3ijvEr.js → web-CH5wzMHy.js} +1 -1
- package/package.json +1 -1
- package/src/components/BottomSheet/BottomSheet.vue +4 -4
- package/src/components/Feed/Carousel.vue +1 -1
- package/src/components/Feed/Feed.vue +3 -3
- package/src/modules/LAYOUT.MD +767 -0
- package/src/modules/community/components/sections/HotPosts.vue +8 -4
- package/src/modules/core/views/components/layouts/Client.vue +1 -1
- package/src/modules/events/components/sections/EventsHot.vue +21 -4
- package/src/modules/events/events.client.js +3 -0
- package/src/modules/music/components/blocks/ActionButtons.vue +74 -0
- package/src/modules/music/components/cards/AlbumCard.vue +1 -1
- package/src/modules/music/components/cards/ArtistCardSmall.vue +8 -6
- package/src/modules/music/components/cards/TrackListCard.vue +6 -6
- package/src/modules/music/components/layouts/MusicBottomPlayer.vue +94 -4
- package/src/modules/music/components/pages/Album.vue +55 -67
- package/src/modules/music/components/pages/MusicHome.vue +4 -6
- package/src/modules/music/components/pages/Playlist.vue +61 -70
- package/src/modules/music/components/pages/Track.vue +54 -71
- package/src/modules/music/components/player/FullscreenPlayer.vue +248 -0
- package/src/modules/music/components/player/MusicPlayer.vue +21 -216
- package/src/modules/music/components/player/PlayerControls.vue +112 -0
- package/src/modules/music/components/player/Visualizer.vue +151 -0
- package/src/modules/music/components/player/VolumeControl.vue +75 -23
- package/src/modules/music/components/player/tonar.png +0 -0
- package/src/modules/music/routes/albums.routes.js +13 -12
- package/src/modules/music/routes/tracks.routes.js +39 -0
- package/src/modules/music/store/albums.js +10 -2
- package/src/modules/music/store/player.js +101 -89
- package/src/modules/music/store/tracks.js +5 -21
- package/src/styles/config.scss +6 -6
- package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
- package/dist/node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/definitions.js.map +0 -1
- package/dist/node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.1.0_@capacitor_core@7.0.1/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/web.js.map +0 -1
- package/dist/node_modules/.pnpm/@capacitor_core@7.0.1/node_modules/@capacitor/core/dist/index.js.map +0 -1
- /package/dist/node_modules/.pnpm/{@capacitor_keyboard@7.0.0_@capacitor_core@7.0.1 → @capacitor_keyboard@7.0.1_@capacitor_core@7.4.4}/node_modules/@capacitor/keyboard/dist/esm/definitions.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"albums.js","sources":["../../../../../../src/modules/music/store/albums.js"],"sourcesContent":["// store/albums.js\nimport StoreManager from '@martyrs/src/modules/core/views/classes/store.manager.js';\nimport { reactive } from 'vue';\n\n// Create store instance\nconst albumStore = new StoreManager(`${process.env.API_URL}/api/albums`);\n\n// State\nexport const state = reactive({\n albums: [],\n featured: [],\n userAlbums: [],\n currentAlbum: null,\n currentAlbumTracks: [],\n isLoading: false,\n loadingFeatured: false,\n});\n\n// Actions\nexport const actions = {\n async fetchAlbums(options = {}) {\n state.isLoading = true;\n try {\n const albums = await albumStore.read(options);\n state.albums = albums;\n return albums;\n } catch (error) {\n console.error('Error fetching albums:', error);\n return [];\n } finally {\n state.isLoading = false;\n }\n },\n\n async fetchFeaturedAlbums() {\n state.loadingFeatured = true;\n try {\n const
|
|
1
|
+
{"version":3,"file":"albums.js","sources":["../../../../../../src/modules/music/store/albums.js"],"sourcesContent":["// store/albums.js\nimport StoreManager from '@martyrs/src/modules/core/views/classes/store.manager.js';\nimport { reactive } from 'vue';\n\n// Create store instance\nconst albumStore = new StoreManager(`${process.env.API_URL}/api/albums`);\n\n// State\nexport const state = reactive({\n albums: [],\n featured: [],\n userAlbums: [],\n currentAlbum: null,\n currentAlbumTracks: [],\n isLoading: false,\n loadingFeatured: false,\n});\n\n// Actions\nexport const actions = {\n async fetchAlbums(options = {}) {\n state.isLoading = true;\n try {\n const albums = await albumStore.read(options);\n state.albums = albums;\n return albums;\n } catch (error) {\n console.error('Error fetching albums:', error);\n return [];\n } finally {\n state.isLoading = false;\n }\n },\n\n async fetchFeaturedAlbums(options = {}) {\n state.loadingFeatured = true;\n try {\n const queryParams = new URLSearchParams();\n\n if (options.limit) queryParams.append('limit', options.limit);\n if (options.skip) queryParams.append('skip', options.skip);\n if (options.sortParam) queryParams.append('sortParam', options.sortParam);\n if (options.sortOrder) queryParams.append('sortOrder', options.sortOrder);\n\n const url = `${process.env.API_URL}/api/albums/featured${queryParams.toString() ? '?' + queryParams.toString() : ''}`;\n const response = await fetch(url);\n const albums = await response.json();\n state.featured = albums;\n return albums;\n } catch (error) {\n console.error('Error fetching featured albums:', error);\n return [];\n } finally {\n state.loadingFeatured = false;\n }\n },\n\n async fetchAlbumByUrl(url) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/albums/url/${url}`);\n const album = await response.json();\n state.currentAlbum = album;\n\n // Fetch album tracks\n await this.fetchAlbumTracks(album._id);\n\n return album;\n } catch (error) {\n console.error('Error fetching album by URL:', error);\n return null;\n }\n },\n\n async fetchAlbumTracks(albumId) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/albums/${albumId}/tracks`);\n const tracks = await response.json();\n state.currentAlbumTracks = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching album tracks:', error);\n return [];\n }\n },\n\n async createAlbum(albumData) {\n try {\n const createdAlbum = await albumStore.create(albumData);\n // Update local state\n state.albums.unshift(createdAlbum);\n state.userAlbums.unshift(createdAlbum);\n return createdAlbum;\n } catch (error) {\n console.error('Error creating album:', error);\n throw error;\n }\n },\n\n async updateAlbum(albumData) {\n try {\n const updatedAlbum = await albumStore.update(albumData);\n\n // Update local state\n const index = state.albums.findIndex(a => a._id === updatedAlbum._id);\n if (index !== -1) {\n state.albums[index] = updatedAlbum;\n }\n\n const userIndex = state.userAlbums.findIndex(a => a._id === updatedAlbum._id);\n if (userIndex !== -1) {\n state.userAlbums[userIndex] = updatedAlbum;\n }\n\n if (state.currentAlbum && state.currentAlbum._id === updatedAlbum._id) {\n state.currentAlbum = updatedAlbum;\n }\n\n return updatedAlbum;\n } catch (error) {\n console.error('Error updating album:', error);\n throw error;\n }\n },\n\n async deleteAlbum(albumId) {\n try {\n await albumStore.delete({ _id: albumId });\n\n // Update local state\n state.albums = state.albums.filter(a => a._id !== albumId);\n state.userAlbums = state.userAlbums.filter(a => a._id !== albumId);\n\n if (state.currentAlbum && state.currentAlbum._id === albumId) {\n state.currentAlbum = null;\n state.currentAlbumTracks = [];\n }\n\n return true;\n } catch (error) {\n console.error('Error deleting album:', error);\n throw error;\n }\n },\n\n async fetchUserAlbums(userId) {\n try {\n const options = {\n creator: userId,\n limit: 100,\n };\n\n const albums = await albumStore.read(options);\n state.userAlbums = albums;\n return albums;\n } catch (error) {\n console.error('Error fetching user albums:', error);\n return [];\n }\n },\n\n async addTrackToAlbum(albumId, trackId) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/${trackId}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ album: albumId }),\n });\n\n const updatedTrack = await response.json();\n\n // Update the current album tracks if relevant\n if (state.currentAlbum && state.currentAlbum._id === albumId) {\n state.currentAlbumTracks.push(updatedTrack);\n }\n\n return updatedTrack;\n } catch (error) {\n console.error('Error adding track to album:', error);\n throw error;\n }\n },\n\n async removeTrackFromAlbum(trackId) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/${trackId}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ album: null }),\n });\n\n const updatedTrack = await response.json();\n\n // Update the current album tracks if relevant\n if (state.currentAlbumTracks.some(track => track._id === trackId)) {\n state.currentAlbumTracks = state.currentAlbumTracks.filter(track => track._id !== trackId);\n }\n\n return updatedTrack;\n } catch (error) {\n console.error('Error removing track from album:', error);\n throw error;\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -2,21 +2,24 @@ import { wsManager } from "../../core/views/classes/ws.manager.js";
|
|
|
2
2
|
import { reactive } from "vue";
|
|
3
3
|
const state = reactive({
|
|
4
4
|
currentTrack: null,
|
|
5
|
+
currentTrackIndex: 0,
|
|
5
6
|
queue: [],
|
|
6
7
|
isPlaying: false,
|
|
7
8
|
volume: 0.7,
|
|
8
9
|
muted: false,
|
|
9
10
|
currentTime: 0,
|
|
10
11
|
duration: 0,
|
|
11
|
-
repeat:
|
|
12
|
-
// 'none', 'all', 'one'
|
|
12
|
+
repeat: false,
|
|
13
13
|
shuffle: false,
|
|
14
14
|
initialQueue: [],
|
|
15
15
|
// To keep original order when shuffle is toggled
|
|
16
16
|
audioElement: null,
|
|
17
17
|
audioContext: null,
|
|
18
18
|
listeningPartyId: null,
|
|
19
|
-
syncInProgress: false
|
|
19
|
+
syncInProgress: false,
|
|
20
|
+
showFullPlayer: false,
|
|
21
|
+
rotationAngle: 0,
|
|
22
|
+
animationFrameId: null
|
|
20
23
|
});
|
|
21
24
|
const actions = {
|
|
22
25
|
initializeAudio() {
|
|
@@ -42,13 +45,20 @@ const actions = {
|
|
|
42
45
|
state.duration = state.audioElement.duration;
|
|
43
46
|
});
|
|
44
47
|
state.audioElement.addEventListener("ended", () => {
|
|
45
|
-
|
|
48
|
+
if (state.repeat) {
|
|
49
|
+
this.seek(0);
|
|
50
|
+
state.audioElement.play().catch((e) => console.error(e));
|
|
51
|
+
} else {
|
|
52
|
+
this.playNext();
|
|
53
|
+
}
|
|
46
54
|
});
|
|
47
55
|
state.audioElement.addEventListener("play", () => {
|
|
48
56
|
state.isPlaying = true;
|
|
57
|
+
this.startRotation();
|
|
49
58
|
});
|
|
50
59
|
state.audioElement.addEventListener("pause", () => {
|
|
51
60
|
state.isPlaying = false;
|
|
61
|
+
this.stopRotation();
|
|
52
62
|
});
|
|
53
63
|
}
|
|
54
64
|
}
|
|
@@ -127,18 +137,9 @@ const actions = {
|
|
|
127
137
|
setQueue(tracks, startIndex = 0) {
|
|
128
138
|
state.queue = [...tracks];
|
|
129
139
|
state.initialQueue = [...tracks];
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
state.queue
|
|
133
|
-
}
|
|
134
|
-
if (state.shuffle && state.queue.length > 1) {
|
|
135
|
-
const firstTrack = state.queue[0];
|
|
136
|
-
const remainingTracks = state.queue.slice(1);
|
|
137
|
-
this.shuffleArray(remainingTracks);
|
|
138
|
-
state.queue = [firstTrack, ...remainingTracks];
|
|
139
|
-
}
|
|
140
|
-
if (state.queue.length > 0) {
|
|
141
|
-
this.playTrack(state.queue[0]);
|
|
140
|
+
state.currentTrackIndex = startIndex;
|
|
141
|
+
if (state.queue.length > 0 && state.queue[startIndex]) {
|
|
142
|
+
this.playTrack(state.queue[startIndex]);
|
|
142
143
|
}
|
|
143
144
|
},
|
|
144
145
|
addToQueue(track) {
|
|
@@ -151,6 +152,20 @@ const actions = {
|
|
|
151
152
|
removeFromQueue(index) {
|
|
152
153
|
if (index >= 0 && index < state.queue.length) {
|
|
153
154
|
state.queue.splice(index, 1);
|
|
155
|
+
state.initialQueue.splice(index, 1);
|
|
156
|
+
if (index < state.currentTrackIndex) {
|
|
157
|
+
state.currentTrackIndex--;
|
|
158
|
+
} else if (index === state.currentTrackIndex) {
|
|
159
|
+
if (state.queue.length > 0) {
|
|
160
|
+
if (state.currentTrackIndex >= state.queue.length) {
|
|
161
|
+
state.currentTrackIndex = 0;
|
|
162
|
+
}
|
|
163
|
+
this.playTrack(state.queue[state.currentTrackIndex]);
|
|
164
|
+
} else {
|
|
165
|
+
state.currentTrack = null;
|
|
166
|
+
state.isPlaying = false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
154
169
|
}
|
|
155
170
|
},
|
|
156
171
|
clearQueue() {
|
|
@@ -164,68 +179,35 @@ const actions = {
|
|
|
164
179
|
state.isPlaying = false;
|
|
165
180
|
},
|
|
166
181
|
playNext() {
|
|
167
|
-
if (state.queue.length
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
if (state.repeat !== "one") {
|
|
177
|
-
state.queue.shift();
|
|
178
|
-
if (state.queue.length === 0 && state.repeat === "all") {
|
|
179
|
-
state.queue = [...state.initialQueue];
|
|
180
|
-
}
|
|
181
|
-
if (state.queue.length > 0) {
|
|
182
|
-
this.playTrack(state.queue[0]);
|
|
183
|
-
} else {
|
|
184
|
-
state.currentTrack = null;
|
|
185
|
-
state.isPlaying = false;
|
|
186
|
-
}
|
|
182
|
+
if (state.queue.length === 0) return;
|
|
183
|
+
if (state.shuffle) {
|
|
184
|
+
let nextIndex;
|
|
185
|
+
do {
|
|
186
|
+
nextIndex = Math.floor(Math.random() * state.queue.length);
|
|
187
|
+
} while (nextIndex === state.currentTrackIndex && state.queue.length > 1);
|
|
188
|
+
state.currentTrackIndex = nextIndex;
|
|
187
189
|
} else {
|
|
188
|
-
|
|
189
|
-
state.audioElement.play().catch((e) => console.error(e));
|
|
190
|
+
state.currentTrackIndex = (state.currentTrackIndex + 1) % state.queue.length;
|
|
190
191
|
}
|
|
192
|
+
this.playTrack(state.queue[state.currentTrackIndex]);
|
|
191
193
|
},
|
|
192
194
|
playPrevious() {
|
|
195
|
+
if (state.queue.length === 0) return;
|
|
193
196
|
if (state.currentTime > 3) {
|
|
194
197
|
this.seek(0);
|
|
195
198
|
return;
|
|
196
199
|
}
|
|
197
|
-
|
|
200
|
+
state.currentTrackIndex = state.currentTrackIndex - 1;
|
|
201
|
+
if (state.currentTrackIndex < 0) {
|
|
202
|
+
state.currentTrackIndex = state.queue.length - 1;
|
|
203
|
+
}
|
|
204
|
+
this.playTrack(state.queue[state.currentTrackIndex]);
|
|
198
205
|
},
|
|
199
206
|
toggleRepeat() {
|
|
200
|
-
|
|
201
|
-
state.repeat = "all";
|
|
202
|
-
} else if (state.repeat === "all") {
|
|
203
|
-
state.repeat = "one";
|
|
204
|
-
} else {
|
|
205
|
-
state.repeat = "none";
|
|
206
|
-
}
|
|
207
|
+
state.repeat = !state.repeat;
|
|
207
208
|
},
|
|
208
209
|
toggleShuffle() {
|
|
209
210
|
state.shuffle = !state.shuffle;
|
|
210
|
-
if (state.shuffle) {
|
|
211
|
-
const currentTrack = state.queue[0];
|
|
212
|
-
const remainingTracks = state.queue.slice(1);
|
|
213
|
-
this.shuffleArray(remainingTracks);
|
|
214
|
-
state.queue = [currentTrack, ...remainingTracks];
|
|
215
|
-
} else {
|
|
216
|
-
if (state.currentTrack) {
|
|
217
|
-
const currentTrackIndex = state.initialQueue.findIndex((track) => track._id === state.currentTrack._id);
|
|
218
|
-
if (currentTrackIndex !== -1) {
|
|
219
|
-
const tracksToPlay = state.initialQueue.slice(currentTrackIndex);
|
|
220
|
-
const previousTracks = state.initialQueue.slice(0, currentTrackIndex);
|
|
221
|
-
state.queue = [...tracksToPlay, ...previousTracks];
|
|
222
|
-
} else {
|
|
223
|
-
state.queue = [...state.initialQueue];
|
|
224
|
-
}
|
|
225
|
-
} else {
|
|
226
|
-
state.queue = [...state.initialQueue];
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
211
|
},
|
|
230
212
|
shuffleArray(array) {
|
|
231
213
|
for (let i = array.length - 1; i > 0; i--) {
|
|
@@ -292,6 +274,42 @@ const actions = {
|
|
|
292
274
|
setTimeout(() => {
|
|
293
275
|
state.syncInProgress = false;
|
|
294
276
|
}, 1e3);
|
|
277
|
+
},
|
|
278
|
+
// Fullscreen player
|
|
279
|
+
toggleFullPlayer() {
|
|
280
|
+
state.showFullPlayer = !state.showFullPlayer;
|
|
281
|
+
},
|
|
282
|
+
// Disk rotation animation
|
|
283
|
+
rotateDisk() {
|
|
284
|
+
if (state.isPlaying) {
|
|
285
|
+
state.rotationAngle = (state.rotationAngle + 1) % 360;
|
|
286
|
+
state.animationFrameId = requestAnimationFrame(() => this.rotateDisk());
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
startRotation() {
|
|
290
|
+
if (!state.animationFrameId && typeof window !== "undefined") {
|
|
291
|
+
this.rotateDisk();
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
stopRotation() {
|
|
295
|
+
if (state.animationFrameId) {
|
|
296
|
+
cancelAnimationFrame(state.animationFrameId);
|
|
297
|
+
state.animationFrameId = null;
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
// Queue reordering
|
|
301
|
+
reorderQueue(fromIndex, toIndex) {
|
|
302
|
+
if (fromIndex >= 0 && fromIndex < state.queue.length && toIndex >= 0 && toIndex < state.queue.length) {
|
|
303
|
+
const track = state.queue.splice(fromIndex, 1)[0];
|
|
304
|
+
state.queue.splice(toIndex, 0, track);
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
// Jump to specific track in queue
|
|
308
|
+
jumpToTrack(index) {
|
|
309
|
+
if (index >= 0 && index < state.queue.length) {
|
|
310
|
+
state.currentTrackIndex = index;
|
|
311
|
+
this.playTrack(state.queue[index]);
|
|
312
|
+
}
|
|
295
313
|
}
|
|
296
314
|
};
|
|
297
315
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.js","sources":["../../../../../../src/modules/music/store/player.js"],"sourcesContent":["// store/player.js\nimport wsManager from '@martyrs/src/modules/core/views/classes/ws.manager.js';\nimport { reactive } from 'vue';\n\n// State\nexport const state = reactive({\n currentTrack: null,\n queue: [],\n isPlaying: false,\n volume: 0.7,\n muted: false,\n currentTime: 0,\n duration: 0,\n repeat: 'none', // 'none', 'all', 'one'\n shuffle: false,\n initialQueue: [], // To keep original order when shuffle is toggled\n audioElement: null,\n audioContext: null,\n listeningPartyId: null,\n syncInProgress: false,\n});\n\n// Actions\nexport const actions = {\n initializeAudio() {\n if (typeof window !== 'undefined') {\n if (!state.audioElement) {\n state.audioElement = new Audio();\n state.audioElement.volume = state.volume;\n\n // Set up audio context if available\n try {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (AudioContext) {\n state.audioContext = new AudioContext();\n }\n } catch (e) {\n console.error('AudioContext not supported', e);\n }\n\n // Add event listeners\n state.audioElement.addEventListener('timeupdate', () => {\n state.currentTime = state.audioElement.currentTime;\n\n // Sync playback with listening party every 5 seconds\n if (state.listeningPartyId && !state.syncInProgress && state.isPlaying && state.currentTime % 5 < 0.1) {\n this.syncPartyPlayback();\n }\n });\n\n state.audioElement.addEventListener('loadedmetadata', () => {\n state.duration = state.audioElement.duration;\n });\n\n state.audioElement.addEventListener('ended', () => {\n this.playNext();\n });\n\n state.audioElement.addEventListener('play', () => {\n state.isPlaying = true;\n });\n\n state.audioElement.addEventListener('pause', () => {\n state.isPlaying = false;\n });\n }\n }\n },\n\n async playTrack(track) {\n if (!state.audioElement) {\n this.initializeAudio();\n }\n\n // If track is already playing, just toggle play/pause\n if (state.currentTrack && state.currentTrack._id === track._id) {\n return this.togglePlay();\n }\n\n // Set the current track\n state.currentTrack = track;\n\n // Generate stream URL\n const streamUrl = `${process.env.API_URL}/api/stream/${track._id}`;\n\n // Set up audio element\n state.audioElement.src = streamUrl;\n state.audioElement.load();\n const playPromise = state.audioElement.play();\n\n // Handle autoplay restrictions\n if (playPromise !== undefined) {\n playPromise.catch(error => {\n console.error('Autoplay prevented:', error);\n state.isPlaying = false;\n });\n }\n\n // Log play via WebSocket if connected\n console.log('Player: Attempting to log play event for track:', track._id);\n console.log('Player: WebSocket connected?', wsManager.isSocketConnected());\n \n if (wsManager.isSocketConnected()) {\n console.log('Player: Sending startPlaying event via WebSocket');\n wsManager.send({\n module: 'music-streaming',\n action: 'startPlaying',\n data: {\n trackId: track._id,\n from: 'player',\n deviceInfo: navigator.userAgent,\n },\n });\n } else {\n console.log('Player: WebSocket not connected, play count will not be incremented');\n }\n },\n\n togglePlay() {\n if (!state.currentTrack || !state.audioElement) return;\n\n if (state.isPlaying) {\n state.audioElement.pause();\n } else {\n state.audioElement.play().catch(error => {\n console.error('Play failed:', error);\n });\n }\n\n state.isPlaying = !state.isPlaying;\n\n // Sync with listening party if active\n if (state.listeningPartyId) {\n this.syncPartyPlayback();\n }\n },\n\n setVolume(volume) {\n state.volume = volume;\n if (state.audioElement) {\n state.audioElement.volume = volume;\n }\n },\n\n toggleMute() {\n state.muted = !state.muted;\n if (state.audioElement) {\n state.audioElement.muted = state.muted;\n }\n },\n\n seek(time) {\n if (state.audioElement) {\n state.audioElement.currentTime = time;\n state.currentTime = time;\n\n // Sync with listening party if active\n if (state.listeningPartyId) {\n this.syncPartyPlayback();\n }\n }\n },\n\n // Queue management\n setQueue(tracks, startIndex = 0) {\n state.queue = [...tracks];\n state.initialQueue = [...tracks];\n\n if (startIndex > 0 && startIndex < tracks.length) {\n // Rearrange queue to start from the selected track\n const tracksToPlay = state.queue.splice(startIndex);\n state.queue = [...tracksToPlay, ...state.queue];\n }\n\n // If shuffle is on, randomize the queue except the first track\n if (state.shuffle && state.queue.length > 1) {\n const firstTrack = state.queue[0];\n const remainingTracks = state.queue.slice(1);\n this.shuffleArray(remainingTracks);\n state.queue = [firstTrack, ...remainingTracks];\n }\n\n // Start playing the first track in queue\n if (state.queue.length > 0) {\n this.playTrack(state.queue[0]);\n }\n },\n\n addToQueue(track) {\n state.queue.push(track);\n state.initialQueue.push(track);\n\n // If nothing is playing, start this track\n if (!state.currentTrack) {\n this.playTrack(track);\n }\n },\n\n removeFromQueue(index) {\n if (index >= 0 && index < state.queue.length) {\n state.queue.splice(index, 1);\n }\n },\n\n clearQueue() {\n state.queue = [];\n state.initialQueue = [];\n\n if (state.audioElement) {\n state.audioElement.pause();\n state.audioElement.src = '';\n }\n\n state.currentTrack = null;\n state.isPlaying = false;\n },\n\n playNext() {\n if (state.queue.length <= 1) {\n // Only one track or empty queue\n if (state.repeat === 'one' || state.repeat === 'all') {\n // Replay the current track\n this.seek(0);\n state.audioElement.play().catch(e => console.error(e));\n } else {\n // Stop playback\n state.isPlaying = false;\n }\n return;\n }\n\n if (state.repeat !== 'one') {\n // Move to next track\n state.queue.shift(); // Remove current track from queue\n\n // If queue is empty after removing current track and repeat is on\n if (state.queue.length === 0 && state.repeat === 'all') {\n state.queue = [...state.initialQueue];\n }\n\n // Play the next track if available\n if (state.queue.length > 0) {\n this.playTrack(state.queue[0]);\n } else {\n state.currentTrack = null;\n state.isPlaying = false;\n }\n } else {\n // Repeat one - just seek to beginning\n this.seek(0);\n state.audioElement.play().catch(e => console.error(e));\n }\n },\n\n playPrevious() {\n // If we're more than 3 seconds into the track, restart it\n if (state.currentTime > 3) {\n this.seek(0);\n return;\n }\n\n // Otherwise go to previous track if we have history\n // Implementation depends on how track history is managed\n // For simplicity, let's just go back to the beginning of the current track\n this.seek(0);\n },\n\n toggleRepeat() {\n // Cycle through repeat modes: none -> all -> one -> none...\n if (state.repeat === 'none') {\n state.repeat = 'all';\n } else if (state.repeat === 'all') {\n state.repeat = 'one';\n } else {\n state.repeat = 'none';\n }\n },\n\n toggleShuffle() {\n state.shuffle = !state.shuffle;\n\n if (state.shuffle) {\n // Save the current track\n const currentTrack = state.queue[0];\n\n // Shuffle the rest of the queue\n const remainingTracks = state.queue.slice(1);\n this.shuffleArray(remainingTracks);\n\n // Reconstruct queue with current track at the front\n state.queue = [currentTrack, ...remainingTracks];\n } else {\n // Restore original order but keep current track at front\n if (state.currentTrack) {\n const currentTrackIndex = state.initialQueue.findIndex(track => track._id === state.currentTrack._id);\n\n if (currentTrackIndex !== -1) {\n const tracksToPlay = state.initialQueue.slice(currentTrackIndex);\n const previousTracks = state.initialQueue.slice(0, currentTrackIndex);\n state.queue = [...tracksToPlay, ...previousTracks];\n } else {\n state.queue = [...state.initialQueue];\n }\n } else {\n state.queue = [...state.initialQueue];\n }\n }\n },\n\n shuffleArray(array) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n },\n\n // Listening party features\n joinListeningParty(partyId) {\n state.listeningPartyId = partyId;\n\n if (wsManager.isSocketConnected()) {\n wsManager.send({\n module: 'music-streaming',\n action: 'joinListeningParty',\n data: { partyId },\n });\n\n // Set up event listener for party playback sync\n wsManager.addEventListener('partyPlaybackSync', this.handlePartySync.bind(this), {\n module: 'music-streaming',\n });\n }\n },\n\n leaveListeningParty() {\n state.listeningPartyId = null;\n\n // Remove event listener for party sync\n if (wsManager.isSocketConnected()) {\n wsManager.removeEventListener('partyPlaybackSync');\n }\n },\n\n syncPartyPlayback() {\n if (!state.listeningPartyId || !state.currentTrack || !wsManager.isSocketConnected()) {\n return;\n }\n\n wsManager.send({\n module: 'music-streaming',\n action: 'syncPartyPlayback',\n data: {\n trackId: state.currentTrack._id,\n position: state.currentTime,\n isPlaying: state.isPlaying,\n },\n });\n },\n\n handlePartySync(data) {\n if (!state.listeningPartyId) return;\n\n state.syncInProgress = true;\n\n // If different track is playing in the party\n if (data.trackId !== state.currentTrack?._id) {\n // Find track in queue or load it\n const trackInQueue = state.queue.find(track => track._id === data.trackId);\n\n if (trackInQueue) {\n this.playTrack(trackInQueue);\n } else {\n // Need to fetch the track from the API\n fetch(`${process.env.API_URL}/api/tracks/${data.trackId}`)\n .then(response => response.json())\n .then(track => {\n this.playTrack(track);\n })\n .catch(error => {\n console.error('Error fetching party track:', error);\n });\n }\n }\n\n // Sync playback position with some tolerance (2 seconds)\n if (Math.abs(state.currentTime - data.position) > 2) {\n this.seek(data.position);\n }\n\n // Sync play/pause state\n if (state.isPlaying !== data.isPlaying) {\n this.togglePlay();\n }\n\n // Reset sync flag after a short delay\n setTimeout(() => {\n state.syncInProgress = false;\n }, 1000);\n },\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"player.js","sources":["../../../../../../src/modules/music/store/player.js"],"sourcesContent":["// store/player.js\nimport wsManager from '@martyrs/src/modules/core/views/classes/ws.manager.js';\nimport { reactive } from 'vue';\n\n// State\nexport const state = reactive({\n currentTrack: null,\n currentTrackIndex: 0,\n queue: [],\n isPlaying: false,\n volume: 0.7,\n muted: false,\n currentTime: 0,\n duration: 0,\n repeat: false,\n shuffle: false,\n initialQueue: [], // To keep original order when shuffle is toggled\n audioElement: null,\n audioContext: null,\n listeningPartyId: null,\n syncInProgress: false,\n showFullPlayer: false,\n rotationAngle: 0,\n animationFrameId: null,\n});\n\n// Actions\nexport const actions = {\n initializeAudio() {\n if (typeof window !== 'undefined') {\n if (!state.audioElement) {\n state.audioElement = new Audio();\n state.audioElement.volume = state.volume;\n\n // Set up audio context if available\n try {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (AudioContext) {\n state.audioContext = new AudioContext();\n }\n } catch (e) {\n console.error('AudioContext not supported', e);\n }\n\n // Add event listeners\n state.audioElement.addEventListener('timeupdate', () => {\n state.currentTime = state.audioElement.currentTime;\n\n // Sync playback with listening party every 5 seconds\n if (state.listeningPartyId && !state.syncInProgress && state.isPlaying && state.currentTime % 5 < 0.1) {\n this.syncPartyPlayback();\n }\n });\n\n state.audioElement.addEventListener('loadedmetadata', () => {\n state.duration = state.audioElement.duration;\n });\n\n state.audioElement.addEventListener('ended', () => {\n if (state.repeat) {\n // Restart текущего трека\n this.seek(0);\n state.audioElement.play().catch(e => console.error(e));\n } else {\n // Следующий трек\n this.playNext();\n }\n });\n\n state.audioElement.addEventListener('play', () => {\n state.isPlaying = true;\n this.startRotation();\n });\n\n state.audioElement.addEventListener('pause', () => {\n state.isPlaying = false;\n this.stopRotation();\n });\n }\n }\n },\n\n async playTrack(track) {\n if (!state.audioElement) {\n this.initializeAudio();\n }\n\n // If track is already playing, just toggle play/pause\n if (state.currentTrack && state.currentTrack._id === track._id) {\n return this.togglePlay();\n }\n\n // Set the current track\n state.currentTrack = track;\n\n // Generate stream URL\n const streamUrl = `${process.env.API_URL}/api/stream/${track._id}`;\n\n // Set up audio element\n state.audioElement.src = streamUrl;\n state.audioElement.load();\n const playPromise = state.audioElement.play();\n\n // Handle autoplay restrictions\n if (playPromise !== undefined) {\n playPromise.catch(error => {\n console.error('Autoplay prevented:', error);\n state.isPlaying = false;\n });\n }\n\n // Log play via WebSocket if connected\n console.log('Player: Attempting to log play event for track:', track._id);\n console.log('Player: WebSocket connected?', wsManager.isSocketConnected());\n \n if (wsManager.isSocketConnected()) {\n console.log('Player: Sending startPlaying event via WebSocket');\n wsManager.send({\n module: 'music-streaming',\n action: 'startPlaying',\n data: {\n trackId: track._id,\n from: 'player',\n deviceInfo: navigator.userAgent,\n },\n });\n } else {\n console.log('Player: WebSocket not connected, play count will not be incremented');\n }\n },\n\n togglePlay() {\n if (!state.currentTrack || !state.audioElement) return;\n\n if (state.isPlaying) {\n state.audioElement.pause();\n } else {\n state.audioElement.play().catch(error => {\n console.error('Play failed:', error);\n });\n }\n\n state.isPlaying = !state.isPlaying;\n\n // Sync with listening party if active\n if (state.listeningPartyId) {\n this.syncPartyPlayback();\n }\n },\n\n setVolume(volume) {\n state.volume = volume;\n if (state.audioElement) {\n state.audioElement.volume = volume;\n }\n },\n\n toggleMute() {\n state.muted = !state.muted;\n if (state.audioElement) {\n state.audioElement.muted = state.muted;\n }\n },\n\n seek(time) {\n if (state.audioElement) {\n state.audioElement.currentTime = time;\n state.currentTime = time;\n\n // Sync with listening party if active\n if (state.listeningPartyId) {\n this.syncPartyPlayback();\n }\n }\n },\n\n // Queue management\n setQueue(tracks, startIndex = 0) {\n state.queue = [...tracks];\n state.initialQueue = [...tracks];\n state.currentTrackIndex = startIndex;\n\n // Start playing the track at startIndex\n if (state.queue.length > 0 && state.queue[startIndex]) {\n this.playTrack(state.queue[startIndex]);\n }\n },\n\n addToQueue(track) {\n state.queue.push(track);\n state.initialQueue.push(track);\n\n // If nothing is playing, start this track\n if (!state.currentTrack) {\n this.playTrack(track);\n }\n },\n\n removeFromQueue(index) {\n if (index >= 0 && index < state.queue.length) {\n state.queue.splice(index, 1);\n state.initialQueue.splice(index, 1);\n\n // Корректируем currentTrackIndex если нужно\n if (index < state.currentTrackIndex) {\n // Удалили трек до текущего - сдвигаем индекс назад\n state.currentTrackIndex--;\n } else if (index === state.currentTrackIndex) {\n // Удалили текущий трек - играем следующий (или первый если был последний)\n if (state.queue.length > 0) {\n if (state.currentTrackIndex >= state.queue.length) {\n state.currentTrackIndex = 0;\n }\n this.playTrack(state.queue[state.currentTrackIndex]);\n } else {\n state.currentTrack = null;\n state.isPlaying = false;\n }\n }\n // Если удалили трек после текущего - ничего не делаем\n }\n },\n\n clearQueue() {\n state.queue = [];\n state.initialQueue = [];\n\n if (state.audioElement) {\n state.audioElement.pause();\n state.audioElement.src = '';\n }\n\n state.currentTrack = null;\n state.isPlaying = false;\n },\n\n playNext() {\n if (state.queue.length === 0) return;\n\n if (state.shuffle) {\n // Случайный трек (кроме текущего)\n let nextIndex;\n do {\n nextIndex = Math.floor(Math.random() * state.queue.length);\n } while (nextIndex === state.currentTrackIndex && state.queue.length > 1);\n state.currentTrackIndex = nextIndex;\n } else {\n // По порядку (циклически)\n state.currentTrackIndex = (state.currentTrackIndex + 1) % state.queue.length;\n }\n\n this.playTrack(state.queue[state.currentTrackIndex]);\n },\n\n playPrevious() {\n if (state.queue.length === 0) return;\n\n // If we're more than 3 seconds into the track, restart it\n if (state.currentTime > 3) {\n this.seek(0);\n return;\n }\n\n // Move to previous track (циклически)\n state.currentTrackIndex = state.currentTrackIndex - 1;\n if (state.currentTrackIndex < 0) {\n state.currentTrackIndex = state.queue.length - 1;\n }\n this.playTrack(state.queue[state.currentTrackIndex]);\n },\n\n toggleRepeat() {\n state.repeat = !state.repeat;\n },\n\n toggleShuffle() {\n state.shuffle = !state.shuffle;\n },\n\n shuffleArray(array) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n },\n\n // Listening party features\n joinListeningParty(partyId) {\n state.listeningPartyId = partyId;\n\n if (wsManager.isSocketConnected()) {\n wsManager.send({\n module: 'music-streaming',\n action: 'joinListeningParty',\n data: { partyId },\n });\n\n // Set up event listener for party playback sync\n wsManager.addEventListener('partyPlaybackSync', this.handlePartySync.bind(this), {\n module: 'music-streaming',\n });\n }\n },\n\n leaveListeningParty() {\n state.listeningPartyId = null;\n\n // Remove event listener for party sync\n if (wsManager.isSocketConnected()) {\n wsManager.removeEventListener('partyPlaybackSync');\n }\n },\n\n syncPartyPlayback() {\n if (!state.listeningPartyId || !state.currentTrack || !wsManager.isSocketConnected()) {\n return;\n }\n\n wsManager.send({\n module: 'music-streaming',\n action: 'syncPartyPlayback',\n data: {\n trackId: state.currentTrack._id,\n position: state.currentTime,\n isPlaying: state.isPlaying,\n },\n });\n },\n\n handlePartySync(data) {\n if (!state.listeningPartyId) return;\n\n state.syncInProgress = true;\n\n // If different track is playing in the party\n if (data.trackId !== state.currentTrack?._id) {\n // Find track in queue or load it\n const trackInQueue = state.queue.find(track => track._id === data.trackId);\n\n if (trackInQueue) {\n this.playTrack(trackInQueue);\n } else {\n // Need to fetch the track from the API\n fetch(`${process.env.API_URL}/api/tracks/${data.trackId}`)\n .then(response => response.json())\n .then(track => {\n this.playTrack(track);\n })\n .catch(error => {\n console.error('Error fetching party track:', error);\n });\n }\n }\n\n // Sync playback position with some tolerance (2 seconds)\n if (Math.abs(state.currentTime - data.position) > 2) {\n this.seek(data.position);\n }\n\n // Sync play/pause state\n if (state.isPlaying !== data.isPlaying) {\n this.togglePlay();\n }\n\n // Reset sync flag after a short delay\n setTimeout(() => {\n state.syncInProgress = false;\n }, 1000);\n },\n\n // Fullscreen player\n toggleFullPlayer() {\n state.showFullPlayer = !state.showFullPlayer;\n },\n\n // Disk rotation animation\n rotateDisk() {\n if (state.isPlaying) {\n state.rotationAngle = (state.rotationAngle + 1) % 360;\n state.animationFrameId = requestAnimationFrame(() => this.rotateDisk());\n }\n },\n\n startRotation() {\n if (!state.animationFrameId && typeof window !== 'undefined') {\n this.rotateDisk();\n }\n },\n\n stopRotation() {\n if (state.animationFrameId) {\n cancelAnimationFrame(state.animationFrameId);\n state.animationFrameId = null;\n }\n },\n\n // Queue reordering\n reorderQueue(fromIndex, toIndex) {\n if (fromIndex >= 0 && fromIndex < state.queue.length && toIndex >= 0 && toIndex < state.queue.length) {\n const track = state.queue.splice(fromIndex, 1)[0];\n state.queue.splice(toIndex, 0, track);\n }\n },\n\n // Jump to specific track in queue\n jumpToTrack(index) {\n if (index >= 0 && index < state.queue.length) {\n state.currentTrackIndex = index;\n this.playTrack(state.queue[index]);\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -179,19 +179,10 @@ const actions = {
|
|
|
179
179
|
},
|
|
180
180
|
async fetchRelatedTracks(trackUrl) {
|
|
181
181
|
try {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
queryParams.append("limit", "5");
|
|
187
|
-
const response = await fetch(`${process.env.API_URL}/api/tracks/read?${queryParams.toString()}`);
|
|
188
|
-
const tracks = await response.json();
|
|
189
|
-
const relatedTracks = tracks.filter((track) => track._id !== state.currentTrack._id);
|
|
190
|
-
state.relatedTracks = relatedTracks;
|
|
191
|
-
return relatedTracks;
|
|
192
|
-
}
|
|
193
|
-
state.relatedTracks = [];
|
|
194
|
-
return [];
|
|
182
|
+
const response = await fetch(`${process.env.API_URL}/api/tracks/related/${trackUrl}`);
|
|
183
|
+
const relatedTracks = await response.json();
|
|
184
|
+
state.relatedTracks = relatedTracks;
|
|
185
|
+
return relatedTracks;
|
|
195
186
|
} catch (error) {
|
|
196
187
|
console.error("Error fetching related tracks:", error);
|
|
197
188
|
state.relatedTracks = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracks.js","sources":["../../../../../../src/modules/music/store/tracks.js"],"sourcesContent":["// store/tracks.js\nimport StoreManager from '@martyrs/src/modules/core/views/classes/store.manager.js';\nimport { reactive } from 'vue';\n\n// Create store instance\nconst trackStore = new StoreManager(`${process.env.API_URL}/api/tracks`);\n\n// State\nexport const state = reactive({\n tracks: [],\n popular: [],\n recent: [],\n featured: [],\n userTracks: [],\n currentTrack: null,\n relatedTracks: [],\n isLoading: false,\n loadingPopular: false,\n loadingRecent: false,\n loadingFeatured: false,\n});\n\n// Actions\nexport const actions = {\n async fetchTracks(options = {}) {\n state.isLoading = true;\n try {\n const tracks = await trackStore.read(options);\n state.tracks = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching tracks:', error);\n return [];\n } finally {\n state.isLoading = false;\n }\n },\n\n async fetchPopularTracks(options = {}) {\n state.loadingPopular = true;\n try {\n // Обрабатываем options от Feed компонента\n const queryParams = new URLSearchParams();\n queryParams.append('limit', options.limit || 10);\n \n if (options.skip) queryParams.append('skip', options.skip);\n if (options.search) queryParams.append('search', options.search);\n \n const response = await fetch(`${process.env.API_URL}/api/tracks/popular?${queryParams.toString()}`);\n const tracks = await response.json();\n state.popular = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching popular tracks:', error);\n return [];\n } finally {\n state.loadingPopular = false;\n }\n },\n\n async fetchRecentTracks(limit = 10) {\n state.loadingRecent = true;\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/recent?limit=${limit}`);\n const tracks = await response.json();\n state.recent = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching recent tracks:', error);\n return [];\n } finally {\n state.loadingRecent = false;\n }\n },\n\n async fetchTracksByGenre(genreId, limit = 20) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/genre/${genreId}?limit=${limit}`);\n return await response.json();\n } catch (error) {\n console.error('Error fetching tracks by genre:', error);\n return [];\n }\n },\n\n async fetchTrackByUrl(url) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/url/${url}`);\n const track = await response.json();\n state.currentTrack = track;\n return track;\n } catch (error) {\n console.error('Error fetching track by URL:', error);\n return null;\n }\n },\n\n // Improved createTrack action with better error handling\n async createTrack(trackData) {\n console.log('Creating track with data:', trackData);\n\n // Validate required fields to prevent silent failures\n const requiredFields = ['title', 'artist', 'genre', 'fileUrl'];\n const missingFields = requiredFields.filter(field => !trackData[field]);\n\n if (missingFields.length > 0) {\n const error = new Error(`Missing required fields: ${missingFields.join(', ')}`);\n console.error(error);\n throw error;\n }\n\n // Ensure proper structure for owner and creator fields\n if (!trackData.owner || !trackData.owner.target || !trackData.owner.type) {\n console.error('Track data missing owner information');\n throw new Error('Owner information is required');\n }\n\n if (!trackData.creator || !trackData.creator.target || !trackData.creator.type) {\n console.error('Track data missing creator information');\n throw new Error('Creator information is required');\n }\n\n try {\n console.log('Calling API to create track...');\n\n // Check what API URL we're using\n console.log('API URL:', trackStore.apiUrl);\n\n // Use a timeout to detect hanging requests\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Request timed out after 15 seconds')), 15000);\n });\n\n // Race between the actual request and the timeout\n const createdTrack = await Promise.race([trackStore.create(trackData), timeoutPromise]);\n\n console.log('Track created successfully, server response:', createdTrack);\n\n // Check if the response is what we expect\n if (!createdTrack || !createdTrack._id) {\n console.error('API returned success but without expected track data:', createdTrack);\n throw new Error('Invalid response from server');\n }\n\n // Update local state\n state.tracks.unshift(createdTrack);\n state.userTracks.unshift(createdTrack);\n\n console.log('Local state updated with new track');\n return createdTrack;\n } catch (error) {\n console.error('Error creating track:', error);\n\n // Enhanced error logging\n if (error.response) {\n console.error('Error response:', error.response);\n }\n\n // Format the error for better user feedback\n const formattedError = new Error(error.message || 'Failed to create track. Please try again.');\n formattedError.originalError = error;\n\n // Set a global error\n setError({\n message: formattedError.message,\n errorCode: error.errorCode || 'TRACK_CREATE_FAILED',\n });\n\n throw formattedError;\n }\n },\n\n async updateTrack(trackData) {\n try {\n const updatedTrack = await trackStore.update(trackData);\n\n // Update local state\n const index = state.tracks.findIndex(t => t._id === updatedTrack._id);\n if (index !== -1) {\n state.tracks[index] = updatedTrack;\n }\n\n const userIndex = state.userTracks.findIndex(t => t._id === updatedTrack._id);\n if (userIndex !== -1) {\n state.userTracks[userIndex] = updatedTrack;\n }\n\n if (state.currentTrack && state.currentTrack._id === updatedTrack._id) {\n state.currentTrack = updatedTrack;\n }\n\n return updatedTrack;\n } catch (error) {\n console.error('Error updating track:', error);\n throw error;\n }\n },\n\n async deleteTrack(trackId) {\n try {\n await trackStore.delete({ _id: trackId });\n\n // Update local state\n state.tracks = state.tracks.filter(t => t._id !== trackId);\n state.userTracks = state.userTracks.filter(t => t._id !== trackId);\n\n if (state.currentTrack && state.currentTrack._id === trackId) {\n state.currentTrack = null;\n }\n\n return true;\n } catch (error) {\n console.error('Error deleting track:', error);\n throw error;\n }\n },\n\n async fetchUserTracks(userId) {\n try {\n const options = {\n creator: userId,\n limit: 100,\n };\n console.log('fetchUserTracks', userId);\n const tracks = await trackStore.read(options);\n state.userTracks = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching user tracks:', error);\n return [];\n }\n },\n\n async fetchRelatedTracks(trackUrl) {\n try {\n // Если есть currentTrack, ищем треки того же артиста\n if (state.currentTrack && state.currentTrack.artist) {\n const artistId = typeof state.currentTrack.artist === 'object' \n ? state.currentTrack.artist._id \n : state.currentTrack.artist;\n \n const queryParams = new URLSearchParams();\n queryParams.append('artist', artistId);\n queryParams.append('limit', '5');\n \n const response = await fetch(`${process.env.API_URL}/api/tracks/read?${queryParams.toString()}`);\n const tracks = await response.json();\n \n // Исключаем текущий трек\n const relatedTracks = tracks.filter(track => track._id !== state.currentTrack._id);\n state.relatedTracks = relatedTracks;\n return relatedTracks;\n }\n \n state.relatedTracks = [];\n return [];\n } catch (error) {\n console.error('Error fetching related tracks:', error);\n state.relatedTracks = [];\n return [];\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tracks.js","sources":["../../../../../../src/modules/music/store/tracks.js"],"sourcesContent":["// store/tracks.js\nimport StoreManager from '@martyrs/src/modules/core/views/classes/store.manager.js';\nimport { reactive } from 'vue';\n\n// Create store instance\nconst trackStore = new StoreManager(`${process.env.API_URL}/api/tracks`);\n\n// State\nexport const state = reactive({\n tracks: [],\n popular: [],\n recent: [],\n featured: [],\n userTracks: [],\n currentTrack: null,\n relatedTracks: [],\n isLoading: false,\n loadingPopular: false,\n loadingRecent: false,\n loadingFeatured: false,\n});\n\n// Actions\nexport const actions = {\n async fetchTracks(options = {}) {\n state.isLoading = true;\n try {\n const tracks = await trackStore.read(options);\n state.tracks = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching tracks:', error);\n return [];\n } finally {\n state.isLoading = false;\n }\n },\n\n async fetchPopularTracks(options = {}) {\n state.loadingPopular = true;\n try {\n // Обрабатываем options от Feed компонента\n const queryParams = new URLSearchParams();\n queryParams.append('limit', options.limit || 10);\n \n if (options.skip) queryParams.append('skip', options.skip);\n if (options.search) queryParams.append('search', options.search);\n \n const response = await fetch(`${process.env.API_URL}/api/tracks/popular?${queryParams.toString()}`);\n const tracks = await response.json();\n state.popular = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching popular tracks:', error);\n return [];\n } finally {\n state.loadingPopular = false;\n }\n },\n\n async fetchRecentTracks(limit = 10) {\n state.loadingRecent = true;\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/recent?limit=${limit}`);\n const tracks = await response.json();\n state.recent = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching recent tracks:', error);\n return [];\n } finally {\n state.loadingRecent = false;\n }\n },\n\n async fetchTracksByGenre(genreId, limit = 20) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/genre/${genreId}?limit=${limit}`);\n return await response.json();\n } catch (error) {\n console.error('Error fetching tracks by genre:', error);\n return [];\n }\n },\n\n async fetchTrackByUrl(url) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/url/${url}`);\n const track = await response.json();\n state.currentTrack = track;\n return track;\n } catch (error) {\n console.error('Error fetching track by URL:', error);\n return null;\n }\n },\n\n // Improved createTrack action with better error handling\n async createTrack(trackData) {\n console.log('Creating track with data:', trackData);\n\n // Validate required fields to prevent silent failures\n const requiredFields = ['title', 'artist', 'genre', 'fileUrl'];\n const missingFields = requiredFields.filter(field => !trackData[field]);\n\n if (missingFields.length > 0) {\n const error = new Error(`Missing required fields: ${missingFields.join(', ')}`);\n console.error(error);\n throw error;\n }\n\n // Ensure proper structure for owner and creator fields\n if (!trackData.owner || !trackData.owner.target || !trackData.owner.type) {\n console.error('Track data missing owner information');\n throw new Error('Owner information is required');\n }\n\n if (!trackData.creator || !trackData.creator.target || !trackData.creator.type) {\n console.error('Track data missing creator information');\n throw new Error('Creator information is required');\n }\n\n try {\n console.log('Calling API to create track...');\n\n // Check what API URL we're using\n console.log('API URL:', trackStore.apiUrl);\n\n // Use a timeout to detect hanging requests\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => reject(new Error('Request timed out after 15 seconds')), 15000);\n });\n\n // Race between the actual request and the timeout\n const createdTrack = await Promise.race([trackStore.create(trackData), timeoutPromise]);\n\n console.log('Track created successfully, server response:', createdTrack);\n\n // Check if the response is what we expect\n if (!createdTrack || !createdTrack._id) {\n console.error('API returned success but without expected track data:', createdTrack);\n throw new Error('Invalid response from server');\n }\n\n // Update local state\n state.tracks.unshift(createdTrack);\n state.userTracks.unshift(createdTrack);\n\n console.log('Local state updated with new track');\n return createdTrack;\n } catch (error) {\n console.error('Error creating track:', error);\n\n // Enhanced error logging\n if (error.response) {\n console.error('Error response:', error.response);\n }\n\n // Format the error for better user feedback\n const formattedError = new Error(error.message || 'Failed to create track. Please try again.');\n formattedError.originalError = error;\n\n // Set a global error\n setError({\n message: formattedError.message,\n errorCode: error.errorCode || 'TRACK_CREATE_FAILED',\n });\n\n throw formattedError;\n }\n },\n\n async updateTrack(trackData) {\n try {\n const updatedTrack = await trackStore.update(trackData);\n\n // Update local state\n const index = state.tracks.findIndex(t => t._id === updatedTrack._id);\n if (index !== -1) {\n state.tracks[index] = updatedTrack;\n }\n\n const userIndex = state.userTracks.findIndex(t => t._id === updatedTrack._id);\n if (userIndex !== -1) {\n state.userTracks[userIndex] = updatedTrack;\n }\n\n if (state.currentTrack && state.currentTrack._id === updatedTrack._id) {\n state.currentTrack = updatedTrack;\n }\n\n return updatedTrack;\n } catch (error) {\n console.error('Error updating track:', error);\n throw error;\n }\n },\n\n async deleteTrack(trackId) {\n try {\n await trackStore.delete({ _id: trackId });\n\n // Update local state\n state.tracks = state.tracks.filter(t => t._id !== trackId);\n state.userTracks = state.userTracks.filter(t => t._id !== trackId);\n\n if (state.currentTrack && state.currentTrack._id === trackId) {\n state.currentTrack = null;\n }\n\n return true;\n } catch (error) {\n console.error('Error deleting track:', error);\n throw error;\n }\n },\n\n async fetchUserTracks(userId) {\n try {\n const options = {\n creator: userId,\n limit: 100,\n };\n console.log('fetchUserTracks', userId);\n const tracks = await trackStore.read(options);\n state.userTracks = tracks;\n return tracks;\n } catch (error) {\n console.error('Error fetching user tracks:', error);\n return [];\n }\n },\n\n async fetchRelatedTracks(trackUrl) {\n try {\n const response = await fetch(`${process.env.API_URL}/api/tracks/related/${trackUrl}`);\n const relatedTracks = await response.json();\n\n state.relatedTracks = relatedTracks;\n return relatedTracks;\n } catch (error) {\n console.error('Error fetching related tracks:', error);\n state.relatedTracks = [];\n return [];\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -31,8 +31,8 @@ class CapacitorPushHandler {
|
|
|
31
31
|
}
|
|
32
32
|
try {
|
|
33
33
|
const { Capacitor } = await import("../../../node_modules/.pnpm/@capacitor_core@7.0.1/node_modules/@capacitor/core/dist/index.js");
|
|
34
|
-
const { PushNotifications } = await import("../../../../node_modules/.pnpm/@capacitor_push-notifications@7.0.
|
|
35
|
-
const { Device } = await import("../../../../node_modules/.pnpm/@capacitor_device@7.0.
|
|
34
|
+
const { PushNotifications } = await import("../../../../node_modules/.pnpm/@capacitor_push-notifications@7.0.3_@capacitor_core@7.4.4/node_modules/@capacitor/push-notifications/dist/esm/index.js");
|
|
35
|
+
const { Device } = await import("../../../../node_modules/.pnpm/@capacitor_device@7.0.1_@capacitor_core@7.4.4/node_modules/@capacitor/device/dist/esm/index.js");
|
|
36
36
|
this.capacitor = Capacitor;
|
|
37
37
|
this.pushNotifications = PushNotifications;
|
|
38
38
|
this.device = Device;
|
|
@@ -5,7 +5,7 @@ import "vue-i18n";
|
|
|
5
5
|
/* empty css */
|
|
6
6
|
import _sfc_main$1 from "../../../../components/Dropdown/Dropdown.vue.js";
|
|
7
7
|
import _sfc_main$7 from "../../../../components/Chips/Chips.vue.js";
|
|
8
|
-
/* empty css
|
|
8
|
+
/* empty css */
|
|
9
9
|
import "../../../../components/Menu/MenuItem.vue.js";
|
|
10
10
|
import _sfc_main$6 from "../../../icons/entities/IconFollowing.vue.js";
|
|
11
11
|
import _sfc_main$5 from "../../../icons/navigation/IconEdit.vue.js";
|
package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ref, onMounted, createElementBlock, openBlock, createVNode, withCtx, createBlock, createCommentVNode, unref, createElementVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Menu/Menu.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Menu/Menu.vue.js";
|
|
3
3
|
import _sfc_main$2 from "../../../../components/Menu/MenuItem.vue.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
import _sfc_main$4 from "../../../icons/entities/IconProducts.vue.js";
|