Changelog

RCA Feed Factory Changelog

6.0.68 — 2026-10-25

Fixed

  • Article view fatal:RcaFeedFactorySocialEmbedAssets not found on com_content article pages. Social embed WAM registration now lives in plg_system_rca_feedfactory (always autoloaded with the system plugin). The component class remains a thin delegate for backward compatibility.

6.0.67 — 2026-10-25

Fixed

  • Read-more at sentence boundaries: When the intro already meets a minimum teaser length, defer whole <p> blocks to fulltext instead of cutting mid-sentence. In-paragraph splits retreat to the last sentence end when possible, with slight budget slack to finish a sentence.
  • Fulltext micro-paragraphs: After split, adjacent syndication-style short <p> tags in fulltext (e.g. "this" / "week") merge when they clearly continue the same sentence.

6.0.66 — 2026-10-25

Fixed

  • Re-split trailing source link:extractTrailingSourceLink() now strips only the I2C footer anchor whose link text matches “Source link”, with a byte cap. Fixes Fox-style syndication where inline anchors caused the old regex to treat the whole story as suffix, leaving empty fulltext and no Joomla read-more.
  • Read-more budget vs inline links: Visible link text inside <a> counts toward the character limit again (anchors stay atomic). Syndicated bodies split at the configured teaser length instead of stuffing link-heavy HTML into intro.
  • Mid-word paragraph cuts: Oversize text tokens move to fulltext whole unless URL-like or very long; reduces broken fragments such as invento / ry across intro and fulltext.

Changed

  • Re-split batch warnings: Articles whose core visible length exceeds the limit but still have empty fulltext after split are counted per batch and shown as an admin warning.

6.0.65 — 2026-10-25

Fixed

  • Re-split OOM (1 GB):splitParagraphElement() no longer recurses when intro exceeds the read-more budget with an empty remainder. Oversize single tokens (no whitespace) now use a one-shot visible-character split instead of keeping the whole token in intro.
  • Re-split batch memory: Each article in ReadMoreResplitService releases large strings and runs gc_collect_cycles() so DOM/HTML from prior rows is not retained for the rest of the HTTP request.

6.0.64 — 2026-10-25

Fixed

  • Site menu items / SEF: Frontend menu types (Submit feeds, Feeds, Category, etc.) no longer fail with “Invalid controller class: display” or route to the site home. Site uses the standard DisplayController; the admin cron dispatcher is no longer loaded on the site client. Added Site\Service\Router so SEF URLs preserve view and request keys.

6.0.63 — 2026-10-24

Fixed

  • Read-more word boundaries: Visible-character splits no longer break inside a word when the budget falls mid-token. The next whole word moves to fulltext instead (e.g. “took” is not split into “to” / “ok” across <p> tags).

6.0.62 — 2026-10-24

Fixed

  • Read-more before body text: Paragraph split could overshoot the character budget (whole words only) and return no remainder, leaving an empty introtext and a leading system-readmore marker before the story. Intro is now guaranteed when remainder exists; word splits honor the budget at the character level.
  • Inline links and read-more budget:<a> link text no longer counts toward the visible-character limit; anchors stay atomic and are not broken across intro/fulltext.

Changed

  • Import2Content Read More rule: Stops injecting a leading <hr id="system-readmore" /> into parsed HTML (Joomla introtext/fulltext fields own the split).

6.0.61 — 2026-10-24

Added

  • Social embed scripts on article views: System plugin registers Instagram, Twitter/X, and TikTok embed scripts via WebAssetManager when imported blockquote markup is present (import path strips inline scripts by design).

Changed

  • Re-split Read More messages: Replaced the misleading “Continuing…” notice with guidance to re-run Re-split until every batch reports 0 of N updated; completion message repeats the same rule. User manual troubleshooting section documents the workflow.

6.0.60 — 2026-10-24

Changed

  • Re-split Read More batch messages: Each batch now states how many articles were updated versus how many already matched the configured read-more character limit (unchanged in the database), so “11 of 25 updated” is explicit that the other 14 needed no change.

