enclosure.go 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package model // import "miniflux.app/v2/internal/model"
  4. import (
  5. "strings"
  6. "miniflux.app/v2/internal/mediaproxy"
  7. )
  8. // Enclosure represents an attachment.
  9. type Enclosure struct {
  10. ID int64 `json:"id"`
  11. UserID int64 `json:"user_id"`
  12. EntryID int64 `json:"entry_id"`
  13. URL string `json:"url"`
  14. MimeType string `json:"mime_type"`
  15. Size int64 `json:"size"`
  16. MediaProgression int64 `json:"media_progression"`
  17. }
  18. type EnclosureUpdateRequest struct {
  19. MediaProgression int64 `json:"media_progression"`
  20. }
  21. // Html5MimeType will modify the actual MimeType to allow direct playback from HTML5 player for some kind of MimeType
  22. func (e *Enclosure) Html5MimeType() string {
  23. if e.MimeType == "video/m4v" {
  24. return "video/x-m4v"
  25. }
  26. return e.MimeType
  27. }
  28. func (e *Enclosure) IsAudio() bool {
  29. return strings.HasPrefix(strings.ToLower(e.MimeType), "audio/")
  30. }
  31. func (e *Enclosure) IsVideo() bool {
  32. return strings.HasPrefix(strings.ToLower(e.MimeType), "video/")
  33. }
  34. func (e *Enclosure) IsImage() bool {
  35. mimeType := strings.ToLower(e.MimeType)
  36. if strings.HasPrefix(mimeType, "image/") {
  37. return true
  38. }
  39. mediaURL := strings.ToLower(e.URL)
  40. return strings.HasSuffix(mediaURL, ".jpg") || strings.HasSuffix(mediaURL, ".jpeg") || strings.HasSuffix(mediaURL, ".png") || strings.HasSuffix(mediaURL, ".gif")
  41. }
  42. // ProxifyEnclosureURL modifies the enclosure URL to use the media proxy if necessary.
  43. func (e *Enclosure) ProxifyEnclosureURL(mediaProxyOption string, mediaProxyResourceTypes []string) {
  44. if mediaproxy.ShouldProxifyURLWithMimeType(e.URL, e.MimeType, mediaProxyOption, mediaProxyResourceTypes) {
  45. e.URL = mediaproxy.ProxifyAbsoluteURL(e.URL)
  46. }
  47. }
  48. // EnclosureList represents a list of attachments.
  49. type EnclosureList []*Enclosure
  50. // FindMediaPlayerEnclosure returns the first enclosure that can be played by a media player.
  51. func (el EnclosureList) FindMediaPlayerEnclosure() *Enclosure {
  52. for _, enclosure := range el {
  53. if enclosure.URL != "" {
  54. if enclosure.IsAudio() || enclosure.IsVideo() {
  55. return enclosure
  56. }
  57. }
  58. }
  59. return nil
  60. }
  61. func (el EnclosureList) ContainsAudioOrVideo() bool {
  62. for _, enclosure := range el {
  63. if enclosure.IsAudio() || enclosure.IsVideo() {
  64. return true
  65. }
  66. }
  67. return false
  68. }
  69. func (el EnclosureList) ProxifyEnclosureURL(mediaProxyOption string, mediaProxyResourceTypes []string) {
  70. for _, enclosure := range el {
  71. enclosure.ProxifyEnclosureURL(mediaProxyOption, mediaProxyResourceTypes)
  72. }
  73. }