diff --git a/web-src/package-lock.json b/web-src/package-lock.json index c44ae966..3b2d1eb9 100644 --- a/web-src/package-lock.json +++ b/web-src/package-lock.json @@ -14,9 +14,8 @@ "axios": "^0.26.1", "bulma": "^0.9.3", "bulma-switch": "^2.0.4", + "luxon": "^2.3.1", "mdi": "^2.2.43", - "moment": "^2.29.2", - "moment-duration-format": "^2.3.2", "reconnectingwebsocket": "^1.0.0", "spotify-web-api-js": "^1.5.2", "string-to-color": "^2.2.2", @@ -1470,6 +1469,14 @@ "node": ">=10" } }, + "node_modules/luxon": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", + "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==", + "engines": { + "node": ">=12" + } + }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -1496,19 +1503,6 @@ "node": "*" } }, - "node_modules/moment": { - "version": "2.29.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-duration-format": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/moment-duration-format/-/moment-duration-format-2.3.2.tgz", - "integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==" - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -3138,6 +3132,11 @@ "yallist": "^4.0.0" } }, + "luxon": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", + "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==" + }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", @@ -3160,16 +3159,6 @@ "brace-expansion": "^1.1.7" } }, - "moment": { - "version": "2.29.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", - "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" - }, - "moment-duration-format": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/moment-duration-format/-/moment-duration-format-2.3.2.tgz", - "integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ==" - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", diff --git a/web-src/package.json b/web-src/package.json index 5cdb76ef..a4046106 100644 --- a/web-src/package.json +++ b/web-src/package.json @@ -16,9 +16,8 @@ "axios": "^0.26.1", "bulma": "^0.9.3", "bulma-switch": "^2.0.4", + "luxon": "^2.3.1", "mdi": "^2.2.43", - "moment": "^2.29.2", - "moment-duration-format": "^2.3.2", "reconnectingwebsocket": "^1.0.0", "spotify-web-api-js": "^1.5.2", "string-to-color": "^2.2.2", diff --git a/web-src/src/App.vue b/web-src/src/App.vue index 675f0a2e..7f9c78ff 100644 --- a/web-src/src/App.vue +++ b/web-src/src/App.vue @@ -33,7 +33,6 @@ import ModalDialogUpdate from '@/components/ModalDialogUpdate.vue' import webapi from '@/webapi' import * as types from '@/store/mutation_types' import ReconnectingWebSocket from 'reconnectingwebsocket' -import moment from 'moment' export default { name: 'App', @@ -90,7 +89,6 @@ export default { }, created: function () { - moment.locale(navigator.language) this.connect() // Start the progress bar on app start diff --git a/web-src/src/components/ListAlbums.vue b/web-src/src/components/ListAlbums.vue index 01a30586..dcb37316 100644 --- a/web-src/src/components/ListAlbums.vue +++ b/web-src/src/components/ListAlbums.vue @@ -34,7 +34,7 @@ v-if="album.item.date_released && album.item.media_kind === 'music'" class="subtitle is-7 has-text-grey has-text-weight-normal" > - {{ $filters.time(album.item.date_released, 'L') }} + {{ $filters.date(album.item.date_released) }} diff --git a/web-src/src/components/ModalDialogAlbum.vue b/web-src/src/components/ModalDialogAlbum.vue index b7083994..217f52ae 100644 --- a/web-src/src/components/ModalDialogAlbum.vue +++ b/web-src/src/components/ModalDialogAlbum.vue @@ -35,7 +35,7 @@

Release date {{ - $filters.time(album.date_released, 'L') + $filters.date(album.date_released) }}

@@ -49,7 +49,7 @@

Length {{ - $filters.duration(album.length_ms) + $filters.durationInHours(album.length_ms) }}

@@ -61,7 +61,7 @@

Added at {{ - $filters.time(album.time_added, 'L LT') + $filters.datetime(album.time_added) }}

diff --git a/web-src/src/components/ModalDialogArtist.vue b/web-src/src/components/ModalDialogArtist.vue index c93e67fb..e11ebcf8 100644 --- a/web-src/src/components/ModalDialogArtist.vue +++ b/web-src/src/components/ModalDialogArtist.vue @@ -27,7 +27,7 @@

Added at {{ - $filters.time(artist.time_added, 'L LT') + $filters.datetime(artist.time_added) }}

diff --git a/web-src/src/components/ModalDialogComposer.vue b/web-src/src/components/ModalDialogComposer.vue index 16759ad7..02228c51 100644 --- a/web-src/src/components/ModalDialogComposer.vue +++ b/web-src/src/components/ModalDialogComposer.vue @@ -26,7 +26,7 @@

Length {{ - $filters.duration(composer.length_ms) + $filters.durationInHours(composer.length_ms) }}

diff --git a/web-src/src/components/ModalDialogGenre.vue b/web-src/src/components/ModalDialogGenre.vue index 57f89a5c..e4d0cb72 100644 --- a/web-src/src/components/ModalDialogGenre.vue +++ b/web-src/src/components/ModalDialogGenre.vue @@ -23,7 +23,7 @@

Length {{ - $filters.duration(genre.length_ms) + $filters.durationInHours(genre.length_ms) }}

diff --git a/web-src/src/components/ModalDialogQueueItem.vue b/web-src/src/components/ModalDialogQueueItem.vue index 97009112..ee122722 100644 --- a/web-src/src/components/ModalDialogQueueItem.vue +++ b/web-src/src/components/ModalDialogQueueItem.vue @@ -56,7 +56,7 @@

Length {{ - $filters.duration(item.length_ms) + $filters.durationInHours(item.length_ms) }}

diff --git a/web-src/src/components/ModalDialogTrack.vue b/web-src/src/components/ModalDialogTrack.vue index 92e504ab..5e6607ab 100644 --- a/web-src/src/components/ModalDialogTrack.vue +++ b/web-src/src/components/ModalDialogTrack.vue @@ -48,7 +48,7 @@

Release date {{ - $filters.time(track.date_released, 'L') + $filters.date(track.date_released) }}

@@ -70,7 +70,7 @@

Length {{ - $filters.duration(track.length_ms) + $filters.durationInHours(track.length_ms) }}

@@ -107,7 +107,7 @@

Added at {{ - $filters.time(track.time_added, 'L LT') + $filters.datetime(track.time_added) }}

diff --git a/web-src/src/components/SpotifyListItemAlbum.vue b/web-src/src/components/SpotifyListItemAlbum.vue index 7ace7861..f3df381c 100644 --- a/web-src/src/components/SpotifyListItemAlbum.vue +++ b/web-src/src/components/SpotifyListItemAlbum.vue @@ -11,7 +11,7 @@ {{ album.artists[0].name }}

- ({{ album.album_type }}, {{ $filters.time(album.release_date, 'L') }}) + ({{ album.album_type }}, {{ $filters.date(album.release_date) }})

diff --git a/web-src/src/components/SpotifyModalDialogAlbum.vue b/web-src/src/components/SpotifyModalDialogAlbum.vue index a7034a9d..f1d6a9f7 100644 --- a/web-src/src/components/SpotifyModalDialogAlbum.vue +++ b/web-src/src/components/SpotifyModalDialogAlbum.vue @@ -32,7 +32,7 @@

Release date {{ - $filters.time(album.release_date, 'L') + $filters.date(album.release_date) }}

diff --git a/web-src/src/components/SpotifyModalDialogTrack.vue b/web-src/src/components/SpotifyModalDialogTrack.vue index 065a4390..5dfe46b9 100644 --- a/web-src/src/components/SpotifyModalDialogTrack.vue +++ b/web-src/src/components/SpotifyModalDialogTrack.vue @@ -28,7 +28,7 @@

Release date {{ - $filters.time(album.release_date, 'L') + $filters.date(album.release_date) }}

@@ -40,7 +40,7 @@

Length {{ - $filters.duration(track.duration_ms) + $filters.durationInHours(track.duration_ms) }}

diff --git a/web-src/src/filter/index.js b/web-src/src/filter/index.js index fa562f54..9d7a0bb6 100644 --- a/web-src/src/filter/index.js +++ b/web-src/src/filter/index.js @@ -1,25 +1,47 @@ -import moment from 'moment' -import momentDurationFormatSetup from 'moment-duration-format' - -momentDurationFormatSetup(moment) +import { DateTime, Duration } from 'luxon' export const filters = { - duration: function (value, format) { - if (format) { - return moment.duration(value).format(format) + durationInHours: function (value_ms) { + const seconds = Math.floor(value_ms / 1000) + if (seconds > 3600) { + return Duration.fromObject({ seconds: seconds }) + .shiftTo('hours', 'minutes', 'seconds') + .toFormat('hh:mm:ss') } - return moment.duration(value).format('hh:*mm:ss') + return Duration.fromObject({ seconds: seconds }) + .shiftTo('minutes', 'seconds') + .toFormat('mm:ss') }, - time: function (value, format) { - if (format) { - return moment(value).format(format) + durationInDays: function (value_ms) { + const minutes = Math.floor(value_ms / 60000) + if (minutes > 1440) { + // 60 * 24 + return Duration.fromObject({ minutes: minutes }) + .shiftTo('days', 'hours', 'minutes') + .toHuman() + } else if (minutes > 60) { + return Duration.fromObject({ minutes: minutes }) + .shiftTo('hours', 'minutes') + .toHuman() } - return moment(value).format() + return Duration.fromObject({ minutes: minutes }) + .shiftTo('minutes') + .toHuman() }, - timeFromNow: function (value, withoutSuffix) { - return moment(value).fromNow(withoutSuffix) + date: function (value) { + return DateTime.fromISO(value).toLocaleString(DateTime.DATE_FULL) + }, + + datetime: function (value) { + return DateTime.fromISO(value).toLocaleString(DateTime.DATETIME_MED) + }, + + timeFromNow: function (value) { + var diff = DateTime.now().diff(DateTime.fromISO(value)) + + return this.durationInDays(diff.as('milliseconds')) }, number: function (value) { diff --git a/web-src/src/pages/PageAbout.vue b/web-src/src/pages/PageAbout.vue index bdc5afba..d6f12842 100644 --- a/web-src/src/pages/PageAbout.vue +++ b/web-src/src/pages/PageAbout.vue @@ -61,20 +61,15 @@ Total playtime - {{ - $filters.duration( - library.db_playtime * 1000, - 'y [years], d [days], h [hours], m [minutes]' - ) - }} + {{ $filters.durationInDays(library.db_playtime * 1000) }} Library updated - {{ $filters.timeFromNow(library.updated_at) }} + {{ $filters.timeFromNow(library.updated_at) }} ago ({{ $filters.time(library.updated_at, 'lll') }})({{ $filters.datetime(library.updated_at) }}) @@ -83,7 +78,7 @@ {{ $filters.timeFromNow(library.started_at, true) }} ({{ $filters.time(library.started_at, 'll') }})({{ $filters.datetime(library.started_at) }}) diff --git a/web-src/src/pages/PageNowPlaying.vue b/web-src/src/pages/PageNowPlaying.vue index 04e0e98e..0c3fa0dc 100644 --- a/web-src/src/pages/PageNowPlaying.vue +++ b/web-src/src/pages/PageNowPlaying.vue @@ -38,8 +38,8 @@

{{ $filters.duration(item_progress_ms) }} / - {{ $filters.duration(now_playing.length_ms) }}{{ $filters.durationInHours(item_progress_ms) }} / + {{ $filters.durationInHours(now_playing.length_ms) }}