From 3d642971c0cb6b2a57405b60aec4b24cac8f214e Mon Sep 17 00:00:00 2001 From: Joseph Date: Sun, 21 Feb 2021 12:30:01 +0000 Subject: [PATCH] [FirefoxAddonsBridge] Add bridge (#1952) --- bridges/FirefoxAddonsBridge.php | 90 +++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 bridges/FirefoxAddonsBridge.php diff --git a/bridges/FirefoxAddonsBridge.php b/bridges/FirefoxAddonsBridge.php new file mode 100644 index 00000000..d9803b74 --- /dev/null +++ b/bridges/FirefoxAddonsBridge.php @@ -0,0 +1,90 @@ + array( + 'name' => 'Add-on ID', + 'type' => 'text', + 'required' => true, + 'exampleValue' => 'save-to-the-wayback-machine', + ) + ) + ); + + const CACHE_TIMEOUT = 3600; + + private $feedName = ''; + private $releaseDateRegex = '/Released ([\w, ]+) - ([\w. ]+)/'; + private $xpiFileRegex = '/([A-Za-z0-9_.-]+)\.xpi$/'; + private $outgoingRegex = '/https:\/\/outgoing.prod.mozaws.net\/v1\/(?:[A-z0-9]+)\//'; + + public function collectData() { + $html = getSimpleHTMLDOM($this->getURI()) + or returnServerError('Could not request: ' . $this->getURI()); + + $this->feedName = $html->find('h1[class="AddonTitle"] > a', 0)->innertext; + $author = $html->find('span.AddonTitle-author > a', 0)->plaintext; + + foreach ($html->find('div.AddonVersionCard-content') as $div) { + $item = array(); + + $item['title'] = $div->find('h2.AddonVersionCard-version', 0)->plaintext; + $item['uri'] = $this->getURI(); + $item['author'] = $author; + + if (preg_match($this->releaseDateRegex, $div->find('div.AddonVersionCard-fileInfo', 0)->plaintext, $match)) { + $item['timestamp'] = $match[1]; + $size = $match[2]; + } + + $compatibility = $div->find('div.AddonVersionCard-compatibility', 0)->plaintext; + $license = $div->find('p.AddonVersionCard-license', 0)->innertext; + $downloadlink = $div->find('a.InstallButtonWrapper-download-link', 0)->href; + $releaseNotes = $this->removeOutgoinglink($div->find('div.AddonVersionCard-releaseNotes', 0)); + + if (preg_match($this->xpiFileRegex, $downloadlink, $match)) { + $xpiFilename = $match[0]; + } + + $item['content'] = <<Release Notes +

{$releaseNotes}

+Compatibility +

{$compatibility}

+License +

{$license}

+Download +

{$xpiFilename} ($size)

+EOD; + + $this->items[] = $item; + } + } + + public function getURI() { + if (!is_null($this->getInput('id'))) { + return self::URI . 'en-US/firefox/addon/' . $this->getInput('id') . '/versions/'; + } + + return parent::getURI(); + } + + public function getName() { + if (!empty($this->feedName)) { + return $this->feedName . ' - Firefox Add-on'; + } + + return parent::getName(); + } + + private function removeOutgoinglink($html) { + foreach ($html->find('a') as $a) { + $a->href = urldecode(preg_replace($this->outgoingRegex, '', $a->href)); + } + + return $html->innertext; + } +}