enclosure.go 2.6 KB

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