Fixed

  • Read-more split inside syndication wrappers: Hollywood Reporter–style markup (div.pmc-paywall, div.a-content, layout grids) no longer keeps the entire story in introtext because paragraphs were nested one level too deep for the splitter. Passive layout containers are unwrapped before counting; oversized blocks are not forced into the intro fallback path.
  • Syndication tail junk in fulltext: Strips paywall placeholders, ad shells, empty Trinity/audio widgets, and article-tag blocks before split so re-split does not leave a non-empty fulltext that is only chrome (which made Joomla show “Read more” at the bottom of a full intro on category blogs).

6.0.59 — 2026-10-24

Added

  • RcaFeedFactoryReadMoreAssembly: Central I2C pipeline for read-more limits, prepend/append (excluded from the visible-character budget), and source link placement at the end of fulltext (or intro when there is no remainder).
  • Paragraph-splittable intros: Oversized <p> blocks split at word boundaries with a closed </p> on introtext and a new <p> opening on fulltext so category layouts do not inherit mangled markup.

Changed

  • Import2Content save: Builds core story HTML first (no prepend/append/source), applies enclosures, localizes hero images, then splits into introtext + fulltext before save. ContentTable::addReadMore() uses the same assembly on check (idempotent re-split).
  • Read-more limit: Removed the legacy 100-character floor; global default is configurable (50 / 100 / 250 / 500). Optional per-feed i2c_readmore_char_limit overrides the global value when set.
  • Re-split Read More: Strips global prepend/append and trailing source link before re-splitting, then re-assembles fields the same way as new imports.

6.0.58 — 2026-10-24

Added

  • HTML-aware Read More splitting: Import2Content now counts visible characters only (entities decoded, whitespace ignored; markup, script/style, and attribute text such as alt/title are excluded). Splits at safe HTML boundaries (block-complete default; word-boundary fallback inside a single oversized block). Replaces the legacy word-based addReadMore() split that could leave unclosed tags in introtext.
  • Re-split Read More (admin): Configuration toolbar action re-applies the new splitter on existing articles in Import2Content categories (batched). Run once after upgrade to repair Showcase and similar sites; forward imports use the same logic automatically.

Changed

  • Read More rule: Uses the shared RcaFeedFactoryIntroSplit helper (same visible-character rules as global I2C read more).
  • Language: Global and per-feed read-more settings document that the character limit is an estimate and markup is not counted.

6.0.57 — 2026-10-24

Fixed

  • Admin fatal parse on component boot:RcaFeedFactoryHtml.php file header was broken after J7 annotation insertion (syntax error, unexpected token "--"), which blocked Feed Factory categories and other admin screens that boot com_rca_feedfactory. Restored a valid GPL docblock header.

6.0.56 — 2026-10-24

Fixed

  • JED Checker: non-empty configuration refresh field labels/descriptions; missing admin strings (backup generate, dashboard title, Never/Error/OK, Use Global).
  • JED Checker: site/admin PHP uses COM_RCA_FEEDFACTORY_* language keys that exist in en-GB INI (replaces legacy lowercase keys).
  • JED Checker: legacy site/helpers/refresh.php no longer reads $_GET (query parsed via RcaFeedFactoryRefreshBootstrap::getQueryParameters()).
  • JED Checker: GPL license headers on cron-batch MVC, layouts, and related helpers added in 6.0.x.

6.0.55 — 2026-10-23

Fixed

  • Scheduled refresh / Run now summary: Per-feed lines #id (…): N stories showed empty parentheses when refresh used poll-driven admin slices. Summaries now include the feed URL (or title if URL is empty) in admin flash messages and HTTP cron HTML output.

6.0.54 — 2026-10-23

Added

  • Details tab refresh guidance: Expanded accordion (open by default) on each feed’s Details tab — plain-English advice on story limits, active vs quiet sources, batch composition, manual refresh vs scheduled cron, and keeping the administrator tab open during poll-driven refresh.
  • In-progress refresh message: Replaced the vague “page will update” notice with explicit stay-on-tab guidance and a short reminder about batch size and story limits.

Changed

  • Number of stories minimum 1: Removed the legacy “0 = all stories” option. The feed form requires at least 1 story per refresh (recommended 15–25). Saving with 0 is rejected with a clear message. Existing feeds with nrfeeds &lt; 1 are upgraded to 15 on install/update (6.0.54.sql).
  • Parser: No silent 0 → 15 fallback; uses the saved minimum of 1 (defensive max(1, …) at parse time).

