В очередной раз ухудшил сайт. На сей раз под руку попалась галерея — решил вытащить из EXIF марки фотоаппаратов и даты снимков. Процесс растянулся на неделю.
Получить производителя и модель — задача, казалось бы, тривиальная. В самом деле:
$exif_data = exif_read_data($image); $camera = $exif_data['Make'] . ' ' . $exif_data['Model'];
Только вот результаты радуют не особо:
"Canon Canon PowerShot A80" "CoreLogic SAMSUNG" "HP iPAQ rx3000 " "NIKON COOLPIX L1" "Nokia N70-1" "OLYMPUS CORPORATION " "OLYMPUS CORPORATION C160,D395" "OLYMPUS IMAGING CORP. C170,D425" "PENTAX Corporation PENTAX Optio 33L " "PENTAX Corporation PENTAX Optio 30" "Panasonic DMC-LZ6" "SAMSUNG TECHWIN CO., LTD Digimax 370 / Kenox D370" "SAMSUNG TECHWIN CO., LTD. Digimax A40 / KENOX Q1" "SPREADTRUM 6800" "Sony Ericsson K550i"
Кто во что горазд. То производителя и туда и туда напишут, то ©®™ навешают (да ещё и большими буквами), щедро разбавив пробелами. Не выдержав несовершенства мира, закрыл я очи и написал вот такую лапшу. Всё это наверняка придётся ещё не раз править, но пока с вышеперечисленным скромным списком справляется.
Теперь далее. Дата:
$taken = array( strtotime(@$exif_data['DateTime']), strtotime(@$exif_data['DateTimeOriginal']), strtotime(@$exif_data['DateTimeDigitized']), ); array_filter($taken); $taken = min($taken);
Получение корректных данных осложняется тем, что всякие пидоры не выставляют время на фотоаппарате. Правда, как оказалось, пидор-то всего один — Samsung Digimax A40. Нужно ли говорить чей это аппарат? Ну ещё Pentax Optio 33L (Димка Коромшук), но у того дата сбрасывается как только открываешь отсек для батареек. Но самсунг специально неделю провалялся на столе с открытой крышкой — и не отстал ни на минуту! Позор мне, как только за пять лет ни разу не подумал?
Пришлось, основываясь на дате копирования на комп, названиях файлов и воспоминаниях, писать корректировщик времени. Слава Богу, что фотографии в галерее идут в более-менее хронологическом порядке, и подгонять можно одновременно под несколько — быстрее и точнее:
$_ = "(SELECT id FROM the_tags WHERE title LIKE '%Digimax A40%' AND `key` = 'gallery-hardware')"; DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 122807071 WHERE hardware = {$_} AND imageid > 492 AND imageid <= 499"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 122765671 WHERE hardware = {$_} AND imageid > 476 AND imageid <= 492"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 120762000 WHERE hardware = {$_} AND imageid > 414 AND imageid <= 476"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 486600 WHERE hardware = {$_} AND imageid > 384 AND imageid <= 414"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 242740 WHERE hardware = {$_} AND imageid > 289 AND imageid <= 355"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 72000 WHERE hardware = {$_} AND imageid > 225 AND imageid <= 289"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 342800 WHERE hardware = {$_} AND imageid > 219 AND imageid <= 225"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 242740 WHERE hardware = {$_} AND imageid > 176 AND imageid <= 219"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 118800 WHERE hardware = {$_} AND imageid > 160 AND imageid <= 176"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 72000 WHERE hardware = {$_} AND imageid = 84"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 242740 WHERE hardware = {$_} AND imageid <= 49"); DM::QueryWrite("UPDATE `the_gallery_images` SET taken = taken + 141552000 WHERE imageid <= 23");
Располагается это, конечно же, прямо в коде контроллера, перечитывающего EXIF со всей галереи (решил его так и оставить — вдруг ещё какие подробности всплывут). А потом меня просят «поделиться своим движком» (ведь я так мастерски модифицировал WordPress!) и приходится обьяснять: вот понимаешь, да, там всё круто, но есть одна фича: если ID фотки лежит в полуинтервале (492; 499] и она снята на Samsung Digimax A40, то у неё дата будет на 3 года 11 месяцев и 22 дня больше, чем нужно, и это не баг.
Ещё неплохо получилось с легендарной Motorola C650. EXIF она хоть и не пишет, но время создания в свойствах файла сохраняет, а MMCenter, которым я их скачивал на комп, его передаёт. Правда, эти ценнейшие данные дают больше вопросов, чем ответов. Вот, к примеру, одна из самых значимых фотографий — про кока-колу, сделанная вместе с Димкой на остановке после курсов. В 18:12, хотя пара обычно кончалась в 18:25. В пятницу — после математики, хотя всю жизнь казалось, что в среду после русского. Да и по дате это пораньше должно было быть — во времена этой фотки я целыми вечерами ошивался на промофоруме, дорвавшись наконец-то до неповременного интернета. А в середине февраля уже близился бан к компу за неподобающую успеваемость (4 по географии, ну совсем охуел ребёнок!). Сплошные загадки 
А вот телефоны от SAMSUNG не блещут. Что в теперь уже папином слайдере, что в опять же Димкином коммуникаторе производитель один — CoreLogic Samsung, а самое дурацкое — не прописана дата. Они стоят в 3 раза дороже моторолы каждый, могут заходить не только в WAP, но и в Internet, а дату вписать в EXIF ну никак. Да, в некоторых файлах тегов нет вообще. Что у меня, что у Димки. Даже Fly со своим Spreadtrum 6800 и то выглядит лучше.
Выставляйте дату на фотоаппаратах 

Добавлено через 30 минут
А похуй, все равно сделал.
Камера: OLYMPUS IMAGING CORP. FE45,X40
Добавлено через 15 минут
По фоткам у меня в галерее понял, что старые нокии вообще не знали, что такое EXIF, а вот SE довольно хорошо прописались. Но, конечно, D80 без комментариев

Добавлено через 2 минуты
Зато новые нокии я смотрю научились хорошо прописываться. Что N73, что N900.
Ага, это моя хуита, которая батарейки жрет как сволочь =\

IMAGING CORP.

старые нокии вообще не знали, что такое EXIF, а вот SE довольно хорошо прописалисьАга, из старых никто не знал, я CX65 вручную прописывал, а вот что было у всяких Никит в 10 классе, хз

если ID фотки лежит в полуинтервале (492; 499] и она снята на Samsung Digimax A40, то у неё дата будет на 3 года 11 месяцев и 22 дня больше, чем нужно, и это не баг.Серьёзная фича однако

а как-же
if (empty($arr)) {
// ...
}
empty(array_intersect(str_split($words[$i]), str_split("0123456789")))empty can not be used in write context 
Доступные тэги: <b>, <i>, <s>, <u>, <a href="">, <img src="" /> (загрузить), <pre>, <quote>
- themylogin › Самое дорогое в жизни Вчера, 02:19
- ramwoolf › Am I not always be wanting this? (x8) 16 мая, 23:08
- anonymous › Написание «не» с различными частями речи 16 мая, 16:06
- anonymous › A Tragedy in the Air 15 мая, 18:24
- themylogin › Итоги 2011 15 мая, 12:10
- themylogin › На гелике езжу 13 мая, 16:24
- anonymous › Waking up at ten 13 мая, 13:16
- themylogin › Жук 12 мая, 11:55
- themylogin › Давайте шутки из твиттера продолжим развивать здесь 7 мая, 11:03
- anonymous › Шевченко лох 6 мая, 14:02
