Skip to content

Technical Plugin Subscription

Daniel Neto edited this page Oct 29, 2026 · 1 revision

Technical: Subscription plugin

Grants time-limited subscription plans and dynamic user-group membership.

Audience: developers, advanced administrators and AI-assisted diagnosis. Plugin catalog.

Source baseline

  • Review date: 2026-10-29. Method: static source analysis; runtime/provider behavior was not exercised.
  • Code ownership: independently versioned plugin repository.
  • Reported version: 9.8.
  • Source revision: 0e859ead35ba2f2b952470f47165dc7a43de6829.
  • Entry class file: Subscription.php.

Confirm the installed plugin version independently of the Streamer version. Configuration defaults below are not a dump of this installation's saved settings.

Dependencies

Plugin Required by declaration Source reason
PayPerView Optional Optional PPV plan cross-sell/integration

Literal runtime plugin references: Live, PayPalYPT, PayPerView, YPTWallet. These calls do not mean every referenced plugin is mandatory.

Hook integration

Override Implementation
getTags() Subscription.php:20
getDataObjectAdvanced() Subscription.php:56
navBarButtons() Subscription.php:162
getHTMLMenuRight() Subscription.php:168
getHTMLMenuLeft() Subscription.php:178
getPluginMenu() Subscription.php:188
getDynamicUserGroupsId($users_id) Subscription.php:195
getDynamicUsersId($users_groups_id) Subscription.php:203
getModeYouTube($videos_id) Subscription.php:267
getEmbed($videos_id) Subscription.php:290
getNetflixActionButton($videos_id) Subscription.php:343
userCanWatchVideo($users_id, $videos_id) Subscription.php:360
userCanWatchVideoWithAds($users_id, $videos_id) Subscription.php:366
showAds($videos_id) Subscription.php:388
getVideo() Subscription.php:407
profileTabName($users_id) Subscription.php:416
profileTabContent($users_id) Subscription.php:422
isPaidUser($users_id) Subscription.php:637
executeEveryMinute() Subscription.php:692

Configuration assignments

These are direct assignments inside getEmptyDataObject(), not evaluated effective defaults. Stored plugins.object_data, globals, structured values and conditional branches may alter runtime behavior. Private/default credential values are omitted.

Field Literal default or expression type Literal source label/help Evidence
recurrentPaymentsOnly true — source
displayTopBarSubscribeButton true — source
displayLeftMenuSubscribeButton true — source
textSubscribe "Subscribe to watch all our videos" — source
textPlansButton Computed/structured; inspect source — source
textPlansSubtitle "Choose the plan that fits you best. Cancel anytime." — source
thanksForSubscribe Computed/structured; inspect source — source
lastNotificationDaysBefore 1 — source
lastNotificationSubject Computed/structured; inspect source — source
lastNotification Computed/structured; inspect source — source
firstNotificationDaysBefore 5 — source
firstNotificationSubject Computed/structured; inspect source — source
firstNotification Computed/structured; inspect source — source
notifyUsersPaymentConfirmationSubject Computed/structured; inspect source — source
notifyUsersPaymentConfirmationText Computed/structured; inspect source — source
notifyUsersOnTrial Computed/structured; inspect source — source
allowFreePlayWithAds false — source
expiresAtTheEndOfTheDay true — source
hideNetflixButton false — source
ifNeedToPayRedirectURL '' if need to pay, redirect to this URL: If you use this option you may need the API to enable the Subscription source
textPpvCalloutTitle "Pay-Per-View" Pay-Per-View callout title: Title shown in the Pay-Per-View callout on the subscription plans page. source
textPpvCallout Computed/structured; inspect source Pay-Per-View callout description: Text shown below the Pay-Per-View heading on the subscription plans page when a video has an active PPV plan. source
textPpvCalloutButton "Get Access" Pay-Per-View callout button: Button text shown in the Pay-Per-View callout on the subscription plans page. source

Files and request surface

This inventory distinguishes implementation files from an API specification. Includes, templates, callbacks and CLI workers are not interchangeable HTTP endpoints. Request-field names below are direct source references, not a complete schema or permission declaration.

