В общем создается модуль.
В хуке
hook_init подключаем ко всем страницам сайта новый js файл, короче как-то так:
function loadfile_init(){$path = drupal_get_path('module', 'loadfile'); drupal_add_js($path . '/js/lsystem.js');}
Предположим все файлы у вас на страницах находятся по прямым ссылкам(что скорее всего так и есть) У этих ссылок есть свой классовый атрибут, пусть это будет class=someclass
тогда в файле lsystem.js пишем примерно! так
$(document).ready(function(){$("body").delegate('.someclass',"click",function(e){ href = $(this).attr('href');//собсна ссылка /* Обычно все файлы, которые закачиваются находятся в 1 директории и отличаются друг от друга только по имени, то есть имя - единственный параметр который изменяется, мы его и получаемПусть ссылка выглядит так:href = "/sites/default/files/blabla/arhivename.zip"; */ name = href.split("/"); //name[4] - эо имя файла, во всяком случае либо [4] либо [3], да сами вкурите.... window.location = "/loadfile/"+name;//ГЛАВНОЕ, редиректим его, то есть юзера, на левую страницу, на котрой запилим ожидание. return false;//обязательно!!});});
Теперь надо через хук hook_menu запилить страницу, на которой юзер будет ждать пока ему отдадут файл собсна.
Делается это следующим образом:
function loadfile_menu(){ $items['/loadfile/%'] = array(//редирект на загрузку файла по его идентификатору 'title' => t('Load File'), 'type' => MENU_CALLBACK, 'page callback' => 'func_loadFile', 'access arguments' => array('access content'), );return $items;}
И собсна сама функция закачки будет как-то так выглядеть:
function func_loadFile(){$filename = arg(1);//вроде 1, если урл такого рода: /loadfile/filename.zip, то нам надо filename.zip$file_url= "/sites/default/files/blabla/".$filename;//про это выше я писал. 1 часть выражения - собсна каталог в который все файлы вы кидаете$result = "<div>".$file_url."</div>";//прямая ссылка на файл как и заказывали. Есче сюда можно запилить нечто вроде вывода рекламы и прочего, на что хватит фантазии//Дальше все просто:sleep(3);//скока надо ждать там по вашему? Вот сюда это вписать надо.$fpOrigin=fopen($file_url, 'rb'); //отдаем юзеру файл по чанкам... header('Content-type: application/octet-stream'); $position = 0; $size = 51200; while(!feof($fpOrigin)){//sleep(1); - это ЕСЛИ мы ограничиваем скорость скачки до 4кб/сек, соответственно для больше скорости 4096 надо заменить на большее число $buffer=fread($fpOrigin, 4096); //we read chunks of 4096 bytes fpassthru($buffer); //And we send them back to the current user flush(); //we try to flush the output buffer, in case there is a deflated or gzipped transfert betweenm the web server and the client } fclose($fpOrigin);return $result;}
Надуюсь помог хД Возможно я где-то что-то упустил, хз. Я бы сделал так) Или чуть по другому, но похоже.
Если вариант вывода прямой ссылки не очень устраивает, то hook_page вам в помощ)
в .htaccess добавь в конец:
AddType application/octet-stream .mp3
Тогда будет скачивать. Во всяком случае у меня пашет на 2 сайтах(в одном это header'ом прописано).
В общем реализовал я на стороне сервера отдачу файла частями, на стороне клиента скрипт посредством ajax отправляет запросы на сервер и тот отдает данные. По теперь трек воспроизводится, НО! он воспроизводится с небольшими паузами(я свел их к минимуму, но они ЕСТЬ!) попытки избежать пауз результатов не принесли. Вот что выдает firebug теперь, когда я воспроизвожу песню:
Воспроизведение следующей части начинается когда воспроизведены 98,95% текущей части. Загрузка начинается когда проиграны 30% текущей части. несмотря на это заметны дефекты, и они серьезные. В некоторых треках все играет нормально, в некоторых нет. Это скорее всего связано с тем что длительность воспроизведения 2% из оставшейся части всегда разная. Ведь есть треки по 3 мин а есть по 7-9 мин. И получается что у некоторых треков 2% - это какие-то 0,5 - 1 сек или меньше, а у каких-то треков это 5сек. Секундные помехи не так заметны как 5 секундные. Я в тупике. Нет, МОЖНО! написать сложный и низкокачественный(говнокод) алгоритм определения длительности песни исходя из ее размера(я где-то библиотеки видел, позволяющие получать значения ipv3 тегов).
Что-то на последнее меня не тянет, тем более что снижение качества звучания даже на 1 сек - неприемлемо...
Может есть еще варианты?---------- Добавлено 18.03.2013 в 00:15 ----------Ведь отправляет же flash плеер stream серверу запросы. Каким образом сервер на них отвечает, заголовки и прочее... Я сам буржунет рою - пока ничего не нашел кроме вот такой глупости хД http://sourceforge.net/projects/php-radio/ сейчас ломаю над этой штукой голову. К стати без толку. Исходников там нет или я не там смотрю...---------- Добавлено 18.03.2013 в 00:35 ----------вот к слову один из вариантов реализации похожей идеи своими руками.
http://wiki.secondlife.com/wiki/Stream_Music_In_PHP
Тут правда придется читать в файле ipv3 теги, а это требует установки доп. расширения на php, что для модуля Неприемлимо(
ну это можно через js реализовать) просто гложат меня сомнения... А вдруг там какая-то иная технология используется. Я конечно могу при проигрывании половины закачанного отрезка начать закачивать еще один такой-же отрезок и когда проигрывание первого отрезка закончится перейти ко второму НО. Не плавно это будет(на мой взгляд) Переключение вещ довольно муторная, особенно в soundmanager 2(это мой плеер). Ну хотя думаю стоит попробовать...
да смотрю) Только вот ведь беда - серверной части то не видно((
УРААА! ГЕНИАЛЬНО!!! Урааа ! Я не могу передать своих эмоций простыми словами) 2 недели. 2 неели я шатался по stackowerflow и англоязычному гуглу. 2 недели я копал javascript и php и сокеты даже затронул.... В общем что я только не делал, а дело то было всего лишь в 1 цифре.... Вы не смотрите что код - уг, я сейчас займусь его оптимизацией)) Спасибо огромное.
Код пойдет) Но ничем от моего варианта практически не отличается, за исключением проверки. Результат тот же самый - Файл не проигрывается полностью, проигрываются только первые 20-30 секунд, что весьма странно. Может есть какой-то особый символ, который говорит флеш плееру - стоп?
Сравнивал скачанный файл и слепленный файл побайтово. И знаете что меня убило?
Размер слепленного файла - 3,67 МБ (3 854 426 байт)
Размер скачанного! файла - 3,75 МБ (3 936 951 байт)
То есть слепленный весит меньше! скачанного. Вот такого я точно не ожидал. Сравнивал на разных файлах, всегда размер слепленного меньше размера скачанного... Странно.
Кто-нибудь это может понять?
Я сам себе это объяснить не способен, если честно....
andygood, что-то ваш вариант не работает, хотя все равно спасибо что попробовали. Пишет 405 ошибку - not Allowed, жаль(
чем это пренебрегать то? Я могу написать выражение для очистки от ненужных символов внутренности файла. Только вот какой символ заставляет flashplayer остановитсья? EOF? Но ведь ни fclose ни curl_setopt($ch, CURLOPT_FILE, $fp); в конце записи данных символ EOF в поток не помещают, во всяком случае про это нигде не написано. Так в чем загвоздка то? о_0
В том что ВК АПИ - не позволяет получать аудио из своего VKAPI. Делай через curl и не парься) Я так сделал, все нормально пашет и списки получает и видео если надо будет тоже получу. PHP+CURL короче. только так.
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);
Таки да хД
Но я это поборол хД---------- Добавлено 28.02.2013 в 18:26 ----------К стати сдеано примерно так:
$url = "test1.ru/rec.php";if(isset($_GET['i'] <= $_GET["max"]){ sleep(20);//..//действия//.. $i++; $ch = curl_init($url."/?max=".$_GET['max']."&&i=".$i);//продолжаем рекурсию curl_setopt($ch, CURLOPT_TIMEOUT, 1); curl_exec ($ch); curl_close ($ch); } if(!isset($_GET['max']) && !isset($_GET['i'])){//если икаких параметров не передано. $max = 6; $ch = curl_init($url."/?max=".$max."&&i=1");//запуск рекурсии curl_setopt($ch, CURLOPT_TIMEOUT, 13); curl_exec ($ch); curl_close ($ch); }
Не подскажите как это примерно реализовать? Копаю в сторону Chunked transfer encoding, мне именно это посоветовали здесь же на форуме. Но я если честно уже 2 день копаю в эту сторону и не могу заставить алгоритм работать так как мне надо. скачка начинается, но скачиваются только первые 500 килобит, остальное не передается. Что еще досаднее - урл у команды по которой мы получаем первый(начальный) пакет выглядит так: - test1.ru/rec.php, а урл с которого берется второй пакет так: test1.ru/rec.php/?max=6&&i=1 ну и так далее... Естесственно броузер не может собрать все воедино да и не возможно это. Есть мысли какие нибудь по этому поводу? Я уже всю свою фантазию израсходовал(