Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выдергивание информации о файле с фтп.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Maiai
Отправлено: 06 Августа, 2009 - 11:10:57
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




Цель: Музыка находящаяся на ФТП.
Задача: Брать информацию о музыкальных файлах с фтп, продолжительность, размер, название, качество и прочее.
Способ решения: Даже не знаю, первое что приходит на ум, обрабатывать теги с фтп, но там довольно скудно все. Вот и прошу помощи.
 
 Top
Champion Супермодератор
Отправлено: 06 Августа, 2009 - 11:28:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




что скудно? Проблема с функциями для мп3 или по фтп достучаться не получается?
 
 Top
Maiai
Отправлено: 06 Августа, 2009 - 11:54:43
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




Доступ до ФТП есть, проблема какраз таки с ф-циями, не знаю как выдергивать время бит рейт, название и прочее.
 
 Top
pifon1989
Отправлено: 06 Августа, 2009 - 11:57:43
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Есть такая функция! Улыбка
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. ftp_rawlist(<идентификатор соединения>, <папка на ftp>);
  4. ?>
  5.  

Выдаёт массив, содержащий подробную информацию о файлах, включая название. Информация выдаётся строкой через пробелы, и, в принципе, можно разбить эту строку для удобства вывода информации пользователю.

(Отредактировано автором: 06 Августа, 2009 - 11:58:09)



-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Maiai
Отправлено: 06 Августа, 2009 - 12:11:33
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




Спасибо, уже что-то, но все же информация не совсем полная.
Конечная цель - создание каталога музыки.
А есть ли функции для обработки mp3 файлов, сортировке по mp3-тегам?

(Отредактировано автором: 06 Августа, 2009 - 12:15:25)

 
 Top
Champion Супермодератор
Отправлено: 06 Августа, 2009 - 12:17:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




функции id3_*** вроде для этого. Вот такая, например. id3_get_tag. Посмотри.
 
 Top
pifon1989
Отправлено: 06 Августа, 2009 - 12:40:37
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




В общем виде ваш скрипт будет выглядеть так:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $connect = ftp_connect("");
  4. $login = ftp_login($connect, "", "");
  5.  
  6. $list = ftp_rawlist($connect, "");
  7.  
  8. foreach($list as $_)
  9.  
  10. '`^(.{10}+)(\s*)(\d{1})(\s*)(\d*|\w*)'.
  11. '(\s*)(\d*|\w*)(\s*)(\d*)\s'.
  12. '([a-zA-Z]{3}+)(\s*)([0-9]{1,2}+)'.
  13. '(\s*)([0-9]{2}+):([0-9]{2}+)(\s*)(.*)$`Ue',
  14.  
  15. '$items[]=array(
  16. "rights"=>"$1",
  17. "number"=>"$3",
  18. "owner"=>"$5", "group"=>"$7",
  19. "file_size"=>"$9",
  20. "mod_time"=>"$10 $12 $14:$15",
  21. "file"=>"$17",
  22. "type"=>print_r((preg_match("/^d/","$1"))?"dir":"file",1));',
  23.  
  24. $_) ;
  25. print_r($items);
  26. ftp_close($connect);
  27. ?>
  28.  

В итоге, все данные будут храниться в многомерном массиве $items.


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Maiai
Отправлено: 06 Августа, 2009 - 12:53:00
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




Champion пишет:
функции id3_*** вроде для этого. Вот такая, например. id3_get_tag. Посмотри.


Вот, пожалуй решение, только модуль установить нужно на хост. Спасибо.

pifon1989 пишет:
<?PHP
$connect = ftp_connect("");
$login = ftp_login($connect, "", "");

$list = ftp_rawlist($connect, "");

