Repository navigation
Technical Plugin Subscription
Grants time-limited subscription plans and dynamic user-group membership.
Audience: developers, advanced administrators and AI-assisted diagnosis. Plugin catalog.
- 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.
| 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.
| 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 |
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 |
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 | — |
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.
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 |
These symbols are grouped by source file; inspect the class declaration and visibility before calling them.
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 |
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 |
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 |
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 |
| Named symbol | Source |
|---|---|
subscriptionShowPlansSendNoContentForBot() |
2 |
- Check the installed/enabled version and the dependencies/settings above.
- Identify the actual failing page, request, callback or worker and correlate its timestamp with the AVideo log.
- Follow the linked method and caller. Check business-state changes and output artifacts as well as HTTP status.
- 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):
- tests/Security/StripeSubscriptionMetadataTest.php
- tests/Security/StripeSubscriptionRequestTest.php
- tests/Security/SubscriptionCheckoutStatusTest.php
- tests/Unit/StripeSubscriptionCheckoutTest.php
- tests/Unit/SubscriptionCronStatusTest.php
- tests/stripe-subscription-ui.test.js
Shared diagnostic workflow. This page is not a security audit or a claim of end-to-end validation.
Start
Install and update
- Install on Ubuntu 24.04 or 26.04
- Installation Setup Page
- Scheduler cron job (required)
- Set up email
- Use HTTPS
- Own Encoder
- Docker
- Update AVideo
- Backup
- Secure file permissions
- Server command-line tools
- Hidden configuration options
Videos
- Upload a video
- Local Encoder (on your computer)
- Bulk upload by FTP
- Import a channel
- Publish on YouTube and social media
- Privacy options
- Only for logged-in users
- Resolutions by user group
- Storage options
- Move and protect video files
- Video does not play
Users
Live
- Make a live stream
- Stream with OBS
- Own live server
- One live server, many sites
- Live server install errors
- Live does not play
Plugins
Problems
Other
- Translate your site
- Write a plugin (developers)
- Technical reference (developers and advanced administrators)
Old and retired guides