Skip to content

Commit

Permalink
Add download button in the SharePlayer
Browse files Browse the repository at this point in the history
  • Loading branch information
deluan committed Mar 11, 2023
1 parent a7d3e6e commit b520d88
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 9 deletions.
4 changes: 3 additions & 1 deletion core/archiver.go
Expand Up @@ -91,8 +91,10 @@ func (a *archiver) albumFilename(mf model.MediaFile, format string, isMultDisc b

func (a *archiver) ZipShare(ctx context.Context, id string, out io.Writer) error {
s, err := a.shares.Load(ctx, id)
if !s.Downloadable {
return model.ErrNotAuthorized
}
if err != nil {
log.Error(ctx, "Error loading mediafiles from share", "id", id, err)
return err
}
log.Debug(ctx, "Zipping share", "name", s.ID, "format", s.Format, "bitrate", s.MaxBitRate, "numTracks", len(s.Tracks))
Expand Down
3 changes: 3 additions & 0 deletions server/public/handle_shares.go
Expand Up @@ -45,6 +45,9 @@ func checkShareError(ctx context.Context, w http.ResponseWriter, err error, id s
case errors.Is(err, model.ErrNotFound):
log.Error(ctx, "Share not found", "id", id, err)
http.Error(w, "Share not found", http.StatusNotFound)
case errors.Is(err, model.ErrNotAuthorized):
log.Error(ctx, "Share is not downloadable", "id", id, err)
http.Error(w, "This share is not downloadable", http.StatusForbidden)
case err != nil:
log.Error(ctx, "Error retrieving share", "id", id, err)
http.Error(w, "Error retrieving share", http.StatusInternalServerError)
Expand Down
10 changes: 7 additions & 3 deletions server/serve_index.go
Expand Up @@ -122,8 +122,10 @@ func getIndexTemplate(r *http.Request, fs fs.FS) (*template.Template, error) {
}

type shareData struct {
Description string `json:"description"`
Tracks []shareTrack `json:"tracks"`
ID string `json:"id"`
Description string `json:"description"`
Downloadable bool `json:"downloadable"`
Tracks []shareTrack `json:"tracks"`
}

type shareTrack struct {
Expand All @@ -141,7 +143,9 @@ func addShareData(r *http.Request, data map[string]interface{}, shareInfo *model
return
}
sd := shareData{
Description: shareInfo.Description,
ID: shareInfo.ID,
Description: shareInfo.Description,
Downloadable: shareInfo.Downloadable,
}
sd.Tracks = slice.Map(shareInfo.Tracks, func(mf model.MediaFile) shareTrack {
return shareTrack{
Expand Down
2 changes: 1 addition & 1 deletion ui/src/App.js
Expand Up @@ -37,7 +37,7 @@ import config, { shareInfo } from './config'
import { setDispatch, startEventStream, stopEventStream } from './eventStream'
import { keyMap } from './hotkeys'
import useChangeThemeColor from './useChangeThemeColor'
import SharePlayer from './SharePlayer'
import SharePlayer from './share/SharePlayer'

const history = createHashHistory()

Expand Down
19 changes: 15 additions & 4 deletions ui/src/SharePlayer.js → ui/src/share/SharePlayer.js
@@ -1,6 +1,6 @@
import ReactJkMusicPlayer from 'navidrome-music-player'
import { shareInfo } from './config'
import { shareCoverUrl, shareStreamUrl } from './utils'
import { shareInfo } from '../config'
import { shareCoverUrl, shareDownloadUrl, shareStreamUrl } from '../utils'

import { makeStyles } from '@material-ui/core/styles'

Expand Down Expand Up @@ -34,12 +34,17 @@ const SharePlayer = () => {
duration: s.duration,
}
})
const onBeforeAudioDownload = () => {
return Promise.resolve({
src: shareDownloadUrl(shareInfo?.id),
})
}
const options = {
audioLists: list,
mode: 'full',
toggleMode: false,
mobileMediaQuery: '',
showDownload: false,
showDownload: shareInfo?.downloadable,
showReload: false,
showMediaSession: true,
theme: 'auto',
Expand All @@ -49,7 +54,13 @@ const SharePlayer = () => {
spaceBar: true,
volumeFade: { fadeIn: 200, fadeOut: 200 },
}
return <ReactJkMusicPlayer {...options} className={classes.player} />
return (
<ReactJkMusicPlayer
{...options}
className={classes.player}
onBeforeAudioDownload={onBeforeAudioDownload}
/>
)
}

export default SharePlayer
4 changes: 4 additions & 0 deletions ui/src/utils/urls.js
Expand Up @@ -19,6 +19,10 @@ export const shareStreamUrl = (id) => {
return baseUrl(config.publicBaseUrl + '/s/' + id)
}

export const shareDownloadUrl = (id) => {
return baseUrl(config.publicBaseUrl + '/d/' + id)
}

export const shareCoverUrl = (id) => {
return baseUrl(config.publicBaseUrl + '/img/' + id + '?size=300')
}
Expand Down

0 comments on commit b520d88

Please sign in to comment.