File Source role Direct request fields observed
HTMLMenuLeft.php PHP page/include/worker; inspect caller —
HTMLMenuRight.php PHP page/include/worker; inspect caller —
Objects/SubscriptionHistoryTable.php class/helper implementation —
Objects/SubscriptionPlansGroupsTable.php class/helper implementation —
Objects/SubscriptionPlansTable.php class/helper implementation —
Objects/SubscriptionTable.php class/helper implementation columns
Subscription.php plugin entry class current, rowCount, videos_id
actionButton.php PHP page/include/worker; inspect caller —
crontab.php PHP page/include/worker; inspect caller —
footer.php PHP page/include/worker; inspect caller —
install/install.sql schema/migration SQL —
install/updateV2.1.sql schema/migration SQL —
install/updateV3.3.sql schema/migration SQL —
install/updateV3.4.sql schema/migration SQL —
install/updateV3.5.sql schema/migration SQL —
install/updateV3.6.sql schema/migration SQL —
install/updateV7.0.sql schema/migration SQL —
install/updateV7.6.sql schema/migration SQL —
navBarButtons.php PHP page/include/worker; inspect caller —
page/editor.php PHP page/include/worker; inspect caller —
page/editorPlans.php PHP page/include/worker; inspect caller —
page/editorSubscriptions.php PHP page/include/worker; inspect caller —
page/editor_body.php PHP page/include/worker; inspect caller —
page/editor_head.php PHP page/include/worker; inspect caller —
page/plans.json.php JSON entry point; inspect caller and guard draw
page/plansDelete.json.php JSON entry point; inspect caller and guard id
page/plansInfo.json.php JSON entry point; inspect caller and guard plans_id
page/plansSave.json.php JSON entry point; inspect caller and guard description, how_many_days, how_many_days_trial, id, is_featured, name, price, status, userGroups
page/profileTabContent.php PHP page/include/worker; inspect caller sort
page/reports.php PHP page/include/worker; inspect caller —
page/reportsData.json.php JSON entry point; inspect caller and guard —
page/subscriptions.json.php JSON entry point; inspect caller and guard draw
page/subscriptionsDelete.json.php JSON entry point; inspect caller and guard id
page/subscriptionsSave.json.php JSON entry point; inspect caller and guard good_until, id, plans_id, status, user_id
showPlans.php PHP page/include/worker; inspect caller plans_id, status, videos_id
subscribePlan.php PHP page/include/worker; inspect caller globalToken, plans_id, videos_id
view/ppvCallout.php PHP page/include/worker; inspect caller —
view/videoHero.php PHP page/include/worker; inspect caller —

Data and migrations

Tables named in available CREATE TABLE statements: subscriptions, subscriptions_history, subscriptions_plans, subscriptions_plans_has_users_groups. Apply installation/update behavior through the owning plugin; this reference is not a script for running historical migrations manually.

Main-file named symbols

Visibility and implementation semantics must be checked in source. Nonempty string defaults are represented as . This is a symbol reference, not a stable public API promise.

Function or method Source
getPluginDependencies() 14
getTags() 20
getDescription() 29
getPluginVersion() 41
getName() 46
getUUID() 51
getDataObjectAdvanced() 56
getEmptyDataObject() 63
navBarButtons() 162
getHTMLMenuRight() 168
getHTMLMenuLeft() 178
getPluginMenu() 188
getDynamicUserGroupsId($users_id) 195
getDynamicUsersId($users_groups_id) 203
getUsersFromGroup($users_groups_id) 211
getGroupsFromUser($users_id) 239
getModeYouTube($videos_id) 267
getEmbed($videos_id) 290
getPlansFromVideo($videos_id) 295
isVideoOnSubscription($videos_id) 336
getNetflixActionButton($videos_id) 343
userCanWatchVideo($users_id, $videos_id) 360
userCanWatchVideoWithAds($users_id, $videos_id) 366
getAllFromUser($users_id, $active_only = false) 378
getCheckoutAccess($users_id, $plans_id) 383
showAds($videos_id) 388
getVideo() 407
profileTabName($users_id) 416
profileTabContent($users_id) 422
getExpiredSubscriptions($daysAgoLimit = 1) 432
getPaypalPlanId($subscriptions_plans_id) 451
getFromAgreement($agreement_id) 457
getFromStripeCostumerId($stripe_costumer_id) 463
isAgreementFromUser($agreement_id, $users_id) 469
getOrCreateSubscription($users_id, $plans_id, $agreement_id = "") 480
getOrCreateStripeSubscription($users_id, $plans_id, $stripe_costumer_id = "") 485
getOrCreateGatewaySubscription($users_id, $plans_id, $gateway, $gatewaySubscriptionId = "") 490
renew($users_id, $plans_id, $gateway = "'<string>'", $json = []) 495
addToHistory($subscriptions_id, $how_many_days_added, $price) 579
onTrial($users_id, $plans_id) 588
isTrial($plans_id) 625
isPaidUser($users_id) 637
getPlansByUserGroups($userGroupIds) 642
getBuyURL($videos_id = 0, $liveLink_id = 0, $redirectUri = '') 647
executeEveryMinute() 692

Supporting PHP declarations

These symbols are grouped by source file; inspect the class declaration and visibility before calling them.

Objects/SubscriptionHistoryTable.php

Declared classes: SubscriptionHistoryTable.

