summaryrefslogtreecommitdiff
path: root/internal/platforms/linkedin
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-12 22:24:08 +0200
committerPaul Buetow <paul@buetow.org>2026-03-12 22:24:08 +0200
commitcfddc5696f4956081630e3d394ef3d8c652af02e (patch)
tree30dc6e7de7fe28d6733c485adaddea1129533cfb /internal/platforms/linkedin
parent914d3fb1c0839f3a25c42769ea42cf424ae340c4 (diff)
release v1.2.5v1.2.5
Diffstat (limited to 'internal/platforms/linkedin')
-rw-r--r--internal/platforms/linkedin/preview.go9
-rw-r--r--internal/platforms/linkedin/preview_test.go92
2 files changed, 98 insertions, 3 deletions
diff --git a/internal/platforms/linkedin/preview.go b/internal/platforms/linkedin/preview.go
index 125a4bf..b7387c9 100644
--- a/internal/platforms/linkedin/preview.go
+++ b/internal/platforms/linkedin/preview.go
@@ -44,13 +44,16 @@ func NewPreview(ctx context.Context, args config.Args, urls []string) (preview,
colour.Infoln("URL", urls[0], "is without any image, that's fine, though.")
}
if !errors.Is(err, errNoTitleElementFound) && !errors.Is(err, errNoImageElementFound) {
- return p, err
+ colour.Infoln("Skipping LinkedIn preview metadata for", urls[0], "due to", err)
+ return p, nil
}
}
if p.thumbnailURL != "" {
if p.thumbnailDownloadPath, err = p.DownloadImage(args.CacheDir); err != nil {
- return p, err
+ colour.Infoln("Skipping LinkedIn preview image for", urls[0], "due to", err)
+ p.thumbnailDownloadPath = ""
+ return p, nil
}
colour.Infoln("Downloaded preview image to ", p.thumbnailDownloadPath)
}
@@ -65,7 +68,7 @@ func (p preview) String() string {
}
func (p preview) TitleAndURL() (string, string, bool) {
- return p.title, p.url, p.url != ""
+ return p.title, p.url, p.url != "" && p.title != ""
}
func (p preview) Thumbnail() (string, bool) {
diff --git a/internal/platforms/linkedin/preview_test.go b/internal/platforms/linkedin/preview_test.go
index 1df969b..f65da63 100644
--- a/internal/platforms/linkedin/preview_test.go
+++ b/internal/platforms/linkedin/preview_test.go
@@ -1,8 +1,14 @@
package linkedin
import (
+ "context"
+ "net/http"
+ "net/http/httptest"
+ "path/filepath"
"strings"
"testing"
+
+ "codeberg.org/snonux/gos/internal/config"
)
func TestPreviewExtract(t *testing.T) {
@@ -33,3 +39,89 @@ func TestPreviewExtract(t *testing.T) {
t.Errorf("expected imageURL '%s' but got '%s'", expectedImageURL, imageURL)
}
}
+
+func TestNewPreviewIgnoresForbiddenPage(t *testing.T) {
+ t.Parallel()
+
+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ http.Error(w, "blocked", http.StatusForbidden)
+ }))
+ defer srv.Close()
+
+ prev, err := NewPreview(context.Background(), config.Args{
+ CacheDir: t.TempDir(),
+ }, []string{srv.URL})
+ if err != nil {
+ t.Fatalf("expected preview fetch failure to be non-fatal, got %v", err)
+ }
+
+ title, sourceURL, ok := prev.TitleAndURL()
+ if !ok {
+ t.Fatal("expected preview to keep URL fallback")
+ }
+ if title != srv.URL {
+ t.Fatalf("expected fallback title %q, got %q", srv.URL, title)
+ }
+ if sourceURL != srv.URL {
+ t.Fatalf("expected source URL %q, got %q", srv.URL, sourceURL)
+ }
+ if _, ok := prev.Thumbnail(); ok {
+ t.Fatal("expected no thumbnail for forbidden preview page")
+ }
+}
+
+func TestNewPreviewIgnoresForbiddenImage(t *testing.T) {
+ t.Parallel()
+
+ srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ switch r.URL.Path {
+ case "/":
+ _, _ = w.Write([]byte(`
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Blocked image</title>
+</head>
+<body>
+ <img src="/blocked.jpg" alt="blocked">
+</body>
+</html>
+`))
+ case "/blocked.jpg":
+ http.Error(w, "blocked", http.StatusForbidden)
+ default:
+ http.NotFound(w, r)
+ }
+ }))
+ defer srv.Close()
+
+ cacheDir := t.TempDir()
+ prev, err := NewPreview(context.Background(), config.Args{
+ CacheDir: cacheDir,
+ }, []string{srv.URL})
+ if err != nil {
+ t.Fatalf("expected image download failure to be non-fatal, got %v", err)
+ }
+
+ title, sourceURL, ok := prev.TitleAndURL()
+ if !ok {
+ t.Fatal("expected preview title and URL to be preserved")
+ }
+ if title != "Blocked image" {
+ t.Fatalf("expected title %q, got %q", "Blocked image", title)
+ }
+ if sourceURL != srv.URL {
+ t.Fatalf("expected source URL %q, got %q", srv.URL, sourceURL)
+ }
+ if thumbnailPath, ok := prev.Thumbnail(); ok {
+ t.Fatalf("expected no thumbnail after blocked download, got %q", thumbnailPath)
+ }
+
+ matches, err := filepath.Glob(filepath.Join(cacheDir, "*"))
+ if err != nil {
+ t.Fatalf("glob failed: %v", err)
+ }
+ if len(matches) != 0 {
+ t.Fatalf("expected cache dir to stay empty, got %v", matches)
+ }
+}