6.0.53 — 2026-10-23

Fixed

  • Admin refresh 503/504 on weak hosts (maxm.news): Root cause was server-side HTTP loopback to index.php (edge proxy/FPM returned 503/504) while Import2Content full-article work can exceed a single request budget even for 25 stories. Detached refresh no longer uses loopback after redirect.
  • Poll-driven resumable slices (J4/5/6): Manual refresh (feed edit, feeds list, Run now) redirects immediately; each feed.refreshJobStatus poll runs a short in-administrator slice (default 25s, configurable admin_refresh_slice_seconds) via Parser::parse2cacheResumable() and FeedModel::refreshFeedResumable() until all stories/feeds complete. No browser navigation to the site front end; no self-HTTP through the public vhost.

6.0.52 — 2026-10-23

Fixed

  • 503 Service Unavailable on admin feed refresh (maxm.news and similar hosts): Root cause is long import/parse work in the administrator PHP-FPM pool (or admin proxy timeout), not a bad feed id. 6.0.51 ran refresh inline in admin and still hit 503 on heavy feeds (e.g. feed edit id 34).
  • Detached admin refresh (J4/5/6): Feeds list refresh, feed edit refresh, and scheduled Run now release the browser immediately (fastcgi_finish_request), then run refresh on the site application via server-side loopback HTTP (return=loopback JSON). The browser never navigates to the site front end; administrator URL and session stay in place. Completion is delivered via ff_refresh_job polling and cache-backed ff_cron_flash (same pattern as 6.0.48 site handoff, without browser redirect).
  • adminfeed token auth on site:runAdminFeedsRefresh() accepts one-time cache token authorization so loopback runs do not require a site login session.

6.0.51 — 2026-10-23

Fixed

  • Admin Feeds refresh / Run now — no site redirect (restored RSS Factory Pro behaviour): Removed administrator→site HTTP handoff introduced in 6.0.48–6.0.50. Refresh on the Feeds list, feed edit screen, and scheduled-batch Run now run entirely in administrator again (no index.php front-end hop). The 6.0.49+ site handoff caused “You don't have permission to access this” on Joomla 5 when the site app handled adminfeed/adminbatch without a valid admin session context.
  • Runtime tuning before inline refresh:applyRefreshRuntimeEnvironment() is called before list/single feed refresh in admin (session lock release, time limit, memory) — same helper used by HTTP cron.
  • Keeps 6.0.50 cache fix:getShortLivedCache() remains CacheController + output handler for any legacy site cron URLs only.

6.0.50 — 2026-10-23

Fixed

  • Admin site-handoff refresh fatal on Joomla 5 (maxm.news):getShortLivedCache() was typed to return legacy Joomla\CMS\Cache\Cache while Factory::getCache() returns a CacheController (OutputController when handler is empty). PHP 8+ throws before store/get of admin batch/feed tokens. Return type is now CacheController with explicit output handler (same as AboutHelper), J4/5/6 compatible.

6.0.49 — 2026-10-23

Fixed

  • 503 Service Unavailable on maxm.news (and similar hosts) for admin refresh: Root cause is long-running work inside the administrator PHP-FPM pool (or admin vhost proxy timeout)—not a Joomla logic error. Apache returns 503 while the browser stays on administrator/index.php?...runCronbatch or feed refresh tasks. 6.0.48 auto mode still ran ≤2 feeds inline, so maxm’s 2-feed scheduled test and every single-feed refresh on the Feeds list/edit screen still hit the admin worker until timeout.
  • Default admin refresh dispatch is now site: Scheduled Run now, Feeds list refresh, and feed edit refresh hand off to sitetask=cron.run (adminbatch / new adminfeed) unless the site is explicitly set to Always in administrator. Auto mode max-inline default is 1 feed.
  • adminfeed cron type: Site HTTP handler for admin-initiated feed refresh with cache token + return URL (preserves feed edit tab, e.g. import2content_rules).

6.0.48 — 2026-10-23

