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
Форумы портала PHP.SU :: Версия для печати :: Выдергивание информации о файле с фтп.
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Выдергивание информации о файле с фтп.

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

1. Maiai - 06 Августа, 2009 - 11:10:57 - перейти к сообщению
Цель: Музыка находящаяся на ФТП.
Задача: Брать информацию о музыкальных файлах с фтп, продолжительность, размер, название, качество и прочее.
Способ решения: Даже не знаю, первое что приходит на ум, обрабатывать теги с фтп, но там довольно скудно все. Вот и прошу помощи.
2. Champion - 06 Августа, 2009 - 11:28:37 - перейти к сообщению
что скудно? Проблема с функциями для мп3 или по фтп достучаться не получается?
3. Maiai - 06 Августа, 2009 - 11:54:43 - перейти к сообщению
Доступ до ФТП есть, проблема какраз таки с ф-циями, не знаю как выдергивать время бит рейт, название и прочее.
4. pifon1989 - 06 Августа, 2009 - 11:57:43 - перейти к сообщению
Есть такая функция! Улыбка
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. ftp_rawlist(<идентификатор соединения>, <папка на ftp>);
  4. ?>
  5.  

Выдаёт массив, содержащий подробную информацию о файлах, включая название. Информация выдаётся строкой через пробелы, и, в принципе, можно разбить эту строку для удобства вывода информации пользователю.
5. Maiai - 06 Августа, 2009 - 12:11:33 - перейти к сообщению
Спасибо, уже что-то, но все же информация не совсем полная.
Конечная цель - создание каталога музыки.
А есть ли функции для обработки mp3 файлов, сортировке по mp3-тегам?
6. Champion - 06 Августа, 2009 - 12:17:38 - перейти к сообщению
функции id3_*** вроде для этого. Вот такая, например. id3_get_tag. Посмотри.
7. pifon1989 - 06 Августа, 2009 - 12:40:37 - перейти к сообщению
В общем виде ваш скрипт будет выглядеть так:

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.
8. Maiai - 06 Августа, 2009 - 12:53:00 - перейти к сообщению
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);
?>


Спасибо, за предоставленную помощь, пожалуй времено воспользуюсь этим решением, для работы над самим двигом сайта.
9. pifon1989 - 06 Августа, 2009 - 13:36:14 - перейти к сообщению
Странно, но в сети не удалось найти никаких упоминаний о получении времени проигрывания трека или его битрейта средствами 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.


Странно, чтобы при таком обилии сложнейших функций, никто до сих пор не заморочился этой задачей. Сильно сомневаюсь, что она много сложнее реализации сокетов... :/
10. Maiai - 07 Августа, 2009 - 13:04:47 - перейти к сообщению
Вот, побродил по сети, и наткнулся на статейку 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.  


Отдельное спасибо автору той темы. Тему можно закрывать.
11. Maiai - 16 Августа, 2009 - 13:16:57 - перейти к сообщению
хм.. еще один вопрос по теме возник, как можно реализовать "паука", что бы он сам бродил по папкам ФТП и отсеявал все кроме mp3 файлов?

 

Powered by ExBB FM 1.0 RC1