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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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


Интересные статьи

Интересные статьи

Вы можете использовать это руководство для получения практической информации о том, как найти и установить последнюю версию Java, понять различия между дистрибутивами Java (Adoptium, AdoptOpenJdk, Ope...
В JVM 1.8 отсутствует удобный и простой в использовании класс форматирования класса java.sql.Timestamp с микро и нано секундами. Есть специализированный пакет java.time с достаточно разнообразной функ...
Привет, мы команда СберМегаМаркета, и это обзорная статья о нашей площадке, пробный камень для блога Хабре. За нашими плечами спешный переезд с PHP на GO, ребрендинг и решение таких задач, с которыми ...
В скором времени в грядущей Java 14 появится новая синтаксическая фича — записи (records). После изучения превью, в котором вкратце описано, как выглядят записи и с “чем их едят”, я осмелился ада...
Если в вашей компании хотя бы два сотрудника, отвечающих за работу со сделками в Битрикс24, рано или поздно возникает вопрос распределения лидов между ними.