diff --git a/goutubedl.go b/goutubedl.go index 379e993..ca378de 100644 --- a/goutubedl.go +++ b/goutubedl.go @@ -217,6 +217,7 @@ func infoFromURL(ctx context.Context, rawURL string, options Options) (info Info Path, "--no-call-home", "--no-cache-dir", + "--ignore-errors", "--skip-download", "--restrict-filenames", // provide URL via stdin for security, youtube-dl has some run command args @@ -275,10 +276,14 @@ func infoFromURL(ctx context.Context, rawURL string, options Options) (info Info } } - if errMessage != "" { - return Info{}, nil, Error(errMessage) - } else if cmdErr != nil { - return Info{}, nil, cmdErr + // HACK: --ignore-errors still return error message and exit code != 0 + // so workaround is to assume things went ok if we get some json on stdout + if len(stdoutBuf.Bytes()) == 0 { + if errMessage != "" { + return Info{}, nil, Error(errMessage) + } else if cmdErr != nil { + return Info{}, nil, cmdErr + } } if infoErr := json.Unmarshal(stdoutBuf.Bytes(), &info); infoErr != nil { @@ -318,6 +323,18 @@ func infoFromURL(ctx context.Context, rawURL string, options Options) (info Info } } + // as we ignore errors some entries might show up as null + if options.YesPlaylist { + var filteredEntrise []Info + for _, e := range info.Entries { + if e.ID == "" { + continue + } + filteredEntrise = append(filteredEntrise, e) + } + info.Entries = filteredEntrise + } + return info, stdoutBuf.Bytes(), nil } diff --git a/goutubedl_test.go b/goutubedl_test.go index 627c445..6a2d071 100644 --- a/goutubedl_test.go +++ b/goutubedl_test.go @@ -181,6 +181,26 @@ func TestPlaylist(t *testing.T) { } } +func TestPlaylistWithPrivateVideo(t *testing.T) { + defer leaktest.Check(t)() + + playlistRawURL := "https://www.youtube.com/playlist?list=PLX0g748fkegS54oiDN4AXKl7BR7mLIydP" + ydlResult, ydlResultErr := New(context.Background(), playlistRawURL, Options{ + YesPlaylist: true, + DownloadThumbnail: false, + }) + + if ydlResultErr != nil { + t.Errorf("failed to download: %s", ydlResultErr) + } + + expectedLen := 2 + actualLen := len(ydlResult.Info.Entries) + if expectedLen != actualLen { + t.Errorf("expected len %d got %d", expectedLen, actualLen) + } +} + func TestPlaylistBadURL(t *testing.T) { defer leakChecks(t)()