User:Brooke Vibber/exif
<?php require "./commandLine.inc"; $fieldKeys = array(); $fieldFile = fopen("exif-fields.csv", "wt"); $dbr = wfGetDB(DB_SLAVE); $dbr->bufferResults(false); $result = $dbr->select('image', array('img_name', 'img_metadata'), array("img_metadata != '' and img_metadata != '0'")); foreach ($result as $row) { $name = $row->img_name; $meta = @unserialize($row->img_metadata); if (is_array($meta) && !empty($meta)) { $out = array($row->img_name); foreach($meta as $field => $val) { if (!is_array($val)) { $num = fieldKey($field); $out[] = "$num:$val"; } } print csvout($out); } } function csvout($args) { return implode(',', array_map('csvField', $args)) . "\n"; } function csvField($val) { return '"' . str_replace('"', '""', $val) . '"'; } function fieldKey($field) { global $fieldKeys, $fieldFile; if (!isset($fieldKeys[$field])) { $fieldKeys[$field] = count($fieldKeys); fwrite($fieldFile, csvOut(array($field, $fieldKeys[$field]))); } return $fieldKeys[$field]; }
<?php require "./commandLine.inc"; /* create table exif_fields ( ef_id int primary key, ef_name varchar(255) unique key ) default charset=utf8; create table exif_image ( ei_id int primary key auto_increment, ei_name varbinary(255) unique key ) default charset=utf8; create table exif_metadata ( em_img int comment 'foreign key exif_image.ei_id', em_field int comment 'foreign key exif_fields.ef_id', em_val varchar(255), key (em_img,em_field), key (em_field,em_img) ) default charset=utf8; */ $dbw = wfGetDB(DB_MASTER); $infile = fopen("exif-fields.csv", "rt"); while(!feof($infile)) { $bits = fgetcsv($infile); if ($bits) { $dbw->insert('exif_fields', array( 'ef_id' => $bits[1], 'ef_name' => $bits[0], )); } } fclose($infile); $count = 0; $infile = fopen("exif.csv", "rt"); $dbw->begin(); while(!feof($infile)) { $bits = fgetcsv($infile); if ($bits) { $name = array_shift($bits); $dbw->insert('exif_image', array('ei_name' => $name)); $id = $dbw->insertId(); $data = array(); foreach($bits as $item) { list($field, $val) = explode(':', $item, 2); if (!isset($val)) { var_dump($bits); die(); } $data[] = array( 'em_img' => $id, 'em_field' => $field, 'em_val' => $val, ); } if ($data) { $dbw->insert('exif_metadata', $data); } $count++; if($count % 1000 == 0) { print "$count...\n"; $dbw->commit(); } } } $dbw->commit(); fclose($infile);