Fixed

  • Admin Run now 503 on long batches (e.g. maxm.news J5, 4 feeds): 6.0.47 ran the full batch inside the administrator request; strict admin PHP-FPM / reverse-proxy limits return 503 Service Unavailable when refresh exceeds the worker timeout. Automatic dispatch now uses site HTTP (task=cron.run&type=adminbatch) when feeds per run exceed max inline feeds (default 2); smaller batches stay inline in administrator (Showcase J4 with 2 feeds). Component options: Admin Run now dispatch (auto / inline / site) and Max feeds for inline admin run.
  • Adminbatch auth across admin/site (J4 subdirectory): One-time keys are stored in shared cache (not administrator session), so site cron can authorize Run now on installs where admin and site sessions are separate.
  • Result message after site-handled Run now: Flash uses cache + ff_cron_flash query param (admin session was never reliable from site redirect).

6.0.47 — 2026-10-23

Fixed

  • Scheduled refresh admin Run now (permanent, J4/5/6): Admin test runs execute entirely in administrator via CronBatchService::runAdminBatchTest() — same application context as per-feed refresh (which already worked on Showcase J4). Removed the admin→site HTTP redirect (adminbatch / task=cron.run), which failed across J4 subdirectory installs, empty live_site, cross-client routers, and admin/site session splits.
  • External scheduled cron unchanged: Site index.php?option=com_rca_feedfactory&task=cron.run&type=cronjob (and legacy helpers/refresh.php redirect) remain the supported path for wget/cron-job.org/production timers. applyRefreshRuntimeEnvironment() still releases the session lock and extends limits for long runs.

6.0.46 — 2026-10-23

Fixed

  • Joomla 4 “No router available for this application” on Run now / cron URLs: Replaced Route::link() (requires the other client’s router from admin) with Uri-based absolute URLs via getSiteRootAbsolute() — works on J4/5/6, subdirectory installs, and subdomain hosts (live_site or derived from the current request).

6.0.45 — 2026-10-23

Fixed

  • Scheduled refresh on Joomla 4 subdirectory installs (e.g. showcase /j4/): Cron and admin test-run URLs now use Route::link('site', …) instead of Uri::root() . 'index.php', so requests hit the correct index.php when live_site is empty.
  • Admin test run on J4 with backend-only login:adminbatch auth no longer requires a matching site frontend session user; it validates the one-time key and core.manage for the admin user id stored when Run now was clicked.

6.0.44 — 2026-10-23

Fixed

  • Scheduled refresh “No configuration file found” on direct helpers/refresh.php: HTTP cron now runs through index.php?option=com_rca_feedfactory&task=cron.run (full Joomla bootstrap). Legacy refresh.php only 302-redirects to that URL so old cron bookmarks keep working.
  • Scheduled refresh list — no Edit/Delete: Toolbar now matches Feeds (Edit, Publish, Unpublish, Delete with list check). Delete used the list model default; CronbatchesController now resolves Cronbatch AdminModel for delete.

6.0.43 — 2026-10-23

Fixed

  • refresh.php “No configuration file found”: Bootstrap now walks up from the script directory until configuration.php + includes/ are found (fixes legacy site/helpers/ depth and non-standard host layouts). Installer mirrors refresh.php + refresh_bootstrap.php to site/helpers/ on upgrade.
  • Admin Run now exposing cron password: Uses type=adminbatch with a one-time session key (core.manage on the component) instead of password= in the URL. External cron URLs unchanged.

6.0.42 — 2026-10-23

Fixed

  • Admin “Run now” batch test (503 Service Unavailable): Long Import2Content batch runs executed inside administrator/index.php and were killed by admin PHP-FPM/proxy timeouts on strict hosts (e.g. maxm.news). Run now redirects to the site refresh.php cron endpoint (same as scheduled cron), then returns to Scheduled refresh with a summary. Shared applyRefreshRuntimeEnvironment() sets memory, time limit, system plugins, and releases the session lock for all batch runs.

6.0.41 — 2026-10-23

Fixed

  • Scheduled refresh tasks:DisplayController called non-existent getMVCFactory() on BaseController. Cron batch save/list tasks now pass injected $this->factory (Joomla admin controller pattern).

6.0.40 — 2026-10-23

