Skip to content

Technical Plugin PayPerView

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

Technical: PayPerView plugin

Defines video rental plans, wallet checkout and time-limited paid access.

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: 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.

Behavior and operational checks

Plan selection, wallet funding and rental fulfillment are distinct. A credited wallet alone does not mean that the selected video was rented.

Dependencies

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.

Hook integration

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

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
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

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
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

Data and migrations

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.

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
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

Supporting PHP declarations

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

Objects/PPV_Insights.php

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

Objects/PPV_Plans.php

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

Objects/PPV_Plans_Users_Videos.php

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

Objects/PPV_Plans_Videos.php

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

Objects/PPV_Users_Parameters.php

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

Objects/Ppv_plans_has_users.php

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

Objects/Ppv_plans_has_users_groups.php

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

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.

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

Clone this wiki locally