AVOS
aka Pure Luck or Blind Faith
a guide to implementing functional atrocities too sublime to ignore or ramblings and preambles leading to recourse and discourse explaining the structural scaffold behind the purposive simple architecture
The function extractWebcamsFields($webcamsIds)
will convert the list of webcams
id's to an array of hashes containing the models info for display on a grid etc.
$models = extractWebcamsFields([12345, 12725]);
[
[
[id] => 12345
[addedOn] => 1631607911
[updatedOn] => 1741005250
[scrapedOn] => 1670274856
[purged] => 0
[nickname] => riley_sweety
[externalId] => 0
[name] => Riley
[site] => Chaturbate
[status] => Offline
...
],
[
[id] => 12725
...
]
]
The function expandWebcamsFields($models)
takes a list of hashes containing webcams data extracted from mysql and expands/adds the following fields:
Additionally if age is 0 it is converted to the empty string and any data stored in Redis
in the key modelId/p
is merged.
Fetches a specified number of webcams related to the current model identified by $model
in the template or getTemplateValue('model')
within external php code.
getRelatedWebcams($cats=false, $count=8, $type='tags', $catstags=false, $samesite=false)
$cats
is a csv of the list of cats and/or tags to check for related models, leave empty to default to all tags+cats on the site$count
is how many related models to return$type
indicates whether to first search tags
or categories
$catstags
is optional, set to true
if want to check categories filtered by tags$samesite
is optional, set to true
to ensure related models are on the same camsite as the current oneTo use defaults simply use setTemplateValue('related', getRelatedWebcams());
A list of models data is returned.
[
[
[id] => 3099130
[nickname] => em1ly_joy
[site] => Chaturbate
[status] => Freechat
[addedOn] => 1741643103
[age] => 20
[hd] => 0
[gender] => Female
[imageUrl] => "https://thumb.live.mmcdn.com/ri/em1ly_joy.jpg"
[imagePath] => "/photos/chaturbate/e/m/1/l/em1ly_joy/"
[numImages] => 4
[siteShortNameCaps] => Cb
],
...
A standard example to fetch a number of related webcams for a profile page:
// create CSV of tags followed by categories
$counts = getWebcamsCounts();
// if set to false this is what $csv will expand to
$csv = implode(',', array_merge(array_keys($counts['tags']), array_keys($counts['categories'])));
// check to see if we have a [urls] rule that uses categories filtered by tags
$useCatsTags = empty(getUrl('webcamsCategoryTag')) ? 0 : 1;
// fetch related webcams and set as $related for the profile template
setTemplateValue('related', getRelatedWebcams($csv, 20, 'tags', $useCatsTags));
Fetch one extra model from the same camsite for use in the profile page:
$model2 = getRelatedWebcams(false, 1, 'tags', false, true)[0];
setTemplateValue('model2', $model2);
The function getStatsSummary()
returns an array containing 3 keys:
Each key contains a hash with these keys:
[viewersTotal] => 330
[viewersMax] => 48
[viewersAvg] => 6
[followersNew] => 704
[followersMin] => 31477
[followersMax] => 32181
[rankMax] => 868
[rankAvg] => 1541
[onlineTime] => 371170
[onlineDays] => 52
[onlineDaily] => 7137
[freechatTime] => 350825
[freechatLongest] => 32041
[freechatSessions] => 142
[freechatAvg] => 2470
[groupTime] => 11704
[groupLongest] => 4740
[groupSessions] => 22
[groupAvg] => 532
[privateTime] => 8641
[privateLongest] => 2160
[privateSessions] => 12
[privateAvg] => 720
[popularRank] => 123
[trendingRank] => 0
The data is cached for statsCacheExpiry
seconds before needing to be recalculated, default is 8 hours. To pre-cache this data for all online models run the 'summary` cron.
The initial run of this cron could take around an hour assuming approx 20k models online. Subsequent runs will only check/update the cache for models whose status has been
updated since the previous cron run.
To extract full historical data from the sqlite
databases under avos/db/
as well as the ones in redis
pass true
as the next argument:
getStatsSummary($webcamsId, true);
[cron]
domains/main = avos.mysite.com
main/15minutes = summary
function webcamsStats()
{
setTemplateValue('stats', getStatsSummary(getTemplateValue('model')['id']));
}
calling getStatsSummary($webcamsId, true, true)
will return an array containing all the models attributes, stats from redis, alltime stats, daily stats with keys with 'Day' appended and monthly stats with 'Month' appended. using getStatsSummary($webcamsId, false, true)
will still return the data flattened into a single hash but will not include data purged to sqlite
id = 10
nickname = silentmary
name = Silentmary
site = Chaturbate
gender = Female
views = 34
age = 99
addedOn = 1631593804
updatedOn = 1744362996
// status times if online else statusTime=0
status = Freechat
statusTime = 5001
// these ranks based on the sponsors site
rank = 263
genderRank = 199
// these ranks based on the avos filterng of sites
localRankMax = 10
localRankMaxOn = 1743870182
// based on current site filters and popular/trending logic
popularRank = 0
trendingRank = 0
subject = 'CrazyGoal': Flash every goal Boobs 30 min every 10x Oil every 20x Domi active @5+ ULTRAHIGHS100/200/420/666/1000 make me #squirt #bigboobs #edge #goth #hairy 200=Boobs 5 min C2c=555
birthday = 0
imageUrl = https://thumb.live.mmcdn.com/ri/silentmary.jpg
numImages = 20
viewers = 141
followers = 345789
hd = 1
tags = ,squirt,bigboobs,edge,goth,hairy,
location =
about =
languages =
body =
links = a:1:{i:0;s:65:"https://www.amazon.com/hz/wishlist/ls/1SLARMUNUQFGO?ref_=wl_share";}
imagePath = /photos/chaturbate/s/i/l/e/silentmary/
siteShortName = cb
siteShortNameCaps = Cb
// all time stats
viewersTotal = 88054
viewersMax = 7514
viewersAvg = 0
followersNew = 135309
followersMin = 207456
followersMax = 342765
rankMax = -1
rankAvg = -1
onlineTime = 8438093
onlineDays = 220
onlineDaily = 38354
freechatTime = 8403954
freechatLongest = 67919
freechatSessions = 906
freechatAvg = 9275
groupTime = 22738
groupLongest = 2160
groupSessions = 30
groupAvg = 757
privateTime = 11401
privateLongest = 2940
privateSessions = 46
privateAvg = 247
// stats for the last day they worked
viewersTotalDay = 0
viewersMaxDay = 0
viewersAvgDay = 0
followersNewDay = 0
followersMinDay = 0
followersMaxDay = 0
rankMaxDay = -1
rankAvgDay = -1
onlineTimeDay = 0
freechatTimeDay = 0
freechatLongestDay = 0
freechatSessionsDay = 0
freechatAvgDay = 0
groupTimeDay = 0
groupLongestDay = 0
groupSessionsDay = 0
groupAvgDay = 0
privateTimeDay = 0
privateLongestDay = 0
privateSessionsDay = 0
privateAvgDay = 0
// stats for the previous 30 days from the last day they worked
viewersTotalMonth = 0
viewersMaxMonth = 0
viewersAvgMonth = 0
followersNewMonth = 0
followersMinMonth = 0
followersMaxMonth = 0
rankMaxMonth = -1
rankAvgMonth = -1
onlineTimeMonth = 863566
onlineDaysMonth = 0
onlineDailyMonth = 0
freechatTimeMonth = 852165
freechatLongestMonth = 74700
freechatSessionsMonth = 97
freechatAvgMonth = 8785
groupTimeMonth = 9481
groupLongestMonth = 3240
groupSessionsMonth = 9
groupAvgMonth = 1053
privateTimeMonth = 1920
privateLongestMonth = 960
privateSessionsMonth = 2
privateAvgMonth = 960
The function getAllStats($webcamsId)
returns all statistics for the specified model both recent data from Redis and all time data that has been purged to SQLite databases on the filesystem. It returns an array()
with the following keys:
'h' (online status timeline by month)
'd' (summary of daily times in freechat etc)
'r' (ranks; followers and viewers)
eg: 12345/r/2412
e: epoch minutes since EPOCHSTART
[e]
is the timestamp in minutes after EPOCHSTART
to reduce space as cron only runs every minute. to convert to epoch seconds use $elt['e'] * 60 + EPOCHSTART
Stores the popularModelsMax
models from the last popularModelsDays
days, ranking is based on viewers. Run the popular
cron
to cache the data.
Fetch the data using getPopularWebcams($onlineOnly)
. default is $onlineOnly == false
to return all models.
[webcams]
; these are the defaults if not set
popularModelsMax = 1000
popularModelsDays = 30
[urls]
webcamsPopular = [ none, /popular/ ]
function webcamsPopular()
{
setTemplateValue('models', getPopularWebcams());
}
Every day a snapshot is saved for any model in the popular models list storing their max viewers and followers for that day. This is saved in redis as prefix/popular/snapshots
Data is stored for the last popularModelsMaxViewersDays
days
Fetch the data using getPopularWebcamsSnapshots($id=false, $day=false)
[webcams]
popularModelsMaxViewersDays = 30
\getPopularWebcamsSnapshots(98739, 250323);
viewers => 8805
followers => 1332202
\getPopularWebcamsSnapshots(98739);
250323 => [
viewers => 8712
followers => 1332202
],
250324 => [
viewers => 8805
followers => 1333203
]
\getPopularWebcamsSnapshots(false, 250323);
1750741 => [
viewers => 11179
followers => 162215
],
1891989 => [
viewers => 129
followers => 0
],
...
\getPopularWebcamsSnapshots();
250323 => [
1750741 => [
viewers => 11179
followers => 162215
],
1891989 => [
viewers => 129
followers => 0
],
...
250324 => [
...
If a model has ever ranked in the top popularModelsMax
models list their best ranking and date is stored in redis under the key siteprefix/models/modelId/p
These values are automatically fetched from redis when displaying a profile as bestRank
and bestRankOn
<? if (!empty($model['bestRank'])): ?>
Best Ranked <?= $model['bestRank'] ?> on <?= date("F j, Y", $model['bestRankOn']); ?></div>
<? endif; ?>
Iterates round the trendingModelsSnapshots snapshots of data, one per minute, which contains the number of viewers in each room. The deltas are calculated and added together to calculate
a trending score, weighted towards more recent snapshots as value * sqrt(snapshotNumber)
.
The returned list starts at rooms deemed to be most trending to the least. Default mode is absolute delta differences. Two other modes are available: relative
which divides the value by viewers in the room and average
which averages out the trending score per model from the two calculated lists.
[webcams]
; these are the defaults if not set
trendingModelsSnapshots = 10
trendingModelsMax = 1000
[urls]
; type: absolute, relative, average
webcamsTrending = [ none, /trending/:type/ ]
function webcamsTrending()
{
$type = getUrl()['args']['type'];
setTemplateValue('models', getTrendingWebcams($type));
/*
// default trending list based on absolute viewer deltas
setTemplateValue('modelsa', getTrendingWebcams());
setTemplateValue('modelsa', getTrendingWebcams('absolute'));
// trending list based on the relative change in viewers
setTemplateValue('modelsr', getTrendingWebcams('relative'));
// average mode
setTemplateValue('modelsa', getTrendingWebcams('average'));
*/
}
<? foreach ($models as $m): ?>
<?= $m['nickname'] ?> trending rank is <?= $m['rank'] ?>
<? endforeach; ?>
Creates snapshots every minute for each category (categories, tags, sites) creating a rating score for each based on the number of online models and viewers optionally
weighted by popularCategoriesRoomsWeight
and popularCategoriesViewersWeight
. It reads from prefix/webcams/counts
in redis and caches in prefix/popular/categories
getPopularCategories()
returns the categories ordered by models, viewers and weightings. Calling with no argument returns data for categories, tags and sites. Alternatively
passing in the type required returns only that data.
Runs at the end of the categories cron.
[webcams]
popularCategoriesSnapshots = 30
popularCategoriesRoomsWeight = 10
popularCategoriesViewersWeight = 1
$sites = getPopularCategories('sites');
[sc] => [
[fullname] => StripChat
[online] => 7154
[viewers] => 187992
],
[cb] => [
[fullname] => Chaturbate
[online] => 4418
[viewers] => 223883
]
...
Every day a snapshot is saved for every category/tag/site max total viewers and rooms for that day. This is saved in redis as prefix/popular/categories
Data is stored for the last popularCategoriesMaxViewersDays
days
Fetch the data using getPopularCategoriesSnapshots($mode=false, $name=false)
[webcams]
popularCategoriesMaxViewersDays = 30
getPopularCategoriesSnapshots('categories', 'teens')
250322 => [
online => 344
viewers => 130469
],
250323 => [
online => 344
viewers => 130469
]
getPopularCategoriesSnapshots('tags')
girls => [
250322 => [
online => 7829
viewers => 322431
],
250323 => [
online => 7829
viewers => 322431
]
]
anal => [
250322 => [
online => 3206
viewers => 118296
],
250323 => [
online => 3206
viewers => 118296
]
]
getPopularCategoriesSnapshots('tags')
categories => [
test => [
250322 => [
online => 7843
viewers => 328175
],
250323 => [
online => 7843
viewers => 328175
]
],
...
girls => [
...
],
tags => [
...
],
sites => [
...
]
getPopularCategoriesSnapshots('tags');
$change = [];
foreach ($tags as $name => $stats) {
$first = current($stats);
$last = end($stats);
$change[$name] = ($last['viewers'] - $first['viewers']) / $first['viewers'] * 100;
}
Calculates a score based on the delta between snapshots for each category based on the number of online models and viewers optionally weighted by
popularCategoriesRoomsWeight
and popularCategoriesViewersWeight
Shares the configuration and data with Popular Categories and the function getTrendingCategories()
behaves the same as getPopularCategories()
calling getHotModels()
returns a list of the following models:
hotNumPopular
online popular modelshotNumTrending
online trending modelshotNumPerTag
online models from the top hotNumTags
trending tags[webcams]
hotNumPopular = 10
hotNumTrending = 10
hotNumTags = 3
hotNumPerTag = 5
Calling getUpdatesStream()
returns a stream from the last $updatesStreamMaxHours
of models status changes:
Each element returned contains the following:
id => 1733559
timestamp => 1743706332
rank => 48
site => Chaturbate
nickname => _alicegreen_
status => Group
viewers => 1981
All updates apart from the loggedOn
update contain additional data
update => status
oldStatus => Freechat
update => rank
rankUpdate => 50
update => viewers
viewersIncr => 1032
viewersIncrMins => 29
id => 1733559
update => hours
onlineHours => 23
functions.php
function webcamsUpdates()
{
setTemplateValue('updates', getUpdatesStream());
}
webcamsUpdates.php
<? foreach ($updates as $u): ?>
<?= $u['id'] ?>
<?= $u['timestamp'] ?>
<?= $u['nickname'] ?>
<?= $u['site'] ?>
<?= $u['rank'] ?>
<?= $u['viewers'] ?>
<?= $u['update'] ?>
<a href="<?= encodeUrl('webcamsProfile', $u) ?>"> profile </a>
<? switch ($u['update']):
case 'status':
echo "from $u[oldStatus] to $u[status]";
break;
case 'rank':
echo "entered top $u[rankUpdate]";
break;
case 'viewers':
echo "gained $u[viewersIncr] viewers in the last $u[viewersIncrMins] mins";
break;
case 'hours':
echo "online for $u[onlineHours] hours";
break;
endswitch; ?>
<? endforeach; ?>
The following work whether the user is logged in or not. When logged in data is stored in mysql and in the session if not.
An array()
is returned from the users functions containing status and data which can automatically returned in json format if required for javascript use
(append format=json
to a web request to a [urls]
rule of type users
)
define('USERS_STATUS_OK', 1);
define('USERS_STATUS_ERROR', 0);
[
[status] => 1
[message] =>
[error] => 0
[args] => [
[models] => []
]
saveSearch()
is automatically called when multiple webcams results are found.
To display the searches use action=searches
in [urls]
where the template (e.g: usersSearches.php
) can iterate around $searches
.
[urls]
usersSearches = [ users, /searches/, 'action=searches' ]
Use action=clearSearches
to clear the searches:
[urls]
usersSearchesClear = [ users, /searches/clear/, 'action=clearSearches' ]
usersSearchesClear.php
<? include("usersSearches.php");
You can also directly call listUsersSearches()
and clearUsersSearches()
config.ini
[urls]
usersSearches = [ none, /searches/ ]
functions.php
function usersSearches()
{
if (isset($_GET['clear'])) clearUsersSearches();
setTemplateValue('searches', listUsersSearches()['args']['searches']);
}
addUsersHistory()
needs to be called in the [urls]
rule for displaying a profile and listUsersHistory()
will return a list of model id's that have been viewed.
[urls]
usersHistory = [ none, /history/:page ]
function webcamsProfile()
{
$model = getTemplateValue('model');
addUsersHistory($model['id']);
}
function usersHistory()
{
setTemplateValue('models', listUsersHistory()['args']['models']);
}
Users alerts are fetched using listAlerts()
consisting of the following:
[urls]
alerts = [ users, /alerts/, 'action=alerts' ]
alertsDebug = [ users, /alerts-debug/, 'action=alerts&format=print' ]
alertsAjax = [ users, /alerts-json/, 'action=alerts&format=json' ]
Posts can be displayed individually via the variable $post
given to the template or in multiples optionally filtered
by tag or keyword via either path or the ?kw=keyword
query arg in the usual way.
The template postsIndex.php
is given the variable $posts
which is a list of hashes of posts data.
[urls]
postsIndex = [ posts, /pages/:page ]
postsKeyword = [ posts, /pages/kw-:kw/:page ]
postsTag = [ posts, /pages/:tag/:page ]
postsSingle = [ post, /:urlTitle.html ]
; following url will load the template post.php or postsSingle.php if postsSiski.php doesnt exist
postsSiski = [ post, /i-really-love-siski, "urlTitle=i-love-siski-and-sosiki" ]
foreach ($posts as $p) {
title: $p['title']
link: encodeUrl('postsPage', $p)
views: $p['views']
body: $p['body']
tags:
foreach ($p['tags'] as $t) {
tag name: $t
tag link: encodeUrl('postsTag', ['tag' => $t])
}
}
The author function author($type, $data, $count=1, $seed=false)
randomly selects a start rule for type then keeps substituting tokens until there are no rewrite tokens remaining.
For example the call author('title', $model)
could output "Checkout sexy Chaturbate's silentmary" from the data below.
The random number generator is seeded by $seed
if provided else by $data['id']
if exists (such as for models profile data). This ensures the same output each time for the same model.
In the spreadsheet file declare multiple options on the same row and/or use multiple rows
Spreadsheet can be either CSV or XLSX
By default the AVOS Admin Meta Generator will use start types of: title, keywords, description (and category:title, category:keywords, category:description if defined)
To write "she" or "he" etc you can use one of these tokens: heshe, hisher, himher, guygirl
Capitalising the token as in %Gender%
will capitalize the rewrite as in Female
To rewrite the current models category double-tokenize as %%category%%
. e.g: %%category%%
will be rewritten as the current category such as %online%
and then the token online
would be rewritten
If using a token to represent a models attribute that might not be set then a default token can be added after a |
as in %location|site%
Any token with no rewrites will be replaced by itself as the terminal token such as %flibble%
will be replaced with flibble
unless it is defined as a key in $data
(eg: a models attribute) in which case it will be removed.
This can be used to set default literals such as %age|18%
. To ensure it is interpreted as a literal and not rewrite token append a period "." as in %age|site.%
If a rewrite rule contains periods "." to separate multiple sentences (ie: not as in %age|many.%
) then any sentence containing unexpanded data will cause the entire sentence to be deleted. e.g: checkout this %age% years old model. %Heshe% is from %site%
will result in a form like She is from Chaturbate
if age is not set.
use <empty>
as a rewrite option to replace with nothing
A start
or rewrite
rule may contain a precondition which must be in the first column
If any preconditions evaluate as true rules then rules without preconditions for the current rewrite will be ignored. Rules containing the most precondition elements are favored
Preconditions must match named functions in the namespace Avos\User\Author
Preconditions can only contain function names plus the operators !
, |
and &
plus (
and )
for grouping. e.g: viewers500&(isPopular|isTrending)
Precondition functions are passed the data as first arg and can optionally be passed a second defined after a colon as in viewers:10
| token | female | male | trans | group |
|-----------|--------|------|-------|---------|
| heshe | she | he | zie | they |
| hisher | her | his | zir | their |
| himher | her | him | zim | them |
| guygirl | girl | guy | trans | couple |
| guysgirls | girls | guys | trans | couples |
%onlineTime!hours%
which will be rounded to one decimal place.%addedOn!days%
it will be relative to the current date.valid modifiers are:
!seconds
only affects a timestamp and converts to seconds!mins
or !minutes
, non decimal!hrs
or !hours
!days
, non decimal!weeks
!months
!years
if the resulting value is zero it will not be removed like for other data. e.g: %nickname% %started% %working% %online% %addedOn!years% ago
could result in hotkandy began stripping on webcam 0 years ago
%Try% %age|20% years old %nickname% from %Site% - longest ever private %privateLongest!mins% mins - last online %updatedOn%
Discover 20 years old SARAMISHA from StripChat - longest ever private 103 mins - last online 1.3 hours ago
%onlineTime%
vs %onlineTime!mins%
then the most appropriate time interval will be appended as in 23 minutes
The breakpoints are as follows:
If the token is a timestamp such as %localRankMaxOn%
then the word "ago" is additionally appended as in "23 minutes ago"
[meta]
; use author* =
authorMain = author1.csv
authorMeta = author2.xlsx
// general start rules
start,title,%Sexy% %nickname% from %Location|Site%
start,title,%Checkout% %sexy% %site%s %nickname%
// start rules with preconditions
hasAge,start,title,%Checkout% %sexy% %age% year old %nickname% from %Site%
isNew,start,title,%Checkout% this new %model%, %heshe% is waiting for you
hasAge&isYoung,start,title,%Checkout% this %new% %young% %model% %lovesmobile%
viewers500&(isPopular|isTrending),start,title,%Checkout% this %popular% %model%
viewers:10,start,title,%Nickname% has over 10k people in %hisher% room
// start rule for categories
start,category:title,%%category%%
// example rewrite rules
rewrite,any,sexy,sexy,hot,slutty,gorgeous
rewrite,any,sexy,%very% lovely,%very% beautiful
rewrite,any,checkout,checkout,come and see,visit
rewrite,any,very,<empty>,very,really
// rewrite rules with preconditions
viewers:10,rewrite,any,popular,%heshe% is very popular with %viewers% people in %hisher% room
hasTag:mobile,rewrite,any,lovesmobile,and loves %streaming% outside from %hisher% %phone%
// example category rewrite rules
rewrite,category:title,girls,come and checkout these female webcams,%sexy% girls %naked% on %webcam%
rewrite,category:title,guys,come and checkout these male webcams,%horny% %guys% online for you
rewrite,category:title,any,%sexy% %category %webcams%
function webcamsProfile()
{
setTemplateValue('title', author('title', $model));
}
namespace Avos\User\Author;
function hasAge($m) { return $m['age'] > 0; }
function isNew($m) { return $m['addedOn'] + 1209600 > time(); }
function isYoung($m) { return $m['age'] < 30; }
function viewers500($m) { return $m['viewers'] >= 500; }
function viewers($m, $v) { return $m['viewers'] >= $v * 1000; }
function isTrending($m) { return $m['popularRank'] > 0; }
function isPopular($m) { return $m['trendingRank'] > 0; }
function hasTag($m, $t) { return strstr($m['tags'], $t); }
To verify all rules preconditions run avos.php -r
$ ./avos.php -r
isOnline&isFemale ... ok
isOnline ... ok
isNew7 ... ok
isNew30&!isNew7 ... ok
isNew ... ok
isNew31&isPopular ... err
breakme* ... err
isFemale ... ok
found 18 rules, 8 had conditions and 2 failed
eval error, isNew31&isPopular
parse error, breakme*
Setting logRequestsExpiry
in the [site]
block will enable logging of requests in redis. Items in the queue are removed via the logs
cron
after logRequestsExpiry
hours. The is data is available in the admin by clicking on Requests
in the sidebar.
Each item contains a hash of: timestamp, country, url path, [urls]
type, [urls]
name, decoded args and user agent.
[
[0] => 1742406080
[1] => RO
[2] => /
[3] => webcamsProfile
[4] => webcam
[5] => [
[site] => streamate
[nickname] => isalondon
],
[6] => "curl/7.64.1"
]
// getRequests() returns data from newest to oldest
$requests = \getRequests();
or
// fetching directly from redis will return data oldest to newest
$requests = \Avos\Redis\handle()->lRange(\Avos\Redis\getPrefix('requests'), 0, -1);
It is possible to define variables within the [templates]
block that are only set within a specified date range. This can be used to display
links or banners for a chosen promo period.
The dateFormat
is defined as 1 or 2 digit month, 1 or 2 digit month/day or as a range defined as dateFormat to dateFormat
or dateFormat - dateFormat
[templates]
groupName:date = dateFormat
groupName:variableName1 = value1
groupName:variableName2 = value2
12
15/2
12 to 3
15/12 to 3/3
12 - 3/3
xmas:date = 10/12 to 1
xmas:bannerImage = /image,png
xmas:bannerLink = https://foo.com
[site]
; max size for any log file
logsMaxSize = 1000
; enable logging of requests in redis, expiry in hours, requires geoip_country_code_by_name() to log country
logRequestsExpiry = 8
; enable logging of long sql queries over 2 seconds into redis prefix/longsql/<timestamp>, retain for 1 hour
logLongSqlExpiry = 3600
logLongSqlTime = 2
warnings = 0
refresh = 0
allowDebugFlag = 2
; overrides warnings/refresh/allowDebugFlag unless they are set to 2
devMode = 0
; general cache expiry time in seconds
cacheExpiry = 60
; skip the site for the admin servers/sites list
serversSkip = 1
; to store all models data in webcams/counts cache set to 0
cronWebcamsLite = 1
; how many items to store in the system load average list (one is saved per minute)
loadAverageCount = 1440
; offset to apply for postbacks timestamps
timezoneOffset = 0
; max runtime in seconds for a cron task before being killed and restarted
maxRuntime = 3600
[webcams]
; when to archive models (in days)
archiveInterval = 0.3
; max downloaded thumbs to keep per model
maxLocalImages = 20
; what sites to include models from on this avos site
sitesFilter = cb,sc,lj
; how many months of history, stats, ranks data to keep in redis before purging to sqlite in avos/db/
moveStatusHistory = 2
moveMonthlyStats = 2
moveRanks = 2
; how many days to move daily stats
moveDailyStats = 60
popularModelsMax = 1000
popularModelsDays = 30
popularModelsMaxViewersDays = 30
popularCategoriesSnapshots = 30
popularCategoriesRoomsWeight = 10
popularCategoriesViewersWeight = 1
popularCategoriesMaxViewersDays = 30
trendingModelsSnapshots = 10
trendingModelsMax = 1000
; configure stats summary cache
statsCacheExpiryHours = 8
; how many days ago a model should have logged in to check/recache their stats summary cache for 'summary' cron
; stores last run timestamp as prefix/site:summaryLastRun and subsequent runs use that
statsCacheDays = 30
; max models to take from trending and also from max viewers online
statusStreamModelsMax = 100
; used in site totals, specified in days but one snapshot of average rooms online and total viewers stored per hour
allModelsRoomsViewersSnapshotsDays = 30
; max hours before removing items from the updates feed
updatesStreamMaxHours = 8
; whether to extract redis profile data for use on index pages, default = 0
indexPagesRedisData = 0
; how long to cache a model matched to a country (mins)
modelsByCountryCacheExpiryMins = 5
modelsByCountryCodes = uk,ua,es
[users]
[meta]
; csv or xslx spreadsheet containing the meta
file = meta.csv
; to specify author rules files start the key with 'author'
; read in author rules from a file:
authorMain = authorMain.csv
; read in all author rule files from a folder:
author = meta
; if set to true the meta rule must contain exactly all the same params/values as the requested url
; by default the requested urls query args must match the meta rule but the requested url can contain extra
queryExactMatchOnly = true
; allows use of query args like ethnicity=white for a keyword search instead of needing to specify kwethnicity=white
; since kw* will perform a keyword search. meta rules should contain the requested url format ala ?ethnicity=white
queryArgKeywordMap = ethnicity,toys
AVOS=/home/webroot/www/avos.master.com/avos/bin
LOGS=/home/webroot/www/avos.master.com/avos/logs
PHP=/usr/bin/php
CRON=cron.php
* * * * * cd $AVOS && $PHP schedule.php minute >> $LOGS/schedule.out 2>&1
* * * * * cd $AVOS && $PHP schedule.php minute status >> $LOGS/schedule.out 2>&1
* * * * * cd $AVOS && $PHP schedule.php minute categories >> $LOGS/schedule.out 2>&1
* * * * * cd $AVOS && $PHP schedule.php minute streamate >> $LOGS/schedule.out 2>&1
*/15 * * * * cd $AVOS && $PHP schedule.php 15minutes >> $LOGS/schedule.out 2>&1
13 * * * * cd $AVOS && $PHP schedule.php hour >> $LOGS/schedule.out 2>&1
0 14 * * * cd $AVOS && $PHP schedule.php day >> $LOGS/schedule.out 2>&1
0 12 2 * * cd $AVOS && $PHP schedule.php month >> $LOGS/schedule.out 2>&1
[cron]
avosPaths = '/home/$user/www/$domain/avos'
domains/main = avos.master.com
domains/satellite = mysite1.com,mysite2.com,mysite3.com
main/minute = stats,photos,actions,popular
main/minute/categories = categories
main/minute/status = load,status BongaCams,status Chaturbate,status StripChat,status Streamray,status CamSoda,status Flirt4Free,status LiveJasmin,status Cam4
main/minute/streamate = status Streamate
main/15minutes = logs,import,servers,summary
main/hour = publish,scrape
main/day = backups,sitemaps,tags,purge,purgehistory
main/month = purgemonthly
satellite/minute = categories,actions,popular
satellite/15minutes = logs,import
satellite/hour = publish
satellite/day = backups,sitemaps