Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > HTTP сервера > Наша Лаборатория


Автор: Rom@nych 09.08.04, 15:54
Если Вы хотите что-либо добавить или Вам что-либо не нравится - пишите сюда

Функция инициализирования переменной

Язык: РНР
Автор: Rom@nych


Функция инициализирует переменную из данных GET, POST запроса или берёт её из сессионных данных. Принимает два параметра. Первый - строка - имя переменной, второй - значение, которое передастся переменной в случае, если она не может быть найдена. По умолчанию пустая строка.
Пример вызова:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ini('action', 'none')
В результате выполнения этого кода будет проинициализирована переменная $action в случае, если она не содержится в массивах $_POST, $_GET, $_SESSION она будет равна 'none'
При выборе массива идёт проверка в следующем порядке $_POST, $_GET, $_SESSION

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Trustmaster 10.08.04, 07:27
Mailpost Server

Скрипт для отправки файлов по почте непосредственно из интернета.


Язык: PHP (серверная часть), Free Pascal (клиентская)
Автор: Trustmaster & Argentum


Скрипт полезен в том случае, если вы имеете почтовый ящик с неограниченным трафиком. Серверный скрипт располагается на вашем хостинге и предоставляет форму, в которой вы вводите URL нужного файла. После этого файл будет отправлен на ваш e-mail. Если размер файла превышает определенный лимит (по умолчанию 4МБ), он будет отправлен по частям, соединить которые можно при помощи клиентской программы. Подробную инструкцию читайте в README.

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Kheor 10.08.04, 09:37
Функция создания Pages Bar

Язык: PHP
Автор: Kheor aka DUKe


исправлены ошибки: 24/10/2007. Отдельное и больше спасибо Лёхе

Функция создает что-то типа оглавления когда нужен постраничный вывод, например, у нас есть 23 страницы и выбрана 11ая страница (номер страницы передается методом get, параметром page). Тогда, чтобы создать оглавление вызываем:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    echo generatePagesBar(11, 23, "<a href='%PARAM_PAGE%'>%PARAM_PAGE%</a> ");


В результате имеем:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <a href = 'http://www.someplace.ru/somepage.php?page=1'>1</a>,
    <a href = 'http://www.someplace.ru/somepage.php?page=2'>2</a>,
    <a href = 'http://www.someplace.ru/somepage.php?page=3'>3</a> ...
    <a href = 'http://www.someplace.ru/somepage.php?page=10'>10</a>,
    <a href = 'http://www.someplace.ru/somepage.php?page=11'>11</a>,
    <a href = 'http://www.someplace.ru/somepage.php?page=12'>12</a> ...
    <a href = 'http://www.someplace.ru/somepage.php?page=21'>21</a>,
    <a href = 'http://www.someplace.ru/somepage.php?page=22'>22</a>,
    <a href = 'http://www.someplace.ru/somepage.php?page=23'>23</a>


Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Rom@nych 18.08.04, 06:56
Плагин для системы Smarty

Язык: РНР
Автор: Rom@nych
Тип: modifier


Этот модификатор позволяет подсвечивать ссылки в тексте. Возможности: поиск всех ссылок в тексте на сайты и e-mail'ы. если в ссылке указан хост сайта, то он будет открыт в новом окне, иначе - в том же. Также принимает аттрибут extras, который позволяет вставлять в ссылку доп. аттрибуты.
Использование:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    {$var|hrefs:'class="link"'}

Установка: скопировать файл в каталог plugins системы Smarty

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Trustmaster 19.08.04, 11:50
Безопасные Сессии

Замещенный механизм, хранящий данные сессии в БД.


Язык: PHP
Автор: Trustmaster


Слабость стандартного механизма сессий PHP заключается в том, что сами данные сессии хранятся в виде файлов, доступных для чтения и записи любому желающему. Скрипт session_thief.php наглядно показывает, как эти данные можно извлечь.

PHP позволяет замещать многие из его механизмов. Данный вариант замещенного механизма сессий PHP использует базы данных. Таким образом, вы можете создать единую таблицу для всех сессий в системе, но лучше, чтобы каждый сайт имел собственную таблицу сессий, что обеспечит большую конфиденциальность и даст вам дополнительные возможности. Например, вы сможете с легкостью узнать, сколько пользователей находятся в режиме OnLine, просто подсчитав количество валидных записей в таблице. Кроме того, вы сами можете модифицировать этот механизм под свои нужды, добавив, например, промежуточное шифрование данных (что не есть обязательно, если вы не раздаете свой пароль от mySQL каждому встречному-поперечному).

