diff --git a/api/funkwhale_api/music/management/commands/import_files.py b/api/funkwhale_api/music/management/commands/import_files.py index 541b60886e910312594fbc5b39c854a0a0b81635..33f8ed2d1f6fb10c299465fa752efb4c058a4dd4 100644 --- a/api/funkwhale_api/music/management/commands/import_files.py +++ b/api/funkwhale_api/music/management/commands/import_files.py @@ -226,7 +226,7 @@ class Command(BaseCommand): urllib.parse.urlencode([("import", reference)]), ) self.stdout.write( - "For details, please refer to import refrence '{}' or URL {}".format( + "For details, please refer to import reference '{}' or URL {}".format( reference, import_url ) ) @@ -246,7 +246,7 @@ class Command(BaseCommand): self.stderr.write("- {}: {}".format(path, error)) self.stdout.write( - "For details, please refer to import refrence '{}' or URL {}".format( + "For details, please refer to import reference '{}' or URL {}".format( reference, import_url ) ) diff --git a/changes/changelog.d/368.enhancement b/changes/changelog.d/368.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..7e8f78c0a8be20794c0042e32ad2ad55e2f221be --- /dev/null +++ b/changes/changelog.d/368.enhancement @@ -0,0 +1 @@ +Added button to search for objects on Discogs (#368) diff --git a/changes/changelog.d/419.enhancement b/changes/changelog.d/419.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..f4716b53e5e23ab6ab047ab033b2a6d02bf04c2b --- /dev/null +++ b/changes/changelog.d/419.enhancement @@ -0,0 +1 @@ +Favorites radio will not be visible if the user does not have any favorites (#419) \ No newline at end of file diff --git a/changes/changelog.d/708.enhancement b/changes/changelog.d/708.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..f3217e5a9b3e5c90d4e1af0370dc58e3e28d98ef --- /dev/null +++ b/changes/changelog.d/708.enhancement @@ -0,0 +1 @@ +Aligned search headers with search results in the sidebar (#708) \ No newline at end of file diff --git a/changes/changelog.d/807.enhancement b/changes/changelog.d/807.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..bab8f9647e6b9a7e360dfd17c8b7ff6dd3682041 --- /dev/null +++ b/changes/changelog.d/807.enhancement @@ -0,0 +1 @@ +Clicking on the currently selected playlist in the Playlist popup will now close the popup (#807) \ No newline at end of file diff --git a/changes/changelog.d/832.enhancement b/changes/changelog.d/832.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..1a270b88eaf9fa8a584b894a9bc611aab980feb3 --- /dev/null +++ b/changes/changelog.d/832.enhancement @@ -0,0 +1 @@ +The currently playing track is now highlighted with an orange play icon (#832) \ No newline at end of file diff --git a/changes/changelog.d/864.enhancement b/changes/changelog.d/864.enhancement new file mode 100644 index 0000000000000000000000000000000000000000..f903ac85054911c5f131f290f4ad1e9aacb77161 --- /dev/null +++ b/changes/changelog.d/864.enhancement @@ -0,0 +1 @@ +Redirect from / to /library when user is logged in (#864) diff --git a/front/src/components/Home.vue b/front/src/components/Home.vue index 9393d9b7850cf4e40594bbd4fdc47774753a0f1e..bbcc9a8f959a89b9d20ffadc402acfa74da5274b 100644 --- a/front/src/components/Home.vue +++ b/front/src/components/Home.vue @@ -147,7 +147,19 @@ export default { let msg = this.$pgettext('Content/Home/List item/Verb', 'Get quality metadata about your music thanks to <a href="%{ url }" target="_blank">MusicBrainz</a>') return this.$gettextInterpolate(msg, {url: this.musicbrainzUrl}) } + }, + watch: { + '$store.state.auth.authenticated': { + handler (v) { + if (v) { + console.log('Authenticated, redirecting to /library…') + this.$router.push('/library') + } + }, + immediate: true + } } + } </script> diff --git a/front/src/components/Sidebar.vue b/front/src/components/Sidebar.vue index 8b183b215875b532c40faeff53ed547d1eb766ef..0f2809064cb1052eedda92d6c262a5f266819d35 100644 --- a/front/src/components/Sidebar.vue +++ b/front/src/components/Sidebar.vue @@ -466,6 +466,12 @@ $sidebar-color: #3d3e3f; border-radius: 0; } } + .ui.search .results { + vertical-align: middle; + } + .ui.search .name { + vertical-align: middle; + } } .ui.tiny.avatar.image { position: relative; diff --git a/front/src/components/audio/album/Card.vue b/front/src/components/audio/album/Card.vue index bdc0dd6cb57b18eed7dfcc00ff45c929a027f4fb..db6e8de6bba8e8ece4f4d761ae1466e9be113435 100644 --- a/front/src/components/audio/album/Card.vue +++ b/front/src/components/audio/album/Card.vue @@ -20,7 +20,7 @@ <tbody> <tr v-for="track in tracks"> <td class="play-cell"> - <play-button class="basic icon" :track="track" :discrete="true"></play-button> + <play-button :class="['basic', {orange: isPlaying && track.id === currentTrack.id}, 'icon']" :discrete="true" :track="track"></play-button> </td> <td class="content-cell" colspan="5"> <track-favorite-icon :track="track"></track-favorite-icon> @@ -57,6 +57,7 @@ </template> <script> +import { mapGetters } from "vuex" import backend from '@/audio/backend' import TrackFavoriteIcon from '@/components/favorites/TrackFavoriteIcon' import PlayButton from '@/components/audio/PlayButton' @@ -64,7 +65,7 @@ import PlayButton from '@/components/audio/PlayButton' export default { props: { album: {type: Object}, - mode: {type: String, default: 'rich'} + mode: {type: String, default: 'rich'}, }, components: { TrackFavoriteIcon, @@ -84,6 +85,12 @@ export default { } return this.album.tracks.slice(0, this.initialTracks) }, + ...mapGetters({ + currentTrack: "queue/currentTrack", + }), + isPlaying () { + return this.$store.state.player.playing + }, tracksWithAlbum () { // needed to include album data (especially cover) // with tracks appended in queue (#795) diff --git a/front/src/components/audio/track/Row.vue b/front/src/components/audio/track/Row.vue index abc4137bf397306b457cb19e8e9d39e6b21c0838..90d0579603472b18f760c6902fa68309148f756c 100644 --- a/front/src/components/audio/track/Row.vue +++ b/front/src/components/audio/track/Row.vue @@ -1,7 +1,7 @@ <template> <tr> <td> - <play-button class="basic icon" :discrete="true" :is-playable="playable" :track="track"></play-button> + <play-button :class="['basic', {orange: isPlaying && track.id === currentTrack.id}, 'icon']" :discrete="true" :is-playable="playable" :track="track"></play-button> </td> <td> <img class="ui mini image" v-if="track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](track.album.cover.small_square_crop)"> @@ -50,7 +50,7 @@ </template> <script> - +import { mapGetters } from "vuex" import time from '@/utils/time' import TrackFavoriteIcon from '@/components/favorites/TrackFavoriteIcon' import TrackPlaylistIcon from '@/components/playlists/TrackPlaylistIcon' @@ -74,13 +74,19 @@ export default { } }, computed: { + ...mapGetters({ + currentTrack: "queue/currentTrack", + }), + isPlaying () { + return this.$store.state.player.playing + }, albumArtist () { if (this.artist) { return this.artist } else { return this.track.album.artist } - } + }, } } </script> diff --git a/front/src/components/favorites/List.vue b/front/src/components/favorites/List.vue index d1bde0935341934af4988c64d1ec766d8da22c9b..6402d417f7120296ab8b13c2a70c109aad14aca2 100644 --- a/front/src/components/favorites/List.vue +++ b/front/src/components/favorites/List.vue @@ -16,7 +16,7 @@ 1 favorite </translate> </h2> - <radio-button type="favorites"></radio-button> + <radio-button v-if="hasFavorites" type="favorites"></radio-button> </section> <section class="ui vertical stripe segment"> <div :class="['ui', {'loading': isLoading}, 'form']"> @@ -115,7 +115,10 @@ export default { return { title: this.$pgettext('Head/Favorites/Title', 'Your Favorites') } - } + }, + hasFavorites () { + return this.$store.state.favorites.count > 0 + }, }, methods: { updateQueryString: function() { diff --git a/front/src/components/library/AlbumBase.vue b/front/src/components/library/AlbumBase.vue index 1f89bef8898f9a1a496545688ff818a10e071e2a..2b3c978bced83a60574a49380e786e7312828182 100644 --- a/front/src/components/library/AlbumBase.vue +++ b/front/src/components/library/AlbumBase.vue @@ -61,7 +61,11 @@ <i class="external icon"></i> <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate> </a> - <router-link + <a :href="discogsUrl" target="_blank" rel="noreferrer noopener" class="basic item"> + <i class="external icon"></i> + <translate translate-context="Content/*/Button.Label/Verb">Search on Discogs</translate> + </a> + <router-link v-if="object.is_local" :to="{name: 'library.albums.edit', params: {id: object.id }}" class="basic item"> @@ -168,6 +172,13 @@ export default { return "https://musicbrainz.org/release/" + this.object.mbid } }, + discogsUrl() { + return ( + "https://discogs.com/search/?type=release&title=" + + encodeURI(this.object.title) + "&artist=" + + encodeURI(this.object.artist.name) + ) + }, headerStyle() { if (!this.object.cover.original) { return "" diff --git a/front/src/components/library/ArtistBase.vue b/front/src/components/library/ArtistBase.vue index 5da7370bacf5fba3abe0c44aa10eb82d421c4a46..3c21f603fe150109ade24448510bb42805ac4663 100644 --- a/front/src/components/library/ArtistBase.vue +++ b/front/src/components/library/ArtistBase.vue @@ -72,6 +72,10 @@ <i class="external icon"></i> <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate> </a> + <a :href="discogsUrl" target="_blank" rel="noreferrer noopener" class="basic item"> + <i class="external icon"></i> + <translate translate-context="Content/*/Button.Label/Verb">Search on Discogs</translate> + </a> <router-link v-if="object.is_local" :to="{name: 'library.artists.edit', params: {id: object.id }}" @@ -205,6 +209,12 @@ export default { return "https://musicbrainz.org/artist/" + this.object.mbid } }, + discogsUrl() { + return ( + "https://discogs.com/search/?type=artist&title=" + + encodeURI(this.object.name) + ) + }, cover() { return this.object.albums .filter(album => { diff --git a/front/src/components/library/Radios.vue b/front/src/components/library/Radios.vue index 9b2f7bf82010bc1eed389ca072468a5c51c62ff0..9f59db514ccb2bab0b0d9860d1cee72eb6facab5 100644 --- a/front/src/components/library/Radios.vue +++ b/front/src/components/library/Radios.vue @@ -10,7 +10,7 @@ <translate translate-context="Content/Radio/Title">Instance radios</translate> </h3> <div class="ui cards"> - <radio-card v-if="$store.state.auth.authenticated" :type="'favorites'"></radio-card> + <radio-card v-if="isAuthenticated && hasFavorites" :type="'favorites'"></radio-card> <radio-card :type="'random'"></radio-card> <radio-card v-if="$store.state.auth.authenticated" :type="'less-listened'"></radio-card> </div> @@ -144,7 +144,13 @@ export default { searchPlaceholder, title } - } + }, + isAuthenticated () { + return this.$store.state.auth.authenticated + }, + hasFavorites () { + return this.$store.state.favorites.count > 0 + }, }, methods: { updateQueryString: _.debounce(function() { diff --git a/front/src/components/library/TrackBase.vue b/front/src/components/library/TrackBase.vue index 4d396bd1ad1b50323974c0e5462875c12a3404e8..4edd00c5de9ae92f32254636bec9bc19f4643751 100644 --- a/front/src/components/library/TrackBase.vue +++ b/front/src/components/library/TrackBase.vue @@ -76,6 +76,10 @@ <i class="external icon"></i> <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate> </a> + <a :href="discogsUrl" target="_blank" rel="noreferrer noopener" class="basic item"> + <i class="external icon"></i> + <translate translate-context="Content/*/Button.Label/Verb">Search on Discogs</translate> + </a> <router-link v-if="track.is_local" :to="{name: 'library.tracks.edit', params: {id: track.id }}" @@ -180,6 +184,14 @@ export default { return "https://musicbrainz.org/recording/" + this.track.mbid } }, + discogsUrl() { + return ( + "https://discogs.com/search/?type=release&title=" + + encodeURI(this.track.album.title) + "&artist=" + + encodeURI(this.track.artist.name) + "&track=" + + encodeURI(this.track.title) + ) + }, downloadUrl() { let u = this.$store.getters["instance/absoluteUrl"]( this.upload.listen_url diff --git a/front/src/components/playlists/PlaylistModal.vue b/front/src/components/playlists/PlaylistModal.vue index 44969afbfd8860c565173292c8eb338178869173..97c5f0a1eb80c7a913db32f175597549cbc7e464 100644 --- a/front/src/components/playlists/PlaylistModal.vue +++ b/front/src/components/playlists/PlaylistModal.vue @@ -57,7 +57,7 @@ :to="{name: 'library.playlists.detail', params: {id: playlist.id }, query: {mode: 'edit'}}"><i class="ui pencil icon"></i></router-link> </td> <td :title="playlist.name"> - <router-link :to="{name: 'library.playlists.detail', params: {id: playlist.id }}">{{ playlist.name }}</router-link></td> + <router-link v-on:click.native="update(false)" :to="{name: 'library.playlists.detail', params: {id: playlist.id }}">{{ playlist.name }}</router-link></td> <td><human-date :date="playlist.modification_date"></human-date></td> <td>{{ playlist.tracks_count }}</td> <td>