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 вам в помощ)
Милованов Ю.С: Задача серверной части - отдать определенный кусок файла. Задача браузера - запросить этот кусок.
В общем реализовал я на стороне сервера отдачу файла частями, на стороне клиента скрипт посредством 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 ----------
вот к слову один из вариантов реализации похожей идеи своими руками.
Милованов Ю.С: Ваша задача - научить браузер запрашивать этот кусок
ну это можно через js реализовать) просто гложат меня сомнения... А вдруг там какая-то иная технология используется. Я конечно могу при проигрывании половины закачанного отрезка начать закачивать еще один такой-же отрезок и когда проигрывание первого отрезка закончится перейти ко второму НО. Не плавно это будет(на мой взгляд) Переключение вещ довольно муторная, особенно в soundmanager 2(это мой плеер). Ну хотя думаю стоит попробовать...
ivan-lev: Сообщение от siv1987 Посмотреть сообщение ($position + $size - 1)
УРААА! ГЕНИАЛЬНО!!! Урааа ! Я не могу передать своих эмоций простыми словами) 2 недели. 2 неели я шатался по stackowerflow и англоязычному гуглу. 2 недели я копал javascript и php и сокеты даже затронул.... В общем что я только не делал, а дело то было всего лишь в 1 цифре.... Вы не смотрите что код - уг, я сейчас займусь его оптимизацией)) Спасибо огромное.
Код пойдет) Но ничем от моего варианта практически не отличается, за исключением проверки. Результат тот же самый - Файл не проигрывается полностью, проигрываются только первые 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 ----------
---------- Добавлено 28.02.2013 в 18:38 ----------
Теперь файл закачивается рекурсивно, все нормально. Но! Я хотел чтобы первые 500килобайт файла, как только пользователь их скачает - начинали бы скачиваться. В это время алгоритм подгрузит остальную часть файла, таким образом ускорится процесс... В общем пользователю будет проще, да и быстрее работать будет.
Не подскажите как это примерно реализовать? Копаю в сторону Chunked transfer encoding, мне именно это посоветовали здесь же на форуме. Но я если честно уже 2 день копаю в эту сторону и не могу заставить алгоритм работать так как мне надо. скачка начинается, но скачиваются только первые 500 килобит, остальное не передается. Что еще досаднее - урл у команды по которой мы получаем первый(начальный) пакет выглядит так: - test1.ru/rec.php, а урл с которого берется второй пакет так: test1.ru/rec.php/?max=6&&i=1 ну и так далее... Естесственно броузер не может собрать все воедино да и не возможно это. Есть мысли какие нибудь по этому поводу? Я уже всю свою фантазию израсходовал(
Хочу реализовать функционал http://sourceforge.net
А именно функция загрузки, чтобы при клике на приложенном файле был переход на отдельную страницу (заглушку), отсчет 5-10 секунд и автоматический запуск загрузки + появление прямой ссылки на файл. А лучше не прямой, а кодированной.
В общем создается модуль.
В хуке
hook_init подключаем ко всем страницам сайта новый js файл, короче как-то так:
Предположим все файлы у вас на страницах находятся по прямым ссылкам(что скорее всего так и есть) У этих ссылок есть свой классовый атрибут, пусть это будет class=someclass
тогда в файле lsystem.js пишем примерно! так
Теперь надо через хук hook_menu запилить страницу, на которой юзер будет ждать пока ему отдадут файл собсна.
Делается это следующим образом:
И собсна сама функция закачки будет как-то так выглядеть:
Надуюсь помог хД Возможно я где-то что-то упустил, хз. Я бы сделал так) Или чуть по другому, но похоже.
появление прямой ссылки на файл. А лучше не прямой, а кодированной.
Если вариант вывода прямой ссылки не очень устраивает, то 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(это мой плеер). Ну хотя думаю стоит попробовать...
А кто говорит воровать? Просто посмотрите как там это реализовано.
да смотрю) Только вот ведь беда - серверной части то не видно((
Сообщение от siv1987 Посмотреть сообщение
($position + $size - 1)
УРААА! ГЕНИАЛЬНО!!! Урааа ! Я не могу передать своих эмоций простыми словами) 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 ----------
К стати сдеано примерно так:
---------- Добавлено 28.02.2013 в 18:38 ----------
Теперь файл закачивается рекурсивно, все нормально. Но! Я хотел чтобы первые 500килобайт файла, как только пользователь их скачает - начинали бы скачиваться. В это время алгоритм подгрузит остальную часть файла, таким образом ускорится процесс... В общем пользователю будет проще, да и быстрее работать будет.
Не подскажите как это примерно реализовать? Копаю в сторону Chunked transfer encoding, мне именно это посоветовали здесь же на форуме. Но я если честно уже 2 день копаю в эту сторону и не могу заставить алгоритм работать так как мне надо. скачка начинается, но скачиваются только первые 500 килобит, остальное не передается. Что еще досаднее - урл у команды по которой мы получаем первый(начальный) пакет выглядит так: - test1.ru/rec.php, а урл с которого берется второй пакет так: test1.ru/rec.php/?max=6&&i=1 ну и так далее... Естесственно броузер не может собрать все воедино да и не возможно это. Есть мысли какие нибудь по этому поводу? Я уже всю свою фантазию израсходовал(