Кроме того, этот вариант использует библиотеку SQLDB, поэтому он будет работать на MySQL, MSSQL и PostgreSQL.

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Tishaishii 31.08.04, 12:12
Коллектор ТВ-программ

Автор: Tishaishii

А это затравка для разработки менеджмента телепрограммами.
Подворовываются с www.rambler.ru. Жаль, только ресурсы кушает много (зато один раз на всю неделю), но без этого никак.

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Tishaishii 27.09.04, 19:20
Программа кружка про создание www-приложений. Тема: "Базовые конструкции языка программирования Perl".

Автор: Tishaishii

Решил в институте открыть кружок "Золотая, смелая и умелая клавиатура, да гибкие пальчики" или "Бодрая мышка с нарушкой" про www-мастерство. Декан одобрил и деньги предложил. Идея хорошая.
Вот здесь (в пакетике) материалы по нему самому (по кружку "Золотая, смелая и умелая клавиатура, да гибкие пальчики").
Краткое описание 13 лекционных занятий и 13 практических. Курс только по возможностям самого языка. Про модули пока ничего не придумал. В целях курса не было обучение системных администраторов, но предъявить возможности и тонкости языка.

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Trustmaster 09.10.04, 19:40
SQLDB Class Library v.1.3.11

Объектно ориентированный подход к работе с базами данных.

Автор: Trustmaster
Язык: PHP4

Вам может показаться громоздким и нелогичным такой подход, но как показывает реальность, большинство серьезных проектов на PHP придерживаются именно объектно ориентированной методологии, в том числе и при работе с базами данных. Основная направленность таких классов - оградить разработчика от технических деталей. Полиморфизм позволяет использовать один и тот же код для разных баз данных. Данная библиотека предоставляет полиморфные классы для баз данных:
  • FrontBase
  • Informix
  • Interbase
  • MiniSQL
  • Microsoft SQL Server
  • MySQL
  • PostgreSQL
  • SQLite
  • Sybase
В комплект поставки входит документация.

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Trustmaster 20.10.04, 17:56
FTP Class

Расширенный драйвер FTP для PHP


Автор: Trustmaster
Язык: PHP4


Этот класс предоставляет удобную объектно-ориентированную оболочку для стандартных FTP-функций PHP. Кроме того, он содержит методы, позволяющие производить более сложные операции (к примеру, закачка целой папки рекурсивно) и работать с файлами удаленно (чтение/запись). Некоторые методы позволяют вам не вникать в тонкости протокола FTP, другие наоборот, позволяют работать с FTP сервером напрямую.

В комплект поставки входит документация по классу.

Ждем с нетерпением стабильного PHP5, который несет с собой новые возможности работы с FTP.

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Trustmaster 23.10.04, 14:45
XTPL Template Engine

Компактный и удобный интерпретирующий шаблонный движок.


Автор: Trustmaster.
Язык: PHP4.


Никто не оспаривает непревзойденные возможности Smarty - лучшего шаблонного движка для PHP. Но во многих случаях использовать Smarty - как стрелять из пушки по воробьям. Выходит, что 99% скриптов составляет сам шаблонный движок.

В основе XTPL лежит немного иной принцип. Если Smarty компилирует шаблоны во временные PHP-скрипты, то XTPL - классический интепретатор. Кроме того, XTPL взаимодействует с PHP напрямую. Так, вы можете присвоить значение переменным частного сектора (видимым только из шаблонов) традиционным методом Assign(), а можете не делать этого, а работать напрямую с глобальной областью видимости вашего скрипта. При построении логических выражений и условий циклов используется синтаксис PHP. Вот некоторые ключевые аспекты XTPL:
  • При работе с переменными XTPL смотрит сначала в список переменных, присвоенных методом Assign(), а затем (если не нашел нужную переменную) обращается к глобальной области видимости. В большинстве случаев это позволяет избавиться от десятков лишних вызовов Assign().
  • Модификаторы переменных, как и в Smarty, но с расширенными возможностями. Фактически, любая PHP-функция может выступать в роли модификатора.
  • Конструкция {modify}{/modify}, преобразующая HTML внутри нее.
  • Ветвление {if}{else}{/if}.
  • Циклы for и while, удобные, к примеру, при формировании таблиц.
  • Полноценная поддержка вложенных (nested) конструкций, исключая только {modify}{/modify} и {php}{/php}.
  • Конструкции {include} и {php}{/php}.
  • Набор классов, реализующих XHTML/HTML4 тэги в виде PHP классов. В том числе класс SelectTag для преобразования массивов в выпадающие списки.
  • Модульная поддержка функций- и классов-рассширений.
Что касается производительности, то XTPL почти не уступает Smarty в скорости выполнения программы, а при использовании на сервере Zend Optimizer выигрывает 5-40%. В качестве теста был использован шаблон, содержащий два десятка переменных для подставновки и пару логических ветвлений. Конфигурация: Athlon XP 2800+, Apache 2.0.49 + PHP 4.3.8 + Zend Optimizer. Сначала был первый запуск скриптов (компиляция шаблонов Smarty и оптимизация промежуточного кода Zend Optimizer'ом), после чего скрипты были перезапущены по 12 раз. Среднее время выполнения составило соответственно:
Цитата
Smarty            XTPL
---------------------------
0.04824          0.02907


В комплект поставки входит документация по классам и обучение по конструкциям (Tutorial).

Это сообщение было перенесено сюда или объединено из темы "Наша лаборатория"

Автор: Tishaishii 08.01.05, 23:25
Абстрактный класс "Object" для быстрого создания пакетов с поддержкой методов:
  • new - создание объекта
  • get - получение ссылки на атрибут
  • set - установка атрибута
  • check - установить атрибут, если атрибут не определён
  • del - удаление атрибута
  • def - проверка определённости атрибута
события:
  • before, after - вызов пользовательских процедур
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    package Object;
    use subs qw'before after';
    use overload '""'=>'___str___',
                 '~'=>'DESTROY';
     
    sub __new__ {
        my($class, $self)=(shift, {@_});
        bless $self, $class;
        $self->after_new;
        +$self
    }
     
    sub __check__ {
        my$self=shift;
        my$val=pop;
        my$var=$self->__get__(@_);
        $$var=$val unless defined$$var;
        +$var
    }
     
    sub __def__ {+defined shift->Get(@_)}
    sub __set__ {
        my$self=shift;
        my($val, $attr)=(pop, $self->__get__(@_));
        $self->before_set;
        $$attr=$val;
        $self->after_set;
        +$attr
    }
     
    sub __get__ {
        my$self=shift;
        my($result, $self_ref, $ref)=(\$self, ref$self);
     
        $result=do{
            $ref=ref$$result;
            if($ref eq 'HASH' or $ref eq $self_ref)
            {
                +\$$result->{$_}
            }
            elsif($ref eq 'ARRAY')
            {
                +\$$result->[$_]
            }
            else
            {
                return undef
            }
        } foreach @_;
        +$result
    }
     
    sub __del__ {
        my$self=shift;
        my$last=pop;
        my($result, $self_ref, $ref, $ret)=(\$self, ref$self);
     
        $result=do{
            $ref=ref$$result;
            if($ref eq 'HASH' or $ref eq $self_ref)
            {
                +\$$result->{$_}
            }
            elsif($ref eq 'ARRAY')
            {
                +\$$result->[$_]
            }
            else
            {
                return undef
            }
        } foreach @_;
     
        +do{
            $ref=ref$$result;
            if($ref eq 'HASH' or $ref eq $self_ref)
            {
                +delete$$result->{$last}
            }
            elsif($ref eq 'ARRAY')
            {
                $ret=$$result->[$last];
                @$$result=@$$result[0..$last-1, $last+1..$#$$result];
                +$ret
            }
            else
            {
                $ret=$$result;
                undef$$result;
                +$ret
            }
        }
    }
     
    sub ___str___ {
        use Data::Dumper;
        +Dumper shift
    }
     
    sub __after__ {+@_}
    sub __before__ {+@_}
     
    sub __CORE__::Object::AUTOLOAD {
        my$self=shift;
        my($package)=$AUTOLOAD=~/^(.+)::(.+)$/o or return undef;
        index $2, '__' or die ':)Can\'t locate method '.$2.' in package '.__PACKAGE__;
        my($function, @args)=split '_', $2;
        my@result=$self->${\('__'.lcfirst($function).'__')}(@args, @_);
        if($function=~/^[A-Z]/o)
        {
            $result[0]=${$result[0]} while ref$result[0] eq 'SCALAR' || ref$result[0] eq 'REF';
        }
        +wantarray?@result:$result[0]
    }
     
    sub DESTROY {undef $_[0]}
     
    +1;
     
    __END__
     
     
    =head1 NAME
     
        Object - Provides abstract object class
     
    =head1 VERSION
     
        This document describes version 1.0 of Object.pm module,
        released Jan 08, 2005.
     
    =head1 SYNOPSIS
     
        package My::Package;
        use base 'Object';
     
        # methods "new", "set", "get" and their aliases
        # are defined, place here your other methods,
        # vars, constants, etc.
     
        package main;
        $obj=new My::Package(
            size=>{
                b=>'c',
                d=>'e',
                c=>{
                    't'=>'w'
                }
            },
            weight=>[
                12,
                {
                    z=>'r'
                }
            ]
        );
     
        $z=$obj->set_weight_1_z('f');       # returns \$obj->{weight}[1]{z}{f}
        print $obj->Set_size_w({
                                't'=>'z',
                                'y'=>'x'
              })->{t};                      # prints 'z'
     
        $c=$obj->get_size('c');             # returns \$obj->{size}{c}
        print $$c->{t};                     # prints 'w'
     
        $$c={11=>12};
        print $obj->Get_size_c_11;          # prints '12'
     
        $c=$obj->Get_size_c->{t};           # returns $obj->{size}{c}{t}
     
        print int $obj->def_color;          # checks if key 'color' is defined
     
        $obj->check_color('red');           # sets value 'red' on key 'color'
                                            # if it's not defined
     
    =head1 DESCRIPTION
     
    =head1 METHODS
     
    =over 4
     
    =item ___str___
          Returns a string, which was generated by L<Data::Dumper> from data stored in object
     
    =back
     
    =head1 AUTHOR
     
    Shatrov Alexey mail@yandex.ru
     
    Copyright (c) 2005 Shatrov Alexey. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
     
    =cut

Автор: Tishaishii 27.01.05, 17:41
Класс "Hash"

Переопределение хэш-массива для работы с нечёткими ключами.

Автор: Tishaishii.
Язык: Perl.

POD-описание внутри.

Автор: Tishaishii 26.03.05, 00:46
Универсальный преобразователь текстовых документов RXParser 2.0

Модуль RXParser создан для преобразования текстовых документов с использованием
шаблонов.
Для использования этого модуля вам потребуется версия Perl 5.6.x.

Что нового?

Версия 2.0:

1. Классы пакета RXParser разложены по файлам с возможностью единообразной загрузки
из любого
класса пакета:
Filter
Rules
Template
Parser
Wizard

2. Добавлен класс RXParser::Wizard, работающий со всеми классами пакета (Rules,
Template,
Parser, Filter).
3. Упрощена работа с модулями. Основной модуль RXParser контролирует загрузку прочих
модулей.

Версия 1.7125:

1. Ускорена загрузка правил. Добавлена возможность сохранения отпарсенных правил
разбора и
сборки в отдельный файл с возможностью загрузки.
2. Исправлена ошибка несовместимости версии 1.6001. Теперь RXParser 1.7125 работает
для разных
платформ одинаково.
3. Дополнительно оптимизирован код модуля.

Версия 1.6001:

1. Введено пространство префиксов - в будущих версиях возможно появление
дополнительных
возможностей управления выводом, таких как итератор в текущей версии.
2. Дополнительно оптимизирован код модуля.

Версия 1.6:

1. Полностью переписан движок для записи шаблонов. Теперь процесс форматирования
выходных
документов происходит много быстрее и стал ещё менее требователен к ресурсам.
2. Включена поддержка кроссплатформенной блокировки файлов.
3. Дополнительно оптимизирован код модуля.

Это сообщение было перенесено сюда или объединено из темы "Обсуждение FAQ-ов"

Автор: Tishaishii 28.03.05, 13:48
Утилита Str2Rex v0.98b - помогает преобразовывать пару строк в
регулярное выражение.

Мануал:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        Str2Rex v0.98b util - simply converts two strings to RegExp
     
        This util based on the classic LCS algorithm.
     
    -------------------------------------------------------------------
     Usage:
          perl str2rex.pl -in=in.txt -out=out.txt
          perl str2rex.pl -in=in.txt -out=out.txt -locale=on
          perl str2rex.pl in=in.txt out=out.txt locale=off -join=(.+?)
     
     Arguments:
                 -in - Input file path.
                -out - Output file path.
             -locale - Switches on/off using locale.
               -join - Use this argument to set variable part of
                       the resulting RegExp. Default value is (.*?)
     
     Example:
     
      Meaning, input file contains two strings and
                                  have following Perl syntax:
     
     # file "in.txt"
     #-----------------------------------------------------------------
     # The beginning of input file
     + [<<'-- DELIMETER 1 --', <<'-- DELIMETER 2 --'];
     
     This!
        is the
         "first
      string!
     
    -- DELIMETER 1 --
     
      This
        is>
          the "second string
     
    -- DELIMETER 2 --
     
     # The end of input file
     #-----------------------------------------------------------------
     
     Then enter at your command line following commands:
     perl str2rex.pl -in=in.txt -out=out.txt
     
     As result you have something like:
     This(.*?)\ is(.*?)\ the\ \"(.*?)s(.*?)\ string
     
    -------------------------------------------------------------------
                                     Shatrow Aleksey <cdch@yandex.ru>
                                                Krasnodar, 28.03.2005
    -------------------------------------------------------------------


Это сообщение было перенесено сюда или объединено из темы "Обсуждение FAQ-ов"

Автор: aGR 12.06.05, 01:00
Класс для упрощения работы с БД MySQL

Язык: PHP
Автор: aGR


В классе 3 функции:
1) Соединение с сервером и выбор БД
2) SQL запрос к БД с отслеживанием ошибок
3) Демонстрация содержимого результата запроса в виде HTML таблицы

Это сообщение было перенесено сюда или объединено из темы "Обсуждение FAQ-ов"

Автор: Axis 01.09.05, 05:31
RSTPL - Быстрая библиотека для работы с шаблонами

Автор: Axis
Язык: PHP4 и выше


Данная библиотека работает с шаблонами со скоростью обработки строк заключенных в "". Шаблоны могут содержать только те данные, что может содержать текст заключенный в "", но, с другой стороны, используя средства PHP, нельзя создать что-то быстрее.
Возможности:
  • Несколько шаблонов в одном файле
  • Поддержка глобальных и локальных подставляемых переменных
  • Работа с динамическими блоками
  • Высокая скорость

Это сообщение было перенесено сюда или объединено из темы "Обсуждение FAQ-ов"

Автор: Рысь 29.05.07, 09:21
чтение информации из mp3 файла.

Автор: SCINER
Язык: PHP


Использование:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    require_once("id.php");
    print_r(getTags("10_-_Ber_Upkennen_Ni_Bula.mp3"));

Возвращаемое значение - массив:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Array
    (
        [FILE] => /home/u51935/market.bars-media.ru/www/mp3/Elephunk - Track 16.mp3
        [FILESIZE] => 2911975
        [VBR] => yes
        [FRAMES] => 6256
        [MPEG] => 1.0
        [LAYER] => 3
        [SAMPLERATE] => 44100
        [BPP] => 142
        [LENGTH] => 163
        [CHANELS] => Joint stereo
        [EMPHASIS] => None
        [ORIGINAL] => Yes
        [TITLE] => Track 16
        [ARTIST] => Black eyed peas
        [ALBUM] => Elephunk
        [YEAR] => 2004
        [GENRECODE] => 32
        [GENRE] => Classical
        [TRACK] => 16
        [COMMENT] => lenar2003@mail.ru
    )

, если файл некорректный, то соответствующие поля не будут присутствовать в массиве!
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?
     
    //Written by SCINER: MP3-file parser
    //30-05-2007 - 14:41
     
    //Read mp3-header, id3v1.0, id3v1.1
     
    /*
    A   3   (0-2)   Tag индитификатор. Должны использоваться символы 'TAG' как char символы.
    +B  30  (3-32)  Title
    +C  30  (33-62) Artist
    +D  30  (63-92) Album
    +E  4   (93-96) Year
    +F  30  (97-126)    Comment
    +G  1   (127)   Genre
    */
     
    Function BinToDec($BinValue)
    {
        $I = 0;
        $BinToDec = 0;
        For ($I = 1; $I <= strlen($BinValue); $I++)
        {
            If (substr($BinValue, $I - 1, 1) == "1")
            {
                $BinToDec = $BinToDec + pow(2 ,(strLen($BinValue) - $I));
            }
        }
        return $BinToDec;
    }
     
    function ByteToBit($ByteArray)
    {
        $Z =0;
        $I =0;
        $cnt =0;
        $ByteToBit = "";
        //convert 4*1 byte array to 4*8 bits'''''
        For ($Z = 1; $Z<=4; $Z++)
        {
            $subs = ord(substr($ByteArray, $Z-1, 1));
            For ($I = 7; $I >= 0; $I--)
            {
                If(intval($subs / pow(2, $I)) == 1)
                {
                    $ByteToBit = $ByteToBit."1";
                    $subs = $subs - pow(2 , $I);
                }
                ElseIf ($ByteToBit !== "")
                {
                    $ByteToBit = $ByteToBit."0";
                }
            }
        }
        return BinToDec($ByteToBit);
    }
     
    function isVBR($sign)
    {
        if($sign == "Xing")
        {
            return "yes";
        }
        else
        {
            return "no";
        }
    }
    function GetGenre($genre)
    {
    $_genres = array(
            0   => 'Blues',
            1   => 'Classic Rock',
            2   => 'Country',
            3   => 'Dance',
            4   => 'Disco',
            5   => 'Funk',
            6   => 'Grunge',
            7   => 'Hip-Hop',
            8   => 'Jazz',
            9   => 'Metal',
            10  => 'New Age',
            11  => 'Oldies',
            12  => 'Other',
            13  => 'Pop',
            14  => 'R&B',
            15  => 'Rap',
            16  => 'Reggae',
            17  => 'Rock',
            18  => 'Techno',
            19  => 'Industrial',
            20  => 'Alternative',
            21  => 'Ska',
            22  => 'Death Metal',
            23  => 'Pranks',
            24  => 'Soundtrack',
            25  => 'Euro-Techno',
            26  => 'Ambient',
            27  => 'Trip-Hop',
            28  => 'Vocal',
            29  => 'Jazz+Funk',
            30  => 'Fusion',
            31  => 'Trance',
            32  => 'Classical',
            33  => 'Instrumental',
            34  => 'Acid',
            35  => 'House',
            36  => 'Game',
            37  => 'Sound Clip',
            38  => 'Gospel',
            39  => 'Noise',
            40  => 'Alternative Rock',
            41  => 'Bass',
            42  => 'Soul',
            43  => 'Punk',
            44  => 'Space',
            45  => 'Meditative',
            46  => 'Instrumental Pop',
            47  => 'Instrumental Rock',
            48  => 'Ethnic',
            49  => 'Gothic',
            50  => 'Darkwave',
            51  => 'Techno-Industrial',
            52  => 'Electronic',
            53  => 'Pop-Folk',
            54  => 'Eurodance',
            55  => 'Dream',
            56  => 'Southern Rock',
            57  => 'Comedy',
            58  => 'Cult',
            59  => 'Gangsta',
            60  => 'Top 40',
            61  => 'Christian Rap',
            62  => 'Pop/Funk',
            63  => 'Jungle',
            64  => 'Native US',
            65  => 'Cabaret',
            66  => 'New Wave',
            67  => 'Psychadelic',
            68  => 'Rave',
            69  => 'Showtunes',
            70  => 'Trailer',
            71  => 'Lo-Fi',
            72  => 'Tribal',
            73  => 'Acid Punk',
            74  => 'Acid Jazz',
            75  => 'Polka',
            76  => 'Retro',
            77  => 'Musical',
            78  => 'Rock & Roll',
            79  => 'Hard Rock',
            80  => 'Folk',
            81  => 'Folk-Rock',
            82  => 'National Folk',
            83  => 'Swing',
            84  => 'Fast Fusion',
            85  => 'Bebob',
            86  => 'Latin',
            87  => 'Revival',
            88  => 'Celtic',
            89  => 'Bluegrass',
            90  => 'Avantgarde',
            91  => 'Gothic Rock',
            92  => 'Progressive Rock',
            93  => 'Psychedelic Rock',
            94  => 'Symphonic Rock',
            95  => 'Slow Rock',
            96  => 'Big Band',
            97  => 'Chorus',
            98  => 'Easy Listening',
            99  => 'Acoustic',
            100 => 'Humour',
            101 => 'Speech',
            102 => 'Chanson',
            103 => 'Opera',
            104 => 'Chamber Music',
            105 => 'Sonata',
            106 => 'Symphony',
            107 => 'Booty Bass',
            108 => 'Primus',
            109 => 'Porn Groove',
            110 => 'Satire',
            111 => 'Slow Jam',
            112 => 'Club',
            113 => 'Tango',
            114 => 'Samba',
            115 => 'Folklore',
            116 => 'Ballad',
            117 => 'Power Ballad',
            118 => 'Rhytmic Soul',
            119 => 'Freestyle',
            120 => 'Duet',
            121 => 'Punk Rock',
            122 => 'Drum Solo',
            123 => 'Acapella',
            124 => 'Euro-House',
            125 => 'Dance Hall',
            126 => 'Goa',
            127 => 'Drum & Bass',
            128 => 'Club-House',
            129 => 'Hardcore',
            130 => 'Terror',
            131 => 'Indie',
            132 => 'BritPop',
            133 => 'Negerpunk',
            134 => 'Polsk Punk',
            135 => 'Beat',
            136 => 'Christian Gangsta Rap',
            137 => 'Heavy Metal',
            138 => 'Black Metal',
            139 => 'Crossover',
            140 => 'Contemporary Christian',
            141 => 'Christian Rock',
            142 => 'Merengue',
            143 => 'Salsa',
            144 => 'Trash Metal',
            145 => 'Anime',
            146 => 'Jpop',
            147 => 'Synthpop');
     
        if(($genre<148) && ($genre>-1))
        {
            return $_genres[$genre];
        }
        else
        {
            return '';
        }
    }
     
    function GetLayer($byte)
    {   $ret = 0;
        $layers = Array(0, 3, 2, 1);
        if ((ord($byte) & 2) == 2) $ret += 1;
        if ((ord($byte) & 4) == 4) $ret += 2;
        return $layers[$ret];
    }
     
    function isOriginal($byte)
    {   $ret = 0;
        $originals = Array('No' ,'Yes');
        if ((ord($byte) & 4) == 4) $ret += 1;
        return $originals[$ret];
    }
     
    function getEmphasis($byte)
    {   $ret = 0;
        $emphasis = Array('None', '50/15 microseconds', 'Dunno', 'CITT j.17');
        if ((ord($byte) & 1) == 1) $ret += 1;
        if ((ord($byte) & 2) == 2) $ret += 2;
        return $emphasis[$ret];
    }
     
    function getChanels($byte)
    {   $ret = 0;
        $chanels = Array('Stereo', 'Joint stereo', 'Dual channel', 'Mono');
        if ((ord($byte) & 64) == 64) $ret += 1;
        if ((ord($byte) & 128) == 128) $ret += 2;
        return $chanels[$ret];
    }
     
    function GetMPEG($byte)
    {   $ret = 0;
        $mpegs = Array('2.5','?','2.0','1.0');
        if ((ord($byte) & 8) == 8) $ret |= 1;
        if ((ord($byte) & 16) == 16) $ret |= 2;
        return $mpegs[$ret];
    }
     
    function GetSampleRate($byte, $mpeg)
    {   $ret = 0;
        $samplerate1 = Array(44100,48000,32000,'?');
        $samplerate2 = Array(22050,24000,16000, '?');
        if ((ord($byte) & 4) == 4) $ret += 1;
        if ((ord($byte) & 8) == 8) $ret += 2;
        if($mpeg=='1.0')
        {
            return $samplerate1[$ret];
        }
        elseif($mpeg=='2.0')
        {
            return $samplerate2[$ret];
        }else{return '?';}
    }
     
     
    function GetBitRate($byte, $mpeg, $layer)
    {
      $ret = 0;
      if ((ord($byte) & 16) == 16) {$ret |= 1;}
      if ((ord($byte) & 32) == 32) {$ret |= 2;}
      if ((ord($byte) & 64) == 64) {$ret |= 4;}
      if ((ord($byte) & 128) == 128) {$ret |= 8;}
      $bitrates = Array(
                        '1.0'=>Array(
                                    '1'=>Array(0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,'?'),
                                    '2'=>Array(0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,'?'),
                                    '3'=>Array(0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,'?')
                                    ),
                        '2.0'=>Array(
                                    '1'=>Array(0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,'?'),
                                    '2'=>Array(0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,'?'),
                                    '3'=>Array(0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,'?')
                                    )
                      );
      return $bitrates[$mpeg][$layer][$ret];
    }
     
    function getTags($mp3file)
    {
     
        $bpp = 0;
        $tags = Array();
        $tags['FILE'] = (realpath($mp3file));
     
        if(file_exists($mp3file))
        {
            if(is_readable($mp3file))
            {
     
                $f = fopen($mp3file,'r');
                fseek($f,filesize($mp3file)-128);
                $ret = fread($f,128);
     
                $start = -1;
                //search mp3-header
                for ($i = 0; $i <= filesize($mp3file); $i++)
                {
                  fseek($f, $i);
                  $byte = fread($f, 1);
                  if(ord($byte)==255)
                  {
                    fseek($f, $i+1);
                    $bits = 0;
                    $byte = fread($f, 1);
                      if ((ord($byte) & 32) == 32) {$bits |= 2;}
                      if ((ord($byte) & 64) == 64) {$bits |= 4;}
                      if ((ord($byte) & 128) == 128) {$bits |= 8;}
                    if ($bits==14)
                    {
                        $start = $i;
                        break;
                    }
                  }
                }
     
                $tags['FILESIZE'] = filesize($mp3file);
     
                if($start>=0)
                {
                    fseek($f, $start + 0); $byte0 = fread($f, 1);
                    fseek($f, $start + 1); $byte1 = fread($f, 1);
                    fseek($f, $start + 2); $byte2 = fread($f, 1);
                    fseek($f, $start + 3); $byte3 = fread($f, 1);
                    fseek($f, $start + 36); $xing = fread($f, 4);
     
                    $tags['VBR'] = isVBR($xing);
                    $tags['FRAMES'] = 1;
     
                    if($tags['VBR']=="yes")
                    {
                        //calculate # of frames
                        $Frames = 0;
                        fseek($f, $start + 44);
                        $frame = fread($f, 4); //get framelength
                        $Frames = ByteToBit($frame);
                        $tags['FRAMES'] = $Frames;
                    }
     
                    fclose($f);
     
                    $tags['MPEG'] = GetMPEG($byte1);
                    $tags['LAYER'] = GetLayer($byte1);
                    $tags['SAMPLERATE'] = GetSampleRate($byte2, $tags['MPEG']);
     
     
                    if($tags['VBR']=="yes")
                    {
                        $Temp = Array(0, 12, 144, 144);
                        $tags['BPP'] = (filesize($mp3file) * $tags['SAMPLERATE']) / (intval($tags['FRAMES'])) / 1000 / $Temp[round($tags['LAYER'])];
                    }
                    else
                    {
                        $tags['BPP'] = GetBitRate($byte2, $tags['MPEG'], $tags['LAYER']);
                    }
     
                    $tags['LENGTH'] = intval(($tags['FILESIZE'] * 8) / $tags['BPP'] / 1000);
                    //$Duration = intval($Duration / 60) . "m " . ($Duration - intval($Duration / 60) * 60) . "s";
     
                    // floor( ((8 * filesize($mp3file))/1000) / $tags['BPP']);
                    $tags['CHANELS'] = getChanels($byte3);
                    $tags['EMPHASIS'] = getEmphasis($byte3);
                    $tags['ORIGINAL'] = isOriginal($byte3);
                    $tags['BPP'] = intval($tags['BPP']);
     
                }
                else
                {
                    return false;
                }
     
                //$tags[] = $ret;
                if(substr($ret,0,3)=="TAG")
                {
                  $tags['TITLE'] = (chop(substr($ret,3,32-3+1)));
                  $tags['ARTIST'] = (chop(substr($ret,33,62-33+1)));
                  $tags['ALBUM'] = (chop(substr($ret,63,92-63+1)));
                  $tags['YEAR'] = (chop(substr($ret,93,96-93+1)));
                  $tags['GENRECODE'] = (ord(substr($ret,127,1)));
                  $tags['GENRE'] = (GetGenre(ord(substr($ret,127,1))));
                  if((ord(substr($ret,125,1))==0) && (ord(substr($ret,126,1))!==0))
                  {
                    $tags['TRACK'] = (ord(substr($ret,126,1)));
                    $tags['COMMENT'] = (chop(substr($ret,97,28)));
                  }
                  else
                  {
                    $tags['COMMENT'] = (chop(substr($ret,97,30)));
                  }
     
     
     
     
                }
     
            }
        }
        return $tags;
    }
     
    ?>


Обсуждение и доработки здесь: mp3, tags, id3v1

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)