<?php

/*****************************************************************
Пример использования:

$vk_parser = new Vkontakte();
$vk_parser->parse('Blondie - Call Me');
$files = $vk_parser->getFiles();
*****************************************************************/

/**
 * Класс парсинга вконтактика
 *
 * @package classes
 * @author chez
 **/
class Vkontakte {

	private $_cookies;	// Куки, ассоциативный массив
	private $_query;	// Запрос, plain text

	private $_html;		// HTML, полученый от вконтактика
	private $_files;	// Распарсеные массивы с информацией о файле
	
	/**
	 * Оболочка парсера
	 *
	 * @param string $q	Запрос
	 * @return array	Массив с файлами
	 * @author chez
	 **/
	public function parse($q) {
		$this->_query = $q;
		$this->auth();
		$cookie = array();
		foreach ($this->_cookies as $key => $val) {
			$cookie[] = $key .'='. $val;
		}
		RemoteFile::setHeaders(array(
			'Cookie: '. implode('; ', $cookie),
			'Referer: http://vkontakte.ru/audio?album_id=0',
			'X-Requested-With: XMLHttpRequest',
			'Origin: http://vkontakte.ru',
			'Content-Type: application/x-www-form-urlencoded',
			'User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.151 Safari/534.16',
			'Connection: close'
		));
		$this->setHtml(RemoteFile::getData('http://vkontakte.ru/audio', array(
			'act'			=>'search',
			'al'			=>'1',
			'gid'			=>'0',
			'id'			=>'5728795',
			'offset'		=>'0',
			'q'				=> urlencode($this->_query),
			'sort'			=>'2'
		)));
		$this->parseHtml();
		return $this->_files;
	}

	/**
	 * Пишет полученый html в член объекта
	 *
	 * @param string $html HTML
	 * @return void
	 * @author chez
	 **/
	public function setHtml($html) {
		$this->_html = $html;
	}

	/**
	 * Возвращает хранимый html
	 *
	 * @return string HTML
	 * @author chez
	 **/
	public function getHtml() {
		return $this->_html;
	}

	/**
	 * Возвращает хранимый массив файлов
	 *
	 * @return array Список файлов
	 * @author chez
	 **/
	public function getFiles() {
		return $this->_files;
	}

	/**
	 * Проводит авторизацию на вконтактике и получает куки
	 * Пока костыль, потом нужно будет переписать
	 *
	 * @return array Ассоциативный массив с куками
	 * @author chez
	 **/
	private function auth() {
		$this->_cookies = array(
			'remixchk' => 5,
			'remixsid' => 'c68c4362f62f218a25802bae87201d1bc46fadd0b5c64f71678430c9b63b'
		);
	}

	/**
	 * Разбирает HTML, полученый от вконтактика
	 *
	 * @return array Список файлов
	 * @author chez
	 **/
	public function parseHtml() {
		preg_match_all('/<tr>(.*)<\/tr>/Usi', $this->_html, $m);
		$files = array();
		if (count($m) > 0) foreach ($m[0] as $res) {
			$m1 = array();
			preg_match('/<input.*value=\"(.*)\,(\d{2,4})\".*<div\sclass=\"duration.*>(.*)<\/div>.*<a.*>(.*)<\/a>.*\s-\s(.*)<\/div>/Usi', $res, $m1);
			if (count($m1) > 0) {
				$duration = explode(':', $m1[3]);
				$files[] = array(
					'url'		=> $m1[1],
					'duration'	=> $duration[0] * 60 + $duration[1],
					'artist'	=> strip_tags($m1[4]),
					'track'		=> strip_tags($m1[5])
				);
			}
		}
		$this->_files = $files;
	}
}