foreach($list as $_)
preg_replace(

'`^(.{10}+)(\s*)(\d{1})(\s*)(\d*|\w*)'.
'(\s*)(\d*|\w*)(\s*)(\d*)\s'.
'([a-zA-Z]{3}+)(\s*)([0-9]{1,2}+)'.
'(\s*)([0-9]{2}+)Недовольство, огорчение[0-9]{2}+)(\s*)(.*)$`Ue',

'$items[]=array(
"rights"=>"$1",
"number"=>"$3",
"owner"=>"$5", "group"=>"$7",
"file_size"=>"$9",
"mod_time"=>"$10 $12 $14:$15",
"file"=>"$17",
"type"=>print_r((preg_match("/^d/","$1"))?"dir":"file",1));',

$_) ;
print_r($items);
ftp_close($connect);
?>


Спасибо, за предоставленную помощь, пожалуй времено воспользуюсь этим решением, для работы над самим двигом сайта.

(Отредактировано автором: 06 Августа, 2009 - 12:57:01)

 
 Top
pifon1989
Отправлено: 06 Августа, 2009 - 13:36:14
Post Id



Частый гость


Покинул форум
Сообщений всего: 196
Дата рег-ции: Май 2008  


Помог: 0 раз(а)




Странно, но в сети не удалось найти никаких упоминаний о получении времени проигрывания трека или его битрейта средствами php... :/

Про id3
Цитата:

These functions let you read and manipulate ID3 tags. ID3 tags are used in MP3 files to store title of the song, as well as information about the artist, album, genre, year and track number.


Странно, чтобы при таком обилии сложнейших функций, никто до сих пор не заморочился этой задачей. Сильно сомневаюсь, что она много сложнее реализации сокетов... :/


-----
Ассемблер для Чайников
Всем любителям Pascal посвящается:
function writeln($text) {echo '<br>'.$text};
 
 Top
Maiai
Отправлено: 07 Августа, 2009 - 13:04:47
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




Вот, побродил по сети, и наткнулся на статейку http://www[dot]easywebscripts[dot]net/php/php_mp3.php . Оказалось все относительно просто.

Выкладываю здесь, может кто-то тоже сталкнется с подобной проблемой.

Определяем: название, артиста, альбом, год, коментарий и номер трека.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $f = fopen('mp3.mp3', 'rb');
  4. rewind($f);
  5. fseek($f, -128, SEEK_END);
  6. $tmp = fread($f,128);
  7. if ($tmp[125] == Chr(0) and $tmp[126] != Chr(0)) {
  8. // <UserJS-USH-highlight class="UserJS-USH-highlight" style="background-attachment: scroll; background-repeat: repeat; background-position: 0% 0%; background-image: none; background-color: #ffff66" id="UserJS-USH-0_3">ID3</UserJS-USH-highlight> v1.1
  9. $format = 'a3TAG/a30NAME/a30ARTISTS/a30ALBUM/a4YEAR/a28COMMENT/x1/C1TRACK/C1GENRENO';
  10. } else {
  11. // <UserJS-USH-highlight class="UserJS-USH-highlight" style="background-attachment: scroll; background-repeat: repeat; background-position: 0% 0%; background-image: none; background-color: #ffff66" id="UserJS-USH-0_4">ID3</UserJS-USH-highlight> v1
  12. $format = 'a3TAG/a30NAME/a30ARTISTS/a30ALBUM/a4YEAR/a30COMMENT/C1GENRENO';
  13. }
  14.  
  15. $id3tag = unpack($format, $tmp);
  16. var_dump($id3tag);
  17. ?>


