View file modules/downloads/helpers/downloads.php

File size: 11Kb
<?php
/**
 * Ant0ha's project
 *
 * @package
 * @author Ant0ha, ICQ: 144-144-2, e-mail: [email protected]
 * @copyright Copyright (c) 2006 - 2010, Ant0ha
 * @license http://ant0ha.ru/license.txt
 * @link http://ant0ha.ru
 */

//---------------------------------------------

defined('IN_SYSTEM') or die('<b>403<br />Запрет доступа!</b>');

/**
* Хелпер загрузок
*/
class downloads {
	/**
	* @desc получение реального пути к папке
	* @param $int
	*/
	public static function get_path($directory_id, &$db, $directory_path = array(), $i = 0) {
		$parent = $db->get_row("SELECT * FROM #__downloads_directories WHERE
	 		directory_id = (SELECT parent_id FROM #__downloads_directories WHERE directory_id = '". intval($directory_id) ."')
	 	");
	 	$i++;
	 	if($parent['directory_id'] != 0) {
	 		$directory_path[$i]['directory_id'] = $parent['directory_id'];
	  		$directory_path[$i]['name'] = $parent['name'];
	  		$directory_path = self::get_path($parent['directory_id'], $db, $directory_path, $i);
	  	}
	  	return $directory_path;
	}

	/**
	* @desc получение полного пути к папке
	* @param $array
	*/
	public static function get_realpath($directories_array) {
		if(empty($directories_array)) return;

		foreach($directories_array AS $directory) {
			$directory_path[] = $directory['directory_id'];
		}
		if(count($directory_path) > 1) {
	   		$realpath = array_reverse($directory_path);
	   		$realpath = implode('/', $realpath);
	  	}
	  	else {
	   		$realpath = $directory_path[0];
	  	}

	  	return $realpath;
	}

	/**
	* @desc получение полного пути к папке
	* @param $array
	*/
	public static function get_namepath($directories_array, $delim = '/', $admin = FALSE) {
		if(empty($directories_array)) return;

	        $segment = $admin ? 'downloads/admin' : 'downloads';

		foreach($directories_array AS $directory) {
			$directory_path[] = '<a href="'. a_url($segment, 'directory_id='. $directory['directory_id']) .'">'. $directory['name'] .'</a>';
		}
		if(count($directory_path) > 1) {
	   		$realpath = array_reverse($directory_path);
	   		$realpath = implode($delim, $realpath);
	  	}
	  	else {
	   		$realpath = $directory_path[0];
	  	}

	  	return $realpath;
	}

	/**
	* @desc скачка файла
	* @param $string, $string
	*/
	public static function force_download($filename = '', $data = '', $prefix = '', $attachment = TRUE)
	{
		if ($filename == '' OR $data == '')
		{
			return FALSE;
		}

		// Try to determine if the filename includes a file extension.
		// We need it in order to set the MIME type
		if (FALSE === strpos($filename, '.'))
		{
			return FALSE;
		}

		// Grab the file extension
		$x = explode('.', $filename);
		$extension = end($x);

		// Load the mime types
		@include(ROOT .'utils/mimes.php');

		// Set a default mime if we can't find it
		if ( ! isset($mimes[$extension]))
		{
			$mime = 'application/octet-stream';
		}
		else
		{
			$mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];
		}

		if(!$attachment) {
			//exit($mime);
			header('Content-Type: '.$mime);
			header("Content-Length: ".strlen($data));
		}
		else {
			// Generate the server headers
			if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
			{
				header('Content-Type: '.$mime);
				header('Content-Disposition: attachment; filename='.$prefix . $filename);
				header('Expires: 0');
				header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
				header("Content-Transfer-Encoding: binary");
				header('Pragma: public');
				header("Content-Length: ".strlen($data));
			}
			else
			{
				header('Content-Type: '.$mime);
				header('Content-Disposition: attachment; filename='.$prefix . $filename);
				header("Content-Transfer-Encoding: binary");
				header('Expires: 0');
				header('Pragma: no-cache');
				header("Content-Length: ".strlen($data));
			}
		}

		exit($data);
	}

	/**
	* @desc Рекурсивный подсчет файлов в папке
	* @param $string
	*/
	public static function count_files($directory_id) {
		$db = Registry::get('db');
		
		$files = $db->get_one("SELECT COUNT(*) FROM #__downloads_files WHERE directory_id = '". intval($directory_id) ."' AND real_name != ''");
		$result = $db->query("SELECT * FROM #__downloads_directories WHERE parent_id = '". intval($directory_id) ."'");
		while($cild_directory = $db->fetch_array($result)) {
			$files += self::count_files($cild_directory['directory_id']);
		}
		return $files;
	}

	/**
	* @desc определение имени файла
	* @param $string
	*/
	public static function get_filename($string) {
		$headers = get_headers($string);
    
		foreach($headers AS $header) {
			if(stripos($header, 'Location:') === 0) {
				$url = trim(str_ireplace('Location: ', '', $header));
				return basename($url);
			}
		}
    
		return false;
	}

	/**
	* Действия над файлом
	*/
	public static function filetype_actions($file) {
		$config = Registry::get('config');
		
		$file_path = ROOT . $file['path_to_file'] .'/'. $file['real_name'];

		if(class_exists('ffmpeg_movie')) {
			# Работаем с видео файлами
			if($file['file_ext'] == '3gp' || $file['file_ext'] == 'mp4' || $file['file_ext'] == 'avi') {
				$ff = new ffmpeg_movie($file_path);

				# Продолжительность
				$duration = $ff->getDuration();
				$min = floor($duration / 60);
				$sec = floor($duration % 60);
				$file['file_info'] = 'Продолжительность: '. ($min > 0 ? $min .' мин. ' : '') . $sec .' сек.'. PHP_EOL;
	    
				# Разрешение экрана
				$w = $ff->getFrameWidth();
				$h = $ff->getFrameHeight();
				$file['file_info'] .= 'Разрешение: '. $w .'x'. $h . PHP_EOL;

				# Создаем скрины для видео
				if($config['downloads']['make_screens_from_video']) {
					$frame_count = $ff->getFrameCount();

					$frame_1 = floor($frame_count / 3);
					$frame_2 = $frame_1 * 2;
					$frame_3 = $frame_1 * 3;
	
					$frames_arr = array(
						1 => $frame_1,
						2 => $frame_2,
						3 => $frame_3
					);

					foreach($frames_arr AS $key => $frame_num) {
						if($frame_num < 1) continue;
						$screen_name = ROOT . $file['path_to_file'] .'/screen'. $key .'.jpg';
						if(!$frame = $ff->getFrame($frame_num)) continue;
						$im = $frame->toGDimage();
						$im1 = imagecreatetruecolor(120,100);
						imagecopyresampled($im1,$im,0,0,0,0,120,100,imagesx($im),imagesy($im));
						imagejpeg($im1, $screen_name);
						imagedestroy($im1);
						imagedestroy($im);

						$file['screen'. $key] = 'screen'. $key .'.jpg';
					}
				}
			}

			# Работаем с мп3
			if($file['file_ext'] == 'mp3') {
				$ff = new ffmpeg_movie($file_path);

				# Продолжительность
				$duration = $ff->getDuration();
				$min = floor($duration / 60);
				$sec = floor($duration % 60);
				$file['file_info'] = 'Продолжительность: '. ($min > 0 ? $min .' мин. ' : '') . $sec .' сек.'. PHP_EOL;
	    
				# ID3 информация
				$artist = $ff->getArtist();
				$genre = $ff->getGenre();
				if(!empty($artist)) $file['file_info'] .= 'Исполнитель: '. $artist . PHP_EOL;
				if(!empty($genre)) $file['file_info'] .= 'Жанр: '. $genre . PHP_EOL;
	    
				# Битрейт и тп
				$file['file_info'] .= 'Аудио: '. round($ff->getBitRate() / 1000) .' Kbps, '. ($ff->getAudioChannels() == 1 ? 'Mono' : 'Stereo') . PHP_EOL;
			}
		}

		# Создаем превьюшки для картинок, анимаций и файлов со скринами
		if($file['screen1'] != '' || $file['file_ext'] == 'png' || $file['file_ext'] == 'gif' || $file['file_ext'] == 'jpg' || $file['file_ext'] == 'jpeg') {
			if($file['screen1'] != '') $src_file = ROOT . $file['path_to_file'] .'/'. $file['screen1'];
			else $src_file = ROOT . $file['path_to_file'] .'/'. $file['real_name'];

			# 20x20
			main::image_resize($src_file, ROOT . $file['path_to_file'] .'/preview_20.jpg', 20, 20);
			# 60x60
			main::image_resize($src_file, ROOT . $file['path_to_file'] .'/preview_60.jpg', 60, 60);
			# 100x100
			main::image_resize($src_file, ROOT . $file['path_to_file'] .'/preview_100.jpg', 100, 100);

			$file['previews'] = 'yes';
		}
		return $file;
	}

	/**
	* Изменение данных файла в базе
	*/
	public static function update_file(&$db, $file_id, $file, $new_file = true) {
		$db->query("UPDATE #__downloads_files SET
			directory_id = '". intval($file['directory_id']) ."',
			user_id = '". (!empty($file['user_id']) ? $file['user_id'] : USER_ID) ."',
			name = '". ($file['name'] ? a_safe($file['name']) : a_safe(str_replace('.'. $file['file_ext'], '', $file['real_name']))) ."',
			". ($new_file ? "time = UNIX_TIMESTAMP()," : "") ."
			real_name = '". a_safe($file['real_name']) ."',
			path_to_file = '". $file['path_to_file'] ."',
			about = '". a_safe($file['about']) ."',
			filesize = '". $file['filesize'] ."',
			file_ext = '". strtolower($file['file_ext']) ."',
			screen1 = '". a_safe($file['screen1']) ."',
			screen2 = '". a_safe($file['screen2']) ."',
			screen3 = '". a_safe($file['screen3']) ."',
			add_file_real_name_1 = '". (!empty($file['add_file_real_name_1']) ? a_safe($file['add_file_real_name_1']) : '') ."',
			add_file_real_name_2 = '". (!empty($file['add_file_real_name_2']) ? a_safe($file['add_file_real_name_2']) : '') ."',
			add_file_real_name_3 = '". (!empty($file['add_file_real_name_3']) ? a_safe($file['add_file_real_name_3']) : '') ."',
			add_file_real_name_4 = '". (!empty($file['add_file_real_name_4']) ? a_safe($file['add_file_real_name_4']) : '') ."',
			add_file_real_name_5 = '". (!empty($file['add_file_real_name_5']) ? a_safe($file['add_file_real_name_5']) : '') ."',
			previews = '". $file['previews'] ."',
			status = '". a_safe($file['status']) ."',
			file_info = '". a_safe($file['file_info']) ."'
			WHERE
			file_id = '". intval($file_id) ."'
   		");
	}

	/**
	* Получение размера удаленного файла
	*/
	public static function get_filesize($file_path) {
		$headers = get_headers($file_path, 1);
		if ((!array_key_exists('Content-Length', $headers))) return false;
		return $headers['Content-Length'];
	}

	/**
	* Получение настоящего адреса файла
	*/
	public static function get_real_file_path($file_path) {
		$headers = get_headers($file_path, 1);
		if (!array_key_exists('Location', $headers)) {
			return $file_path;
		}
		if(!strstr($headers['Location'], 'http://')) {
			$url_data = parse_url($file_path);
			$location = 'http://'. $url_data['host'] .'/'. $headers['Location'];
		}
		else $location = $headers['Location'];
		return self::get_real_file_path($location);
	}

	/**
	* Получение настоящего адреса файла
	*/
	public static function delete_directories($directory_id) {
		$db = Registry::get('db');
		
		$result = $db->query("SELECT * FROM #__downloads_directories WHERE parent_id = $directory_id");
		while($dir = $db->fetch_array($result)) {
			$db->query("DELETE FROM #__downloads_directories WHERE directory_id = ". $dir['directory_id']);
			self::delete_directories($dir['directory_id']);
		}
	}
}

?>