ソースを参照

refactor(enclosure): simplify model/enclosure.go

- Reuse isAudio and isVideo instead of re-implementing them
- In IsImage, return early is the mimetype is enough, instead of systematically
  lowercasing the url as well.
- Extract the common parts of the two ProxifyAbsoluteURL implementations into a
  private function, make the code smaller and clearer.
- Fix a logic error where `A && B || C` was used instead of `A && (B || C)
jvoisin 9 ヶ月 前
コミット
50d5cb96c8
1 ファイル変更19 行追加15 行削除
  1. 19 15
      internal/model/enclosure.go

+ 19 - 15
internal/model/enclosure.go

@@ -45,8 +45,11 @@ func (e *Enclosure) IsVideo() bool {
 
 func (e *Enclosure) IsImage() bool {
 	mimeType := strings.ToLower(e.MimeType)
+	if strings.HasPrefix(mimeType, "image/") {
+		return true
+	}
 	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")
+	return strings.HasSuffix(mediaURL, ".jpg") || strings.HasSuffix(mediaURL, ".jpeg") || strings.HasSuffix(mediaURL, ".png") || strings.HasSuffix(mediaURL, ".gif")
 }
 
 // EnclosureList represents a list of attachments.
@@ -55,8 +58,10 @@ 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
+		if enclosure.URL != "" {
+			if enclosure.IsAudio() || enclosure.IsVideo() {
+				return enclosure
+			}
 		}
 	}
 
@@ -65,7 +70,7 @@ func (el EnclosureList) FindMediaPlayerEnclosure() *Enclosure {
 
 func (el EnclosureList) ContainsAudioOrVideo() bool {
 	for _, enclosure := range el {
-		if strings.Contains(enclosure.MimeType, "audio/") || strings.Contains(enclosure.MimeType, "video/") {
+		if enclosure.IsAudio() || enclosure.IsVideo() {
 			return true
 		}
 	}
@@ -78,12 +83,7 @@ func (el EnclosureList) ProxifyEnclosureURL(router *mux.Router) {
 	if proxyOption != "none" {
 		for i := range el {
 			if urllib.IsHTTPS(el[i].URL) {
-				for _, mediaType := range config.Opts.MediaProxyResourceTypes() {
-					if strings.HasPrefix(el[i].MimeType, mediaType+"/") {
-						el[i].URL = mediaproxy.ProxifyAbsoluteURL(router, el[i].URL)
-						break
-					}
-				}
+				proxifyAbsoluteURLIfMimeType(el[i], router)
 			}
 		}
 	}
@@ -93,11 +93,15 @@ func (e *Enclosure) ProxifyEnclosureURL(router *mux.Router) {
 	proxyOption := config.Opts.MediaProxyMode()
 
 	if proxyOption == "all" || proxyOption != "none" && !urllib.IsHTTPS(e.URL) {
-		for _, mediaType := range config.Opts.MediaProxyResourceTypes() {
-			if strings.HasPrefix(e.MimeType, mediaType+"/") {
-				e.URL = mediaproxy.ProxifyAbsoluteURL(router, e.URL)
-				break
-			}
+		proxifyAbsoluteURLIfMimeType(e, router)
+	}
+}
+
+func proxifyAbsoluteURLIfMimeType(e *Enclosure, router *mux.Router) {
+	for _, mediaType := range config.Opts.MediaProxyResourceTypes() {
+		if strings.HasPrefix(e.MimeType, mediaType+"/") {
+			e.URL = mediaproxy.ProxifyAbsoluteURL(router, e.URL)
+			break
 		}
 	}
 }