diff options
author | 2022-06-09 10:56:52 -0400 | |
---|---|---|
committer | 2022-06-09 16:56:52 +0200 | |
commit | 3927ecd8220fca3e52ddc2ba42267e258b6a2a5d (patch) | |
tree | e90f9d5bf9c73c505fe3d792a5f56fb10614cded | |
parent | 1b0a6f281386d12f70b094193d6bf15dcf61729b (diff) | |
download | rss-bridge-3927ecd8220fca3e52ddc2ba42267e258b6a2a5d.tar.gz rss-bridge-3927ecd8220fca3e52ddc2ba42267e258b6a2a5d.tar.zst rss-bridge-3927ecd8220fca3e52ddc2ba42267e258b6a2a5d.zip |
[UsenixBridge] Add bridge (#2800)
-rw-r--r-- | bridges/UsenixBridge.php | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/bridges/UsenixBridge.php b/bridges/UsenixBridge.php new file mode 100644 index 00000000..4f785a0e --- /dev/null +++ b/bridges/UsenixBridge.php @@ -0,0 +1,68 @@ +<?php +declare(strict_types=1); + +final class UsenixBridge extends BridgeAbstract +{ + const NAME = 'USENIX'; + const URI = 'https://www.usenix.org/publications'; + const DESCRIPTION = 'Digital publications from USENIX (usenix.org)'; + const MAINTAINER = 'dvikan'; + const PARAMETERS = [ + 'USENIX ;login:' => [ + ], + ]; + + public function collectData() + { + if ($this->queriedContext === 'USENIX ;login:') { + $this->collectLoginOnlineItems(); + return; + } + returnClientError('Illegal Context'); + } + + private function collectLoginOnlineItems(): void + { + $url = 'https://www.usenix.org/publications/loginonline'; + $dom = getSimpleHTMLDOMCached($url); + $items = $dom->find('div.view-content > div'); + + foreach ($items as $item) { + $title = $item->find('.views-field-title > span', 0); + $author = $item->find('.views-field-pseudo-author-list > span.field-content', 0); + $relativeUrl = $item->find('.views-field-nothing-1 > span > a', 0); + $uri = sprintf('https://www.usenix.org%s', $relativeUrl->href); + // June 2, 2022 + $createdAt = $item->find('div.views-field-field-lv2-publication-date > div > span', 0); + + $item = [ + 'title' => $title->innertext, + 'author' => strstr($author->plaintext, ',', true) ?: $author->plaintext, + 'uri' => $uri, + 'timestamp' => $createdAt->innertext, + ]; + + $this->items[] = array_merge($item, $this->getItemContent($uri)); + } + } + + private function getItemContent(string $uri) : array + { + $html = getSimpleHTMLDOMCached($uri); + $content = $html->find('.paragraphs-items-full', 0)->innertext; + $extra = $html->find('fieldset', 0); + if (!empty($extra)) { + $content .= $extra->innertext; + } + + $tags = []; + foreach($html->find('.field-name-field-lv2-tags div.field-item') as $tag) { + $tags[] = $tag->plaintext; + } + + return [ + 'content' => $content, + 'categories' => $tags + ]; + } +} |