diff --git a/internal/pkg/postprocessor/assets.go b/internal/pkg/postprocessor/assets.go index 73c089c1..a3435965 100644 --- a/internal/pkg/postprocessor/assets.go +++ b/internal/pkg/postprocessor/assets.go @@ -1,6 +1,7 @@ package postprocessor import ( + "fmt" "net/url" "slices" "strings" @@ -21,62 +22,44 @@ func ExtractAssetsOutlinks(item *models.Item) (assets, outlinks []*models.URL, e return SanitizeAssetsOutlinks(item, assets, outlinks, err) } -// Extract assets and outlinks from the body using the appropriate extractor -// Order is important, we want to check for more specific things first, -// as they may trigger more general extractors (e.g. HTML) -// TODO this should be refactored using interfaces +type AssetExtractor interface { + Match(*models.URL) bool + Extract(*models.Item) (assets, outlinks []*models.URL, err error) +} + +// Order matters: site-specific extractors are checked first, then +// general-purpose ones. The first match wins, so more specific +// extractors must precede broader ones (e.g. HTML). +var assetExtractors = []AssetExtractor{ + ina.INAExtractor{}, + truthsocial.TruthsocialExtractor{}, + extractor.M3U8Extractor{}, + extractor.JSONExtractor{}, + extractor.XMLExtractor{}, + extractor.HTMLAssetsExtractor{}, +} + func Extractors(item *models.Item) (assets, outlinks []*models.URL, err error) { logger := log.NewFieldedLogger(&log.Fields{ "component": "postprocessor.Extractors", "item": item.GetShortID(), }) - - switch { - case ina.IsAPIURL(item.GetURL()): - INAAssets, err := ina.ExtractMedias(item.GetURL()) - if err != nil { - logger.Error("unable to extract medias from INA", "err", err.Error()) - return assets, outlinks, err - } - - HTMLAssets, err := extractor.HTMLAssets(item) - if err != nil { - logger.Error("unable to extract assets", "err", err.Error()) + for _, ext := range assetExtractors { + // heavy debug log calls, can be ommited when merged + logger.Debug("AssetExtractor Match call", "url", item.GetURL()) + if ext.Match(item.GetURL()) { + logger.Debug("matched extractor", "extractor", fmt.Sprintf("%T", ext)) + assets, outlinks, err = ext.Extract(item) + logger.Debug("extraction result", "assets", len(assets), "outlinks", len(outlinks), "err", err) + if err != nil { + logger.Error("unable to extract assets", "err", err.Error()) + } return assets, outlinks, err } + } - assets = append(INAAssets, HTMLAssets...) - case truthsocial.NeedExtraction(item.GetURL()): - assets, outlinks, err = truthsocial.ExtractAssets(item) - if err != nil { - logger.Error("unable to extract assets from TruthSocial", "err", err.Error()) - return assets, outlinks, err - } - case extractor.IsM3U8(item.GetURL()): - assets, err = extractor.M3U8(item.GetURL()) - if err != nil { - logger.Error("unable to extract assets", "err", err.Error()) - return assets, outlinks, err - } - case extractor.IsJSON(item.GetURL()): - assets, outlinks, err = extractor.JSON(item.GetURL()) - if err != nil { - logger.Error("unable to extract assets", "err", err.Error()) - return assets, outlinks, err - } - case extractor.IsXML(item.GetURL()): - assets, outlinks, err = extractor.XML(item.GetURL()) - if err != nil { - logger.Error("unable to extract assets", "err", err.Error()) - return assets, outlinks, err - } - case extractor.IsHTML(item.GetURL()): - assets, err = extractor.HTMLAssets(item) - if err != nil { - logger.Error("unable to extract assets", "err", err.Error()) - return assets, outlinks, err - } - case extractor.IsEmbeddedCSS(item): + // Embedded CSS is handled separately see PR discussion + if extractor.IsEmbeddedCSS(item) { var atImportLinks []*models.URL assets, atImportLinks, err = extractor.ExtractFromURLCSS(item.GetURL()) @@ -88,13 +71,12 @@ func Extractors(item *models.Item) (assets, outlinks []*models.URL, err error) { logger.Debug("extracted assets from CSS", logArgs...) } extractor.AddAtImportLinksToItemChild(item, atImportLinks) - default: - contentType := item.GetURL().GetResponse().Header.Get("Content-Type") - logger.Debug("no extractor used for page", "content-type", contentType, "mime", item.GetURL().GetMIMEType().String()) - return assets, outlinks, nil + return assets, outlinks, err } - return assets, outlinks, err + contentType := item.GetURL().GetResponse().Header.Get("Content-Type") + logger.Debug("no extractor used for page", "content-type", contentType, "mime", item.GetURL().GetMIMEType().String()) + return assets, outlinks, nil } func SanitizeAssetsOutlinks(item *models.Item, assets []*models.URL, outlinks []*models.URL, err error) ([]*models.URL, []*models.URL, error) { diff --git a/internal/pkg/postprocessor/extractor/html.go b/internal/pkg/postprocessor/extractor/html.go index 1eb131a4..4ff4ed76 100644 --- a/internal/pkg/postprocessor/extractor/html.go +++ b/internal/pkg/postprocessor/extractor/html.go @@ -14,6 +14,17 @@ import ( "github.com/internetarchive/Zeno/pkg/models" ) +type HTMLAssetsExtractor struct{} + +func (HTMLAssetsExtractor) Match(URL *models.URL) bool { + return IsHTML(URL) +} + +func (HTMLAssetsExtractor) Extract(item *models.Item) (assets, outlinks []*models.URL, err error) { + assets, err = HTMLAssets(item) + return assets, nil, err +} + var ( onclickRegex = regexp.MustCompile(`window\.location(?:\.href)?\s*=\s*['"]([^'"]+)['"]`) ) diff --git a/internal/pkg/postprocessor/extractor/html_test.go b/internal/pkg/postprocessor/extractor/html_test.go index 6e457e34..4bfa325c 100644 --- a/internal/pkg/postprocessor/extractor/html_test.go +++ b/internal/pkg/postprocessor/extractor/html_test.go @@ -78,7 +78,8 @@ func TestHTMLAssetsAudioVideo(t *testing.T) { ` item := setupItem(html) - assets, err := HTMLAssets(item) + extractor := HTMLAssetsExtractor{} + assets, _, err := extractor.Extract(item) if err != nil { t.Errorf("HTMLAssets error = %v", err) } @@ -102,7 +103,8 @@ func TestHTMLAssetsAttributes(t *testing.T) { ` item := setupItem(html) - assets, err := HTMLAssets(item) + extractor := HTMLAssetsExtractor{} + assets, _, err := extractor.Extract(item) if err != nil { t.Errorf("HTMLAssets error = %v", err) } @@ -144,7 +146,8 @@ func TestHTMLAssetsMeta(t *testing.T) { } item := setupItem(html) - assets, err := HTMLAssets(item) + extractor := HTMLAssetsExtractor{} + assets, _, err := extractor.Extract(item) if err != nil { t.Errorf("HTMLAssets error = %v", err) } @@ -171,7 +174,8 @@ func TestSrcset(t *testing.T) { ` item := setupItem(html) - assets, err := HTMLAssets(item) + extractor := HTMLAssetsExtractor{} + assets, _, err := extractor.Extract(item) if err != nil { t.Errorf("Error extracting HTML assets %s", err) } @@ -225,7 +229,8 @@ func TestCSS(t *testing.T) { ` item := setupItem(html) - assets, err := HTMLAssets(item) + extractor := HTMLAssetsExtractor{} + assets, _, err := extractor.Extract(item) if err != nil { t.Errorf("Error extracting HTML assets %s", err) } @@ -247,7 +252,8 @@ func TestHTMLDataSrc(t *testing.T) { ` item := setupItem(html) - assets, err := HTMLAssets(item) + extractor := HTMLAssetsExtractor{} + assets, _, err := extractor.Extract(item) if err != nil { t.Errorf("Error extracting HTML assets %s", err) } diff --git a/internal/pkg/postprocessor/extractor/json.go b/internal/pkg/postprocessor/extractor/json.go index 7d1092f9..556d4fa6 100644 --- a/internal/pkg/postprocessor/extractor/json.go +++ b/internal/pkg/postprocessor/extractor/json.go @@ -10,6 +10,16 @@ import ( "github.com/internetarchive/Zeno/pkg/models" ) +type JSONExtractor struct{} + +func (JSONExtractor) Match(URL *models.URL) bool { + return IsJSON(URL) +} + +func (JSONExtractor) Extract(item *models.Item) (assets, outlinks []*models.URL, err error) { + return JSON(item.GetURL()) +} + func IsJSON(URL *models.URL) bool { return URL.GetMIMEType() != nil && strings.Contains(URL.GetMIMEType().String(), "json") } diff --git a/internal/pkg/postprocessor/extractor/m3u8.go b/internal/pkg/postprocessor/extractor/m3u8.go index d35aaed1..66383d73 100644 --- a/internal/pkg/postprocessor/extractor/m3u8.go +++ b/internal/pkg/postprocessor/extractor/m3u8.go @@ -5,9 +5,21 @@ import ( "github.com/internetarchive/Zeno/pkg/models" ) +type M3U8Extractor struct{} + +func (M3U8Extractor) Match(URL *models.URL) bool { + return IsM3U8(URL) +} + +func (M3U8Extractor) Extract(item *models.Item) (assets, outlinks []*models.URL, err error) { + assets, err = M3U8(item.GetURL()) + return assets, nil, err +} + func IsM3U8(URL *models.URL) bool { - return URL.GetMIMEType() != nil && - URL.GetMIMEType().Is("application/vnd.apple.mpegurl") || URL.GetMIMEType().Is("application/x-mpegURL") + mt := URL.GetMIMEType() + // TODO: https://github.com/gabriel-vasile/mimetype/pull/755 remove "application/x-mpegURL" when merged&released + return mt != nil && (mt.Is("application/vnd.apple.mpegurl") || mt.Is("application/x-mpegURL")) } func M3U8(URL *models.URL) (assets []*models.URL, err error) { diff --git a/internal/pkg/postprocessor/extractor/m3u8_test.go b/internal/pkg/postprocessor/extractor/m3u8_test.go new file mode 100644 index 00000000..81412ce2 --- /dev/null +++ b/internal/pkg/postprocessor/extractor/m3u8_test.go @@ -0,0 +1,48 @@ +package extractor + +import ( + "net/http" + "testing" + + "github.com/internetarchive/Zeno/pkg/models" +) + +func TestShouldMatchM3U8URL(t *testing.T) { + cases := []struct { + url string + mimeType string + expected bool + }{ + {"https://sub.example.com/test.m3u8", "application/vnd.apple.mpegurl", true}, + {"https://sub.example.com/test2.m3u8", "application/x-mpegURL", true}, // will be fixed by PRhttps://github.com/gabriel-vasile/mimetype/pull/755 + {"https://sub.example.com/test3.m3u8", "application/json", false}, + {"https://sub.example.com/example.html", "text/html", false}, + {"https://sub.example.com/m3u8.txt", "text/plain", false}, + {"https://sub.example.com/example.mp4", "application/octet-stream", false}, + {"https://sub.example.com/example.form", "application/x-www-form-urlencoded", false}, + } + + for _, c := range cases { + t.Run(c.url, func(t *testing.T) { + url, err := models.NewURL(c.url) + if err != nil { + t.Fatalf("failed to create URL: %v", err) + } + resp := &http.Response{ + Header: make(http.Header), + Body: nil, + StatusCode: 200, + } + resp.Header.Set("Content-Type", c.mimeType) + url.SetResponse(resp) + + // call match, returns bool + matched := M3U8Extractor{}.Match(&url) + if matched != c.expected { + t.Errorf("M3U8Extractor.Match(%q) = %v, want %v: mimetype=%q", c.url, matched, c.expected, url.GetMIMEType()) + } + }) + } +} + +// TODO: Add test for Extract() diff --git a/internal/pkg/postprocessor/extractor/xml.go b/internal/pkg/postprocessor/extractor/xml.go index 1fd48170..99a1c78a 100644 --- a/internal/pkg/postprocessor/extractor/xml.go +++ b/internal/pkg/postprocessor/extractor/xml.go @@ -13,6 +13,16 @@ import ( "github.com/internetarchive/Zeno/pkg/models" ) +type XMLExtractor struct{} + +func (XMLExtractor) Match(URL *models.URL) bool { + return IsXML(URL) +} + +func (XMLExtractor) Extract(item *models.Item) (assets, outlinks []*models.URL, err error) { + return XML(item.GetURL()) +} + // xmlBufioReaderPool pools bufio.Reader instances for XML parsing to reduce allocations when processing many XML documents. var xmlBufioReaderPool = sync.Pool{ New: func() any { @@ -110,7 +120,6 @@ func XML(URL *models.URL) (assets, outlinks []*models.URL, err error) { body.Reset(URL.GetBody()) defer xmlBufioReaderPool.Put(body) - // Peek to check if body has any non-whitespace content peek, err := body.Peek(512) // peek up to 512 bytes if err != nil && err != io.EOF { diff --git a/internal/pkg/postprocessor/item.go b/internal/pkg/postprocessor/item.go index be7d86ba..d5c53065 100644 --- a/internal/pkg/postprocessor/item.go +++ b/internal/pkg/postprocessor/item.go @@ -90,7 +90,6 @@ func postprocessItem(item *models.Item) []*models.Item { if (item.GetURL().GetResponse() != nil && item.GetURL().GetResponse().StatusCode == 200) || // standard item (item.GetURL().GetResponse() == nil && item.GetURL().GetBody() != nil) { // headless item - logger.Debug("item is a success") var outlinksFromAssets []*models.URL diff --git a/internal/pkg/postprocessor/sitespecific/ina/ina.go b/internal/pkg/postprocessor/sitespecific/ina/ina.go index 6fb506f0..51a96a92 100644 --- a/internal/pkg/postprocessor/sitespecific/ina/ina.go +++ b/internal/pkg/postprocessor/sitespecific/ina/ina.go @@ -16,6 +16,21 @@ import ( warc "github.com/internetarchive/gowarc" ) +type INAExtractor struct{} + +func (INAExtractor) Match(URL *models.URL) bool { + return IsAPIURL(URL) +} + +func (INAExtractor) Extract(item *models.Item) (assets, outlinks []*models.URL, err error) { + assets, err = ExtractMedias(item.GetURL()) + if err != nil { + return nil, nil, err + } + + return assets, nil, err +} + var ( playerVersion string playerVersionLock sync.Mutex @@ -176,6 +191,7 @@ func extractJWPlayerVersion(body string) string { return "" } +// TODO: Use the item obj directly instead of the URL func ExtractMedias(URL *models.URL) (assets []*models.URL, err error) { defer URL.RewindBody() diff --git a/internal/pkg/postprocessor/sitespecific/ina/ina_test.go b/internal/pkg/postprocessor/sitespecific/ina/ina_test.go new file mode 100644 index 00000000..90924d35 --- /dev/null +++ b/internal/pkg/postprocessor/sitespecific/ina/ina_test.go @@ -0,0 +1,92 @@ +package ina + +import ( + "bytes" + "io" + "net/http" + "os" + "testing" + + _ "embed" + + "github.com/internetarchive/Zeno/pkg/models" + "github.com/internetarchive/gowarc/pkg/spooledtempfile" +) + +func TestShouldMatchINAAPIURL(t *testing.T) { + cases := []struct { + url string + expected bool + }{ + {"https://apipartner.ina.fr/assets/CAF94008902?sign=cba193fb1b0f088093cb933e551aeb57ca05aad8&partnerId=2", true}, + {"https://apipartner.ina.fr/partners/2/playerConfigurations.json", false}, + {"https://apipartner.ina.fr/assets/LXF01009183?sign=7b65ad9249d3727e8764f4fa98bbca900ba40dfc&partnerId=2", true}, + {"https://apipartner.ina.fr/partners/2/playerConfigurations.json", false}, + {"https://apipartner.ina.fr/assets/CPF86631442?sign=1c81c809cbc94b3472083f3c416c7f6e3c36a7fc&partnerId=2", true}, + {"https://apipartner.ina.fr/partners/2/playerConfigurations.json", false}, + } + + for _, c := range cases { + t.Run(c.url, func(t *testing.T) { + url, err := models.NewURL(c.url) + if err != nil { + t.Fatalf("failed to create URL: %v", err) + } + + result := INAExtractor{}.Match(&url) + if result != c.expected { + t.Errorf("INAExtractor{}.Match(%q) = %v; want %v", c.url, result, c.expected) + } + }) + } + +} + +//go:embed testdata/ina.json +var rawJson []byte + +func TestShouldExtractINAAPIURL(t *testing.T) { + resp := &http.Response{ + Header: make(http.Header), + Body: io.NopCloser(bytes.NewBuffer(rawJson)), + StatusCode: 200, + } + resp.Header.Set("Content-Type", "application/json") + + newURL, err := models.NewURL("https://apipartner.ina.fr/assets/CAF94008902?sign=cba193fb1b0f088093cb933e551aeb57ca05aad8&partnerId=2") + if err != nil { + t.Fatalf("failed to create URL: %v", err) + } + newURL.SetResponse(resp) + + spooledTempFile := spooledtempfile.NewSpooledTempFile("test", os.TempDir(), 2048, false, -1) + spooledTempFile.Write(rawJson) + + newURL.SetBody(spooledTempFile) + newURL.Parse() + item := models.NewItem(&newURL, "") + + assets, _, err := INAExtractor{}.Extract(item) + if err != nil { + t.Fatalf("failed to extract assets: %v", err) + } + + // check if urls are within assets + expectedURLs := []string{ + "https://media-hub.ina.fr/video/TCTrhfFxdPsK05aEtOQZo21h9bs5knovVz3UlDlUiWugpJXwPaH2M5LEPFcMBUv2sxqpql3WsZx9UAKUZlxACWSXWW3DfDyGEPc2GrizPOCYemJ1BALeMMoG1HdyQ9G6flO2sauFpJQI1a8zkeUNWw==/sl_iv/2m+jStBk7YTkGuubVRRfcQ==/sl_hm/yu3+FJDLtzlrVZB7d60TIwYkjEOIRNk6NipAM252ri57pvRHRORKX58Bs1grMqCqTRrx81t936vdZ62TX+jXAA==/sl_e/1771006331", + "https://cdn-hub.ina.fr/notice/690x517/09b/CPF86631442.jpeg", + "https://player.ina.fr/embed/CPF86631442?pid=1c81c809cbc94b3472083f3c416c7f6e3c36a7fc&sign=c9cb04647e70ee3baaede8e4017131e827bcb496", + "https://www.ina.fr/video/CPF86631442", + } + assetSet := make(map[string]struct{}, len(assets)) + for _, a := range assets { + assetSet[a.Raw] = struct{}{} + } + + for _, expected := range expectedURLs { + if _, ok := assetSet[expected]; !ok { + t.Errorf("expected URL not found in assets: %s", expected) + } + } + +} diff --git a/internal/pkg/postprocessor/sitespecific/ina/testdata/ina.json b/internal/pkg/postprocessor/sitespecific/ina/testdata/ina.json new file mode 100644 index 00000000..830f9e02 --- /dev/null +++ b/internal/pkg/postprocessor/sitespecific/ina/testdata/ina.json @@ -0,0 +1,52 @@ +{ + "id": "CPF86631442", + "title": "Indicatif RTF", + "description": "Logo RTF du 4 février 1959 au 27 juin 1964. La musique est de Jean-Baptiste Lully \u0022Fanfare pour le Carrousel Royal\u0022.", + "dateOfBroadcast": "1959-02-04T18:12:11+00:00", + "type": "video", + "duration": 42, + "categories": [], + "credits": [ + { + "@context": { + "@vocab": "http:\/\/apipartner.ina.fr\/docs.jsonld#", + "hydra": "http:\/\/www.w3.org\/ns\/hydra\/core#", + "name": "AssetElement\/name", + "value": "AssetElement\/value", + "attributes": "AssetElement\/attributes" + }, + "@type": "AssetElement", + "@id": "\/.well-known\/genid\/14ddfbe4c295f9682ecd", + "name": "credit", + "value": "Radiodiffusion Télévision Française", + "attributes": [ + { + "@context": { + "@vocab": "http:\/\/apipartner.ina.fr\/docs.jsonld#", + "hydra": "http:\/\/www.w3.org\/ns\/hydra\/core#", + "key": "AssetElementAttribute\/key", + "value": "AssetElementAttribute\/value" + }, + "@type": "AssetElementAttribute", + "@id": "\/.well-known\/genid\/e6a182965f5ec9215e0a", + "key": "role", + "value": "producer" + } + ] + } + ], + "restrictions": [], + "resourceUrl": "https:\/\/media-hub.ina.fr\/video\/TCTrhfFxdPsK05aEtOQZo21h9bs5knovVz3UlDlUiWugpJXwPaH2M5LEPFcMBUv2sxqpql3WsZx9UAKUZlxACWSXWW3DfDyGEPc2GrizPOCYemJ1BALeMMoG1HdyQ9G6flO2sauFpJQI1a8zkeUNWw==\/sl_iv\/2m+jStBk7YTkGuubVRRfcQ==\/sl_hm\/yu3+FJDLtzlrVZB7d60TIwYkjEOIRNk6NipAM252ri57pvRHRORKX58Bs1grMqCqTRrx81t936vdZ62TX+jXAA==\/sl_e\/1771006331", + "resourceThumbnail": "https:\/\/cdn-hub.ina.fr\/notice\/690x517\/09b\/CPF86631442.jpeg", + "restrictedBroadcastCountries": [], + "embedUrl": "\/embed\/CPF86631442?pid=1c81c809cbc94b3472083f3c416c7f6e3c36a7fc\u0026sign=c9cb04647e70ee3baaede8e4017131e827bcb496", + "allowEmbed": true, + "ratio": "4_3", + "collectionTitle": "", + "isOnline": true, + "allowAds": true, + "typeMedia": "video", + "hideLogo": false, + "uri": "https:\/\/www.ina.fr\/video\/CPF86631442", + "advertisingAsset": false +} \ No newline at end of file diff --git a/internal/pkg/postprocessor/sitespecific/truthsocial/testdata/statuses.json b/internal/pkg/postprocessor/sitespecific/truthsocial/testdata/statuses.json new file mode 100644 index 00000000..c274f922 --- /dev/null +++ b/internal/pkg/postprocessor/sitespecific/truthsocial/testdata/statuses.json @@ -0,0 +1,2445 @@ +[ + { + "id": "115984113252953391", + "created_at": "2026-01-30T12:45:18.728Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115984113252953391", + "url": "https://truthsocial.com/@realDonaldTrump/115984113252953391", + "content": "

Christopher Waller, Rick Rieder, and others, were interviewed for the Fed position. They all would have been outstanding, and have a great and unlimited future with “TRUMP.” Such amazing talent in our Country. Thank you! President DJT

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612717, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1452, + "reblogs_count": 3039, + "favourites_count": 15101, + "reaction": null, + "upvotes_count": 15101, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115984101924920653", + "created_at": "2026-01-30T12:42:25.875Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115984101924920653", + "url": "https://truthsocial.com/@realDonaldTrump/115984101924920653", + "content": "

RT @realDonaldTrumpTheir was great speculation that highly respected Kevin Hassett was going to be named Chairman of the Fed, and a great Chairman he would have been but, quite honestly, he is doing such an outstanding job working with me and my team at the White House, that I just didn’t want to let him go. Kevin is indescribably good so, as the expression goes, “if you can’t do better, don’t try to fix it!” Thank you Kevin for doing such a great job! President DJT

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612715, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": { + "id": "115984071734301762", + "created_at": "2026-01-30T12:34:45.204Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115984071734301762", + "url": "https://truthsocial.com/@realDonaldTrump/115984071734301762", + "content": "

Their was great speculation that highly respected Kevin Hassett was going to be named Chairman of the Fed, and a great Chairman he would have been but, quite honestly, he is doing such an outstanding job working with me and my team at the White House, that I just didn’t want to let him go. Kevin is indescribably good so, as the expression goes, “if you can’t do better, don’t try to fix it!” Thank you Kevin for doing such a great job! President DJT

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612715, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 821, + "reblogs_count": 3432, + "favourites_count": 16280, + "reaction": null, + "upvotes_count": 16280, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + "sponsored": false, + "replies_count": 0, + "reblogs_count": 0, + "favourites_count": 0, + "reaction": null, + "upvotes_count": 0, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115984100084458641", + "created_at": "2026-01-30T12:41:57.793Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115984100084458641", + "url": "https://truthsocial.com/@realDonaldTrump/115984100084458641", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612741, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115984094222640394", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/984/094/222/640/394/original/2e2c9d2663ca7bc6.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/984/094/222/640/394/original/e3cb6239047d9733.jpg", + "external_video_id": "v72vi1s", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#56dcf5", + "background": "#2362dd", + "foreground": "#f5f9f9" + }, + "original": { + "bitrate": 1477161, + "duration": 465.231, + "frame_rate": "52278750/1744619", + "height": 720, + "width": 1280 + }, + "small": { + "aspect": 1.7783333333333333, + "height": 600, + "size": "1067x600", + "width": 1067 + } + }, + "description": null, + "blurhash": "UTB5Y^qsX#njO=R4NFRpDOte%2t6D=fyaebw", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 681, + "reblogs_count": 2987, + "favourites_count": 9349, + "reaction": null, + "upvotes_count": 9349, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115984098944809941", + "created_at": "2026-01-30T12:41:40.404Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115984098944809941", + "url": "https://truthsocial.com/@realDonaldTrump/115984098944809941", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612738, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115984092962617352", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/984/092/962/617/352/original/28a14ebc635f48d8.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/984/092/962/617/352/original/bb8e6ba71ff91c34.jpg", + "external_video_id": "v72vi18", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#d48972", + "background": "#090d15", + "foreground": "#ecf0f4" + }, + "original": { + "bitrate": 1466007, + "duration": 775.957, + "frame_rate": "348825000/11640131", + "height": 720, + "width": 1280 + }, + "small": { + "aspect": 1.7783333333333333, + "height": 600, + "size": "1067x600", + "width": 1067 + } + }, + "description": null, + "blurhash": "UTB:dKjYE0of4mW;bwWV%hoJw^jsIpWqnij]", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 704, + "reblogs_count": 2837, + "favourites_count": 8739, + "reaction": null, + "upvotes_count": 8739, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115984071734301762", + "created_at": "2026-01-30T12:34:45.204Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115984071734301762", + "url": "https://truthsocial.com/@realDonaldTrump/115984071734301762", + "content": "

Their was great speculation that highly respected Kevin Hassett was going to be named Chairman of the Fed, and a great Chairman he would have been but, quite honestly, he is doing such an outstanding job working with me and my team at the White House, that I just didn’t want to let him go. Kevin is indescribably good so, as the expression goes, “if you can’t do better, don’t try to fix it!” Thank you Kevin for doing such a great job! President DJT

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612737, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 821, + "reblogs_count": 3432, + "favourites_count": 16280, + "reaction": null, + "upvotes_count": 16280, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115983891481988557", + "created_at": "2026-01-30T11:48:54.770Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115983891481988557", + "url": "https://truthsocial.com/@realDonaldTrump/115983891481988557", + "content": "

I am pleased to announce that I am nominating Kevin Warsh to be the CHAIRMAN OF THE BOARD OF GOVERNORS OF THE FEDERAL RESERVE SYSTEM. Kevin currently serves as the Shepard Family Distinguished Visiting Fellow in Economics at the Hoover Institution, and Lecturer at the Stanford Graduate School of Business. He is a Partner of Stanley Druckenmiller at Duquesne Family Office LLC. Kevin received his A.B. from Stanford University, and J.D. from Harvard Law School. He has conducted extensive research in the field of Economics and Finance. Kevin issued an Independent Report to the Bank of England proposing reforms in the conduct of Monetary Policy in the United Kingdom. Parliament adopted the Report's recommendations. Kevin Warsh became the youngest Fed Governor, ever, at 35, and served as a Member of the Board of Governors of the Federal Reserve System from 2006 until 2011, as the Federal Reserve's Representative to the Group of Twenty (G-20), and as the Board's Emissary to the Emerging and Advanced Economies in Asia. In addition, he was Administrative Governor, managing and overseeing the Board's operations, personnel, and financial performance. Prior to his appointment to the Board, from 2002 until 2006, Kevin served as Special Assistant to the President for Economic Policy, and Executive Secretary of the White House National Economic Council. Previously, Kevin was a member of the Mergers & Acquisitions Department at Morgan Stanley & Co., in New York, serving as Vice President and Executive Director. I have known Kevin for a long period of time, and have no doubt that he will go down as one of the GREAT Fed Chairmen, maybe the best. On top of everything else, he is “central casting,” and he will never let you down. Congratulations Kevin! PRESIDENT DONALD J. TRUMP

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612732, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1889, + "reblogs_count": 5852, + "favourites_count": 22755, + "reaction": null, + "upvotes_count": 22755, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115982747344520072", + "created_at": "2026-01-30T06:57:56.616Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115982747344520072", + "url": "https://truthsocial.com/@realDonaldTrump/115982747344520072", + "content": "

Leigh Wambsganss, a Republican running for the State Senate in the suburbs of Fort Worth, Texas, will be a GREAT Candidate and has my Complete and Total Endorsement. Thank you for your attention to this matter!!! President DJT

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612730, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 566, + "reblogs_count": 2663, + "favourites_count": 11971, + "reaction": null, + "upvotes_count": 11971, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115982625271651077", + "created_at": "2026-01-30T06:26:53.935Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115982625271651077", + "url": "https://truthsocial.com/@realDonaldTrump/115982625271651077", + "content": "

Agitator and, perhaps, insurrectionist, Alex Pretti’s stock has gone way down with the just released video of him screaming and spitting in the face of a very calm and under control ICE Officer, and then crazily kicking in a new and very expensive government vehicle, so hard and violent, in fact, that the taillight broke off in pieces. It was quite a display of abuse and anger, for all to see, crazed and out of control. The ICE Officer was calm and cool, not an easy thing to be under those circumstances! MAKE AMERICA GREAT AGAIN.

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612730, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 2597, + "reblogs_count": 5296, + "favourites_count": 19882, + "reaction": null, + "upvotes_count": 19882, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115982565820930632", + "created_at": "2026-01-30T06:11:46.790Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115982565820930632", + "url": "https://truthsocial.com/@realDonaldTrump/115982565820930632", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612742, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115982565168356721", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/982/565/168/356/721/original/1f4f548c12694948.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/982/565/168/356/721/original/c9d92f7c6e38737a.jpg", + "external_video_id": "v72v7vw", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#c19360", + "background": "#582c2f", + "foreground": "#b7b7cb" + }, + "original": { + "bitrate": 2434015, + "duration": 43.25599, + "frame_rate": "4968960/166103", + "height": 1280, + "width": 720 + }, + "small": { + "aspect": 0.5623242736644799, + "height": 1067, + "size": "600x1067", + "width": 600 + } + }, + "description": null, + "blurhash": "UcE.q?nMsRadtpROV?V?JCWAWAaxNZjYoIof", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1221, + "reblogs_count": 3968, + "favourites_count": 14627, + "reaction": null, + "upvotes_count": 14627, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115980983698005555", + "created_at": "2026-01-29T23:29:25.548Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115980983698005555", + "url": "https://truthsocial.com/@realDonaldTrump/115980983698005555", + "content": "

Based on the fact that Canada has wrongfully, illegally, and steadfastly refused to certify the Gulfstream 500, 600, 700, and 800 Jets, one of the greatest, most technologically advanced airplanes ever made, we are hereby decertifying their Bombardier Global Expresses, and all Aircraft made in Canada, until such time as Gulfstream, a Great American Company, is fully certified, as it should have been many years ago. Further, Canada is effectively prohibiting the sale of Gulfstream products in Canada through this very same certification process. If, for any reason, this situation is not immediately corrected, I am going to charge Canada a 50% Tariff on any and all Aircraft sold into the United States of America. Thank you for your attention to this matter!

DONALD J. TRUMP
PRESIDENT OF THE UNITED STATES OF AMERICA

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612716, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 4241, + "reblogs_count": 10614, + "favourites_count": 46193, + "reaction": null, + "upvotes_count": 46193, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115980912926614287", + "created_at": "2026-01-29T23:11:25.663Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115980912926614287", + "url": "https://truthsocial.com/@realDonaldTrump/115980912926614287", + "content": "

America is setting Records in every way, and our Growth Numbers are among the best ever. The only thing that can slow our Country down is another long and damaging Government Shutdown. I am working hard with Congress to ensure that we are able to fully fund the Government, without delay. Republicans and Democrats in Congress have come together to get the vast majority of the Government funded until September, while at the same time providing an extension to the Department of Homeland Security (including the very important Coast Guard, which we are expanding and rebuilding like never before). Hopefully, both Republicans and Democrats will give a very much needed Bipartisan “YES” Vote. PRESIDENT DONALD J. TRUMP

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612736, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1721, + "reblogs_count": 4989, + "favourites_count": 20755, + "reaction": null, + "upvotes_count": 20755, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115979321879115449", + "created_at": "2026-01-29T16:26:48.261Z", + "in_reply_to_id": null, + "quote_id": "115979320622868287", + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115979321879115449", + "url": "https://truthsocial.com/@realDonaldTrump/115979321879115449", + "content": "


RT: https://truthsocial.com/users/realDonaldTrump/statuses/115979320622868287

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612721, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115979321578314295", + "type": "image", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/979/321/578/314/295/original/6cc08418ad1c778c.png", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/979/321/578/314/295/small/6cc08418ad1c778c.png", + "external_video_id": null, + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "original": { + "aspect": 4.179245283018868, + "height": 212, + "size": "886x212", + "width": 886 + }, + "small": { + "aspect": 4.179245283018868, + "height": 212, + "size": "886x212", + "width": 886 + } + }, + "description": null, + "blurhash": "UBS$ov009FM_WBM{IUIURjRjRjRjxut7ofof", + "processing": "complete" + } + ], + "mentions": [ + { + "id": "107780257626128497", + "username": "realDonaldTrump", + "url": "https://truthsocial.com/@realDonaldTrump", + "acct": "realDonaldTrump" + } + ], + "tags": [], + "card": null, + "group": null, + "quote": { + "id": "115979320622868287", + "created_at": "2026-01-29T16:26:29.064Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115979320622868287", + "url": "https://truthsocial.com/@realDonaldTrump/115979320622868287", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612721, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115979320242766882", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/979/320/242/766/882/original/3059cc76c63f8ccd.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/979/320/242/766/882/original/7470560bd9cf7b4e.jpg", + "external_video_id": "v72u3vi", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#2e195b", + "background": "#e5ece8", + "foreground": "#2b1a35" + }, + "original": { + "bitrate": 2998073, + "duration": 24.981333, + "frame_rate": "30000/1001", + "height": 1080, + "width": 1920 + }, + "small": { + "aspect": 1.7783333333333333, + "height": 600, + "size": "1067x600", + "width": 1067 + } + }, + "description": null, + "blurhash": "UoI=Jix[9GIV~pxuM{WB%Ma{a|t7ozNHt7t7", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1494, + "reblogs_count": 4474, + "favourites_count": 16476, + "reaction": null, + "upvotes_count": 16476, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 4736, + "reblogs_count": 9153, + "favourites_count": 25390, + "reaction": null, + "upvotes_count": 25390, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115979320622868287", + "created_at": "2026-01-29T16:26:29.064Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115979320622868287", + "url": "https://truthsocial.com/@realDonaldTrump/115979320622868287", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612737, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115979320242766882", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/979/320/242/766/882/original/3059cc76c63f8ccd.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/979/320/242/766/882/original/7470560bd9cf7b4e.jpg", + "external_video_id": "v72u3vi", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#2e195b", + "background": "#e5ece8", + "foreground": "#2b1a35" + }, + "original": { + "bitrate": 2998073, + "duration": 24.981333, + "frame_rate": "30000/1001", + "height": 1080, + "width": 1920 + }, + "small": { + "aspect": 1.7783333333333333, + "height": 600, + "size": "1067x600", + "width": 1067 + } + }, + "description": null, + "blurhash": "UoI=Jix[9GIV~pxuM{WB%Ma{a|t7ozNHt7t7", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1494, + "reblogs_count": 4474, + "favourites_count": 16476, + "reaction": null, + "upvotes_count": 16476, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115979311914390909", + "created_at": "2026-01-29T16:24:16.118Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115979311914390909", + "url": "https://truthsocial.com/@realDonaldTrump/115979311914390909", + "content": "

I had a very productive telephone conversation with President Claudia Sheinbaum, of Mexico. It went extremely well for both Countries. Much of it was focused on the Border, stopping Drug Trafficking, and Trade. We will be speaking again, soon, and ultimately, setting up meetings in our respective Countries. Mexico has a wonderful and highly intelligent Leader — They should be very happy about that! PRESIDENT DONALD J. TRUMP

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612740, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1338, + "reblogs_count": 4448, + "favourites_count": 20930, + "reaction": null, + "upvotes_count": 20930, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115978487020569325", + "created_at": "2026-01-29T12:54:29.234Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115978487020569325", + "url": "https://truthsocial.com/@realDonaldTrump/115978487020569325", + "content": "

Jerome “Too Late” Powell again refused to cut interest rates, even though he has absolutely no reason to keep them so high. He is hurting our Country, and its National Security. We should have a substantially lower rate now that even this moron admits inflation is no longer a problem or threat. He is costing America Hundreds of Billions of Dollar a year in totally unnecessary and uncalled for INTEREST EXPENSE. Because of the vast amounts of money flowing into our Country because of Tariffs, we should be paying the LOWEST INTEREST RATE OF ANY COUNTRY IN THE WORLD. Most of these countries are low interest rate paying cash machines, thought of as elegant, solid, and prime, only because the U.S.A. allows them to be. The Tariffs being charged to them, while bringing in $BILLIONS to us, still allows most of them to have a significant trade surplus, though much smaller, with our beautiful, formerly abused Country. In other words, I have been very nice, kind, and gentle to countries all over the World. With a mere flip of the pen, $BILLIONS more would come into the U.S.A., and these countries would have to go back to making money the old fashioned way, not on the back of America. I hope they all appreciate, although many don’t, what our great Country has done for them. The Fed should substantially lower interest rates, NOW! Tariffs have made America strong and powerful again, far stronger and more powerful than any other Nation. Commensurate with this strength, both financial and otherwise, WE SHOULD BE PAYING LOWER INTEREST RATES THAN ANY OTHER COUNTRY IN THE WORLD! Thank you for your attention to this matter. President DONALD J. TRUMP

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612715, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 3850, + "reblogs_count": 8181, + "favourites_count": 29311, + "reaction": null, + "upvotes_count": 29311, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115978045822911393", + "created_at": "2026-01-29T11:02:17.094Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115978045822911393", + "url": "https://truthsocial.com/@realDonaldTrump/115978045822911393", + "content": "

https://x.com/thescif/status/2016648324644839849?s=10

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612736, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115978043773886704", + "type": "image", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/043/773/886/704/original/162f56648a2ef693.png", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/043/773/886/704/small/162f56648a2ef693.png", + "external_video_id": null, + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "original": { + "aspect": 1.9429824561403508, + "height": 456, + "size": "886x456", + "width": 886 + }, + "small": { + "aspect": 1.9429824561403508, + "height": 456, + "size": "886x456", + "width": 886 + } + }, + "description": null, + "blurhash": "U6R{#?0Kj[D%M{IUM{Rj_3M{D%Rj~qM{D%ae", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": { + "id": null, + "url": "https://x.com/thescif/status/2016648324644839849?s=10", + "title": "The SCIF (@TheSCIF) on X", + "description": "President Trump's legal team exposing the 2020 Election Fraud at the Georgia State Farm Arena pulling suitcases full of alleged fraudulent ballots from under tables after the election center was shut down, running the same stacks of ballots over, and over, and over, all", + "type": "link", + "author_name": "", + "author_url": "", + "provider_name": "x.com", + "provider_url": "", + "html": "", + "width": 1920, + "height": 1080, + "image": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/cache/preview_cards/images/066/659/385/original/2ec4055144165767.jpeg", + "embed_url": "", + "blurhash": null, + "links": null, + "group": null + }, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 2180, + "reblogs_count": 7501, + "favourites_count": 24781, + "reaction": null, + "upvotes_count": 24781, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115978035580347742", + "created_at": "2026-01-29T10:59:40.807Z", + "in_reply_to_id": null, + "quote_id": "115978008041696617", + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": "en", + "uri": "https://truthsocial.com/@realDonaldTrump/115978035580347742", + "url": "https://truthsocial.com/@realDonaldTrump/115978035580347742", + "content": "


RT: https://truthsocial.com/users/realDonaldTrump/statuses/115978008041696617
TRUMP WON BIG. Crooked Election!

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612717, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [], + "mentions": [ + { + "id": "107780257626128497", + "username": "realDonaldTrump", + "url": "https://truthsocial.com/@realDonaldTrump", + "acct": "realDonaldTrump" + } + ], + "tags": [], + "card": null, + "group": null, + "quote": { + "id": "115978008041696617", + "created_at": "2026-01-29T10:52:40.601Z", + "in_reply_to_id": null, + "quote_id": "115978006663781152", + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115978008041696617", + "url": "https://truthsocial.com/@realDonaldTrump/115978008041696617", + "content": "


RT: https://truthsocial.com/users/realDonaldTrump/statuses/115978006663781152

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612717, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115978007715294562", + "type": "image", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/007/715/294/562/original/d98c7b4d55094d61.png", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/007/715/294/562/small/d98c7b4d55094d61.png", + "external_video_id": null, + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "original": { + "aspect": 1.0350467289719627, + "height": 856, + "size": "886x856", + "width": 886 + }, + "small": { + "aspect": 1.0356234096692112, + "height": 786, + "size": "814x786", + "width": 814 + } + }, + "description": null, + "blurhash": "U7SPX_00xaWB-;RjIUof-qRjM{RPxuRjRjax", + "processing": "complete" + } + ], + "mentions": [ + { + "id": "107780257626128497", + "username": "realDonaldTrump", + "url": "https://truthsocial.com/@realDonaldTrump", + "acct": "realDonaldTrump" + } + ], + "tags": [], + "card": null, + "group": null, + "quote": { + "id": "115978006663781152", + "created_at": "2026-01-29T10:52:19.575Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115978006663781152", + "url": "https://truthsocial.com/@realDonaldTrump/115978006663781152", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612717, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115978006025707267", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/006/025/707/267/original/97f8de0b7ba456e6.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/978/006/025/707/267/original/e15126e422edacea.jpg", + "external_video_id": "v72tphc", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#ae2c3d", + "background": "#d8d6d9", + "foreground": "#2c1a25" + }, + "original": { + "bitrate": 426043, + "duration": 131.332063, + "frame_rate": "1251427954/23231283", + "height": 500, + "width": 884 + }, + "small": { + "aspect": 1.7777777777777777, + "height": 360, + "size": "640x360", + "width": 640 + } + }, + "description": null, + "blurhash": "ULM%f.KQK$xCIWNyV@gN.lWqD5OFwuTKRjZ$", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 228, + "reblogs_count": 2105, + "favourites_count": 8377, + "reaction": null, + "upvotes_count": 8377, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 489, + "reblogs_count": 3896, + "favourites_count": 11835, + "reaction": null, + "upvotes_count": 11835, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1877, + "reblogs_count": 6927, + "favourites_count": 24092, + "reaction": null, + "upvotes_count": 24092, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115978031218105674", + "created_at": "2026-01-29T10:58:34.246Z", + "in_reply_to_id": null, + "quote_id": "115978030093232724", + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115978031218105674", + "url": "https://truthsocial.com/@realDonaldTrump/115978031218105674", + "content": "


RT: https://truthsocial.com/users/realDonaldTrump/statuses/115978030093232724

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612715, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115978030988077116", + "type": "image", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/030/988/077/116/original/08686583fca2752e.png", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/030/988/077/116/small/08686583fca2752e.png", + "external_video_id": null, + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "original": { + "aspect": 1.7751004016064258, + "height": 498, + "size": "884x498", + "width": 884 + }, + "small": { + "aspect": 1.7751004016064258, + "height": 498, + "size": "884x498", + "width": 884 + } + }, + "description": null, + "blurhash": "U8SY]j00RjIU9FMyM{RPt8M{IUM{%MIoM{fP", + "processing": "complete" + } + ], + "mentions": [ + { + "id": "107780257626128497", + "username": "realDonaldTrump", + "url": "https://truthsocial.com/@realDonaldTrump", + "acct": "realDonaldTrump" + } + ], + "tags": [], + "card": null, + "group": null, + "quote": { + "id": "115978030093232724", + "created_at": "2026-01-29T10:58:17.078Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115978030093232724", + "url": "https://truthsocial.com/@realDonaldTrump/115978030093232724", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612715, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115978029452797944", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/029/452/797/944/original/6f3aee891d204bba.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/978/029/452/797/944/original/9272099a3063bdb3.jpg", + "external_video_id": "v72tpos", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#aca6a7", + "background": "#020303", + "foreground": "#e6e5e5" + }, + "original": { + "bitrate": 758257, + "duration": 102.378667, + "frame_rate": "30/1", + "height": 1080, + "width": 1080 + }, + "small": { + "aspect": 0.5623242736644799, + "height": 1067, + "size": "600x1067", + "width": 600 + } + }, + "description": null, + "blurhash": "UC8X8{bHxvWV4nt7axoL9YaxM{of~qM{t7R*", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 375, + "reblogs_count": 3087, + "favourites_count": 14139, + "reaction": null, + "upvotes_count": 14139, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1101, + "reblogs_count": 6218, + "favourites_count": 21915, + "reaction": null, + "upvotes_count": 21915, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115978030093232724", + "created_at": "2026-01-29T10:58:17.078Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115978030093232724", + "url": "https://truthsocial.com/@realDonaldTrump/115978030093232724", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612743, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115978029452797944", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/029/452/797/944/original/6f3aee891d204bba.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/978/029/452/797/944/original/9272099a3063bdb3.jpg", + "external_video_id": "v72tpos", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#aca6a7", + "background": "#020303", + "foreground": "#e6e5e5" + }, + "original": { + "bitrate": 758257, + "duration": 102.378667, + "frame_rate": "30/1", + "height": 1080, + "width": 1080 + }, + "small": { + "aspect": 0.5623242736644799, + "height": 1067, + "size": "600x1067", + "width": 600 + } + }, + "description": null, + "blurhash": "UC8X8{bHxvWV4nt7axoL9YaxM{of~qM{t7R*", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 375, + "reblogs_count": 3087, + "favourites_count": 14139, + "reaction": null, + "upvotes_count": 14139, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + { + "id": "115978028922348931", + "created_at": "2026-01-29T10:57:59.215Z", + "in_reply_to_id": null, + "quote_id": "115978024465423949", + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115978028922348931", + "url": "https://truthsocial.com/@realDonaldTrump/115978028922348931", + "content": "


RT: https://truthsocial.com/users/realDonaldTrump/statuses/115978024465423949

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612741, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115978028754313688", + "type": "image", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/028/754/313/688/original/dcfcee4b2897cbff.png", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/028/754/313/688/small/dcfcee4b2897cbff.png", + "external_video_id": null, + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "original": { + "aspect": 3.7142857142857144, + "height": 238, + "size": "884x238", + "width": 884 + }, + "small": { + "aspect": 3.7142857142857144, + "height": 238, + "size": "884x238", + "width": 884 + } + }, + "description": null, + "blurhash": "U8Rysg00V?IT~qIU9FV@-;D%M{jYD%ayWBt7", + "processing": "complete" + } + ], + "mentions": [ + { + "id": "107780257626128497", + "username": "realDonaldTrump", + "url": "https://truthsocial.com/@realDonaldTrump", + "acct": "realDonaldTrump" + } + ], + "tags": [], + "card": null, + "group": null, + "quote": { + "id": "115978024465423949", + "created_at": "2026-01-29T10:56:51.205Z", + "in_reply_to_id": null, + "quote_id": null, + "in_reply_to_account_id": null, + "sensitive": false, + "spoiler_text": "", + "visibility": "public", + "language": null, + "uri": "https://truthsocial.com/@realDonaldTrump/115978024465423949", + "url": "https://truthsocial.com/@realDonaldTrump/115978024465423949", + "content": "

", + "account": { + "id": "107780257626128497", + "username": "realDonaldTrump", + "acct": "realDonaldTrump", + "display_name": "Donald J. Trump", + "locked": false, + "bot": false, + "discoverable": false, + "group": false, + "created_at": "2022-02-11T16:16:57.705Z", + "note": "

", + "url": "https://truthsocial.com/@realDonaldTrump", + "avatar": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "avatar_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/avatars/107/780/257/626/128/497/original/454286ac07a6f6e6.jpeg", + "header": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "header_static": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/accounts/headers/107/780/257/626/128/497/original/ba3b910ba387bf4e.jpeg", + "followers_count": 11612741, + "following_count": 69, + "statuses_count": 31481, + "last_status_at": "2026-01-30", + "verified": true, + "location": "", + "website": "www.DonaldJTrump.com", + "unauth_visibility": true, + "chats_onboarded": true, + "feeds_onboarded": true, + "accepting_messages": false, + "show_nonmember_group_statuses": false, + "emojis": [], + "fields": [], + "tv_onboarded": false, + "tv_account": false, + "premium": true + }, + "media_attachments": [ + { + "id": "115978023605857696", + "type": "video", + "url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/files/115/978/023/605/857/696/original/550828a362e64c57.mp4", + "preview_url": "https://static-assets-1.truthsocial.com/tmtg:prime-ts-assets/media_attachments/thumbnails/115/978/023/605/857/696/original/60771cee1e431ae9.jpg", + "external_video_id": "v72tpm6", + "remote_url": null, + "preview_remote_url": null, + "text_url": null, + "meta": { + "colors": { + "accent": "#cca75a", + "background": "#0f111b", + "foreground": "#e5e2df" + }, + "original": { + "bitrate": 676660, + "duration": 260.643991, + "frame_rate": "482026423/16083615", + "height": 720, + "width": 1280 + }, + "small": { + "aspect": 1.7783333333333333, + "height": 600, + "size": "1067x600", + "width": 1067 + } + }, + "description": null, + "blurhash": "UEDu.2.9ESsp1I$y%0Vt+[WANdkUBns*waRk", + "processing": "complete" + } + ], + "mentions": [], + "tags": [], + "card": null, + "group": null, + "quote": null, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 365, + "reblogs_count": 3230, + "favourites_count": 12620, + "reaction": null, + "upvotes_count": 12620, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + }, + "in_reply_to": null, + "reblog": null, + "sponsored": false, + "replies_count": 1129, + "reblogs_count": 6532, + "favourites_count": 19127, + "reaction": null, + "upvotes_count": 19127, + "downvotes_count": 0, + "favourited": false, + "reblogged": false, + "muted": false, + "pinned": false, + "bookmarked": false, + "poll": null, + "emojis": [], + "votable": false, + "edited_at": null, + "version": "1", + "editable": false, + "title": null + } +] \ No newline at end of file diff --git a/internal/pkg/postprocessor/sitespecific/truthsocial/truthsocial.go b/internal/pkg/postprocessor/sitespecific/truthsocial/truthsocial.go index b8e4e9b4..2b08d74f 100644 --- a/internal/pkg/postprocessor/sitespecific/truthsocial/truthsocial.go +++ b/internal/pkg/postprocessor/sitespecific/truthsocial/truthsocial.go @@ -7,11 +7,21 @@ import ( "github.com/internetarchive/Zeno/pkg/models" ) +type TruthsocialExtractor struct{} + +func (TruthsocialExtractor) Match(URL *models.URL) bool { + return NeedExtraction(URL) +} + +func (TruthsocialExtractor) Extract(item *models.Item) (assets, outlinks []*models.URL, err error) { + return ExtractAssets(item) +} + var ( postURLRegex = regexp.MustCompile(`^https?:\/\/truthsocial\.com\/@[A-Za-z0-9_]+\/posts\/`) postIDRegex = regexp.MustCompile(`^https?:\/\/truthsocial\.com\/@[A-Za-z0-9_]+\/posts\/(\d+)`) usernameRegex = regexp.MustCompile(`^https?:\/\/truthsocial\.com\/@([^/]+)`) - statusesRegex = regexp.MustCompile(`^https?:\/\/truthsocial\.com\/api\/v1\/statuses\/\d+$`) + statusesRegex = regexp.MustCompile(`^https?:\/\/truthsocial\.com\/api\/v1\/accounts\/[0-9]+\/statuses(\?.*)?$`) // changed from /api/v1/statuses/ to /api/v1/accounts//statuses?. accountLookupRegex = regexp.MustCompile(`^https?:\/\/truthsocial\.com\/api\/v1\/accounts\/lookup\?acct=[a-zA-Z0-9]+$`) ) diff --git a/internal/pkg/postprocessor/sitespecific/truthsocial/truthsocial_test.go b/internal/pkg/postprocessor/sitespecific/truthsocial/truthsocial_test.go new file mode 100644 index 00000000..28ae1357 --- /dev/null +++ b/internal/pkg/postprocessor/sitespecific/truthsocial/truthsocial_test.go @@ -0,0 +1,84 @@ +package truthsocial + +import ( + "bytes" + "fmt" + "io" + "net/http" + "os" + "testing" + + _ "embed" + + "github.com/internetarchive/Zeno/pkg/models" + "github.com/internetarchive/gowarc/pkg/spooledtempfile" +) + +func TestShouldMatchTruthsocialURL(t *testing.T) { + + cases := []struct { + url string + expected bool + }{ + {"https://truthsocial.com/@realDonaldTrump/posts/115983891481988557", true}, + {"https://truthsocial.com/api/v1/accounts/107780257626128497/statuses?exclude_replies=true&only_replies=false&with_muted=true", true}, + {"https://truthsocial.com/@realDonaldTrump", false}, + } + + for _, c := range cases { + t.Run(c.url, func(t *testing.T) { + url, err := models.NewURL(c.url) + if err != nil { + t.Fatalf("failed to create URL: %v", err) + } + + result := TruthsocialExtractor{}.Match(&url) + if result != c.expected { + t.Errorf("TruthsocialExtractor{}.Match(%q) = %v; want %v", c.url, result, c.expected) + } + }) + } +} + +// newItemFromBody creates a *models.Item with the given body, URL and Content-Type for use in tests. +func newItemFromBody(t *testing.T, body []byte, urlStr string, contentType string) *models.Item { + t.Helper() + resp := &http.Response{ + Header: make(http.Header), + Body: io.NopCloser(bytes.NewBuffer(body)), + StatusCode: 200, + } + resp.Header.Set("Content-Type", contentType) + + newURL, err := models.NewURL(urlStr) + if err != nil { + t.Fatalf("failed to create URL: %v", err) + } + newURL.SetResponse(resp) + + spooledTempFile := spooledtempfile.NewSpooledTempFile("test", os.TempDir(), 2048, false, -1) + spooledTempFile.Write(body) + + newURL.SetBody(spooledTempFile) + newURL.Parse() + return models.NewItem(&newURL, "") +} + +//go:embed testdata/statuses.json +var rawStatutesJSON []byte + +func TestShouldExtractTruthsocialStatusesAPI(t *testing.T) { + item := newItemFromBody(t, rawStatutesJSON, "https://truthsocial.com/api/v1/accounts/107780257626128497/statuses?exclude_replies=true&only_replies=false&with_muted=true", "application/json") + + assets, outlinks, err := TruthsocialExtractor{}.Extract(item) + if err != nil { + t.Fatalf("failed to extract assets: %v", err) + } + + for _, asset := range assets { + fmt.Println(asset) + } + for _, outlink := range outlinks { + fmt.Println(outlink) + } +} diff --git a/pkg/models/mime_patch.go b/pkg/models/mime_patch.go index add28c86..a01d353e 100644 --- a/pkg/models/mime_patch.go +++ b/pkg/models/mime_patch.go @@ -18,5 +18,9 @@ func extendMimetype() { // gabriel-vasile/mimetype does not support CSS detection yet, so // we have to extend a placeholder for our Content-Type lookup. mimetype.Lookup("text/plain").Extend(mimePlaceholderFunc, "text/css", ".css") + + // TODO: https://github.com/gabriel-vasile/mimetype/pull/755, https://github.com/gabriel-vasile/mimetype/pull/756 + // TODO: Before the above PRs are merged and released, we have to extend a placeholder for application/x-mpegurl Content-Type lookup. + mimetype.Lookup("application/vnd.apple.mpegurl").Extend(mimePlaceholderFunc, "application/x-mpegurl", ".m3u") }) }