mirror of
https://github.com/ad-aures/castopod.git
synced 2026-04-11 18:56:42 +02:00
feat: add analytics and unknown useragents
This commit is contained in:
parent
4651d01a84
commit
ec92e65aa4
44 changed files with 3333 additions and 1987 deletions
113
app/Controllers/Analytics.php
Normal file
113
app/Controllers/Analytics.php
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
<?php namespace App\Controllers;
|
||||
/**
|
||||
* Class Analytics
|
||||
* Creates Analytics controller
|
||||
* @copyright 2020 Podlibre
|
||||
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||
* @link https://castopod.org/
|
||||
*/
|
||||
|
||||
use CodeIgniter\Controller;
|
||||
|
||||
class Analytics extends Controller
|
||||
{
|
||||
function __construct()
|
||||
{
|
||||
$session = \Config\Services::session();
|
||||
$session->start();
|
||||
$db = \Config\Database::connect();
|
||||
$country = 'N/A';
|
||||
|
||||
// Finds country:
|
||||
if (!$session->has('country')) {
|
||||
try {
|
||||
$reader = new \GeoIp2\Database\Reader(
|
||||
WRITEPATH . 'uploads/GeoLite2-Country/GeoLite2-Country.mmdb'
|
||||
);
|
||||
$geoip = $reader->country($_SERVER['REMOTE_ADDR']);
|
||||
$country = $geoip->country->isoCode;
|
||||
} catch (\Exception $e) {
|
||||
// If things go wrong the show must go on and the user must be able to download the file
|
||||
}
|
||||
$session->set('country', $country);
|
||||
}
|
||||
|
||||
// Finds player:
|
||||
if (!$session->has('player')) {
|
||||
$playerName = '-unknown-';
|
||||
$error = '';
|
||||
|
||||
try {
|
||||
$useragent = $_SERVER['HTTP_USER_AGENT'];
|
||||
$jsonUserAgents = json_decode(
|
||||
file_get_contents(
|
||||
WRITEPATH . 'uploads/user-agents/src/user-agents.json'
|
||||
),
|
||||
true
|
||||
);
|
||||
|
||||
//Search for current HTTP_USER_AGENT in json file:
|
||||
foreach ($jsonUserAgents as $player) {
|
||||
foreach ($player['user_agents'] as $useragentsRegexp) {
|
||||
//Does the HTTP_USER_AGENT match this regexp:
|
||||
if (preg_match("#{$useragentsRegexp}#", $useragent)) {
|
||||
if (isset($player['bot'])) {
|
||||
//It’s a bot!
|
||||
$playerName = '-bot-';
|
||||
} else {
|
||||
//It isn’t a bot, we store device/os/app:
|
||||
$playerName =
|
||||
(isset($player['device'])
|
||||
? $player['device'] . '/'
|
||||
: '') .
|
||||
(isset($player['os'])
|
||||
? $player['os'] . '/'
|
||||
: '') .
|
||||
(isset($player['app'])
|
||||
? $player['app']
|
||||
: '?');
|
||||
}
|
||||
//We found it!
|
||||
break 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// If things go wrong the show must go on and the user must be able to download the file
|
||||
}
|
||||
if ($playerName == '-unknown-') {
|
||||
// Add to unknown list
|
||||
try {
|
||||
$procedureNameAUU = $db->prefixTable(
|
||||
'analytics_unknown_useragents'
|
||||
);
|
||||
$db->query("CALL $procedureNameAUU(?)", [$useragent]);
|
||||
} catch (\Exception $e) {
|
||||
// If things go wrong the show must go on and the user must be able to download the file
|
||||
}
|
||||
}
|
||||
$session->set('player', $playerName);
|
||||
}
|
||||
}
|
||||
|
||||
// Add one hit to this episode:
|
||||
public function hit($p_podcast_id, $p_episode_id, ...$filename)
|
||||
{
|
||||
$session = \Config\Services::session();
|
||||
$db = \Config\Database::connect();
|
||||
$procedureName = $db->prefixTable('analytics_podcasts');
|
||||
$p_country_code = $session->get('country');
|
||||
$p_player = $session->get('player');
|
||||
try {
|
||||
$db->query("CALL $procedureName(?,?,?,?);", [
|
||||
$p_podcast_id,
|
||||
$p_episode_id,
|
||||
$p_country_code,
|
||||
$p_player,
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
// If things go wrong the show must go on and the user must be able to download the file
|
||||
}
|
||||
return redirect()->to(media_url(implode('/', $filename)));
|
||||
}
|
||||
}
|
||||
|
|
@ -44,5 +44,56 @@ class BaseController extends Controller
|
|||
//--------------------------------------------------------------------
|
||||
// E.g.:
|
||||
// $this->session = \Config\Services::session();
|
||||
|
||||
$session = \Config\Services::session();
|
||||
$session->start();
|
||||
|
||||
// Defines country
|
||||
if (!$session->has('country')) {
|
||||
try {
|
||||
$reader = new \GeoIp2\Database\Reader(
|
||||
WRITEPATH . 'uploads/GeoLite2-Country/GeoLite2-Country.mmdb'
|
||||
);
|
||||
$geoip = $reader->country($_SERVER['REMOTE_ADDR']);
|
||||
$session->set('country', $geoip->country->isoCode);
|
||||
} catch (\Exception $e) {
|
||||
$session->set('country', 'N/A');
|
||||
}
|
||||
}
|
||||
// Defines browser
|
||||
if (!$session->has('browser')) {
|
||||
try {
|
||||
$whichbrowser = new \WhichBrowser\Parser(getallheaders());
|
||||
$session->set('browser', $whichbrowser->browser->name);
|
||||
} catch (\Exception $e) {
|
||||
$session->set('browser', 'Other');
|
||||
}
|
||||
}
|
||||
|
||||
// Defines referrer
|
||||
$newreferer = isset($_SERVER['HTTP_REFERER'])
|
||||
? parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)
|
||||
: '- Direct -';
|
||||
$newreferer =
|
||||
$newreferer == parse_url(current_url(false), PHP_URL_HOST)
|
||||
? '- Direct -'
|
||||
: $newreferer;
|
||||
if (!$session->has('referer') or $newreferer != '- Direct -') {
|
||||
$session->set('referer', $newreferer);
|
||||
}
|
||||
}
|
||||
|
||||
protected function stats($postcast_id)
|
||||
{
|
||||
$session = \Config\Services::session();
|
||||
$session->start();
|
||||
$db = \Config\Database::connect();
|
||||
$procedureName = $db->prefixTable('analytics_website');
|
||||
$db->query("call $procedureName(?,?,?,?)", [
|
||||
$postcast_id,
|
||||
$session->get('country'),
|
||||
$session->get('browser'),
|
||||
$session->get('referer'),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,6 +125,7 @@ class Episodes extends BaseController
|
|||
->first(),
|
||||
'episode' => $episode_model->where('slug', $episode_slug)->first(),
|
||||
];
|
||||
self::stats($data['podcast']->id);
|
||||
|
||||
return view('episodes/view.php', $data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ class Podcasts extends BaseController
|
|||
->where('podcast_id', $podcast->id)
|
||||
->findAll(),
|
||||
];
|
||||
self::stats($podcast->id);
|
||||
|
||||
return view('podcasts/view', $data);
|
||||
}
|
||||
|
|
|
|||
19
app/Controllers/UnknownUserAgents.php
Normal file
19
app/Controllers/UnknownUserAgents.php
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?php namespace App\Controllers;
|
||||
use CodeIgniter\Controller;
|
||||
|
||||
class UnknownUserAgents extends Controller
|
||||
{
|
||||
public function index($p_id = 0)
|
||||
{
|
||||
$model = new \App\Models\UnknownUserAgentsModel();
|
||||
|
||||
$data = [
|
||||
'useragents' => $model->getUserAgents($p_id),
|
||||
];
|
||||
|
||||
$this->response->setContentType('application/json');
|
||||
$this->response->setStatusCode(\CodeIgniter\HTTP\Response::HTTP_OK);
|
||||
|
||||
echo view('json/unknownuseragents', $data);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue