Мне понадобилось написать своей renamer для фото.
Зачем? Ведь есть куча бесплатного софта для пакетного переименовывания файлов. Я попробовал несколько, и в моем случае они были бесполезны, т.к. мне нужно было в качестве имени файла указывать инфу находящуюся в метаданных. А набор этих метаданных у разных форматов файлов разный (в моем случае JPG и MOV). Причем мне нужны были нужны метаданные, так как я переименовывал файлы скаченные с GooglePhoto, и у файла меняется ДатаСоздания и ДатаИзменения на текущую. И единственный способ узнать дату, когда сделано фото — это лезть в метаданные.
Я решил, что ChatGPT быстрее меня сможет найти библиотеки на java для этого, и поэтому обратился к нему. И, спойлер, он не подвёл.
import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.quicktime.QuickTimeMetadataReader; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; import com.drew.metadata.exif.ExifSubIFDDirectory; import com.drew.metadata.mov.QuickTimeMovieHeaderDirectory; public class RenameFilesExample { public static void main(String[] args) { String folderPath = "path/to/folder"; File folder = new File(folderPath); if (!folder.isDirectory()) { System.out.println("Specified path is not a folder"); return; } File[] files = folder.listFiles(); for (File file : files) { try { if (file.isFile()) { String newName = getNewFileName(file); File newFile = new File(folderPath + "/" + newName); boolean success = file.renameTo(newFile); if (!success) { System.out.println("Could not rename file: " + file.getName()); } } } catch (IOException ex) { ex.printStackTrace(); } } } private static String getNewFileName(File file) throws IOException { String extension = getFileExtension(file.getName()).toLowerCase(); Metadata metadata; String dateStr; switch (extension) { case "jpg": case "jpeg": metadata = ImageMetadataReader.readMetadata(file); ExifSubIFDDirectory directory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class); Date date = directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL); dateStr = formatDate(date); break; case "mov": metadata = QuickTimeMetadataReader.readMetadata(file); QuickTimeMovieHeaderDirectory headerDirectory = metadata.getFirstDirectoryOfType(QuickTimeMovieHeaderDirectory.class); date = headerDirectory.getDate(QuickTimeMovieHeaderDirectory.TAG_CREATION_TIME); dateStr = formatDate(date); break; default: dateStr = ""; break; } return dateStr + "." + extension; } private static String getFileExtension(String fileName) { int dotIndex = fileName.lastIndexOf('.'); if (dotIndex == -1 || dotIndex == fileName.length() - 1) { return ""; } else { return fileName.substring(dotIndex + 1); } } private static String formatDate(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); return dateFormat.format(date); } }
Тут я создал проект и скопировал себе этот код. Но оказалось, что одна из библиотек, которую использовать ChatGPT отсутcвует в mvn central.
import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import com.drew.imaging.ImageMetadataReader; import com.drew.imaging.quicktime.QuickTimeMetadataReader; import com.drew.metadata.Directory; import com.drew.metadata.Metadata; import com.drew.metadata.exif.ExifSubIFDDirectory; import org.mp4parser.IsoFile; import org.mp4parser.boxes.iso14496.part12.MovieHeaderBox; public class RenameFilesExample { public static void main(String[] args) { String folderPath = "path/to/folder"; File folder = new File(folderPath); if (!folder.isDirectory()) { System.out.println("Specified path is not a folder"); return; } File[] files = folder.listFiles(); for (File file : files) { try { if (file.isFile()) { String newName = getNewFileName(file); File newFile = new File(folderPath + "/" + newName); boolean success = file.renameTo(newFile); if (!success) { System.out.println("Could not rename file: " + file.getName()); } } } catch (IOException ex) { ex.printStackTrace(); } } } private static String getNewFileName(File file) throws IOException { String extension = getFileExtension(file.getName()).toLowerCase(); Metadata metadata; String dateStr; switch (extension) { case "jpg": case "jpeg": metadata = ImageMetadataReader.readMetadata(file); ExifSubIFDDirectory directory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class); Date date = directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL); dateStr = formatDate(date); break; case "mov": IsoFile isoFile = new IsoFile(file); MovieHeaderBox movieHeaderBox = isoFile.getMovieBox().getMovieHeaderBox(); Date creationTime = new Date(movieHeaderBox.getCreationTime().getTime() * 1000); dateStr = formatDate(creationTime); break; default: dateStr = ""; break; } return dateStr + "." + extension; } private static String getFileExtension(String fileName) { int dotIndex = fileName.lastIndexOf('.'); if (dotIndex == -1 || dotIndex == fileName.length() - 1) { return ""; } else { return fileName.substring(dotIndex + 1); } } private static String formatDate(Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); return dateFormat.format(date); } }
В итоге я взял этот код, последние версии использованных в нем библиотек и вставил путь в папке с тысячами фоток и видео. И вуаля.
Получается, за 20 мин я получил от ChatGPT рабочий софт, который отлично выполнил необходимую мне задачу. Имхо, на поиски существующего софта и настройку его работы ушло бы сильно больше времени.
Ну и конечно я запушил этот код на gitHub.
ссылка на оригинал статьи https://habr.com/ru/articles/728868/
Добавить комментарий