Как стать автором
Обновить

ChatGPT на Java пишет renamer для файлов

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров2.8K

Мне понадобилось написать своей 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.

Теги:
Хабы:
Всего голосов 7: ↑4 и ↓3+1
Комментарии7

Публикации

Истории

Работа

Java разработчик
268 вакансий

Ближайшие события