Fixed

  • Scheduled refresh save (404 View not found … cronbatch): Cron batch edit form posted with empty option= so admin did not dispatch com_rca_feedfactory on Save. Cronbatch HtmlView now sets $option; edit template includes hidden option (same pattern as other admin views).

6.0.39 — 2026-10-23

Fixed

  • Scheduled refresh save — 404 View not found … cronbatch: Custom FeedFactoryMVCFactory resolves cron HtmlView classes when core MVCFactory::createView() returns null; controllers use ResolvesCronAdminViews fallback. Dispatcher normalizes compound display.saveCronbatch tasks before routing.

6.0.38 — 2026-10-23

Fixed

  • Scheduled refresh save / 404 cronbatch view: Admin dispatcher now remaps legacy cronbatch.* / cronbatches.* tasks and controller=cronbatch display URLs to DisplayController (same path as display.saveCronbatch). CronbatchController / CronbatchesController preload cron HtmlView in getView() when those controllers are still hit.
  • Partial upgrades: Installer postflight overwrites cron view, tmpl, and dispatcher directories from the package so stale toolbar templates cannot keep posting cronbatch.save after upgrade.

6.0.37 — 2026-10-23

Fixed

  • Scheduled refresh (complete suite): Installer now force-syncs the full 18-file admin cron MVC manifest (controllers, models, views, tmpl, form XML, custom fields, CronBatchService, helpers) plus site helpers/refresh.php. Postflight verifies admin MVC and site refresh endpoint; package postflight checks the same paths. Use this release when upgrading from pre–6.0.21 component trees that never received cron batch files.

Added

  • Language strings for batch save/apply and missing site refresh.php install errors.

6.0.36 — 2026-10-23

Fixed

  • Scheduled refresh redirect: 404 View not found … cronbatch when admin/src/View/Cronbatch/HtmlView.php was missing after a partial component upgrade. Installer force-sync now includes AdminViewNames.php; package postflight verifies cron HtmlView files and cronbatch.xml on disk. Admin boot and DisplayController preload cron views; schedule redirect fails with a clear message instead of a 404 when views are still absent.

6.0.35 — 2026-10-23

Fixed

  • Scheduled refresh save: Invalid controller class: feeds — cron batch tasks now use display.saveCronbatch (and related display.* tasks) on DisplayController, the default admin entry controller. Dispatcher falls back to Display when feeds / cronbatch / cronbatches controllers cannot be instantiated (legacy bookmarks).

6.0.34 — 2026-10-23

Fixed

  • Package postflight verifies the full scheduled-refresh contract on disk (CronbatchTaskRunner.php, updated FeedsController.php with saveCronbatch, cron MVC, dispatcher helper)—not only CronbatchController.php.
  • Cron batch list/edit forms include hidden view so feeds.publish / feeds.unpublish delegate correctly on POST.

Changed

  • Suite release 6.0.34: all eight extensions version-locked; package assembly contains only current child ZIPs (clean pkg rebuild).

6.0.33 — 2026-10-23

Fixed

  • Scheduled refresh save (Invalid controller class: cronbatch) — permanent routing: all scheduled-refresh POST/AJAX tasks use feeds.saveCronbatch, feeds.applyCronbatch, and related feeds.* handlers on FeedsController (via CronbatchTaskRunner). Joomla no longer has to resolve a separate cronbatch controller name for save/apply/list actions.
  • Installer install/update scripts force-sync critical admin files (including CronbatchTaskRunner.php and updated FeedsController.php) as soon as the package source is available.

6.0.32 — 2026-10-23

Fixed

  • Scheduled refresh save (Invalid controller class: cronbatch): admin dispatcher now loads CronbatchController via explicit require_once, falls back to FeedsController delegation when MVCFactory cannot instantiate the class, and component postflightoverwrites critical cron-batch MVC files from the package (not only missing-file reconcile). Service provider.php preloads custom Dispatcher.php when present.

6.0.31 — 2026-10-23

Fixed

  • Package install/update: postflight used legacy $parent->get('manifest') on PackageAdapter (undefined method). Use PackageAdapter::getManifest() so pkg upgrades complete without fatal error.

6.0.30 — 2026-10-23

