enclosure.go 3.0 KB

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