Named symbol Source
getSearchFieldsNames() 11
getTableName() 15
getSubscriptions_id() 19
getHow_many_days_added() 23
getPrice() 27
setSubscriptions_id($subscriptions_id) 31
setHow_many_days_added($how_many_days_added) 35
setPrice($price) 39
getRevenueLifetime() 46
getRevenueAndTransactionsBetween($startDateTime, $endDateTime) 55
getRevenueOnDate($date) 68
getRevenueOnMonth($yearMonth) 73
getRenewalsCountBetween($startDateTime, $endDateTime) 82
getDailyRevenueBetween($startDateTime, $endDateTime) 103
getMonthlyRevenueLastMonths($months = 12) 126
getRevenueByPlanBetween($startDateTime, $endDateTime) 155
getTopUsersBetween($startDateTime, $endDateTime, $limit = 20) 190
getRevenueByGatewayBetween($startDateTime, $endDateTime) 220
fetchScalarFloat($sql, $types = '', $values = []) 242
fetchScalarInt($sql, $types = '', $values = []) 249

Objects/SubscriptionPlansGroupsTable.php

Declared classes: SubscriptionPlansGroupsTable.

Named symbol Source
getSearchFieldsNames() 11
getTableName() 15
deleteFromPlan($subscriptions_plans_id) 19
getAllFromPlan($subscriptions_plans_id) 32
getSubscriptions_plans_id() 51
getUsers_groups_id() 55
setSubscriptions_plans_id($subscriptions_plans_id) 59
setUsers_groups_id($users_groups_id) 63

Objects/SubscriptionPlansTable.php

Declared classes: SubscriptionPlansTable.

Named symbol Source
getId() 13
getSearchFieldsNames() 18
getTableName() 23
getAll() 28
getAllActive() 47
getName() 66
getDescription() 71
getPrice() 76
getHow_many_days() 81
getStatus() 86
setName($name) 91
setDescription($description) 97
setPrice($price) 102
setHow_many_days($how_many_days) 109
setStatus($status) 114
getPaypal_plan_id() 120
setPaypal_plan_id($paypal_plan_id) 125
getStripe_plan_id() 130
setStripe_plan_id($stripe_plan_id) 135
getHow_many_days_trial() 140
setHow_many_days_trial($how_many_days_trial) 145
getIs_featured() 150
setIs_featured($is_featured) 155
save($renewPlan = false) 161
getPlansByUserGroups($userGroupIds) 175

Objects/SubscriptionTable.php

Declared classes: SubscriptionTable.

Named symbol Source
getJson() 15
setJson($json) 19
getSearchFieldsNames() 23
getTableName() 27
getAllFromUser($users_id, $active_only = false) 31
getAll() 53
getUserPlan($subscriptions_plans_id, $users_id) 87
getCheckoutAccess($users_id, $plans_id) 95
getUsers_id() 108
getSubscriptions_plans_id() 112
getGood_until() 116
getStatus() 120
setUsers_id($users_id) 124
setSubscriptions_plans_id($subscriptions_plans_id) 128
setGood_until($good_until) 132
setStatus($status) 136
getSubscription($users_id, $subscriptions_plans_id, $stillGood = true, $status = '<string>') 140
getOrCreateSubscription($users_id, $plans_id, $agreement_id = "") 166
getOrCreateStripeSubscription($users_id, $plans_id, $stripe_costumer_id = "") 198
getOrCreateGatewaySubscription($users_id, $plans_id, $gateway, $gatewaySubscriptionId) 242
updateAgreement($subscription_id, $agreement_id) 270
updateStripeCostumerId($subscription_id, $stripe_costumer_id) 281
getAgreement_id() 292
setAgreement_id($agreement_id) 296
getStripe_costumer_id() 300
setStripe_costumer_id($stripe_costumer_id) 304
getGateway() 308
setGateway($gateway) 312
getGateway_subscriptions_id() 316
setGateway_subscriptions_id($gateway_subscriptions_id) 320
getFromAgreement($agreement_id) 324
getFromStripeCostumerId($stripe_costumer_id) 338
getActiveCount() 355
getNewCountBetween($startDateTime, $endDateTime) 367
getCancellationsCountBetween($startDateTime, $endDateTime) 378
getNewPerDayBetween($startDateTime, $endDateTime) 391
getMRR() 410
getExpectedRevenueUntil($endDateTime) 424
getForecastByDayUntil($endDateTime) 440

showPlans.php

Named symbol Source
subscriptionShowPlansSendNoContentForBot() 2

Diagnostics and validation

  1. Check the installed/enabled version and the dependencies/settings above.
  2. Identify the actual failing page, request, callback or worker and correlate its timestamp with the AVideo log.
  3. Follow the linked method and caller. Check business-state changes and output artifacts as well as HTTP status.
  4. Reproduce the relevant workflow in a test environment. External provider, Encoder, live-server, storage, payment and authenticated flows require their real integrations.

Related test filenames (name matches only; not executed by generation):

Shared diagnostic workflow. This page is not a security audit or a claim of end-to-end validation.

Clone this wiki locally