<?php class StravaBridge extends BridgeAbstract { const NAME = 'Strava Bridge'; const DESCRIPTION = "Returns an athlete's recent activities"; const URI = 'https://www.strava.com'; const PARAMETERS = [ [ 'athleteID' => [ 'name' => 'athleteID', 'required' => true ] ], ]; public function detectParameters($url) { if (preg_match('/strava\.com\/athletes\/([\d]+)/', $url, $matches) > 0) { return [ 'athleteID' => $matches[1] ]; } return null; } public function collectData() { $athleteID = $this->getInput('athleteID'); $dom = getSimpleHTMLDOM(self::URI . '/athletes/' . $athleteID); $scriptRegex = "/data-react-props='(.*?)'/"; preg_match($scriptRegex, $dom, $matches) or returnServerError('Could not find json'); $jsonData = json_decode(html_entity_decode($matches[1])); $this->feedName = $jsonData->athlete->name . "'s Recent Activities"; $this->iconURL = $jsonData->athlete->avatarUrl; foreach ($jsonData->recentActivities as $activity) { $item = []; $item['title'] = $activity->name . ' (' . $activity->detailedType . ')'; $item['author'] = $jsonData->athlete->name; $item['uri'] = self::URI . '/activities/' . $activity->id; $item['timestamp'] = $activity->startDateLocal; $content = '<b>Distance:</b> ' . $activity->distance . '<br><b>Elev Gain:</b> ' . $activity->elevation . '<br><b>Time:</b> ' . $activity->movingTime . '<br><br>'; foreach ($activity->images as $image) { $src = $image->squareSrc; if (empty($src)) { $src = $image->defaultSrc; } $content .= '<img src="' . $src . '">'; } $item['content'] = $content; $item['enclosures'][] = $item['uri'] . '/export_gpx'; $this->items[] = $item; } } public function getName() { if (empty($this->feedName)) { return parent::getName(); } else { return $this->feedName; } } public function getIcon() { if (empty($this->iconURL)) { return parent::getIcon(); } else { return $this->iconURL; } } }