mirror of
https://github.com/miniflux/v2.git
synced 2025-06-27 16:36:00 +00:00
fix: show only one player when there are several audio/video enclosures
This commit is contained in:
parent
7759ea1b43
commit
65ff328804
2 changed files with 73 additions and 86 deletions
|
@ -2,6 +2,7 @@
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package model // import "miniflux.app/v2/internal/model"
|
package model // import "miniflux.app/v2/internal/model"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -34,9 +35,34 @@ func (e Enclosure) Html5MimeType() string {
|
||||||
return e.MimeType
|
return e.MimeType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *Enclosure) IsAudio() bool {
|
||||||
|
return strings.HasPrefix(strings.ToLower(e.MimeType), "audio/")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Enclosure) IsVideo() bool {
|
||||||
|
return strings.HasPrefix(strings.ToLower(e.MimeType), "video/")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Enclosure) IsImage() bool {
|
||||||
|
mimeType := strings.ToLower(e.MimeType)
|
||||||
|
mediaURL := strings.ToLower(e.URL)
|
||||||
|
return strings.HasPrefix(mimeType, "image/") || strings.HasSuffix(mediaURL, ".jpg") || strings.HasSuffix(mediaURL, ".jpeg") || strings.HasSuffix(mediaURL, ".png") || strings.HasSuffix(mediaURL, ".gif")
|
||||||
|
}
|
||||||
|
|
||||||
// EnclosureList represents a list of attachments.
|
// EnclosureList represents a list of attachments.
|
||||||
type EnclosureList []*Enclosure
|
type EnclosureList []*Enclosure
|
||||||
|
|
||||||
|
// FindMediaPlayerEnclosure returns the first enclosure that can be played by a media player.
|
||||||
|
func (el EnclosureList) FindMediaPlayerEnclosure() *Enclosure {
|
||||||
|
for _, enclosure := range el {
|
||||||
|
if enclosure.URL != "" && strings.Contains(enclosure.MimeType, "audio/") || strings.Contains(enclosure.MimeType, "video/") {
|
||||||
|
return enclosure
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (el EnclosureList) ContainsAudioOrVideo() bool {
|
func (el EnclosureList) ContainsAudioOrVideo() bool {
|
||||||
for _, enclosure := range el {
|
for _, enclosure := range el {
|
||||||
if strings.Contains(enclosure.MimeType, "audio/") || strings.Contains(enclosure.MimeType, "video/") {
|
if strings.Contains(enclosure.MimeType, "audio/") || strings.Contains(enclosure.MimeType, "video/") {
|
||||||
|
|
|
@ -165,56 +165,55 @@
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
<article class="entry-content gesture-nav-{{ $.user.GestureNav }}" dir="auto">
|
<article class="entry-content gesture-nav-{{ $.user.GestureNav }}" dir="auto">
|
||||||
{{ if (and .entry.Enclosures (not .entry.Feed.NoMediaPlayer)) }}
|
{{ if not .entry.Feed.NoMediaPlayer }}
|
||||||
{{ range .entry.Enclosures }}
|
{{ $mediaPlayerEnclosure := .entry.Enclosures.FindMediaPlayerEnclosure }}
|
||||||
{{ if ne .URL "" }}
|
|
||||||
{{ if hasPrefix .MimeType "audio/" }}
|
{{ if $mediaPlayerEnclosure }}
|
||||||
<div class="enclosure-audio" >
|
{{ with $mediaPlayerEnclosure }}
|
||||||
<audio controls preload="metadata"
|
{{ if .IsAudio }}
|
||||||
{{ if $.user }}data-last-position="{{ .MediaProgression }}"{{ end }}
|
<div class="enclosure-audio" >
|
||||||
{{ if $.user.MediaPlaybackRate }}data-playback-rate="{{ $.user.MediaPlaybackRate }}"{{ end }}
|
<audio controls preload="metadata"
|
||||||
{{ if $.user.MarkReadOnMediaPlayerCompletion }}
|
{{ if $.user }}data-last-position="{{ .MediaProgression }}"{{ end }}
|
||||||
data-mark-read-on-completion="0.9"
|
{{ if $.user.MediaPlaybackRate }}data-playback-rate="{{ $.user.MediaPlaybackRate }}"{{ end }}
|
||||||
{{ end }}
|
{{ if $.user.MarkReadOnMediaPlayerCompletion }}data-mark-read-on-completion="0.9"{{ end }}
|
||||||
{{ if $.user }}data-save-url="{{ route "saveEnclosureProgression" "enclosureID" .ID }}"{{ end }}
|
{{ if $.user }}data-save-url="{{ route "saveEnclosureProgression" "enclosureID" .ID }}"{{ end }}
|
||||||
data-enclosure-id="{{.ID}}"
|
data-enclosure-id="{{ .ID }}"
|
||||||
>
|
>
|
||||||
{{ if (and $.user (mustBeProxyfied "audio")) }}
|
{{ if (and $.user (mustBeProxyfied "audio")) }}
|
||||||
<source src="{{ proxyURL .URL }}" type="{{ .Html5MimeType }}">
|
<source src="{{ proxyURL .URL }}" type="{{ .Html5MimeType }}">
|
||||||
{{ else }}
|
{{ else }}
|
||||||
<source src="{{ .URL | safeURL }}" type="{{ .Html5MimeType }}">
|
<source src="{{ .URL | safeURL }}" type="{{ .Html5MimeType }}">
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</audio>
|
</audio>
|
||||||
{{ template "enclosure_media_controls" . }}
|
{{ template "enclosure_media_controls" . }}
|
||||||
</div>
|
</div>
|
||||||
{{ else if hasPrefix .MimeType "video/" }}
|
{{ else if .IsVideo }}
|
||||||
<div class="enclosure-video">
|
<div class="enclosure-video">
|
||||||
<video controls preload="metadata"
|
<video controls preload="metadata"
|
||||||
{{ if $.user }}data-last-position="{{ .MediaProgression }}"{{ end }}
|
{{ if $.user }}data-last-position="{{ .MediaProgression }}"{{ end }}
|
||||||
{{ if $.user.MediaPlaybackRate }}data-playback-rate="{{ $.user.MediaPlaybackRate }}"{{ end }}
|
{{ if $.user.MediaPlaybackRate }}data-playback-rate="{{ $.user.MediaPlaybackRate }}"{{ end }}
|
||||||
{{ if $.user.MarkReadOnMediaPlayerCompletion }}
|
{{ if $.user.MarkReadOnMediaPlayerCompletion }}data-mark-read-on-completion="0.9"{{ end }}
|
||||||
data-mark-read-on-completion="0.9"
|
{{ if $.user }}data-save-url="{{ route "saveEnclosureProgression" "enclosureID" .ID }}"{{ end }}
|
||||||
|
data-enclosure-id="{{ .ID }}"
|
||||||
|
>
|
||||||
|
{{ if (and $.user (mustBeProxyfied "video")) }}
|
||||||
|
<source src="{{ proxyURL .URL }}" type="{{ .Html5MimeType }}">
|
||||||
|
{{ else }}
|
||||||
|
<source src="{{ .URL | safeURL }}" type="{{ .Html5MimeType }}">
|
||||||
|
{{ end }}
|
||||||
|
</video>
|
||||||
|
{{ template "enclosure_media_controls" . }}
|
||||||
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ if $.user }}data-save-url="{{ route "saveEnclosureProgression" "enclosureID" .ID }}"{{ end }}
|
{{ end }}
|
||||||
data-enclosure-id="{{.ID}}"
|
|
||||||
>
|
|
||||||
{{ if (and $.user (mustBeProxyfied "video")) }}
|
|
||||||
<source src="{{ proxyURL .URL }}" type="{{ .Html5MimeType }}">
|
|
||||||
{{ else }}
|
|
||||||
<source src="{{ .URL | safeURL }}" type="{{ .Html5MimeType }}">
|
|
||||||
{{ end }}
|
|
||||||
</video>
|
|
||||||
{{ template "enclosure_media_controls" . }}
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
|
||||||
{{end}}
|
{{ if .user }}
|
||||||
{{ if .user }}
|
|
||||||
{{ noescape (proxyFilter .entry.Content) }}
|
{{ noescape (proxyFilter .entry.Content) }}
|
||||||
{{ else }}
|
{{ else }}
|
||||||
{{ noescape .entry.Content }}
|
{{ noescape .entry.Content }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</article>
|
</article>
|
||||||
{{ if .entry.Enclosures }}
|
{{ if .entry.Enclosures }}
|
||||||
<details class="entry-enclosures">
|
<details class="entry-enclosures">
|
||||||
|
@ -222,45 +221,7 @@
|
||||||
{{ range .entry.Enclosures }}
|
{{ range .entry.Enclosures }}
|
||||||
{{ if ne .URL "" }}
|
{{ if ne .URL "" }}
|
||||||
<div class="entry-enclosure">
|
<div class="entry-enclosure">
|
||||||
{{ if hasPrefix .MimeType "audio/" }}
|
{{ if .IsImage }}
|
||||||
<div class="enclosure-audio">
|
|
||||||
<audio controls preload="metadata"
|
|
||||||
{{ if $.user }}data-last-position="{{ .MediaProgression }}"{{ end }}
|
|
||||||
{{ if $.user.MediaPlaybackRate }}data-playback-rate="{{ $.user.MediaPlaybackRate }}"{{ end }}
|
|
||||||
{{ if $.user.MarkReadOnMediaPlayerCompletion }}
|
|
||||||
data-mark-read-on-completion="0.9"
|
|
||||||
{{ end }}
|
|
||||||
{{ if $.user }}data-save-url="{{ route "saveEnclosureProgression" "enclosureID" .ID }}"{{ end }}
|
|
||||||
data-enclosure-id="{{.ID}}"
|
|
||||||
>
|
|
||||||
{{ if (and $.user (mustBeProxyfied "audio")) }}
|
|
||||||
<source src="{{ proxyURL .URL }}" type="{{ .Html5MimeType }}">
|
|
||||||
{{ else }}
|
|
||||||
<source src="{{ .URL | safeURL }}" type="{{ .Html5MimeType }}">
|
|
||||||
{{ end }}
|
|
||||||
</audio>
|
|
||||||
{{ template "enclosure_media_controls" . }}
|
|
||||||
</div>
|
|
||||||
{{ else if hasPrefix .MimeType "video/" }}
|
|
||||||
<div class="enclosure-video">
|
|
||||||
<video controls preload="metadata"
|
|
||||||
{{ if $.user }}data-last-position="{{ .MediaProgression }}"{{ end }}
|
|
||||||
{{ if $.user.MediaPlaybackRate }}data-playback-rate="{{ $.user.MediaPlaybackRate }}"{{ end }}
|
|
||||||
{{ if $.user.MarkReadOnMediaPlayerCompletion }}
|
|
||||||
data-mark-read-on-completion="0.9"
|
|
||||||
{{ end }}
|
|
||||||
{{ if $.user }}data-save-url="{{ route "saveEnclosureProgression" "enclosureID" .ID }}"{{ end }}
|
|
||||||
data-enclosure-id="{{.ID}}"
|
|
||||||
>
|
|
||||||
{{ if (and $.user (mustBeProxyfied "video")) }}
|
|
||||||
<source src="{{ proxyURL .URL }}" type="{{ .Html5MimeType }}">
|
|
||||||
{{ else }}
|
|
||||||
<source src="{{ .URL | safeURL }}" type="{{ .Html5MimeType }}">
|
|
||||||
{{ end }}
|
|
||||||
</video>
|
|
||||||
{{ template "enclosure_media_controls" . }}
|
|
||||||
</div>
|
|
||||||
{{ else if hasPrefix .MimeType "image/" }}
|
|
||||||
<div class="enclosure-image">
|
<div class="enclosure-image">
|
||||||
{{ if (and $.user (mustBeProxyfied "image")) }}
|
{{ if (and $.user (mustBeProxyfied "image")) }}
|
||||||
<img src="{{ proxyURL .URL }}" title="{{ .URL }} ({{ .MimeType }})" loading="lazy" alt="{{ .URL }} ({{ .MimeType }})">
|
<img src="{{ proxyURL .URL }}" title="{{ .URL }} ({{ .MimeType }})" loading="lazy" alt="{{ .URL }} ({{ .MimeType }})">
|
||||||
|
@ -271,7 +232,7 @@
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<div class="entry-enclosure-download">
|
<div class="entry-enclosure-download">
|
||||||
<a href="{{ .URL | safeURL }}" title="{{ t "action.download" }}{{ if gt .Size 0 }} - {{ formatFileSize .Size }}{{ end }} ({{ .MimeType }})" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer">{{ .URL | safeURL }}</a>
|
<a href="{{ .URL | safeURL }}" title="{{ t "action.download" }}{{ if gt .Size 0 }} - {{ formatFileSize .Size }}{{ end }}" target="_blank" rel="noopener noreferrer" referrerpolicy="no-referrer">{{ .URL | safeURL }}</a>
|
||||||
<small>{{ if gt .Size 0 }} - <strong>{{ formatFileSize .Size }}</strong>{{ end }}</small>
|
<small>{{ if gt .Size 0 }} - <strong>{{ formatFileSize .Size }}</strong>{{ end }}</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue