From 68cf6fc06440ef88970f9c7d1c0d5cd13cc22ec6 Mon Sep 17 00:00:00 2001 From: Rogiel Sulzbach Date: Sun, 23 Nov 2014 15:18:58 -0200 Subject: [PATCH] Implements namespaces and spl autoloading --- Adapter/Pre_Orlydb_Adapter.php | 72 ------ Adapter/Pre_ScnSrc_Adapter.php | 122 ---------- Examples/Example_AlternativeAdapter.php | 27 --- Examples/Example_SimpleSearch.php | 26 --- Examples/Example_TVShowHelper.php | 35 --- PreDatabase_Library.php | 284 ------------------------ autoload.php | 67 ++++++ examples/AlternativeAdapter.php | 69 ++++++ examples/SimpleSearch.php | 42 ++++ examples/TVShowSearchHelper.php | 52 +++++ src/Adapter/Adapter.php | 53 +++++ src/Adapter/OrlyDB.php | 101 +++++++++ src/PreDB.php | 89 ++++++++ src/Release.php | 204 +++++++++++++++++ src/Search/Helper.php | 49 ++++ src/Search/TVShow.php | 125 +++++++++++ 16 files changed, 851 insertions(+), 566 deletions(-) delete mode 100644 Adapter/Pre_Orlydb_Adapter.php delete mode 100644 Adapter/Pre_ScnSrc_Adapter.php delete mode 100644 Examples/Example_AlternativeAdapter.php delete mode 100644 Examples/Example_SimpleSearch.php delete mode 100644 Examples/Example_TVShowHelper.php delete mode 100755 PreDatabase_Library.php create mode 100644 autoload.php create mode 100644 examples/AlternativeAdapter.php create mode 100644 examples/SimpleSearch.php create mode 100644 examples/TVShowSearchHelper.php create mode 100644 src/Adapter/Adapter.php create mode 100644 src/Adapter/OrlyDB.php create mode 100644 src/PreDB.php create mode 100644 src/Release.php create mode 100644 src/Search/Helper.php create mode 100644 src/Search/TVShow.php diff --git a/Adapter/Pre_Orlydb_Adapter.php b/Adapter/Pre_Orlydb_Adapter.php deleted file mode 100644 index d433417..0000000 --- a/Adapter/Pre_Orlydb_Adapter.php +++ /dev/null @@ -1,72 +0,0 @@ -. -* -* predb is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* predb is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with predb. If not, see . -*/ - -/** -* Adapter implementation for http://orlydb.com/ -* @author Rogiel -* @since 1.0 -*/ -class Pre_Orlydb_Adapter implements Pre_Adapter { - public function latest() { - $html = file_get_contents("http://orlydb.com/1"); - return $this->parseList($html); - } - - public function search($release) { - $html = file_get_contents("http://orlydb.com/?q=" . urlencode($release)); - return $this->parseList($html); - } - - private function parseList($html) { - $dom = new DomDocument(); - $result = @$dom->loadHTML($html); //ignore parse errors - $xpath = new DomXPath($dom); - - $i = 0; - while (true) { - $i ++; - $node = $xpath->query("/html/body/div/div[2]/div[" . $i . "]/span"); - if ($node->length == 0) - break; - $pres[] = $this->parseRelease($node); - } - return $pres; - } - - /** - * @param DOMNodeList $node - */ - private function parseRelease($node) { - $extra = $node->item(3)->nodeValue; - if (strlen($extra)) { - list ($size, $files) = explode("|", $extra); - $size = trim($size); - $files = trim($files); - } - $entry = new Pre_Release(); - $entry->release = $node->item(2)->nodeValue; - $entry->type = $node->item(1)->nodeValue; - $entry->date = strtotime($node->item(0)->nodeValue); - $entry->size = (intval($size)) * 1024 * 1024; //as bytes - $entry->files = intval($files); - $entry->nuke = $node->item(4)->nodeValue; - - return $entry; - } -} -?> \ No newline at end of file diff --git a/Adapter/Pre_ScnSrc_Adapter.php b/Adapter/Pre_ScnSrc_Adapter.php deleted file mode 100644 index a0ad58d..0000000 --- a/Adapter/Pre_ScnSrc_Adapter.php +++ /dev/null @@ -1,122 +0,0 @@ -. -* -* predb is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* predb is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with predb. If not, see . -*/ - -/** - * Adapter implementation for http://pre.scnsrc.net/ - * @author Rogiel - * @since 1.0 - */ -class Pre_ScnSrc_Adapter implements Pre_Adapter { - public function latest() { - $html = file_get_contents("http://pre.scnsrc.net/index.php"); - return $this->parseList($html); - } - - public function search($release) { - $html = $this->download( - "http://pre.corrupt-net.org/search.php?search=" . $release); - return $this->parseList($html); - } - - private function parseList($html) { - - $dom = new DomDocument(); - $result = @$dom->loadHTML($html); //ignore parse errors - $xpath = new DomXPath($dom); - - $i = 0; - while (true) { - $i ++; - ///html/body/table/tbody/tr[3] - $node = $xpath->query( - "/html/body/table/tr[" . $i . "]/td"); - if ($node->length == 0) { - //die("empty!"); - break; - } - $pres[] = &$this->parseRelease($node); - } - return $pres; - } - - /** - * @param DOMNodeList $node - */ - private function parseRelease($node) { - // $extra = $node->item(3)->nodeValue; - // if (strlen($extra)) { - // list ($size, $files) = explode("|", $extra); - // $size = trim($size); - // $files = trim($files); - // } - $entry = &new Pre_Release(); - $entry->release = $node->item(1)->nodeValue; - $entry->type = $node->item(0)->nodeValue; - if ($node->length == 3) { - $entry->date = strtotime(substr($node->item(2)->nodeValue, 4)) + - $vbulletin->options['release_time_offset']; - } else { - $entry->size = (intval($node->item(2)->nodeValue)) * 1024 * - 1024; //as bytes - $entry->files = intval($files); - } - - return $entry; - } - - private function download($url) { - $options = array( - CURLOPT_RETURNTRANSFER => true, // return web page - CURLOPT_HEADER => false, // don't return headers - CURLOPT_FOLLOWLOCATION => true, // follow redirects - CURLOPT_HEADER => array( - 'Host: pre.corrupt-net.org', - //'Accept: text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8', - 'User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.10 (maverick) Firefox/3.6.15', - 'Accept-Language: en-us,en;q=0.5', - 'Accept-Encoding: gzip,deflate', - 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7', - 'Keep-Alive: 115', - 'Connection: keep-alive', - 'Cache-Control: max-age=0'), - //CURLOPT_USERAGENT => "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.10 (maverick) Firefox/3.6.15", // who am i - //CURLOPT_AUTOREFERER => true, // set referer on redirect - CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect - CURLOPT_TIMEOUT => 120, // timeout on response - CURLOPT_MAXREDIRS => 10); // stop after 10 redirects - - - $ch = curl_init($url); - curl_setopt_array($ch, $options); - $content = curl_exec($ch); - $err = curl_errno($ch); - $errmsg = curl_error($ch); - $header = curl_getinfo($ch); - curl_close($ch); - - $header['errno'] = $err; - $header['errmsg'] = $errmsg; - $header['content'] = $content; - - print_r($header); - die(); - return $content; - } -} - -?> \ No newline at end of file diff --git a/Examples/Example_AlternativeAdapter.php b/Examples/Example_AlternativeAdapter.php deleted file mode 100644 index 826c6d0..0000000 --- a/Examples/Example_AlternativeAdapter.php +++ /dev/null @@ -1,27 +0,0 @@ -. -* -* predb is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* predb is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with predb. If not, see . -*/ - -// This example does a simple search for an pre release - -require_once '../PreDatabase_Library.php'; -require_once '../Adapter/Pre_ScnSrc_Adapter.php'; - -$db = new Pre_DB(new Pre_ScnSrc_Adapter()); -print_r($db->search("Microsoft Windows")); - -?> \ No newline at end of file diff --git a/Examples/Example_SimpleSearch.php b/Examples/Example_SimpleSearch.php deleted file mode 100644 index ed05934..0000000 --- a/Examples/Example_SimpleSearch.php +++ /dev/null @@ -1,26 +0,0 @@ -. -* -* predb is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* predb is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with predb. If not, see . -*/ - -// This example does a simple search for an pre release - -require_once '../PreDatabase_Library.php'; - -$db = new Pre_DB(); -print_r($db->search("Microsoft Windows")); - -?> \ No newline at end of file diff --git a/Examples/Example_TVShowHelper.php b/Examples/Example_TVShowHelper.php deleted file mode 100644 index 51205f6..0000000 --- a/Examples/Example_TVShowHelper.php +++ /dev/null @@ -1,35 +0,0 @@ -. -* -* predb is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* predb is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with predb. If not, see . -*/ - -// This example used the Pre_TVShow_SearchHelper to search an given -// episode of an TVShow. It can be used to filter data returned. - -require_once '../PreDatabase_Library.php'; - -$db = new Pre_DB(); - -// Show: True Blood -// Season: 4 -// Episode 1 -print_r($db->search(new Pre_TVShow_SearchHelper( - "true blood", // the tv show name - 4, // the season - 1 // the episode -))); - -?> \ No newline at end of file diff --git a/PreDatabase_Library.php b/PreDatabase_Library.php deleted file mode 100755 index 1859e93..0000000 --- a/PreDatabase_Library.php +++ /dev/null @@ -1,284 +0,0 @@ -. -* -* predb is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* predb is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with predb. If not, see . -*/ - -/** - * The pre database communication class. All operations are performed trough this class. - * @author Rogiel - * @since 1.0 - */ -class Pre_DB { - /** - * The Pre_Adapter implementation - * @var Pre_Adapter - */ - private $adapter; - - /** - * Creates a new instance - * @param Pre_Adapter $adapter the adapter to use. If none is provided an default is used. - */ - public function __construct($adapter = null) { - if ($adapter == null) { - require_once 'Adapter/Pre_Orlydb_Adapter.php'; - $adapter = new Pre_Orlydb_Adapter(); - } - $this->adapter = $adapter; - } - - /** - * Searches the pre database for certain releases - * @param string, Pre_SearchHelper $query the query - */ - public function search($query) { - if ($query instanceof Pre_SearchHelper) { - $query = $query->getSearchQuery(); - } - return $this->adapter->search($query); - } - - /** - * Searches the pre database for an certain release - * @param string $release the release name - * @return Pre_Release - */ - public function get($release) { - $releases = $this->adapter->search($release); - return predb_find_suitable_release($release, $releases); - } - - /** - * Retrieve the latest pre entries from the database - */ - public function latest() { - return $this->adapter->latest(); - } -} - -/** - * Pre entry - * @author @author Rogiel - * @since 1.0 - */ -class Pre_Release { - /** - * @var string - */ - var $release; - /** - * @var string - */ - var $type; - /** - * @var int - */ - var $date; - /** - * @var int - */ - var $size; - /** - * @var int - */ - var $files; - /** - * @var string - */ - var $nuke; - - /** - * @return the $release - */ - public function getRelease() { - return $this->release; - } - - /** - * @return the $date - */ - public function getDate() { - return $this->date; - } - - /** - * @return the $size - */ - public function getSize() { - return $this->size; - } - - /** - * @return the $files - */ - public function getFiles() { - return $this->files; - } - - /** - * @return the $nuke - */ - public function getNuke() { - return $this->nuke; - } - - /** - * @param string $release - */ - public function setRelease($release) { - $this->release = $release; - } - - /** - * @param int $date - */ - public function setDate($date) { - $this->date = $date; - } - - /** - * @param int $size - */ - public function setSize($size) { - $this->size = $size; - } - - /** - * @param int $files - */ - public function setFiles($files) { - $this->files = $files; - } - - /** - * @param string $nuke - */ - public function setNuke($nuke) { - $this->nuke = $nuke; - } -} - -/** - * This is an search helper. It assists the creation of queries that will be used to find an given release. - * @author Rogiel - * @since 1.0 - */ -interface Pre_SearchHelper { - function getSearchQuery(); -} - -/** - * This Pre_SearchHelper asists searching for TVShow releases - * @author Rogiel - * @since 1.0 - */ -class Pre_TVShow_SearchHelper implements Pre_SearchHelper { - private $name; - private $season = null; - private $episode = null; - - public function __construct($name, $season = null, $episode = null) { - $this->name = $name; - $this->season = $season; - $this->episode = $episode; - } - - public function getSearchQuery() { - $query = $this->name; - if ($this->season != null) { - $query .= " S" . predb_padding_zero($this->season); - if ($this->episode != null) - $query .= "E" . predb_padding_zero($this->episode); - } - return str_replace(" ", ".", $query); - } - - /** - * @return the $name - */ - public function getName() { - return $this->name; - } - - /** - * @param string $name - * @return Pre_TVShow_SearchHelper this instance - */ - public function setName($name) { - $this->name = $name; - return $this; - } - - /** - * @return the $season - */ - public function getSeason() { - return $this->season; - } - - /** - * @param int $season - * @return Pre_TVShow_SearchHelper this instance - */ - public function setSeason($season) { - $this->season = $season; - return $this; - } - - /** - * @return the $episode - */ - public function getEpisode() { - return $this->episode; - } - - /** - * @param int $episode - * @return Pre_TVShow_SearchHelper this instance - */ - public function setEpisode($episode) { - $this->episode = $episode; - return $this; - } -} - -/** - * The pre adapter interface - * @author Rogiel - * @since 1.0 - */ -interface Pre_Adapter { - /** - * Implements the underlying search method - * @param string $release - */ - function search($release); - - /** - * Implements the underlying latest method - */ - function latest(); -} - -/** - * @param int $number - * @return the number with padded zeros - */ -function predb_padding_zero($number) { - if ($number < 10) - return "0" . $number; - return $number; -} diff --git a/autoload.php b/autoload.php new file mode 100644 index 0000000..4cda954 --- /dev/null +++ b/autoload.php @@ -0,0 +1,67 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +spl_autoload_register( + function ($class) { + // the package namespace + $ns = 'PreDB'; + + // what prefixes should be recognized? + $prefixes = array( + "{$ns}\\" => array( + __DIR__ . '/src' + ) + ); + + // go through the prefixes + foreach ($prefixes as $prefix => $dirs) { + // does the requested class match the namespace prefix? + $prefix_len = strlen($prefix); + if (substr($class, 0, $prefix_len) !== $prefix) { + continue; + } + + // strip the prefix off the class + $class = substr($class, $prefix_len); + + // a partial filename + $part = str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php'; + + // go through the directories to find classes + foreach ($dirs as $dir) { + $dir = str_replace('/', DIRECTORY_SEPARATOR, $dir); + $file = $dir . DIRECTORY_SEPARATOR . $part; + if (is_readable($file)) { + require $file; + return; + } + } + } + }); diff --git a/examples/AlternativeAdapter.php b/examples/AlternativeAdapter.php new file mode 100644 index 0000000..ee067cd --- /dev/null +++ b/examples/AlternativeAdapter.php @@ -0,0 +1,69 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +namespace PreDB\Example; + +require_once __DIR__ . '/../autoload.php'; + +use PreDB\PreDB; +use PreDB\Release; + +// This example does a simple search for an pre release + +/** + * Implements a custom adpater + */ +class MyCustomAdapter implements \PreDB\Adapter\Adapter { + + /** + * Implements the underlying search method + * + * @param string $release + */ + function search($release) { + return NULL; // no search allowed + } + + /** + * Implements the underlying latest method + */ + function latest() { + return [ + new Release([ + 'release' => 'My.Awesome.Release-AWESOME', + 'size' => 1 * 1024 + ]) + ]; + } +} + +$db = new PreDB(new MyCustomAdapter()); +print_r($db->latest()); +?> \ No newline at end of file diff --git a/examples/SimpleSearch.php b/examples/SimpleSearch.php new file mode 100644 index 0000000..f5d046d --- /dev/null +++ b/examples/SimpleSearch.php @@ -0,0 +1,42 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +namespace PreDB\Example; + +require_once __DIR__ . '/../autoload.php'; + +use PreDB\PreDB; + +// This example does a simple search for an pre release +$db = new PreDB(); +print_r($db->search("Microsoft Windows")); + +?> \ No newline at end of file diff --git a/examples/TVShowSearchHelper.php b/examples/TVShowSearchHelper.php new file mode 100644 index 0000000..daf251f --- /dev/null +++ b/examples/TVShowSearchHelper.php @@ -0,0 +1,52 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// This example used the PreDB\Search\TVShow to search an given +// episode of an TVShow. It can be used to filter data returned. + +namespace PreDB\Example; + +require_once __DIR__ . '/../autoload.php'; +use PreDB\PreDB; +use PreDB\Search\TVShow as TVShowHelper; + +$db = new PreDB(); + +// Show: True Blood +// Season: 4 +// Episode 1 +print_r($db->search(new TVShowHelper( + "true blood", // the tv show name + 4, // the season + 1 // the episode +))); + +?> \ No newline at end of file diff --git a/src/Adapter/Adapter.php b/src/Adapter/Adapter.php new file mode 100644 index 0000000..5435a7f --- /dev/null +++ b/src/Adapter/Adapter.php @@ -0,0 +1,53 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +namespace PreDB\Adapter; + +/** + * The pre adapter interface + * + * @author Rogiel + * @since 1.0 + */ +interface Adapter { + + /** + * Implements the underlying search method + * + * @param string $release + */ + function search($release); + + /** + * Implements the underlying latest method + */ + function latest(); +} diff --git a/src/Adapter/OrlyDB.php b/src/Adapter/OrlyDB.php new file mode 100644 index 0000000..198e0a8 --- /dev/null +++ b/src/Adapter/OrlyDB.php @@ -0,0 +1,101 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +namespace PreDB\Adapter; + +use PreDB\Release; + +use DOMDocument; +use DOMXPath; + +use DateTime; +use DateTimeZone; + +/** + * Adapter implementation for http://orlydb.com/ + * + * @author Rogiel + * @since 1.0 + * + */ +class OrlyDB implements Adapter { + + public function latest() { + $html = file_get_contents("http://orlydb.com/1"); + return $this->parseList($html); + } + + public function search($release) { + $html = file_get_contents("http://orlydb.com/?q=" . urlencode($release)); + return $this->parseList($html); + } + + private function parseList($html) { + $dom = new DOMDocument(); + @$dom->loadHTML($html); // ignore parse errors + $xpath = new DOMXPath($dom); + + $i = 0; + + $pres = array(); + while (true) { + $i ++; + $node = $xpath->query("/html/body/div/div[2]/div[" . $i . "]/span"); + if ($node->length == 0) + break; + $pres[] = $this->parseRelease($node); + } + return $pres; + } + + /** + * + * @param DOMNodeList $node + */ + private function parseRelease($node) { + $extra = $node->item(3)->nodeValue; + if (strlen($extra)) { + list ($size, $files) = explode("|", $extra); + $size = trim($size); + $files = trim($files); + } + $entry = new Release(); + $entry->release = $node->item(2)->nodeValue; + $entry->type = $node->item(1)->nodeValue; + $entry->date = new DateTime($node->item(0)->nodeValue, new DateTimeZone('UTC')); + $entry->size = (intval($size)) * 1024 * 1024; // as bytes + $entry->files = intval($files); + $entry->nuke = $node->item(4)->nodeValue; + + return $entry; + } +} +?> \ No newline at end of file diff --git a/src/PreDB.php b/src/PreDB.php new file mode 100644 index 0000000..26abc6d --- /dev/null +++ b/src/PreDB.php @@ -0,0 +1,89 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +namespace PreDB; + +use PreDB\Adapter\Adapter; +use PreDB\Search\Helper as SearchHelper; + +class PreDB { + /** + * The Pre_Adapter implementation + * + * @var Adapter + */ + private $adapter; + + /** + * Creates a new instance + * + * @param Adapter $adapter + * the adapter to use. If none is provided an default is used. + */ + public function __construct($adapter = null) { + if ($adapter == null) { + $adapter = new \PreDB\Adapter\OrlyDB(); + } + $this->adapter = $adapter; + } + + /** + * Searches the pre database for certain releases + * + * @param + * string, SearchHelper $query the query + */ + public function search($query) { + if ($query instanceof SearchHelper) { + $query = $query->getSearchQuery(); + } + return $this->adapter->search($query); + } + + /** + * Searches the pre database for an certain release + * + * @param string $release + * the release name + * @return Pre_Release + */ + public function get($release) { + $releases = $this->adapter->search($release); + return predb_find_suitable_release($release, $releases); + } + + /** + * Retrieve the latest pre entries from the database + */ + public function latest() { + return $this->adapter->latest(); + } +} \ No newline at end of file diff --git a/src/Release.php b/src/Release.php new file mode 100644 index 0000000..e446b9b --- /dev/null +++ b/src/Release.php @@ -0,0 +1,204 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +namespace PreDB; + +use DateTime; + +/** + * Pre entry + * + * @author @author Rogiel + * @since 1.0 + */ +class Release { + /** + * + * @var string + */ + var $release; + + /** + * + * @var string + */ + var $type; + + /** + * + * @var DateTime + */ + var $date; + + /** + * + * @var int + */ + var $size; + + /** + * + * @var int + */ + var $files; + + /** + * + * @var string + */ + var $nuke; + + /** + * Creates a new release instance. + * + * If $release is a string, it is set as the release name + * If $release is an arraym the following keys are set to the release object model: release, type, date, size, files and nuke. + * + * @param string $release + * the release argument + */ + public function __construct($release = NULL) { + if (is_string($release)) { + $this->release = $release; + } else if (is_array($release)) { + $this->release = (isset($release['release']) ? $release['release'] : NULL); + $this->type = (isset($release['type']) ? $release['type'] : NULL); + $this->date = (isset($release['date']) ? $release['date'] : NULL); + $this->size = (isset($release['size']) ? $release['size'] : NULL); + $this->files = (isset($release['files']) ? $release['files'] : NULL); + $this->nuke = (isset($release['nuke']) ? $release['nuke'] : NULL); + } + } + + /** + * + * @return the string + */ + public function getRelease() { + return $this->release; + } + + /** + * + * @param string $release + */ + public function setRelease($release) { + $this->release = $release; + } + + /** + * + * @return the string + */ + public function getType() { + return $this->type; + } + + /** + * + * @param string $type + */ + public function setType($type) { + $this->type = $type; + } + + /** + * + * @return the DateTime + */ + public function getDate() { + return $this->date; + } + + /** + * + * @param DateTime $date + */ + public function setDate(DateTime $date) { + $this->date = $date; + } + + /** + * + * @return the int + */ + public function getSize() { + return $this->size; + } + + /** + * + * @param int $size + */ + public function setSize($size) { + $this->size = $size; + } + + /** + * + * @return the int + */ + public function getFiles() { + return $this->files; + } + + /** + * + * @param int $files + */ + public function setFiles($files) { + $this->files = $files; + } + + /** + * + * @return the string + */ + public function getNuke() { + return $this->nuke; + } + + /** + * + * @return bool true if the released is nuked + */ + public function isNuked() { + return $this->nuke != NULL; + } + + /** + * + * @param string $nuke + */ + public function setNuke($nuke) { + $this->nuke = $nuke; + } +} \ No newline at end of file diff --git a/src/Search/Helper.php b/src/Search/Helper.php new file mode 100644 index 0000000..1b7673f --- /dev/null +++ b/src/Search/Helper.php @@ -0,0 +1,49 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +namespace PreDB\Search; + +/** + * This is an search helper. + * It assists the creation of queries that will be used to find an given release. + * + * @author Rogiel + * @since 1.0 + */ +interface Helper { + + /** + * Returns a search query that will filter and or specialize the results + * + * @return string + */ + function getSearchQuery(); +} \ No newline at end of file diff --git a/src/Search/TVShow.php b/src/Search/TVShow.php new file mode 100644 index 0000000..4b478e2 --- /dev/null +++ b/src/Search/TVShow.php @@ -0,0 +1,125 @@ + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Rogiel Sulzbach. + * 4. Neither the name of the nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ROGIEL SULZBACH ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL ROGIEL SULZBACH BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +namespace PreDB\Search; + +/** + * This Helper asists searching for TVShow releases + * + * @author Rogiel + * @since 1.0 + */ +class TVShow implements Helper { + private $name; + private $season = null; + private $episode = null; + + public function __construct($name, $season = null, $episode = null) { + $this->name = $name; + $this->season = $season; + $this->episode = $episode; + } + + public function getSearchQuery() { + $query = $this->name; + if ($this->season != null) { + $query .= " S" . self::padZero($this->season); + if ($this->episode != null) + $query .= "E" . self::padZero($this->episode); + } + return str_replace(" ", ".", $query); + } + + /** + * + * @return the $name + */ + public function getName() { + return $this->name; + } + + /** + * + * @param string $name + * @return TVShow this instance + */ + public function setName($name) { + $this->name = $name; + return $this; + } + + /** + * + * @return the $season + */ + public function getSeason() { + return $this->season; + } + + /** + * + * @param int $season + * @return TVShow this instance + */ + public function setSeason($season) { + $this->season = $season; + return $this; + } + + /** + * + * @return the $episode + */ + public function getEpisode() { + return $this->episode; + } + + /** + * + * @param int $episode + * @return TVShow this instance + */ + public function setEpisode($episode) { + $this->episode = $episode; + return $this; + } + + /** + * + * @param int $number + * @return the number with padded zeros + */ + private static function padZero($number) { + if ($number < 10) + return "0" . $number; + return $number; + } +} \ No newline at end of file