Файл: adultscript-2.0.3-pro/files/modules/video/components/rss.php
Строк: 214
<?php
defined('_VALID') or die('Restricted Acess!');
class VComponent_video_rss extends VModule_video
{
public function __construct()
{
parent::__construct();
}
public function render()
{
$args = $this->get_query(TRUE, 1);
$slug = $args['slug'];
$order = $args['order'];
$timeline = $args['timeline'];
$cat_id = 0;
if ($slug != '') {
$categories = $this->get_video_categories();
foreach ($categories as $category) {
if ($slug == $category['slug']) {
$cat_id = $category['cat_id'];
$name = $category['name'];
break;
}
}
if (!isset($cat_id)) {
VModule::load('404', true);
}
}
if (VCfg::get('video.rss_type') == 'simple') {
$videos = $this->get_rss_simple($order, $timeline, $cat_id);
} else {
$videos = $this->get_rss_complex($order, $timeline, $cat_id);
}
$site_name = VF::cfg_item('site_name');
header('Content-Type: text/xml');
ob_start();
print "<?xml version="1.0" encoding="utf-8" ?>n";
print "<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">n";
print "<channel>n";
print "<title>".htmlspecialchars($site_name, ENT_QUOTES, 'UTF-8')."</title>n";
print "<link>".BASE_URL."/</link>n";
print "<description>".htmlspecialchars(VF::cfg_item('meta_desc'))."</description>n";
print "<copyright>Copyright (c) 2009-".date('Y-')." by ".htmlspecialchars($site_name, ENT_QUOTES, 'UTF-8')." - All rights reserved.</copyright>n";
print "<pubDate>".date('r')."</pubDate>n";
print "<lastBuildDate>".date('r')."</lastBuildDate>n";
print "<language>en-us</language>n";
print "<image>n";
print "<url>".BASE_URL."/templates/".VF::cfg_item('template')."/images/logo.png</url>n";
print "<title>".htmlspecialchars($site_name, ENT_QUOTES, 'UTF-8')."</title>n";
print "<link>".BASE_URL."/</link>n";
print "</image>n";
foreach ($videos as $video) {
$link = BASE_URL.'/'.$video['video_id'].'/'.prepare_string($video['title'], true).'/';
$tags = explode(',', $video['tags']);
$count = count($tags)-1;
$tag_string = '';
foreach ($tags as $index => $tag) {
$tag = trim($tag);
$tag_string .= "<a href="".BASE_URL."/tag/".str_replace(' ', '-', $tag)."/">".$tag."</a> ";
if ($index !== $count) {
$tag_string .= ', ';
}
}
$categories = explode(',', $video['name']);
$slugs = explode(',', $video['slug']);
$count = count($categories)-1;
$cat_string = '';
foreach ($categories as $index => $name) {
$cat_string .= "<a href="".BASE_URL."/".$slugs[$index]."">".htmlspecialchars($name, ENT_QUOTES, 'UTF-8')."</a>";
if ($index !== $count) {
$cat_string .= ', ';
}
}
print "<item>n";
print " <title>".htmlspecialchars($video['title'], ENT_QUOTES, 'UTF-8')."</title>n";
print " <link>".$link."</link>n";
print " <guid>".$link."</guid>n";
print " <description>n";
print " <![CDATA[";
print "<img src="".MEDIA_URL."/videos/tmb/".path($video['video_id'])."/".$video['thumb'].".jpg" align="left" border="0" width="160" height="120" vspace="4" hspace="4" />
<br />
Category: ".$cat_string."<br />
Tags: ".$tag_string."<br />
Date: ".$video['add_date']."<br /></p>";
print " ]]>n";
print " </description>n";
print " <pubDate>".date('r', strtotime($video['add_date']))."</pubDate>n";
print "</item>n";
}
print "</channel>n";
print "</rss>";
ob_end_flush();
}
private function get_rss_simple($order, $timeline, $cat_id=0)
{
if ($cat_id !== 0) {
$sql = 'SELECT v.video_id, v.title, v.rating, v.rated_by, v.duration, v.thumb,
v.thumbs, v.total_views, v.add_date, u.username,
GROUP_CONCAT(DISTINCT c.slug) AS slug,
GROUP_CONCAT(DISTINCT c.name) AS name,
GROUP_CONCAT(DISTINCT t.name) AS tags
FROM #__video_category AS vc
LEFT JOIN #__video AS v ON (v.video_id = vc.video_id AND v.status = 1)
LEFT JOIN #__video_categories AS c ON (vc.cat_id = c.cat_id)
LEFT JOIN #__video_tags AS t ON (t.video_id = v.video_id)
LEFT JOIN #__user AS u ON (u.user_id = v.video_id)
WHERE vc.cat_id = '.$cat_id;
$sql_delim = ' AND';
} else {
$sql = 'SELECT v.video_id, v.title, v.rating, v.rated_by, v.duration, v.thumb,
v.thumbs, v.total_views, v.add_date, u.username,
GROUP_CONCAT(DISTINCT c.slug) AS slug,
GROUP_CONCAT(DISTINCT c.name) AS name,
GROUP_CONCAT(DISTINCT t.name) AS tags
FROM #__video AS v
LEFT JOIN #__video_category AS vc ON (vc.video_id = v.video_id)
LEFT JOIN #__video_categories AS c ON (vc.cat_id = c.cat_id)
LEFT JOIN #__video_tags AS t ON (t.video_id = v.video_id)
LEFT JOIN #__user AS u ON (u.user_id = v.video_id)
WHERE v.status = 1';
$sql_delim = ' AND';
}
switch ($timeline) {
case 'today':
$sql .= $sql_delim." DATE_FORMAT(v.view_date, '%y-%m-%d') = DATE_FORMAT(NOW(), '%y-%m-%d')";
break;
case 'yesterday':
$sql .= $sql_delim." DATE_FORMAT(v.view_date, '%y-%m-%d') = DATE_ADD(CURDATE(), INTERVAL -1 DAY)";
break;
case 'week':
break;
case 'month':
$sql .= $sql_delim." DATE_FORMAT(v.add_date, '%y-%m') = DATE_FORMAT(NOW(), '%y-%m')";
break;
case 'year':
$sql .= $sql_delim." DATE_FORMAT(v.add_date, '%y') = DATE_FORMAT(NOW(), '%y')";
break;
}
$sql .= $sql_delim." v.status = 1";
$sql .= ' GROUP BY v.video_id';
switch ($order) {
case 'watched':
$sql .= ' ORDER BY v.view_time DESC';
break;
case 'popular':
$sql .= ' ORDER BY v.total_views DESC';
break;
case 'rated':
$sql .= ' ORDER BY v.rating DESC';
break;
case 'discussed':
$sql .= ' ORDER BY v.total_comments DESC';
break;
case 'downloaded':
$sql .= ' ORDER BY v.total_downloads DESC';
break;
case 'longest':
$sql .= ' ORDER BY v.duration DESC';
break;
case 'recent':
default:
$sql .= ' ORDER BY v.add_time DESC';
break;
}
$sql .= ' LIMIT '.VF::cfg_item('module.video.rss_per_page');
$db = VF::factory('database');
$cache = VF::factory('cache');
if (!$videos = $cache->get($sql, 3600)) {
$videos = $db->get_rows($sql);
if ($db->affected_rows()) {
$cache->store($sql, $videos, 3600);
}
}
return $videos;
}
private function get_rss_complex($order, $timeline, $cat_id=0)
{
$host = VF::cfg_item('sphinx_host');
$port = VF::cfg_item('sphinx_port');
if (empty($host) OR empty($port)) {
new VException('Please set your sphinx search host and port!');
}
VF::load('sphinxapi.sphinxapi');
$sphinx = new SphinxClient();
$sphinx->SetServer($host, $port);
$sphinx->SetConnectTimeout(1);
$sphinx->SetFieldWeights(array('title' => 100, 'tags' => 70, 'description' => 30));
$sphinx->SetMatchMode(SPH_MATCH_EXTENDED2);
$sphinx->SetSortMode(SPH_SORT_RELEVANCE);
$sphinx->SetLimits(0, VF::cfg_item('module.video.rss_per_page'), 1000);
if ($timeline == 'today') {
$sphinx->SetFilterRange('add_time', strtotime('today'), time());
} elseif ($timeline == 'week') {
$sphinx->SetFilterRange('add_time', strtotime('-1 week'), time());
} elseif ($timeline == 'month') {
$sphinx->SetFilterRange('add_time', strtotime('-1 month'), time());
} elseif ($timeline == 'year') {
$sphinx->SetFilterRange('add_time', strtotime('-1 year'), time());
}
if ($order == 'relevance' ) {
$sphinx->SetSortMode(SPH_SORT_RELEVANCE);
} elseif ($order == 'recent') {
$sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'add_time');
} elseif ($order == 'views') {
$sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'total_views');
} elseif ($order == 'longest') {
$sphinx->SetSortMode(SPH_SORT_ATTR_DESC, 'duration');
}
if ($cat_id !== 0) {
$sphinx->SetFilter('categories', $cat_id);
}
$results = $sphinx->Query('', 'videos');
if (isset($results['matches']) && is_array($results['matches'])) {
$ids = implode(', ', array_keys($results['matches']));
$sql = 'SELECT v.video_id, v.title, v.rating, v.rated_by, v.duration, v.thumb,
v.thumbs, v.total_views, v.add_date, u.username,
GROUP_CONCAT(DISTINCT c.slug) AS slug,
GROUP_CONCAT(DISTINCT c.name) AS name,
GROUP_CONCAT(DISTINCT t.name) AS tags
FROM #__video AS v
LEFT JOIN #__video_category AS vc ON (vc.video_id = v.video_id)
LEFT JOIN #__video_categories AS c ON (vc.cat_id = c.cat_id)
LEFT JOIN #__video_tags AS t ON (t.video_id = v.video_id)
LEFT JOIN #__user AS u ON (u.user_id = v.video_id)
WHERE v.video_id IN ('.$ids.')
AND v.status = 1
GROUP BY v.video_id
ORDER BY FIELD(v.video_id, '.$ids.')';
}
if (!isset($sql)) {
return array();
}
return VF::factory('database')->get_rows($sql);
}
}