Определяем: размер файла в байтах, тип кодировки, версию mpeg, бит рейт, частоту(frequency), длительность(секундах, минутах, часах), размер и еще несколько других параметров.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function readframe($file) {
  4.         if (! ($f = fopen($file, 'rb')) ) die("Unable to open " . $file);
  5.     $res['filesize'] = filesize($file);
  6.     do {
  7.         while (fread($f,1) != Chr(255)) { // Find the first frame        
  8.                 if (feof($f))  die( "No mpeg frame found") ;
  9.         }
  10.         fseek($f, ftell($f) - 1); // back up one byte
  11.  
  12.         $frameoffset = ftell($f);
  13.  
  14.         $r = fread($f, 4);
  15.        
  16.         $bits = sprintf("%'08b%'08b%'08b%'08b", ord($r{0}), ord($r{1}), ord($r{2}), ord($r{3}));
  17.     }
  18.         while (!$bits[8] and !$bits[9] and !$bits[10]); // 1st 8 bits true from the while    
  19.  
  20.     // Detect VBR header
  21.     if ($bits[11] == 0) {
  22.         if (($bits[24] == 1) && ($bits[25] == 1)) {
  23.             $vbroffset = 9; // MPEG 2.5 Mono
  24.         } else {
  25.             $vbroffset = 17; // MPEG 2.5 Stereo
  26.         }
  27.     } else if ($bits[12] == 0) {
  28.         if (($bits[24] == 1) && ($bits[25] == 1)) {
  29.             $vbroffset = 9; // MPEG 2 Mono
  30.         } else {
  31.             $vbroffset = 17; // MPEG 2 Stereo
  32.         }
  33.     } else {
  34.         if (($bits[24] == 1) && ($bits[25] == 1)) {
  35.             $vbroffset = 17; // MPEG 1 Mono
  36.         } else {
  37.             $vbroffset = 32; // MPEG 1 Stereo
  38.         }
  39.     }
  40.  
  41.     fseek($f, ftell($f) + $vbroffset);
  42.     $r = fread($f, 4);
  43.  
  44.     switch ($r) {
  45.         case 'Xing':
  46.             $res['encoding_type'] = 'VBR';
  47.         case 'VBRI':
  48.         default:
  49.             if ($vbroffset != 32) {
  50.                 // VBRI Header is fixed after 32 bytes, so maybe we are looking at the wrong place.
  51.                 fseek($f, ftell($f) + 32 - $vbroffset);
  52.                 $r = fread($f, 4);
  53.  
  54.                 if ($r != 'VBRI') {
  55.                     $res['encoding_type'] = 'CBR';
  56.                     break;
  57.                 }
  58.             } else {
  59.                 $res['encoding_type'] = 'CBR';
  60.                 break;
  61.             }
  62.  
  63.             $res['encoding_type'] = 'VBR';
  64.     }
  65.  
  66.     fclose($f);
  67.  
  68.     if ($bits[11] == 0) {
  69.         $res['mpeg_ver'] = "2.5";
  70.         $bitrates = array(
  71.             '1' => array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0),
  72.             '2' => array(0,  8, 16, 24, 32, 40, 48,  56,  64,  80,  96, 112, 128, 144, 160, 0),
  73.             '3' => array(0,  8, 16, 24, 32, 40, 48,  56,  64,  80,  96, 112, 128, 144, 160, 0),
  74.                  );
  75.     } else if ($bits[12] == 0) {
  76.         $res['mpeg_ver'] = "2";
  77.         $bitrates = array(
  78.             '1' => array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0),
  79.             '2' => array(0,  8, 16, 24, 32, 40, 48,  56,  64,  80,  96, 112, 128, 144, 160, 0),
  80.             '3' => array(0,  8, 16, 24, 32, 40, 48,  56,  64,  80,  96, 112, 128, 144, 160, 0),
  81.                  );
  82.     } else {
  83.         $res['mpeg_ver'] = "1";
  84.         $bitrates = array(
  85.             '1' => array(0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0),
  86.             '2' => array(0, 32, 48, 56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384, 0),
  87.             '3' => array(0, 32, 40, 48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 0),
  88.                  );
  89.     }
  90.    
  91.     $layer = array(
  92.         array(0,3),
  93.         array(2,1),
  94.               );
  95.     $res['layer'] = $layer[$bits[13]][$bits[14]];
  96.    
  97.     if ($bits[15] == 0) {
  98.         // It's backwards, if the bit is not set then it is protected.
  99.         $res['crc'] = true;
  100.     }
  101.  
  102.     $bitrate = 0;
  103.     if ($bits[16] == 1) $bitrate += 8;
  104.     if ($bits[17] == 1) $bitrate += 4;
  105.     if ($bits[18] == 1) $bitrate += 2;
  106.     if ($bits[19] == 1) $bitrate += 1;
  107.     $res['bitrate'] = $bitrates[$res['layer']][$bitrate];
  108.  
  109.     $frequency = array(
  110.         '1' => array(
  111.             '0' => array(44100, 48000),
  112.             '1' => array(32000, 0),
  113.                 ),
  114.         '2' => array(
  115.             '0' => array(22050, 24000),
  116.             '1' => array(16000, 0),
  117.                 ),
  118.         '2.5' => array(
  119.             '0' => array(11025, 12000),
  120.             '1' => array(8000, 0),
  121.                   ),
  122.           );
  123.     $res['frequency'] = $frequency[$res['mpeg_ver']][$bits[20]][$bits[21]];
  124.  
  125.     $mode = array(
  126.         array('Stereo', 'Joint Stereo'),
  127.         array('Dual Channel', 'Mono'),
  128.              );
  129.     $res['mode'] = $mode[$bits[24]][$bits[25]];
  130.    
  131.     $samplesperframe = array(
  132.         '1' => array(
  133.             '1' => 384,
  134.             '2' => 1152,
  135.             '3' => 1152
  136.         ),
  137.         '2' => array(
  138.             '1' => 384,
  139.             '2' => 1152,
  140.             '3' => 576
  141.         ),
  142.         '2.5' => array(
  143.             '1' => 384,
  144.             '2' => 1152,
  145.             '3' => 576
  146.         ),
  147.     );
  148.     $res['samples_per_frame'] = $samplesperframe[$res['mpeg_ver']][$res['layer']];
  149.  
  150.     if ($res['encoding_type'] != 'VBR') {
  151.         if ($res['bitrate'] == 0) {
  152.             $s = -1;
  153.         } else {
  154.             $s = ((8*filesize($file))/1000) / $res['bitrate'];
  155.         }
  156.         $res['length'] = sprintf('%02d:%02d',floor($s/60),floor($s-(floor($s/60)*60)));
  157.         $res['lengthh'] = sprintf('%02d:%02d:%02d',floor($s/3600),floor($s/60),floor($s-(floor($s/60)*60)));
  158.         $res['lengths'] = (int)$s;
  159.  
  160.         $res['samples'] = ceil($res['lengths'] * $res['frequency']);
  161.         if(0 != $res['samples_per_frame']) {
  162.             $res['frames'] = ceil($res['samples'] / $res['samples_per_frame']);
  163.         } else {
  164.             $res['frames'] = 0;
  165.         }
  166.         $res['musicsize'] = ceil($res['lengths'] * $res['bitrate'] * 1000 / 8);
  167.     } else {
  168.         $res['samples'] = $res['samples_per_frame'] * $res['frames'];
  169.         $s = $res['samples'] / $res['frequency'];
  170.  
  171.         $res['length'] = sprintf('%02d:%02d',floor($s/60),floor($s-(floor($s/60)*60)));
  172.         $res['lengthh'] = sprintf('%02d:%02d:%02d',floor($s/3600),floor($s/60),floor($s-(floor($s/60)*60)));
  173.         $res['lengths'] = (int)$s;
  174.  
  175.         $res['bitrate'] = (int)(($res['musicsize'] / $s) * 8 / 1000);
  176.     }
  177.    
  178.     return $res;
  179. }
  180. $xx = readframe("mp3.mp3");
  181. var_dump($xx);
  182. ?>
  183.  


Отдельное спасибо автору той темы. Тему можно закрывать.
 
 Top
Maiai
Отправлено: 16 Августа, 2009 - 13:16:57
Post Id



Новичок


Покинул форум
Сообщений всего: 32
Дата рег-ции: Июль 2009  


Помог: 0 раз(а)




хм.. еще один вопрос по теме возник, как можно реализовать "паука", что бы он сам бродил по папкам ФТП и отсеявал все кроме mp3 файлов?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB