fixes config
This commit is contained in:
parent
6151a6c397
commit
12ad427baf
10 changed files with 57 additions and 51 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue