Repository navigation
Technical Plugin PayPerView
Defines video rental plans, wallet checkout and time-limited paid access.
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:
11.15. - Source revision:
6dd4e280afb84b54abdb61e27d16da9188b8de9e. - Entry class file: PayPerView.php.
Confirm the installed plugin version independently of the Streamer version. Configuration defaults below are not a dump of this installation's saved settings.
Plan selection, wallet funding and rental fulfillment are distinct. A credited wallet alone does not mean that the selected video was rented.
No literal dependency declaration was extracted. This does not prove the plugin is standalone.
Literal runtime plugin references: Live, PlayerSkins, StripeYPT, Subscription, YPTWallet, YouPHPFlix2. These calls do not mean every referenced plugin is mandatory.
| Override | Implementation |
|---|---|
getTags() |
PayPerView.php:17 |
updateScript() |
PayPerView.php:53 |
getDataObjectAdvanced() |
PayPerView.php:75 |
getPermissionsOptions() |
PayPerView.php:126 |
navBarButtons() |
PayPerView.php:146 |
getWatchActionButton($videos_id) |
PayPerView.php:152 |
getNetflixActionButton($videos_id) |
PayPerView.php:157 |
getGalleryActionButton($videos_id) |
PayPerView.php:175 |
getPluginMenu() |
PayPerView.php:193 |
getModeYouTube($videos_id) |
PayPerView.php:200 |
getModeLiveLink($liveLink_id) |
PayPerView.php:223 |
getEmbed($videos_id) |
PayPerView.php:233 |
userCanWatchVideo($users_id, $videos_id) |
PayPerView.php:423 |
userCanWatchVideoWithAds($users_id, $videos_id) |
PayPerView.php:440 |
getAllVideosExcludeVideosIDArray() |
PayPerView.php:593 |
showAds($videos_id) |
PayPerView.php:623 |
getVideo() |
PayPerView.php:636 |
profileTabName($users_id) |
PayPerView.php:649 |
profileTabContent($users_id) |
PayPerView.php:656 |
getVideoTags($videos_id) |
PayPerView.php:671 |
getDynamicUserGroupsId($users_id) |
PayPerView.php:730 |
getDynamicUsersId($users_groups_id) |
PayPerView.php:778 |
getVideosManagerListButton() |
PayPerView.php:826 |
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 |
|---|---|---|---|
payPerViewLabel |
"Pay-per-view" |
— | source |
payPerViewBuyLabel |
"Buy Now" |
— | source |
textBuyPageTitle |
"Unlock this content" |
Buy page title: Title shown at the top of the Pay-Per-View purchase modal. | source |
thanksForPurchase |
"Thanks for the purchase" |
— | source |
onlyPlayVideosWithPayPerViewActive |
true |
— | source |
onlyShowVideosWithPayPerViewActive |
false |
— | source |
showPPVLabel |
false |
— | source |
expirationPrecision |
1 |
— | source |
allowFreePlayWithAds |
false |
— | source |
usersCanCreatePPVPlans |
false |
Users Can Create PPV Plans: Users that can upload videos will also able to create PPV plans | source |
usersCanSetPPV |
false |
Users can set PPV plans on his videos: Users will be able to setup predefined PPV plans on his videos | source |
adminSplitlabel |
'Admin Split' |
— | source |
publisherSplitlabel |
'Publisher Split' |
— | source |
allowStripe |
false |
— | source |
hideActionButton |
false |
— | source |
doNotShowAdsForPaidUsers |
true |
— | source |
doNotShowPaymentOptions |
false |
— | source |
ifNeedToPayRedirectURL |
'' |
if need to pay, redirect to this URL: If you use this option you may need the API to enable the PPV | source |
textBuyPageLoginRequired |
Computed/structured; inspect source | Buy page login required message: Message shown when a guest tries to purchase Pay-Per-View content. | source |
textBuyPageSubscriptionTitle |
Computed/structured; inspect source | Buy page subscription title: Title shown in the subscription upsell on the Pay-Per-View purchase modal. | source |
textBuyPageSubscriptionDescription |
Computed/structured; inspect source | Buy page subscription description: Description shown in the subscription upsell on the Pay-Per-View purchase modal. | source |
userGroupPPVGrantsSpecificVideoOnly |
true |
UserGroup PPV grants access to the specific video only: When enabled, paying for a video that belongs to a UserGroup PPV plan grants access to that single video only. When disabled (original behavior), the user gains access to the entire plan (all videos in the group). | 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 |
|---|---|---|
| Objects/PPV_Insights.php | class/helper implementation | — |
| Objects/PPV_Plans.php | class/helper implementation | — |
| Objects/PPV_Plans_Users_Videos.php | class/helper implementation | — |
| Objects/PPV_Plans_Videos.php | class/helper implementation | — |
| Objects/PPV_Users_Parameters.php | class/helper implementation | — |
| Objects/Ppv_plans_has_users.php | class/helper implementation | — |
| Objects/Ppv_plans_has_users_groups.php | class/helper implementation | — |
| PayPerView.php | plugin entry class |
buy, videos_id
|
| Stripe/requestPayment.json.php | JSON entry point; inspect caller and guard |
liveLink_id, ppv_plans_id, videos_id
|
| Wallet/requestPayment.json.php | JSON entry point; inspect caller and guard |
liveLink_id, ppv_plans_id, videos_id
|
| actionButton.php | PHP page/include/worker; inspect caller | — |
| actionButtonGallery.php | PHP page/include/worker; inspect caller | — |
| actionButtonNetflix.php | PHP page/include/worker; inspect caller | — |
| getPurchasedVideoIds.json.php | JSON entry point; inspect caller and guard | — |
| getStripePayButton.php | PHP page/include/worker; inspect caller | — |
| getWalletPayButton.php | PHP page/include/worker; inspect caller |
live_schedule, live_transmitions_id
|
| install/install.sql | schema/migration SQL | — |
| install/updateV2.0.sql | schema/migration SQL | — |
| install/updateV2.1.sql | schema/migration SQL | — |
| install/updateV3.0.sql | schema/migration SQL | — |
| install/updateV4.0.sql | schema/migration SQL | — |
| install/updateV8.0.sql | schema/migration SQL | — |
| navBarButtons.php | PHP page/include/worker; inspect caller | — |
| page/addVideoToPlan.php | PHP page/include/worker; inspect caller | videos_id |
| page/buy.php | PHP page/include/worker; inspect caller |
liveLink_id, live_schedule, live_transmitions_id, plans_id, redirectUri
|
| page/editor.php | PHP page/include/worker; inspect caller | — |
| page/editorParameters.php | PHP page/include/worker; inspect caller | — |
| page/editorPlans.php | PHP page/include/worker; inspect caller | rowCount |
| page/editorUsers.php | PHP page/include/worker; inspect caller | — |
| page/editorVideos.php | PHP page/include/worker; inspect caller |
current, rowCount, sort
|
| page/editor_body.php | PHP page/include/worker; inspect caller | current |
| page/editor_head.php | PHP page/include/worker; inspect caller | — |
| page/embedTrailer.php | PHP page/include/worker; inspect caller |
v, videoName, videos_id
|
| page/insights.help.json.php | JSON entry point; inspect caller and guard | — |
| page/insights.php | PHP page/include/worker; inspect caller | — |
| page/insightsData.json.php | JSON entry point; inspect caller and guard |
days, plans_id, report
|
| page/insightsExport.csv.php | PHP page/include/worker; inspect caller |
days, plans_id, report
|
| page/parametersSave.json.php | JSON entry point; inspect caller and guard | json |
| 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/plansSave.json.php | JSON entry point; inspect caller and guard |
description, hours_valid, id, name, price, splitAdmin, splitPublisher, status, userGroups
|
| page/plansUserDelete.json.php | JSON entry point; inspect caller and guard |
id, users_id
|
| page/plansUserSave.json.php | JSON entry point; inspect caller and guard |
expiration, id, ppv_plans_id, users_id, value_paid
|
| page/profileTabContent.php | PHP page/include/worker; inspect caller | users_id |
| page/reports.php | PHP page/include/worker; inspect caller | — |
| page/reportsData.json.php | JSON entry point; inspect caller and guard | — |
| page/userInfo.php | PHP page/include/worker; inspect caller | users_id |
| page/userInfoPlans.php | PHP page/include/worker; inspect caller | — |
| page/userInfoVideos.php | PHP page/include/worker; inspect caller | — |
| page/videosSave.json.php | JSON entry point; inspect caller and guard |
json, plan_video, v_id
|
| subscribePlanPerUser.php | PHP page/include/worker; inspect caller |
liveLink_id, plans_id, purchased, redirectUri, videos_id
|
Tables named in available CREATE TABLE statements: ppv_plans, ppv_plans_has_users, ppv_plans_has_users_groups, ppv_plans_has_users_has_videos, ppv_plans_has_videos, ppv_users_parameters.
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 |
|---|---|
getTags() |
17 |
getDescription() |
26 |
getName() |
38 |
getUUID() |
43 |
getPluginVersion() |
48 |
updateScript() |
53 |
getDataObjectAdvanced() |
75 |
getEmptyDataObject() |
83 |
getPermissionsOptions() |
126 |
canSearchInfo() |
133 |
canSeePPVManagementInfo() |
141 |
navBarButtons() |
146 |
getWatchActionButton($videos_id) |
152 |
getNetflixActionButton($videos_id) |
157 |
getGalleryActionButton($videos_id) |
175 |
getPluginMenu() |
193 |
getModeYouTube($videos_id) |
200 |
getModeLiveLink($liveLink_id) |
223 |
getEmbed($videos_id) |
233 |
areTablesInstalled($tables) |
268 |
preloadPPVVideoIds() |
282 |
isVideoPayPerViewCached($videos_id) |
334 |
getUserPurchasedVideosSQLParts($users_id) |
340 |
preloadUserPurchasedVideos($users_id = 0) |
372 |
isVideoPurchasedByUserCached($users_id, $videos_id) |
403 |
isVideoPayPerView($videos_id) |
409 |
userCanWatchVideo($users_id, $videos_id) |
423 |
userCanWatchVideoWithAds($users_id, $videos_id) |
440 |
isActive($ppv_plans_id, $videos_id) |
452 |
getAllPlansFromVideo($videos_id, $activeOnly = true, $ppv_plans_id = 0) |
457 |
getPaymentDetails($ppv_plans_id, $videos_id = 0, $walletFunding = false) |
489 |
completeWalletCheckout($users_id, $ppv_plans_id, $videos_id, $expectedValue, $expectedHours) |
519 |
getRentalNotSavedMessage() |
544 |
resolveUserGroupPlanForVideo(array &$plan, int &$videos_id): void |
554 |
getAllPlansFromLiveLink($livelinks_id, $activeOnly = true, $ppv_plans_id = 0) |
584 |
getAllVideosExcludeVideosIDArray() |
593 |
showAds($videos_id) |
623 |
getVideo() |
636 |
profileTabName($users_id) |
649 |
profileTabContent($users_id) |
656 |
getAllPPVFromUser($users_id) |
666 |
getVideoTags($videos_id) |
671 |
canCreatePPV() |
685 |
canSetPPV() |
699 |
canManageVideo($videos_id) |
713 |
getDynamicUserGroupsId($users_id) |
730 |
getGroupsFromUser($users_id) |
738 |
getDynamicUsersId($users_groups_id) |
778 |
getUsersFromGroup($users_groups_id) |
786 |
getVideosManagerListButton() |
826 |
canPayToUser($plans_id) |
836 |
payToUserOrAdmin($plans_id) |
842 |
getActivePlan($users_id, $videos_id) |
857 |
buyPlan($users_id, $ppv_plans_id, $periods = 1) |
867 |
buyPPV($users_id, $ppv_plans_id, $videos_id = 0, $liveLink_id = 0, $method = '<string>') |
897 |
getBuyURL($videos_id = 0, $liveLink_id = 0, $redirectUri = '') |
983 |
API_set_payperview_perVideo($parameters) |
1088 |
API_set_payperview_delete($parameters) |
1177 |
API_get_payperview($parameters) |
1255 |
These symbols are grouped by source file; inspect the class declaration and visibility before calling them.
Declared classes: PPV_Insights.
| Named symbol | Source |
|---|---|
normalizeDays($days) |
20 |
getPlans() |
26 |
buyersSubquery() |
46 |
getList($list, $days, $plansId = 0) |
66 |
getPlanPerformance($days) |
152 |
getMonthlyBuyers($months = 12) |
214 |
getActivitySince() |
248 |
getSummary($days, $plansId = 0) |
257 |
Declared classes: PPV_Plans.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
11 |
getTableName() |
15 |
getValue() |
19 |
getName() |
23 |
getDescription() |
27 |
getStatus() |
31 |
getHours_valid() |
35 |
setValue($value) |
39 |
setName($name) |
43 |
setDescription($description) |
48 |
setStatus($status) |
52 |
setHours_valid($hours_valid) |
56 |
getUsers_id() |
60 |
setUsers_id($users_id) |
64 |
getSplit_publisher() |
68 |
getSplit_siteadmin() |
72 |
setSplit_publisher($split_publisher) |
76 |
setSplit_siteadmin($split_siteadmin) |
80 |
save() |
84 |
getAll() |
95 |
getAllFromUser($users_id) |
119 |
convertSplitPercentageToText($val) |
143 |
getTotalFromUser($users_id) |
151 |
purchasesUnionSubquery() |
177 |
getRevenueLifetime() |
204 |
getKpisBetween($startDateTime, $endDateTime) |
213 |
getRevenueOnDate($date) |
240 |
getRevenueOnMonth($yearMonth) |
246 |
getActiveAccessesCount() |
254 |
getExpiringInDaysCount($days) |
261 |
getDailyRevenueBetween($startDateTime, $endDateTime) |
270 |
getMonthlyRevenueLastMonths($months = 12) |
295 |
getRevenueByTypeBetween($startDateTime, $endDateTime) |
322 |
getTopPlansBetween($startDateTime, $endDateTime) |
346 |
getTopUsersBetween($startDateTime, $endDateTime, $limit = 20) |
374 |
getExpirationsUntil($endDateTime) |
407 |
scalarFloat($sql, $types = '', $values = []) |
430 |
scalarInt($sql, $types = '', $values = []) |
437 |
Declared classes: PPV_Plans_Users_Videos.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
11 |
loadFromUserAndVideoPlan($users_id, $ppv_plans_has_videos_id) |
15 |
getFromDbFromUserAndVideoPlan($users_id, $ppv_plans_has_videos_id, $refreshCache=false) |
25 |
getFromDbFromVideos($videos_id, $validOnly=true) |
42 |
getFromDbFromUser($users_id, $validOnly=true) |
65 |
getTableName() |
89 |
getId() |
93 |
setId($id) |
97 |
getUsers_id() |
101 |
getPpv_plans_has_videos_id() |
105 |
getValue_paid() |
109 |
getExpiration() |
113 |
getWatched_times() |
117 |
getStatus() |
121 |
setUsers_id($users_id) |
125 |
setPpv_plans_has_videos_id($ppv_plans_has_videos_id) |
129 |
setValue_paid($value_paid) |
133 |
setExpiration($expiration) |
137 |
setWatched_times($watched_times) |
141 |
setStatus($status) |
145 |
userCanWatchVideo($users_id, $videos_id) |
158 |
getActivePlan($users_id, $videos_id) |
225 |
getAllFromUser($users_id, $completeHistory = false) |
248 |
getTopVideosBetween($startDateTime, $endDateTime, $limit = 20) |
278 |
Declared classes: PPV_Plans_Videos.
| Named symbol | Source |
|---|---|
loadFromPlanVideo($ppv_plans_id, $videos_id) |
11 |
isActive($ppv_plans_id, $videos_id) |
23 |
getAllPlansFromVideo($videos_id, $activeOnly=true, $ppv_plans_id=0, $refreshCache=false) |
30 |
getFromDbFromPlanVideo($ppv_plans_id, $videos_id) |
62 |
getSearchFieldsNames() |
78 |
getTableName() |
82 |
checkPlan() |
86 |
unCheckPlan() |
90 |
getId() |
94 |
getPpv_plans_id() |
98 |
getVideos_id() |
102 |
getStatus() |
106 |
setPpv_plans_id($ppv_plans_id) |
110 |
setVideos_id($videos_id) |
114 |
setStatus($status) |
118 |
save() |
122 |
Declared classes: PPV_Users_Parameters.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
11 |
getTableName() |
15 |
getUsers_id() |
19 |
getParameters() |
25 |
setUsers_id($users_id) |
29 |
setParameters($parameters) |
33 |
loadFromUser($id=0) |
37 |
getFromUserFromDb($id) |
54 |
getSelfParameters() |
70 |
getVideoOwnerParameters($videos_id) |
81 |
getUserParameters($users_id) |
86 |
Declared classes: Ppv_plans_has_users.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
9 |
getTableName() |
13 |
getAllPpv_plans() |
17 |
getAllUsers() |
36 |
setId($id) |
54 |
setPpv_plans_id($ppv_plans_id) |
58 |
setUsers_id($users_id) |
62 |
setValue_paid($value_paid) |
66 |
setExpiration($expiration) |
70 |
setStatus($status) |
74 |
getId() |
78 |
getPpv_plans_id() |
82 |
getUsers_id() |
86 |
getValue_paid() |
90 |
getExpiration() |
94 |
getStatus() |
98 |
getAllFromUser($users_id, $completeHistory = false) |
102 |
getActivePlan($users_id, $videos_id) |
126 |
getFromDbFromUserAndPlan($users_id, $ppv_plans_id) |
157 |
save() |
173 |
Declared classes: Ppv_plans_has_users_groups.
| Named symbol | Source |
|---|---|
getSearchFieldsNames() |
9 |
getTableName() |
13 |
getAllPpv_plans() |
17 |
setId($id) |
35 |
setPpv_plans_id($ppv_plans_id) |
39 |
setUsers_groups_id($users_groups_id) |
43 |
setStatus($status) |
47 |
getId() |
51 |
getPpv_plans_id() |
55 |
getUsers_groups_id() |
59 |
getStatus() |
63 |
deleteAllFromPPV($ppv_plans_id) |
67 |
getAllFromUserGroups($users_groups_ids) |
82 |
getAllPlansFromVideo($videos_id, $activeOnly=true, $ppv_plans_id=0) |
109 |
getAllPlansFromLivelink($liveLink_id, $activeOnly=true, $ppv_plans_id=0) |
127 |
getAllFromPPV($ppv_plans_id) |
150 |
getAllPlansFromUserGroups($users_groups_ids, $activeOnly=true, $ppv_plans_id=0) |
174 |
- 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.
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