fixes config

This commit is contained in:
stefanodvx 2025-04-20 12:54:20 +02:00
parent 6151a6c397
commit 12ad427baf
10 changed files with 57 additions and 51 deletions

View file

@ -2,6 +2,7 @@ package config
import ( import (
"fmt" "fmt"
"maps"
"os" "os"
"govd/models" "govd/models"
@ -21,17 +22,15 @@ func LoadExtractorConfigs() error {
} }
data, err := os.ReadFile(configPath) data, err := os.ReadFile(configPath)
if err != nil { if err != nil {
return fmt.Errorf("errore nella lettura del file di configurazione: %w", err) return fmt.Errorf("failed reading config file: %w", err)
} }
var rawConfig map[string]*models.ExtractorConfig var rawConfig map[string]*models.ExtractorConfig
if err := yaml.Unmarshal(data, &rawConfig); err != nil { if err := yaml.Unmarshal(data, &rawConfig); err != nil {
return fmt.Errorf("errore nella decodifica del file YAML: %w", err) return fmt.Errorf("failed parsing config file: %w", err)
}
for codeName, config := range rawConfig {
extractorConfigs[codeName] = config
} }
maps.Copy(extractorConfigs, rawConfig)
return nil return nil
} }

View file

@ -37,7 +37,6 @@ var Extractor = &models.Extractor{
URLPattern: regexp.MustCompile(`https:\/\/(www\.)?instagram\.com\/(reel|p|tv)\/(?P<id>[a-zA-Z0-9_-]+)`), URLPattern: regexp.MustCompile(`https:\/\/(www\.)?instagram\.com\/(reel|p|tv)\/(?P<id>[a-zA-Z0-9_-]+)`),
Host: instagramHost, Host: instagramHost,
IsRedirect: false, IsRedirect: false,
Client: util.GetHTTPSession("instagram"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
mediaList, err := MediaListFromAPI(ctx, false) mediaList, err := MediaListFromAPI(ctx, false)
@ -55,7 +54,6 @@ var StoriesExtractor = &models.Extractor{
URLPattern: regexp.MustCompile(`https:\/\/(www\.)?instagram\.com\/stories\/[a-zA-Z0-9._]+\/(?P<id>\d+)`), URLPattern: regexp.MustCompile(`https:\/\/(www\.)?instagram\.com\/stories\/[a-zA-Z0-9._]+\/(?P<id>\d+)`),
Host: instagramHost, Host: instagramHost,
IsRedirect: false, IsRedirect: false,
Client: util.GetHTTPSession("instagram_stories"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
mediaList, err := MediaListFromAPI(ctx, true) mediaList, err := MediaListFromAPI(ctx, true)
@ -73,9 +71,9 @@ var ShareURLExtractor = &models.Extractor{
URLPattern: regexp.MustCompile(`https?:\/\/(www\.)?instagram\.com\/share\/((reels?|video|s|p)\/)?(?P<id>[^\/\?]+)`), URLPattern: regexp.MustCompile(`https?:\/\/(www\.)?instagram\.com\/share\/((reels?|video|s|p)\/)?(?P<id>[^\/\?]+)`),
Host: instagramHost, Host: instagramHost,
IsRedirect: true, IsRedirect: true,
Client: util.GetHTTPSession("instagram_share"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
client := util.GetHTTPSession(ctx.Extractor.CodeName)
req, err := http.NewRequest( req, err := http.NewRequest(
http.MethodGet, http.MethodGet,
ctx.MatchedContentURL, ctx.MatchedContentURL,
@ -84,7 +82,7 @@ var ShareURLExtractor = &models.Extractor{
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create request: %w", err) return nil, fmt.Errorf("failed to create request: %w", err)
} }
resp, err := ctx.Extractor.Client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }
@ -100,15 +98,17 @@ func MediaListFromAPI(
ctx *models.DownloadContext, ctx *models.DownloadContext,
stories bool, stories bool,
) ([]*models.Media, error) { ) ([]*models.Media, error) {
client := util.GetHTTPSession(ctx.Extractor.CodeName)
var mediaList []*models.Media var mediaList []*models.Media
postURL := ctx.MatchedContentURL postURL := ctx.MatchedContentURL
details, err := GetVideoAPI(ctx, postURL) details, err := GetVideoAPI(client, postURL)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get post: %w", err) return nil, fmt.Errorf("failed to get post: %w", err)
} }
var caption string var caption string
if !stories { if !stories {
caption, err = GetPostCaption(ctx, postURL) caption, err = GetPostCaption(client, postURL)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get caption: %w", err) return nil, fmt.Errorf("failed to get caption: %w", err)
} }
@ -157,7 +157,7 @@ func MediaListFromAPI(
} }
func GetVideoAPI( func GetVideoAPI(
ctx *models.DownloadContext, client models.HTTPClient,
contentURL string, contentURL string,
) (*IGramResponse, error) { ) (*IGramResponse, error) {
apiURL := fmt.Sprintf( apiURL := fmt.Sprintf(
@ -175,7 +175,7 @@ func GetVideoAPI(
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", util.ChromeUA) req.Header.Set("User-Agent", util.ChromeUA)
resp, err := ctx.Extractor.Client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }

View file

@ -96,7 +96,7 @@ func GetCDNURL(contentURL string) (string, error) {
} }
func GetPostCaption( func GetPostCaption(
ctx *models.DownloadContext, client models.HTTPClient,
postURL string, postURL string,
) (string, error) { ) (string, error) {
req, err := http.NewRequest( req, err := http.NewRequest(
@ -122,7 +122,7 @@ func GetPostCaption(
req.Header.Set("Cache-Control", "no-cache") req.Header.Set("Cache-Control", "no-cache")
req.Header.Set("TE", "trailers") req.Header.Set("TE", "trailers")
resp, err := ctx.Extractor.Client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to send request: %w", err) return "", fmt.Errorf("failed to send request: %w", err)
} }

View file

@ -44,7 +44,6 @@ var ShortExtractor = &models.Extractor{
return domains return domains
}(), }(),
IsRedirect: true, IsRedirect: true,
Client: util.GetHTTPSession("pinterest_short"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
shortURL := fmt.Sprintf(shortenerAPIFormat, ctx.MatchedContentID) shortURL := fmt.Sprintf(shortenerAPIFormat, ctx.MatchedContentID)
@ -72,7 +71,6 @@ var Extractor = &models.Extractor{
} }
return domains return domains
}(), }(),
Client: util.GetHTTPSession("pinterest"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
media, err := ExtractPinMedia(ctx) media, err := ExtractPinMedia(ctx)
@ -88,8 +86,9 @@ var Extractor = &models.Extractor{
func ExtractPinMedia(ctx *models.DownloadContext) ([]*models.Media, error) { func ExtractPinMedia(ctx *models.DownloadContext) ([]*models.Media, error) {
pinID := ctx.MatchedContentID pinID := ctx.MatchedContentID
contentURL := ctx.MatchedContentURL contentURL := ctx.MatchedContentURL
client := util.GetHTTPSession(ctx.Extractor.CodeName)
pinData, err := GetPinData(ctx, pinID) pinData, err := GetPinData(client, pinID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -160,7 +159,7 @@ func ExtractPinMedia(ctx *models.DownloadContext) ([]*models.Media, error) {
} }
func GetPinData( func GetPinData(
ctx *models.DownloadContext, client models.HTTPClient,
pinID string, pinID string,
) (*PinData, error) { ) (*PinData, error) {
params := BuildPinRequestParams(pinID) params := BuildPinRequestParams(pinID)
@ -179,7 +178,7 @@ func GetPinData(
// fix 403 error // fix 403 error
req.Header.Set("X-Pinterest-PWS-Handler", "www/[username].js") req.Header.Set("X-Pinterest-PWS-Handler", "www/[username].js")
resp, err := ctx.Extractor.Client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }

View file

@ -29,9 +29,9 @@ var ShortExtractor = &models.Extractor{
URLPattern: regexp.MustCompile(`https?://(?P<host>(?:\w+\.)?reddit(?:media)?\.com)/(?P<slug>(?:(?:r|user)/[^/]+/)?s/(?P<id>[^/?#&]+))`), URLPattern: regexp.MustCompile(`https?://(?P<host>(?:\w+\.)?reddit(?:media)?\.com)/(?P<slug>(?:(?:r|user)/[^/]+/)?s/(?P<id>[^/?#&]+))`),
Host: baseHost, Host: baseHost,
IsRedirect: true, IsRedirect: true,
Client: util.GetHTTPSession("reddit_short"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
client := util.GetHTTPSession(ctx.Extractor.CodeName)
req, err := http.NewRequest(http.MethodGet, ctx.MatchedContentURL, nil) req, err := http.NewRequest(http.MethodGet, ctx.MatchedContentURL, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create request: %w", err) return nil, fmt.Errorf("failed to create request: %w", err)
@ -46,7 +46,7 @@ var ShortExtractor = &models.Extractor{
req.AddCookie(cookie) req.AddCookie(cookie)
} }
res, err := ctx.Extractor.Client.Do(req) res, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }
@ -67,7 +67,6 @@ var Extractor = &models.Extractor{
Category: enums.ExtractorCategorySocial, Category: enums.ExtractorCategorySocial,
URLPattern: regexp.MustCompile(`https?://(?P<host>(?:\w+\.)?reddit(?:media)?\.com)/(?P<slug>(?:(?:r|user)/[^/]+/)?comments/(?P<id>[^/?#&]+))`), URLPattern: regexp.MustCompile(`https?://(?P<host>(?:\w+\.)?reddit(?:media)?\.com)/(?P<slug>(?:(?:r|user)/[^/]+/)?comments/(?P<id>[^/?#&]+))`),
Host: baseHost, Host: baseHost,
Client: util.GetHTTPSession("reddit"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
mediaList, err := MediaListFromAPI(ctx) mediaList, err := MediaListFromAPI(ctx)
@ -81,13 +80,15 @@ var Extractor = &models.Extractor{
} }
func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) { func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) {
client := util.GetHTTPSession(ctx.Extractor.CodeName)
host := ctx.MatchedGroups["host"] host := ctx.MatchedGroups["host"]
slug := ctx.MatchedGroups["slug"] slug := ctx.MatchedGroups["slug"]
contentID := ctx.MatchedContentID contentID := ctx.MatchedContentID
contentURL := ctx.MatchedContentURL contentURL := ctx.MatchedContentURL
manifest, err := GetRedditData(ctx, host, slug) manifest, err := GetRedditData(client, host, slug)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -224,7 +225,7 @@ func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) {
} }
func GetRedditData( func GetRedditData(
ctx *models.DownloadContext, client models.HTTPClient,
host string, host string,
slug string, slug string,
) (RedditResponse, error) { ) (RedditResponse, error) {
@ -244,7 +245,7 @@ func GetRedditData(
req.AddCookie(cookie) req.AddCookie(cookie)
} }
res, err := ctx.Extractor.Client.Do(req) res, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }
@ -257,7 +258,7 @@ func GetRedditData(
altHost = "www.reddit.com" altHost = "www.reddit.com"
} }
return GetRedditData(ctx, altHost, slug) return GetRedditData(client, altHost, slug)
} }
var response RedditResponse var response RedditResponse

View file

@ -35,7 +35,6 @@ var Extractor = &models.Extractor{
"redgifs.com", "redgifs.com",
"thumbs2.redgifs.com", "thumbs2.redgifs.com",
}, },
Client: util.GetHTTPSession("redgifs"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
mediaList, err := MediaListFromAPI(ctx) mediaList, err := MediaListFromAPI(ctx)
@ -50,8 +49,10 @@ var Extractor = &models.Extractor{
func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) { func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) {
var mediaList []*models.Media var mediaList []*models.Media
client := util.GetHTTPSession(ctx.Extractor.CodeName)
response, err := GetVideo(ctx) response, err := GetVideo(
client, ctx.MatchedContentID)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get from api: %w", err) return nil, fmt.Errorf("failed to get from api: %w", err)
} }
@ -115,14 +116,16 @@ func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) {
return mediaList, nil return mediaList, nil
} }
func GetVideo(ctx *models.DownloadContext) (*Response, error) { func GetVideo(
videoID := ctx.MatchedContentID client models.HTTPClient,
videoID string,
) (*Response, error) {
url := videoEndpoint + videoID + "?views=true" url := videoEndpoint + videoID + "?views=true"
req, err := http.NewRequest(http.MethodGet, url, nil) req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create request: %w", err) return nil, fmt.Errorf("failed to create request: %w", err)
} }
token, err := GetAccessToken(ctx) token, err := GetAccessToken(client)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get access token: %w", err) return nil, fmt.Errorf("failed to get access token: %w", err)
} }
@ -132,7 +135,7 @@ func GetVideo(ctx *models.DownloadContext) (*Response, error) {
for k, v := range baseApiHeaders { for k, v := range baseApiHeaders {
req.Header.Set(k, v) req.Header.Set(k, v)
} }
res, err := ctx.Extractor.Client.Do(req) res, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }

View file

@ -12,22 +12,22 @@ import (
var accessToken *Token var accessToken *Token
func GetAccessToken(ctx *models.DownloadContext) (*Token, error) { func GetAccessToken(client models.HTTPClient) (*Token, error) {
if accessToken == nil || time.Now().Unix() >= accessToken.ExpiresIn { if accessToken == nil || time.Now().Unix() >= accessToken.ExpiresIn {
if err := RefreshAccessToken(ctx); err != nil { if err := RefreshAccessToken(client); err != nil {
return nil, err return nil, err
} }
} }
return accessToken, nil return accessToken, nil
} }
func RefreshAccessToken(ctx *models.DownloadContext) error { func RefreshAccessToken(client models.HTTPClient) error {
req, err := http.NewRequest(http.MethodGet, tokenEndpoint, nil) req, err := http.NewRequest(http.MethodGet, tokenEndpoint, nil)
if err != nil { if err != nil {
return fmt.Errorf("failed to create request: %w", err) return fmt.Errorf("failed to create request: %w", err)
} }
req.Header.Set("User-Agent", util.ChromeUA) req.Header.Set("User-Agent", util.ChromeUA)
res, err := ctx.Extractor.Client.Do(req) res, err := client.Do(req)
if err != nil { if err != nil {
return fmt.Errorf("failed to send request: %w", err) return fmt.Errorf("failed to send request: %w", err)
} }

View file

@ -44,7 +44,6 @@ var VMExtractor = &models.Extractor{
URLPattern: regexp.MustCompile(`https:\/\/((?:vm|vt|www)\.)?(vx)?tiktok\.com\/(?:t\/)?(?P<id>[a-zA-Z0-9]+)`), URLPattern: regexp.MustCompile(`https:\/\/((?:vm|vt|www)\.)?(vx)?tiktok\.com\/(?:t\/)?(?P<id>[a-zA-Z0-9]+)`),
Host: baseHost, Host: baseHost,
IsRedirect: true, IsRedirect: true,
Client: util.GetHTTPSession("tiktokvm"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
location, err := util.GetLocationURL(ctx.MatchedContentURL, "") location, err := util.GetLocationURL(ctx.MatchedContentURL, "")
@ -64,7 +63,6 @@ var Extractor = &models.Extractor{
Category: enums.ExtractorCategorySocial, Category: enums.ExtractorCategorySocial,
URLPattern: regexp.MustCompile(`https?:\/\/((www|m)\.)?(vx)?tiktok\.com\/((?:embed|@[\w\.-]+)\/)?(v(ideo)?|p(hoto)?)\/(?P<id>[0-9]+)`), URLPattern: regexp.MustCompile(`https?:\/\/((www|m)\.)?(vx)?tiktok\.com\/((?:embed|@[\w\.-]+)\/)?(v(ideo)?|p(hoto)?)\/(?P<id>[0-9]+)`),
Host: baseHost, Host: baseHost,
Client: util.GetHTTPSession("tiktok"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
mediaList, err := MediaListFromAPI(ctx) mediaList, err := MediaListFromAPI(ctx)
@ -78,9 +76,11 @@ var Extractor = &models.Extractor{
} }
func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) { func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) {
client := util.GetHTTPSession(ctx.Extractor.CodeName)
var mediaList []*models.Media var mediaList []*models.Media
details, err := GetVideoAPI(ctx) details, err := GetVideoAPI(
client, ctx.MatchedContentID)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get from api: %w", err) return nil, fmt.Errorf("failed to get from api: %w", err)
} }
@ -138,8 +138,10 @@ func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) {
return mediaList, nil return mediaList, nil
} }
func GetVideoAPI(ctx *models.DownloadContext) (*AwemeDetails, error) { func GetVideoAPI(
awemeID := ctx.MatchedContentID client models.HTTPClient,
awemeID string,
) (*AwemeDetails, error) {
apiURL := fmt.Sprintf( apiURL := fmt.Sprintf(
"https://%s/aweme/v1/multi/aweme/detail/", "https://%s/aweme/v1/multi/aweme/detail/",
apiHostname, apiHostname,
@ -163,7 +165,7 @@ func GetVideoAPI(ctx *models.DownloadContext) (*AwemeDetails, error) {
req.Header.Set("Accept", "application/json") req.Header.Set("Accept", "application/json")
req.Header.Set("X-Argus", "") req.Header.Set("X-Argus", "")
resp, err := ctx.Extractor.Client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }

View file

@ -26,15 +26,15 @@ var ShortExtractor = &models.Extractor{
URLPattern: regexp.MustCompile(`https?://t\.co/(?P<id>\w+)`), URLPattern: regexp.MustCompile(`https?://t\.co/(?P<id>\w+)`),
Host: []string{"t.co"}, Host: []string{"t.co"},
IsRedirect: true, IsRedirect: true,
Client: util.GetHTTPSession("twitter_short"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
client := util.GetHTTPSession(ctx.Extractor.CodeName)
req, err := http.NewRequest(http.MethodGet, ctx.MatchedContentURL, nil) req, err := http.NewRequest(http.MethodGet, ctx.MatchedContentURL, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create req: %w", err) return nil, fmt.Errorf("failed to create req: %w", err)
} }
req.Header.Set("User-Agent", util.ChromeUA) req.Header.Set("User-Agent", util.ChromeUA)
res, err := ctx.Extractor.Client.Do(req) res, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }
@ -65,7 +65,6 @@ var Extractor = &models.Extractor{
"vxx.com", "vxx.com",
"vxtwitter.com", "vxtwitter.com",
}, },
Client: util.GetHTTPSession("twitter"),
Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) { Run: func(ctx *models.DownloadContext) (*models.ExtractorResponse, error) {
mediaList, err := MediaListFromAPI(ctx) mediaList, err := MediaListFromAPI(ctx)
@ -80,8 +79,10 @@ var Extractor = &models.Extractor{
func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) { func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) {
var mediaList []*models.Media var mediaList []*models.Media
client := util.GetHTTPSession(ctx.Extractor.CodeName)
tweetData, err := GetTweetAPI(ctx) tweetData, err := GetTweetAPI(
client, ctx.MatchedContentID)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get tweet data: %w", err) return nil, fmt.Errorf("failed to get tweet data: %w", err)
} }
@ -129,8 +130,10 @@ func MediaListFromAPI(ctx *models.DownloadContext) ([]*models.Media, error) {
return mediaList, nil return mediaList, nil
} }
func GetTweetAPI(ctx *models.DownloadContext) (*Tweet, error) { func GetTweetAPI(
tweetID := ctx.MatchedContentID client models.HTTPClient,
tweetID string,
) (*Tweet, error) {
cookies, err := util.ParseCookieFile("twitter.txt") cookies, err := util.ParseCookieFile("twitter.txt")
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get cookies: %w", err) return nil, fmt.Errorf("failed to get cookies: %w", err)
@ -160,7 +163,7 @@ func GetTweetAPI(ctx *models.DownloadContext) (*Tweet, error) {
} }
req.URL.RawQuery = q.Encode() req.URL.RawQuery = q.Encode()
resp, err := ctx.Extractor.Client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to send request: %w", err) return nil, fmt.Errorf("failed to send request: %w", err)
} }

View file

@ -14,7 +14,6 @@ type Extractor struct {
Host []string Host []string
IsDRM bool IsDRM bool
IsRedirect bool IsRedirect bool
Client HTTPClient
Run func(*DownloadContext) (*ExtractorResponse, error) Run func(*DownloadContext) (*ExtractorResponse, error)
} }