View file radio/Classes/Nowplay.class.php

File size: 13.59Kb
<?php
	class Nowplay {
	    
        public static $object;
        
        public static function create() {
            if (self::$object === null) {
                self::$object = new self();
            }
            
            return self::$object;
        }
        
        private function __construct() {
            $this->db = MySql::create();
            $this->request = Request::create();
            $this->array_playlist = $this->getPlaylistList();
        }
        
		public $bgVP = array(
			1 => "/radio/images/bg_time_1.jpg",
			2 => "/radio/images/bg_time_2.jpg",
			3 => "/radio/images/bg_time_3.jpg",
			4 => "/radio/images/bg_time_4.jpg",
			5 => "/radio/images/bg_time_5.jpg",
			6 => "/radio/images/bg_time_6.jpg"
		);
        
		public function getNextPlaylist() {
			$budet_val = date("U")*2;
			$budet_name = "";
			foreach($this->array_playlist as  $name => $value) {
				if ( ($value < $budet_val) and ($value > date("U")-180) ) {
					if ($budet_val > $value and !strpos($name, SYSTEM_SYMVOL)) {
						$budet_val = $value;
						$budet_name = $name;
					}
				}
			}

			$budet = explode("--psx", $budet_name);
			return $budet[0];
		}

		public function getPlaylistList() {
			$event_id = 2;
			$now_time = 0;
			$is = 0;

			$day_now = date("l");
			$day_now = $this->strDateToNumber($day_now);
			$time_of_day = strtotime(date("Y-m-d "));
			$all_events = array();
			$array_playlist = array();

            $query = "SELECT * FROM `playlist` WHERE `enable`=1 AND `event".$event_id."` REGEXP '[^+]' ";
			foreach ($this->db->getLines($query) as $line) {
				$event = explode(";", $line['event'.$event_id]);
				$name = $line['name'];

				foreach($event as $value) {
					if (preg_match('/^([^\d]+)-(\d+):(\d+)(-(\d+):(\d+)(-(\d+):(\d+))?)?$/', $value, $time)) {
						$days_array = explode(",", $time[1]);
						$times_array=array($time[2]*60+$time[3],$time[5]*60+$time[6],$time[8]*60+$time[9]);
						foreach ($days_array as $event_day) {
							if (trim($event_day) == '') {
								continue;
							}
							$event_day = $this->strDateToNumber($event_day);
							$event_day = $event_day - $day_now;
							if ($event_day < 0) {
								$event_day = $event_day + 7;
							}

							$time_of_event_day = $time_of_day + $event_day*24*60*60;

							if ($event_id == 1) {
								$next_time = $times_array[0];
								while ($next_time <= $times_array[1] && $times_array[2] > 0) {
									$event_time = $time_of_event_day + $next_time*60;
									if (($now_time - $period*60) < $event_time) {
										$all_events[]['time'] = $event_time;
										$all_events[sizeof($all_events)-1]['id'] = $line['id'];
									}
									$next_time = $next_time + $times_array[2];
								}
							} else {
								foreach ($times_array as $time) {
									$event_time = $time_of_event_day + $time*60;
									if ($time > 0 && ($now_time - PERIOD*60) < $event_time) {
										$all_events[]['time'] = $event_time;
										$all_events[sizeof($all_events)-1]['id'] = $line['id'];
										$sled_time[$is] = $event_time;
										$sled_name[$is] = $name;
										if (!empty($array_playlist[$name])) {
											if (empty($w)) {
												$name2 = $name."--psx-";
											} else {
												$name2 = $name."--psx-".$w;
											}
											$array_playlist[$name2] = $sled_time[$is];
										} else {
											$array_playlist[$name] = $sled_time[$is];
										}
										if (empty($w)) {
											$w = 1;
										} else {
											$w++;
										}
										$is=$is+1;
										$mmii = ((24*60*60)*7);
										$sled_time[$is] = $event_time-$mmii;
										$sled_name[$is] = $name;
										if ($array_playlist[$name]) {
											$name2 = $name."--psx-".$w;
											$array_playlist[$name2] = $sled_time[$is];
										} else {
											$array_playlist[$name] = $sled_time[$is];
										}
										$w++;
										$is = $is+1;
									}
								}
							}
						}
					}
				}
			}

			asort($array_playlist);
			return $array_playlist;
		}

		public function getCurrentPlaylist() {
			$query = "SELECT * FROM `playlist` WHERE `now`=1";
			$playlist = $this->db->getLine($query);

			return $playlist['name'];
		}
		
		public function getMusicLoadForm() {
		    ob_start();
		    include($this->request->getRadioPath().'Tpl/musicLoadForm.tpl.html');
            $content = ob_get_contents();
            ob_end_clean();
                        
            if (TEMP_UPLOAD == "") {
                $errors[] = "В настройках RadioCMS не задана папка для загрузки.";
            } 
            
            if (TEMP_UPLOAD != "" and !file_exists($this->request->getMusicPath().TEMP_UPLOAD)) {
                $errors[] = "Папка для загрузки не существует.";
            } 
            
            if (file_exists($this->request->getMusicPath().TEMP_UPLOAD) and !is_writeable($this->request->getMusicPath().TEMP_UPLOAD)) {
                $errors[] = "Недостаточно прав для загрузки.";
            } 
            
            if ($this->letToInt(ini_get('upload_max_filesize')) < 8000000) {
                $errors[] = "Размер загружаемого файла слишко мал. Разрешите загружать минимум 8 мегабайт.";
            } 
            
            if (!empty($errors)) {
                $errorString = "";
                foreach ($errors as $error) {
                    $errorString .= "<p><i>$error</i></p>";
                }
                return $errorString;
            }
            
            return $content;
		}

		public function getVisualPlaylist() {
			$pred = $this->getPrevVP();
        	$add = $this->getAddProgramInVP($pred);
        	$array_playlist = $this->generateFullVP($add);
        	$artoday = $this->generateTodayArrayVP($array_playlist);
        	$array_vp = $this->getArrayVP($artoday);

        	$visual = $this->generateVP($artoday, $array_vp);

        	ob_start();
        	include($this->request->getRadioPath().'Tpl/visualPlaylist.tpl.html');
        	$content = ob_get_contents();
        	ob_end_clean();
        	return $content;
        }

        public function generateVP($artoday, $array_vp) {
        	$vp = 0;
			$x = 1;
			$t = 0;
			$proc_sum = 0;
			$visual = array();

			foreach ($artoday as $k => $v) {
				$nachalo = date("G:i",$v);
				if (!empty($array_vp[$vp])) {
					$t = $array_vp[$vp];
					$t = $t-$v;
					$sto = 24*60*60;
   	 				$proc = (100*$t)/$sto;
    				$proc = number_format($proc, 1, '.', '');
   					$proc =  round($proc);
				} else {
        			$proc = -1;
				}

    			if ($proc > 0) {
    				$proc_sum = $proc_sum + $proc;
    			}
    			if ($proc < 0) {
    				$proc = 100 - $proc_sum;
    			}
   				$pos = strpos($k,"--psx");
    			if ($pos > 0) {
    				$k = substr($k,0,$pos);
    			}
    			$k = str_replace("\r\n","",$k);
    			$prod_m = $t/60;
    			if ($k == "") {
    				$k = "Не задано";
    			}

    			$array['url'] = $this->bgVP[$x];
    			$array['proc'] = $proc;
    			$array['k'] = $k;
    			$array['nachalo'] = $nachalo;

    			$visual[] = $array;
				$vp++;
				$x++;
				if (count($this->bgVP) < $x) {
					$x = 1;
				}
			}
			return $visual;
        }

        public function getArrayVP($artoday) {
        	$vp = -1;
        	$array_vp = array();
			foreach ($artoday as $k => $v) {
				$array_vp[$vp] = $v;
				$vp++;
			}

			return $array_vp;
        }

        public function generateTodayArrayVP($array_playlist) {
       		$now = date("U");
			$today = mktime(0, 0, 0);
			$tomorrow = mktime(0, 0, 0, date("m")  , date("d") +1, date("Y"));
			$artoday = array();
			
        	// Массив за сегодня
			foreach ($array_playlist as $k => $v) {
				if (($v < $tomorrow) and ($v > $today)) {
					$artoday[$k] = $v;
				}
			}

			//Добавляем последний вчера
			$v2 = 0;
			$k2 = "";
			foreach ($array_playlist as $k => $v) {
				if ($v < $today) {
					if ($v2 < $v) {
						$v2 = $v; $k2 = $k;
					}
				}
			}

			$artoday[$k2] = $today;
            asort($artoday);
			return $artoday;
        }

        public function generateFullVP($add) {
        	$array_playlist = $this->array_playlist;
        	$count = count($add);
			for ($i=0; $i<$count; $i++) {
				$name = $add[$i]['name']."--psx-2-".$i;
				$val = $add[$i]['value'];
				$array_playlist[$name] = $val;
			}
			
			return $array_playlist;
        }

        public function getPrevVP() {
        	$i = 0;
        	$pred = array();
			foreach ($this->array_playlist as $k => $v) {
				$nopr = $this->zapros($k);
				if (empty($nopr)) {
    				$pred[$i]['name'] = $k;
    				$pred[$i]['value'] = $v;
    				$pos_name = $k;
   			 	} else {
    				$pred[$i]['name'] = $pos_name;
    				$pred[$i]['value'] = $v;
   				}
				$i++;
			}
			
			return $pred;
        }

        public function getAddProgramInVP($pred) {
        	$i = 0;
			$t = 0;
			$add = array();
			foreach ($this->array_playlist as $k => $v) {
    			$k_p_t = $this->zapros($k);
    			// если это программа
    			if ($k_p_t > 0) {
    				$ip = $i+1;
    				$im = $i-1;
    				$add_time = $pred[$i]['value'] + $k_p_t;
    				//если это время меньше чем следующее тогда добавляем
    				if ($add_time < $pred[$ip]['value']) {
    					$add[$t]['name'] = $pred[$im]['name'];
    					$add[$t]['value'] = $add_time;
    					$t++;
    				}
   				}
				$i++;
			}

			return $add;
        }

        public function getDinamika() {
        	$date = Date::create();
        	$dinamikaInfo = $this->getDinamikaInfo();
        	$dinamikaGraph = $this->getDinamikaGraphLine();
        	$dinamikaBottom = $this->getDinamikaBottomLine();
        	ob_start();
        	include($this->request->getRadioPath().'Tpl/dinamika.tpl.html');
        	$content = ob_get_contents();
        	ob_end_clean();
        	return $content;
        }

		public function getDinamikaBottomLine() {
			$count = 0;
			$return = array();
		    for ($i=30; $i<=130;$i=$i+10) {
      			if ($this->vsego > $i) {
      				$count++;
      			}
		    }

		    for ($i=1; $i<=$count; $i++) {
		    	$time = $this->max_time - $this->min_time;
		    	$time = $time/($count);
				$return[$i] = $this->max_time - $time*$i;
		    }
			
            return $return;
		}

		public function getDinamikaGraphLine() {
			$now_time = date("U");
			$this->min_time = date("U");
			$this->max_time = 0;

            $return = array();
			$query = "SELECT * FROM `statistic` WHERE `type` = 'day' ORDER BY `time` DESC LIMIT 121";
			$this->vsego = $this->db->getCountRow($query);
			
			foreach ($this->db->getLines($query) as $line) {
				$now_listeners = $line['listeners'];
 				$proc_listeners =  ($now_listeners * 100) / $this->listenersMax;
 				$proc_listeners = intval($proc_listeners);
 				if ($proc_listeners==0) {
 					$proc_listeners = 2;
 				}

				$return[] = $proc_listeners;

    			if ($line['time'] < $this->min_time) {
    				$this->min_time = $line['time'];
    			}
    			if ($line['time'] > $this->max_time) {
    				$this->max_time = $line['time'];
    			}
			}

			return $return;
		}

		public function getDinamikaInfo() {
			$max_listeners = 0;
			$query = "SELECT * FROM `statistic` WHERE `type` = 'day' ORDER BY `time` DESC";

			foreach ($this->db->getLines($query) as $line) {
    			if ($line['listeners'] > $max_listeners) {
    				$max_listeners = $line['listeners'];
    			}
			}

			if ($max_listeners <= 5) {$max_listeners = 5;}

 			$l_pol = $max_listeners / 2;
 			$l_niz = $max_listeners / 4;
 			$l_centr = $max_listeners - $l_niz -$l_niz;
 			$l_verh = $max_listeners - $l_niz;

			$info['max']  = $max_listeners;
			$this->listenersMax = $max_listeners;
 			$info['top']  = intval($l_verh);
 			$info['bottom'] = intval($l_niz);
 			$info['center'] = intval($l_centr);

 			return $info;
		}

		public function zapros($name) {
			$pos = strpos($name,"--psx");
    		if ($pos > 0) {
    			$name = substr($name, 0, $pos);
    		}
			$query = "SELECT * FROM `playlist` WHERE `playmode` = '3' and `name` = '".addslashes($name)."' LIMIT 1 ";
			$line = $this->db->getLine($query);
			$id_k = $line['id'];

			if (!empty($id_k)) {
				$query = "SELECT SUM(`duration`) as sum FROM `songlist` WHERE `id`=".$id_k;
				$line = $this->db->getLine($query);
				$k_plus_time = $line['sum'];

				if ($k_plus_time == "") {
					$k_plus_time = 1;
				}
				return $k_plus_time;
			}
		}

		public function strDateToNumber($day) {
			$day = str_replace("Monday", "1", $day);
			$day = str_replace("Tuesday", "2", $day);
			$day = str_replace("Wednesday", "3", $day);
			$day = str_replace("Thursday", "4", $day);
			$day = str_replace("Friday", "5", $day);
			$day = str_replace("Saturday", "6", $day);
			$day = str_replace("Sunday", "7", $day);

			return $day;
		}
        
        public function letToInt($v){
             $l = substr($v, -1);
             $ret = substr($v, 0, -1);
             switch(strtoupper($l)){
             case 'P':
                 $ret *= 1024;
             case 'T':
                 $ret *= 1024;
             case 'G':
                 $ret *= 1024;
             case 'M':
                 $ret *= 1024;
             case 'K':
                 $ret *= 1024;
                 break;
             }
             
             return $ret;
        }
	}
?>