RCA Feed Factory Changelog
$sidebar properties.feed.js and factoryajaxlink.js refactored off jQuery (Bootstrap 5 + fetch); WAM asset dependencies updated.badge-secondary badge-pill), which rendered the number as white-on-white in J4/J5/J6 admin. Now uses badge text-bg-secondary.import2content_helix_format).label when present.onImport2ContentBeforeSave / onImport2ContentAfterSave now pass mutable data, feed, cache, and extracted media (video_url, video_urls, video_index, audio_url, audio_embed, gallery_images) for bridge plugins.RcaFeedFactorySocialMediaFetcher::extractVideoEmbedUrls() / extractPrimaryVideoEmbedUrl($html, $index) / pickVideoUrlByIndex() — ordered embeds (Rumble, BitChute, TikTok, YouTube, Vimeo, Dailymotion, Odysee, known iframes); index is Dom-style 0 = first; index past the end uses the last embed.<audio> player; feed switches i2c_enclosure_images / i2c_enclosure_audio.attribs to {} so format bridges can merge Helix3 / Helix Ultimate keys before save.rca_helix_format_video_index when selecting which embed becomes extracted.video_url.image/*.og:image injection now runs before image localization so injected heroes are downloaded into images/Y/m/d/.image_intro / image_fulltext: if the body still only has remote https:// imgs after parse, download the first usable remote hero and rewrite it locally so Newsberg list/module layouts (which treat remote URLs as filesystem paths under /j4/) get a real thumb.Articles already saved with remote image_intro (e.g. Art of Healthy Living) will not auto-heal. After installing 6.0.16:
1. Prefer delete + re-import affected I2C stories from the Art of Healthy Living feed (or refresh feed / clear cache then re-run I2C for those items).
2. Or manually clear images + re-save after a feed refresh that recreates articles.
3. Run RCA Media Bridge bulk sync (fill-empty) so Helix/spfeatured match local intro paths.
4. Confirm frontpage Top Stories / Health category cards show local /j4/images/… thumbs and body imgs no longer keep remote srcset.
ico_{md5(1..4)}.png files and fresh-install sample order now match Joomla Security (1) / Good News Network (2) / Art of Healthy Living (3) / FOXBusiness (4).chr() (same bytes, no \x/\0 clusters).base64_encode / base64_decode on story enclosure blobs and SimplePie HTTP Basic auth are data transport, not code obfuscation. Do not remove; existing DB rows store base64(serialize(...)).<iframe> markup is used for social embeds (Rumble etc.) and admin story preview. Not injected attacker content.media/icos/ico_{md5(1..4)}.png aligned to that ID order (Joomla / GNN / AOHL heart / FOX Business). Installer also attempts a live favicon fetch after each sample insert.Undefined property: stdClass::$featured_image — see showcase-j4-patches RCA PATCH 005.Field 'userid' doesn't have a default value: userid is not on the feed form and was omitted from INSERT. FeedTable::check() now stamps the saving admin’s user id (and normalises cat, NOT NULL text/params/protocol fields).0 or published to No.^= starts with, *= contains, $= ends with), combined AND form, partial class, and why #id* glob stars fail; clarified #. space >,* and [attr] symbols. Remove examples include numbered-id families such as [id^=between_article_content_]./dev feed SHA256 (verified match). References updated: Feed Factory 6.0.x = pro; never rebuild same version; never leave L1 without matching feed in the same run.Accept header; adding a second Accept via set_curl_options(CURLOPT_HTTPHEADER) produced a duplicate-Accept request that Akamai answered with HTTP 403. Feed fetch now sets only a Chrome-like User-Agent (no extra Accept). Verified SimplePie init() returns items with UA-only; duplicate Accept fails with 403.com_rca_feedfactory_6.0.9.zip: pkg_rca_feedfactory.xml still listed child ZIP filenames at 6.0.9 while the package contained 6.0.10 ZIPs. Manifest filenames synced to the package version; build script now rewrites those names on each build.com_content articles on refresh: RcaFeedFactoryImageHandler called Joomla\Filesystem\Folder::exists() (removed from the standalone Filesystem package). That throws an Error, which bypassed catch (\Exception) in Import2ContentHelper / Remove rule and aborted article save after stories were cached. Replaced with is_dir(); image download failures are caught so I2C still saves; full-article and Remove rule catches use \Throwable./j4/): HTML rewrote src to root-absolute /images/… instead of Uri::root(true) + path. Local URLs now use the site base; bare /images/… that already exist on disk are rewritten to the correct web path; remote /images/… paths are no longer skipped as “already local.” Path-relative WP image URLs resolve against the article directory (same approach as 5.0.0 absolute-URL handling).images as empty {}, so Helix full_image Open Graph read undefined image_intro. Import now sets image_intro / image_fulltext (and empty companion keys) from the first local images/… src in the body.width/height/srcset/sizes and figure style="width:…px" after local image download, so blog grids (e.g. newsberg col-sm-4) overflowed. Image processing now strips those layout locks so CSS can scale images to the container..a, .b,) made HtmlDomParser::find() match nothing so no junk was removed. Empty segments are stripped before find; cheatsheet/field help warn against a dangling comma.#td-full-screen-header-image) sits outside div.td-post-content — Remove first, then two Dom Parser rules, with selectors/settings and reasoning; workflow lines updated to match.compatible; … SimplePie User-Agent that Akamai often 403s. Outbound fetch uses a Chrome-like User-Agent; remoteReadUrl() uses the same UA profile for page fetches. (Extra Accept curl headers from an intermediate attempt were removed in 6.0.10 — they duplicated SimplePie’s Accept and caused 403.).addtoany_share_save_container.tab request param, hidden field, and optional URL hash.CacheTable::getDatabase() is undefined (Table::getDatabase() exists only from J5.4+). Tables now use a J4/J5/J6-safe getTableDatabase() accessor (getDatabase() when present, else getDbo()). Same fix on ContentTable.Site\Helper\RcaFeedFactoryCache not found — PSR-4 file was still named RssFactoryCache.php. Renamed site Helper files to match class names (RcaFeedFactoryCache, RcaFeedFactoryCategories, RcaFeedFactoryFeedsHelper, Html\RcaFeedFactoryFeeds).COM_RCA_FEEDFACTORY_INSTALL_SAMPLE_FEEDS_SEEDED: load admin .sys/.ini language in postflight before Text::_().Joomla\CMS\Event\Finder\AfterDeleteEvent is J5+ only. FeedModel / CacheModel now dispatch that event on J5/J6 and use triggerEvent('onFinderAfterDelete', …) on J4.Incorrect integer value: '' for column i2c_catid): empty form values are now coerced to 0 in FeedTable::check(), and i2c_catid / i2c_author form fields use filter="integer" with default 0.COM_RCA_FEEDFACTORY_INSTALL_SAMPLE_FEEDS_SEEDED set to: “Sample category and feeds were created successfully.” (admin + sys.ini).i2c_catid (FF Samples category still on cat).userid and i2c_author to the installing admin (fallback: first Super User).i2c_published=1); I2C remains off (i2c_enabled=0) until configured.i2c_access_level=1), not Guest (5).com_rca_feedfactoryInstallerScript (global namespace) so Joomla actually loads postflight — namespaced Script was never invoked, so categories/menu/sample feeds never seeded.File::copy failure on J4 after uninstall: <scriptfile>admin/script.php</scriptfile> tried to copy into administrator/components/com_rca_feedfactory/admin/ (parent never created). Installer script is now package-root script.php.rsserror / last_refresh_stories as PHP false, which DatabaseDriver::quote(false) turns into ''; MariaDB strict mode rejected the UPDATE so stories could refresh while the feed row’s date stayed stale. Metadata is now updated with an integer-typed query.refresh() return false, and the controller logged an empty error via Log::add (not shown in admin UI) instead of setMessage. Controllers now enqueue success/error messages; model sets error state on metadata failure.id into FeedsHtml::icon(int|string) — coerce missing id to 0 and accept null.filter_order / filter_order_Dir fields so POST no longer overwrote the selected order with the previous hidden valuesLICENSE_MESSAGE_DESC, LICENSE_CHECKED_AT_DESCprivate/download.php (Joomla Updater was mangling ?dlkey= into the ZIP filename and failing extract)product=com_rca_feedfactory); buy CTA https://recreatinganew.com/com_rca_feedfactory (aligned with install element)Undefined array key "" in AbstractView::getModel() — default display routes through DisplayController, and J4 never calls prepareViewModel() (J5+). Compound view names (submittedfeeds → SubmittedfeedsModel) failed MVCFactory resolution, so no default model was attached. Remap getModel() for SubmittedFeeds / SubmittedFeed / SubmitFeed on admin DisplayController and related controllers; same remap for site submit-feed display; Submittedfeeds view reads sort fields via get('SortFields') instead of bare getModel().<targetplatform> — three separate 4/5/6 tags meant J4 sites only evaluated 6.[0-9]+ and never offered updates. Replaced with one combined regex (4|5|6)\.[0-9]+ on all RCA Feed Factory feeds; component feed sets <client>administrator</client> explicitly.media/com_rca_feedfactory/docs/ (Getting Started, Upgrade, Feed Parsing, Community vs Pro, Import2Content Rules rewrite, Samples, Cron, Frontend/Menus, Modules/Plugins, Backup/Restore, FAQ)README.txt / rewritten CREDITS.txt with lineage and Andrei / ThePHPFactory permission (28 Apr 2026)ONLY_FULL_GROUP_BY-compliant queries; global setSqlMode() removedsimplepie.inc (Composer SimplePie only)simple_html_dom.php (Composer voku/simple_html_dom)Log::add())setSqlMode() / resetSqlMode() workaround from site entry and cron refresh; all feed list/count queries rewritten for ONLY_FULL_GROUP_BY compliance using correlated subqueries (admin Feeds list, tiled feeds, story sort-by-votes/comments, toolbar vote totals)FeedsModel and CategoryModel now use the authoritative Administrator\Helper\RcaFeedFactoryFeedsHelper (complete implementation)default.png or writes neutral GD placeholder; tries www/non-www host variants and /favicon.webpJPATH_CACHE file writes (DEFER-002)/favicon.ico (e.g. 100percentfedup.com): fallback parses homepage <link rel="icon"> / apple-touch-icon hrefs; rejects zero-byte and HTML error-page responses before GD decodeDatabaseQuery::bind() now receives variables for created/expires SQL values (not method return expressions)Rumble("play",…) plain text in Preview Rules when full-page parse succeeds: scrubLeakedPlatformScripts() runs on parsed preview and at end of parseFullArticle(); smart-quote normalization; strip loader IIFE fragmentsRumble("play",…)) leaked as plain text after script strip: convert to iframe before strip in parseFullArticle(); convert leaked plain-text calls on RSS fallbackcontent:encoded path: normalizeImportBody() runs on I2C import and Preview Rules cached fallback (parity with full-parse processContent())processRumbleEmbeds() and processBitChuteEmbeds() into processVideoEmbeds() pipelineFeedModel::preview() now falls back to cached RSS item_description when parseFullArticle() returns empty — parity with 5.3.29 I2C import path; client-side guard when AJAX returns empty bodycontent:encoded while description is a plain excerpt — Parser now prefers get_content() when it carries media; Import2ContentHelper no longer overwrites cache with empty parseFullArticle() result when Cloudflare blocks full-page fetchCall to a member function getForm() on false: ConfigurationController constructor dropped MVC factory injection; restored full BaseController constructor signature; explicit Administrator model prefix; CSRF token check on savedownloadImages=true (5.3.16 verified); DomParser outer_html default restored to 1outer_html=0 (innertext, maxm parity); normalize I2C rule params from Registry/DB; consistent isI2cRuleEnabled() check#__content: Readability ran before configured Dom Parser rules and blocked maxm-style div.single-page-content extraction; skip Readability when enabled DomParser rules exist; discard Readability boilerplate when it yields no visible content; I2C import uses downloadImages=false (preview parity); ignore false DomParser rule output#__content (preview OK): CacheTable::stripTags() now preserves media when allow-list would erase image-only HTML; ReadMore rule skips system-readmore for image-only posts; ContentTable::addReadMore() skips word split when no plain text; lazy-load data-src promoted before image download; I2C retries with absolute URLs when download path yields empty content; ensurePrimaryImagePresent('') fetches og:imagepreg_replace(): Unknown modifier '.' — regex used # delimiter with unescaped # in /embed/# pattern (buildEmbedIframeFallback + iframe detect)strip_tags() treated image-only extracted HTML as empty; use hasVisibleExtractedContent() (text OR img/media); cartoon selectors in fallback; og:image last resort; preview skips image download (downloadImages=false)getSiteIcon() tries GD imagecreatefromstring() on PNG/apple-touch-icon URLs before ICO vendor loader; complete lordelph/icofileloader PHP 8.4 nullable param patch (?array, ?string)/embed/ URLs) with readable link fallback; keep YouTube/Vimeo/Rumble/BitChute/Dailymotion/Odysee embedsreadUrlAndConvertUtf8() wrote cURL cookie jar to /tmp/helpers/cookie.txt — parent directory did not exist; use flat com_rca_feedfactory_cookie.txt in system temp (matches remoteReadUrl())Elphin\IcoFileLoader\IcoFileService::__construct() — explicit ?RendererInterface / ?ParserInterface nullable paramsFeedsHtml::icon() used $src before assignment when appending cache-bust query (5.3.19 regression)bootstrap.modal via WAM; register modal with HTMLHelper::_('bootstrap.modal'); initialize via Joomla.initialiseModal() + modal.open() (Bootstrap 5 ES module — window.bootstrap not available until WAM loads)RcaFeedFactoryProIcon requires class RcaFeedFactoryProIconField — was misnamed RcaFeedFactoryProFeedIconField (Joomla field autoload mismatch)<img> like maxm; favicon URL cache-bust via filemtime#__content invisible in Article Manager: J6 list INNER JOINs #__workflow_associations — ContentTable::store() now creates default workflow stage for new articles (ArticleModel parity)document.body for BS5 stacking; alert when no story selected; preview response Content-Type text/html<name> now uses MOD_RCA_FEEDFACTORY / MOD_RCA_FEEDFACTORY_CATEGORIES language keys (was raw element slug)#current_icon but icon field id is #jform_current_icon — RcaFeedFactoryAjaxLinkField resolves target field id from form; factoryajaxlink.js adds fail/always handlers; JSON Content-Type header; fail refresh when favicon file not createdfeed.preview routes to FeedController on J6 (not FeedRawController) — moved preview() handler; feed.js URL includes task=feed.previewRcaFeedFactoryParseFullArticleTrait calls sanitizeUrl() — method was missing on RcaFeedFactoryHelper (fatal during I2C full-article parse on refresh)services/provider.php vendor autoload path pointed at invalid ../../site/vendor/ — use JPATH_SITE/components/com_rca_feedfactory/vendor/autoload.php; harden getSiteIcon() (create icos dir, scheme-aware favicon URL, Throwable catch)FeedsHtml::icon() instead of HTMLHelper::image() with full URLCOM_RCA_FEEDFACTORY_FEED_N_ITEMS_CLEARED_CACHE (+ _1, _NO_ITEM_SELECTED, refresh plurals) to admin language filefeedjson.* tasks resolve to FeedjsonController (ucfirst only) — class is FeedJsonController; moved refreshIcon / testFtp to FeedController with legacy tasks feed.refreshicon / feed.testftp#__rca_