Fixed

  • Scheduled refresh save (Invalid controller class: cronbatch): root cause is missing CronbatchController.php (and related admin MVC) on the site after upgrade — not MVC naming alone. Installer postflight now copies any missing files from the package source into administrator/components/com_rca_feedfactory/ and shows an explicit error if cron-batch MVC is still absent.
  • Package installer postflight (install and update): verify component version matches package and CronbatchController.php exists; enqueue actionable errors when not.

6.0.29 — 2026-10-23

Fixed

  • Scheduled refresh save/apply: preload CronbatchController on admin boot and in the component dispatcher so task=cronbatch.save resolves when PSR-4 autoload lags after upgrade (Invalid controller class: cronbatch).
  • Cron batch edit form: hidden controller=cronbatch on POST.

6.0.28 — 2026-10-23

Fixed

  • Admin language: bundle language/en-GB/ inside the component, load on boot, and sync to administrator/language/en-GB on install/update so new strings (feeds toolbar, list columns, scheduled refresh titles, last-refresh messages) resolve after upgrade instead of showing raw constants.

6.0.27 — 2026-10-23

Changed

  • Shipped cron documentation and admin language: removed third-party cron service references; Scheduled refresh, host HTTP cron (refresh.php), and pseudo-cron are the documented paths.

6.0.26 — 2026-10-23

Fixed

  • Scheduled refresh save/apply: custom admin Dispatcher maps cronbatch / cronbatches tasks to the correct PSR-4 controller classes (fixes Invalid controller class: cronbatch on save).
  • Cron batches list controller default model set to CronBatches (was Cronbatch).

Changed

  • Cron docs (CRON-AND-REFRESH.html): clarify helpers/refresh.php as the runtime entry point; cron-job.org URL jobs and optional REST API for hosts without crontab.

6.0.25 — 2026-10-23

Fixed

  • Cron batch form: add missing addfieldprefix on cronbatch.xml so RcaFeedFactoryFeedsList and RcaFeedFactoryCronUrl load (without it Joomla fell back to text and htmlspecialchars() failed on pre-selected feed_ids arrays).
  • Schedule refresh redirects straight to the batch edit view so prefill session data is not cleared by cronbatch.add.

6.0.24 — 2026-10-23

Fixed

  • Schedule refresh:cronbatch.add no longer discards pre-filled session data before the batch edit form loads.
  • Cron batch Feeds multi-select: normalize feed_ids as an integer array so the edit form does not throw htmlspecialchars(): array given when feeds are pre-selected.

6.0.23 — 2026-10-22

Fixed

  • Scheduled refresh batch add/edit: DisplayController resolved the wrong model name (CronBatch vs Cronbatch), so the batch form never loaded (getFieldset() on null).

Added

  • Feeds list toolbar Schedule refresh (Pro): select feeds, open a new batch with feeds pre-filled, set interval/stagger, save, copy cron URL.
  • Pro edition gate on Scheduled refresh admin views.

6.0.22 — 2026-10-21

Fixed

  • Import2Content: after copying the first local hero into Intro/Full Article Image (images JSON), remove only that assigned image from article HTML. Other inline images are preserved. Matching uses normalized media path, filename, and on-disk byte size (under images/ paths, different date folders require an exact path match).

Added

  • Component option Remove assigned hero from article HTML (i2c_strip_hero_from_body, default Yes) and per-feed override (Use global / No / Yes).

6.0.21 — 2026-10-21

Added

  • Scheduled refresh batches (DEF-CRON-001): Admin → Scheduled refresh — create batches, assign feeds, set interval and stagger minute, cap feeds per run. Each batch exposes a dedicated refresh.php URL (batch= id) for server cron or cron-job.org. Site-wide lock prevents concurrent batch runs. List view warns on feed overlap and matching stagger minutes.

Changed

  • FeedModel::refresh() accepts options order (stale) and limit for batch rotation.

6.0.20 — 2026-10-03

Changed

  • Scope 3C admin UI: SR4 docblocks and toolbar help URLs on HtmlView classes; tmpl/layout header alignment; removed unused view $sidebar properties.
  • Admin feed edit: feed.js and factoryajaxlink.js refactored off j