2017-06-23 21:00:42 +00:00
< template >
2018-11-19 22:33:22 +00:00
< main >
2018-07-01 19:50:50 +00:00
< div v-if ="isLoadingTrack" class="ui vertical segment" v-title="labels.title" >
2017-06-23 21:00:42 +00:00
< div : class = "['ui', 'centered', 'active', 'inline', 'loader']" > < / div >
< / div >
< template v-if ="track" >
2018-12-04 14:13:37 +00:00
< section
: class = "['ui', 'head', {'with-background': cover}, 'vertical', 'center', 'aligned', 'stripe', 'segment']"
: style = "headerStyle"
v - title = "track.title"
>
2017-06-23 21:00:42 +00:00
< div class = "segment-content" >
< h2 class = "ui center aligned icon header" >
< i class = "circular inverted music orange icon" > < / i >
< div class = "content" >
{ { track . title } }
2019-06-11 12:21:59 +00:00
< div class = "sub header" v-html ="subtitle" > < / div >
2017-06-23 21:00:42 +00:00
< / div >
< / h2 >
2019-07-16 12:04:19 +00:00
< tags -list v-if ="track.tags && track.tags.length > 0" :tags="track.tags" > < / tags -list >
< div class = "ui hidden divider" > < / div >
2019-04-17 12:17:59 +00:00
< div class = "header-buttons" >
< div class = "ui buttons" >
< play -button class = "orange" :track ="track" >
< translate translate -context = " * / Queue / Button.Label / Short , Verb " > Play < / translate >
< / p l a y - b u t t o n >
< / div >
< div class = "ui buttons" >
< track -favorite -icon :track ="track" :button ="true" > < / t r a c k - f a v o r i t e - i c o n >
< / div >
< div class = "ui buttons" >
< track -playlist -icon :button ="true" v-if ="$store.state.auth.authenticated" :track ="track" > < / track -playlist -icon >
< / div >
2017-06-23 21:00:42 +00:00
2019-04-17 12:17:59 +00:00
< div class = "ui buttons" >
< a v-if ="upload" :href="downloadUrl" target="_blank" class="ui icon labeled button" >
< i class = "download icon" > < / i >
< translate translate -context = " Content / Track / Link / Verb " > Download < / translate >
< / a >
< / div >
2018-03-20 22:41:31 +00:00
2019-04-17 12:17:59 +00:00
< modal v-if ="publicLibraries.length > 0" :show.sync="showEmbedModal" >
2018-12-19 13:04:49 +00:00
< div class = "header" >
2019-03-08 11:37:02 +00:00
< translate translate -context = " Popup / Track / Title " > Embed this track on your website < / translate >
2018-12-19 13:04:49 +00:00
< / div >
< div class = "content" >
< div class = "description" >
< embed -wizard type = "track" :id ="track.id" / >
< / div >
< / div >
< div class = "actions" >
< div class = "ui deny button" >
2019-03-18 09:07:58 +00:00
< translate translate -context = " * / * / Button.Label / Verb " > Cancel < / translate >
2018-12-19 13:04:49 +00:00
< / div >
< / div >
< / modal >
2019-04-17 12:17:59 +00:00
< div class = "ui buttons" >
< button class = "ui button" @click ="$refs.dropdown.click()" >
< translate translate -context = " * / * / Button.Label / Noun " > More … < / translate >
< / button >
< div class = "ui floating dropdown icon button" ref = "dropdown" v-dropdown >
< i class = "dropdown icon" > < / i >
< div class = "menu" >
< div
role = "button"
v - if = "publicLibraries.length > 0"
@ click = "showEmbedModal = !showEmbedModal"
class = "basic item" >
< i class = "code icon" > < / i >
< translate translate -context = " Content / * / Button.Label / Verb " > Embed < / translate >
< / div >
< a :href ="wikipediaUrl" target = "_blank" rel = "noreferrer noopener" class = "basic item" >
< i class = "wikipedia w icon" > < / i >
< translate translate -context = " Content / * / Button.Label / Verb " > Search on Wikipedia < / translate >
< / a >
< a v-if ="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" rel="noreferrer noopener" class="basic item" >
< i class = "external icon" > < / i >
< translate translate -context = " Content / * / * / Clickable , Verb " > View on MusicBrainz < / translate >
< / a >
2019-06-16 15:23:12 +00:00
< 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 >
2019-04-17 12:17:59 +00:00
< router -link
v - if = "track.is_local"
: to = "{name: 'library.tracks.edit', params: {id: track.id }}"
class = "basic item" >
< i class = "edit icon" > < / i >
< translate translate -context = " Content / * / Button.Label / Verb " > Edit < / translate >
< / r o u t e r - l i n k >
< div class = "divider" > < / div >
< router -link class = "basic item" v-if ="$store.state.auth.availablePermissions['library']" :to="{name: 'manage.library.tracks.detail', params: {id: track.id}}" >
< i class = "wrench icon" > < / i >
< translate translate -context = " Content / Moderation / Link " > Open in moderation interface < / translate >
< / r o u t e r - l i n k >
< a
2019-04-29 13:26:54 +00:00
v - if = "$store.state.auth.profile && $store.state.auth.profile.is_superuser"
2019-04-17 12:17:59 +00:00
class = "basic item"
: href = "$store.getters['instance/absoluteUrl'](`/api/admin/music/track/${track.id}`)"
target = "_blank" rel = "noopener noreferrer" >
< i class = "wrench icon" > < / i >
< translate translate -context = " Content / Moderation / Link / Verb " > View in Django ' s admin < / translate > & nbsp ;
< / a >
< / div >
< / div >
< / div >
< / div >
2017-06-23 21:00:42 +00:00
< / div >
2018-11-19 22:33:22 +00:00
< / section >
2019-02-28 08:31:04 +00:00
< router -view v-if ="track" @libraries-loaded="libraries = $event" :track="track" :object="track" object-type="track" :key="$route.fullPath" > < / router -view >
2017-06-23 21:00:42 +00:00
< / template >
2018-11-19 22:33:22 +00:00
< / main >
2017-06-23 21:00:42 +00:00
< / template >
< script >
2018-11-19 22:33:22 +00:00
import time from "@/utils/time"
import axios from "axios"
import url from "@/utils/url"
import logger from "@/logging"
import PlayButton from "@/components/audio/PlayButton"
import TrackFavoriteIcon from "@/components/favorites/TrackFavoriteIcon"
import TrackPlaylistIcon from "@/components/playlists/TrackPlaylistIcon"
2018-12-04 14:13:37 +00:00
import Modal from '@/components/semantic/Modal'
2018-12-19 13:04:49 +00:00
import EmbedWizard from "@/components/audio/EmbedWizard"
2019-07-16 12:04:19 +00:00
import TagsList from "@/components/tags/List"
2018-05-15 20:24:20 +00:00
2018-11-19 22:33:22 +00:00
const FETCH _URL = "tracks/"
2017-06-23 21:00:42 +00:00
export default {
2018-11-19 22:33:22 +00:00
props : [ "id" ] ,
2017-06-23 21:00:42 +00:00
components : {
PlayButton ,
2018-03-20 22:41:31 +00:00
TrackPlaylistIcon ,
2018-10-02 17:30:13 +00:00
TrackFavoriteIcon ,
2018-12-19 13:04:49 +00:00
Modal ,
2019-07-16 12:04:19 +00:00
EmbedWizard ,
TagsList ,
2017-06-23 21:00:42 +00:00
} ,
2018-11-19 22:33:22 +00:00
data ( ) {
2017-06-23 21:00:42 +00:00
return {
2018-05-15 20:24:20 +00:00
time ,
2017-06-23 21:00:42 +00:00
isLoadingTrack : true ,
track : null ,
2019-02-28 08:31:04 +00:00
showEmbedModal : false ,
libraries : [ ]
2017-06-23 21:00:42 +00:00
}
} ,
2018-11-19 22:33:22 +00:00
created ( ) {
2017-06-23 21:00:42 +00:00
this . fetchData ( )
} ,
methods : {
2018-11-19 22:33:22 +00:00
fetchData ( ) {
2017-06-23 21:00:42 +00:00
var self = this
this . isLoadingTrack = true
2018-11-19 22:33:22 +00:00
let url = FETCH _URL + this . id + "/"
2017-06-23 21:00:42 +00:00
logger . default . debug ( 'Fetching track "' + this . id + '"' )
2019-07-22 10:12:57 +00:00
axios . get ( url , { params : { refresh : 'true' } } ) . then ( response => {
2017-06-23 21:00:42 +00:00
self . track = response . data
self . isLoadingTrack = false
} )
} ,
} ,
computed : {
2018-12-19 13:04:49 +00:00
publicLibraries ( ) {
return this . libraries . filter ( l => {
return l . privacy _level === 'everyone'
} )
} ,
2018-11-19 22:33:22 +00:00
upload ( ) {
2018-10-26 13:21:35 +00:00
if ( this . track . uploads ) {
return this . track . uploads [ 0 ]
}
} ,
2019-02-28 08:31:04 +00:00
labels ( ) {
return {
2019-03-18 09:07:58 +00:00
title : this . $pgettext ( '*/*/*/Noun' , "Track" )
2019-02-28 08:31:04 +00:00
}
} ,
2018-11-19 22:33:22 +00:00
wikipediaUrl ( ) {
return (
"https://en.wikipedia.org/w/index.php?search=" +
encodeURI ( this . track . title + " " + this . track . artist . name )
)
2017-06-23 21:00:42 +00:00
} ,
2018-11-19 22:33:22 +00:00
musicbrainzUrl ( ) {
2018-10-20 14:20:29 +00:00
if ( this . track . mbid ) {
2018-11-19 22:33:22 +00:00
return "https://musicbrainz.org/recording/" + this . track . mbid
2018-10-20 14:20:29 +00:00
}
2017-06-23 21:00:42 +00:00
} ,
2019-06-16 15:23:12 +00:00
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 )
)
} ,
2018-11-19 22:33:22 +00:00
downloadUrl ( ) {
let u = this . $store . getters [ "instance/absoluteUrl" ] (
this . upload . listen _url
)
2019-03-15 14:52:30 +00:00
if ( this . $store . state . auth . authenticated ) {
u = url . updateQueryString (
u ,
"jwt" ,
encodeURI ( this . $store . state . auth . token )
)
}
2018-09-22 12:29:30 +00:00
return u
2018-05-15 20:24:20 +00:00
} ,
2018-11-19 22:33:22 +00:00
cover ( ) {
2017-06-23 21:00:42 +00:00
return null
} ,
2019-02-25 13:28:25 +00:00
albumUrl ( ) {
let route = this . $router . resolve ( { name : 'library.albums.detail' , params : { id : this . track . album . id } } )
2019-06-28 09:57:32 +00:00
return route . href
2019-02-25 13:28:25 +00:00
} ,
artistUrl ( ) {
let route = this . $router . resolve ( { name : 'library.artists.detail' , params : { id : this . track . artist . id } } )
2019-06-28 09:57:32 +00:00
return route . href
2019-02-25 13:28:25 +00:00
} ,
2018-11-19 22:33:22 +00:00
headerStyle ( ) {
2017-06-23 21:00:42 +00:00
if ( ! this . cover ) {
2018-11-19 22:33:22 +00:00
return ""
2017-06-23 21:00:42 +00:00
}
2018-11-19 22:33:22 +00:00
return (
"background-image: url(" +
this . $store . getters [ "instance/absoluteUrl" ] ( this . cover ) +
")"
)
2018-12-04 14:13:37 +00:00
} ,
2019-06-11 12:21:59 +00:00
subtitle ( ) {
let msg = this . $pgettext ( 'Content/Track/Paragraph' , 'From album <a class="internal" href="%{ albumUrl }">%{ album }</a> by <a class="internal" href="%{ artistUrl }">%{ artist }</a>' )
return this . $gettextInterpolate ( msg , { album : this . track . album . title , artist : this . track . artist . name , albumUrl : this . albumUrl , artistUrl : this . artistUrl } )
}
2017-06-23 21:00:42 +00:00
} ,
watch : {
2018-11-19 22:33:22 +00:00
id ( ) {
2017-06-23 21:00:42 +00:00
this . fetchData ( )
2018-12-04 14:13:37 +00:00
} ,
2017-06-23 21:00:42 +00:00
}
}
< / script >