aftamat4ik

Рейтинг
55
Регистрация
05.01.2012
Интересы
php + Drupal
программист недосамоучка
big boy:
Хочу реализовать функционал http://sourceforge.net
А именно функция загрузки, чтобы при клике на приложенном файле был переход на отдельную страницу (заглушку), отсчет 5-10 секунд и автоматический запуск загрузки + появление прямой ссылки на файл. А лучше не прямой, а кодированной.

В общем создается модуль.

В хуке

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;
}

Надуюсь помог хД Возможно я где-то что-то упустил, хз. Я бы сделал так) Или чуть по другому, но похоже.

big boy:
появление прямой ссылки на файл. А лучше не прямой, а кодированной.

Если вариант вывода прямой ссылки не очень устраивает, то 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(это мой плеер). Ну хотя думаю стоит попробовать...

Милованов Ю.С:
А кто говорит воровать? Просто посмотрите как там это реализовано.

да смотрю) Только вот ведь беда - серверной части то не видно((

ivan-lev:
Сообщение от siv1987 Посмотреть сообщение
($position + $size - 1)

УРААА! ГЕНИАЛЬНО!!! Урааа ! Я не могу передать своих эмоций простыми словами) 2 недели. 2 неели я шатался по stackowerflow и англоязычному гуглу. 2 недели я копал javascript и php и сокеты даже затронул.... В общем что я только не делал, а дело то было всего лишь в 1 цифре.... Вы не смотрите что код - уг, я сейчас займусь его оптимизацией)) Спасибо огромное.

siv1987:
Код

Код пойдет) Но ничем от моего варианта практически не отличается, за исключением проверки. Результат тот же самый - Файл не проигрывается полностью, проигрываются только первые 20-30 секунд, что весьма странно. Может есть какой-то особый символ, который говорит флеш плееру - стоп?

Сравнивал скачанный файл и слепленный файл побайтово. И знаете что меня убило?

Размер слепленного файла - 3,67 МБ (3 854 426 байт)

Размер скачанного! файла - 3,75 МБ (3 936 951 байт)

То есть слепленный весит меньше! скачанного. Вот такого я точно не ожидал. Сравнивал на разных файлах, всегда размер слепленного меньше размера скачанного... Странно.

Кто-нибудь это может понять?

Я сам себе это объяснить не способен, если честно....

andygood, что-то ваш вариант не работает, хотя все равно спасибо что попробовали. Пишет 405 ошибку - not Allowed, жаль(

LEOnidUKG:
плееры могут пренебрегать этим, а флееш нет.

чем это пренебрегать то? Я могу написать выражение для очистки от ненужных символов внутренности файла. Только вот какой символ заставляет flashplayer остановитсья? EOF? Но ведь ни fclose ни curl_setopt($ch, CURLOPT_FILE, $fp); в конце записи данных символ EOF в поток не помещают, во всяком случае про это нигде не написано. Так в чем загвоздка то? о_0

Asju:
Привет!!!
Все сделал как ты сказал. Список аудио файлов получаю, при попытки их воспроизвести результат нулевой, пишет что файл не существует. В чем причина?

В том что ВК АПИ - не позволяет получать аудио из своего 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);
}


---------- Добавлено 28.02.2013 в 18:38 ----------

Теперь файл закачивается рекурсивно, все нормально. Но! Я хотел чтобы первые 500килобайт файла, как только пользователь их скачает - начинали бы скачиваться. В это время алгоритм подгрузит остальную часть файла, таким образом ускорится процесс... В общем пользователю будет проще, да и быстрее работать будет.

Не подскажите как это примерно реализовать? Копаю в сторону Chunked transfer encoding, мне именно это посоветовали здесь же на форуме. Но я если честно уже 2 день копаю в эту сторону и не могу заставить алгоритм работать так как мне надо. скачка начинается, но скачиваются только первые 500 килобит, остальное не передается. Что еще досаднее - урл у команды по которой мы получаем первый(начальный) пакет выглядит так: - test1.ru/rec.php, а урл с которого берется второй пакет так: test1.ru/rec.php/?max=6&&i=1 ну и так далее... Естесственно броузер не может собрать все воедино да и не возможно это. Есть мысли какие нибудь по этому поводу? Я уже всю свою фантазию израсходовал(

Всего: 143