Advertisement
dzocesrce

[NP] Subtitles

Apr 18th, 2025
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.80 KB | None | 0 0
  1. import java.io.InputStream;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.time.LocalTime;
  5.  
  6. import java.util.Scanner;
  7. class Element {
  8.     private int id;
  9.     private String time;
  10.     private String reply;
  11.  
  12.     public Element(int id, String time, String reply) {
  13.         this.id = id;
  14.         this.time = time;
  15.         this.reply = reply;
  16.     }
  17.  
  18.     public String getTime() {
  19.         return time;
  20.     }
  21.  
  22.     public void setTime(String time) {
  23.         this.time = time;
  24.     }
  25.  
  26. public long getNanoSeconds(String time) {
  27.     String[] parts = time.split(",");
  28.     LocalTime localTime = LocalTime.parse(parts[0]); // "HH:mm:ss"
  29.     long baseNanos = localTime.toNanoOfDay(); // total nanos up to this time
  30.     long extraNanos = Long.parseLong(parts[1]); // extra nanos from input
  31.     return baseNanos + extraNanos;
  32. }
  33.  
  34. public void changeTime(int shift) {
  35.     String[] times = time.replace(" --> ", " ").split("\\s+");
  36.  
  37.     long nanoStart = getNanoSeconds(times[0]) + shift;
  38.     long nanoEnd = getNanoSeconds(times[1]) + shift;
  39.  
  40.     String formattedStart = formatWithLast3Nanos(nanoStart,shift);
  41.     String formattedEnd = formatWithLast3Nanos(nanoEnd,shift);
  42.  
  43.     setTime(formattedStart + " --> " + formattedEnd);
  44. }
  45.  
  46. private String formatWithLast3Nanos(long nanos, int shift) {
  47.     LocalTime time = LocalTime.ofNanoOfDay(nanos);
  48.     int nano = time.getNano(); // full nanos
  49.     int last3 = nano % 1000;   // last 3 digits
  50.     if(shift>0 && last3-shift<0)
  51.         return String.format("%02d:%02d:%02d,%03d",
  52.         time.getHour(), time.getMinute(), time.getSecond()+1, last3);
  53.     else if(shift<0 && last3+shift>1000)
  54.         return String.format("%02d:%02d:%02d,%03d",
  55.         time.getHour(), time.getMinute(), time.getSecond()-1, last3);
  56.     else
  57.         return String.format("%02d:%02d:%02d,%03d",
  58.         time.getHour(), time.getMinute(), time.getSecond(), last3);
  59. }
  60.  
  61.     @Override
  62.     public String toString() {
  63.         return String.format("%d\n%s\n%s\n",id,time,reply);
  64.     }
  65. }
  66.  
  67. public class SubtitlesTest {
  68.     public static void main(String[] args) {
  69.         Subtitles subtitles = new Subtitles();
  70.         int n = subtitles.loadSubtitles(System.in);
  71.         System.out.println("+++++ ORIGINIAL SUBTITLES +++++");
  72.         subtitles.print();
  73.         int shift = n * 37;
  74.         shift = (shift % 2 == 1) ? -shift : shift;
  75.         System.out.println(String.format("SHIFT FOR %d ms", shift));
  76.         subtitles.shift(shift);
  77.         System.out.println("+++++ SHIFTED SUBTITLES +++++");
  78.         subtitles.print();
  79.     }
  80. }
  81.  
  82.  class Subtitles {
  83.     private List<Element> elements;
  84.  
  85.     public Subtitles() {
  86.         this.elements = new ArrayList<>();
  87.     }
  88.  
  89.     public int loadSubtitles(InputStream in) {
  90.         Scanner scanner = new Scanner(in);
  91.  
  92.         while (scanner.hasNextLine()) {
  93.             String line = scanner.nextLine().trim();
  94.             if (line.isEmpty()) continue;
  95.             int id = Integer.parseInt(line);
  96.             String time = scanner.nextLine().trim();
  97.             String text = scanner.nextLine().trim();
  98.             while (scanner.hasNextLine()) {
  99.                 String nextLine = scanner.nextLine().trim();
  100.                 if (nextLine.isEmpty()) break;
  101.                 text += "\n" + nextLine;
  102.             }
  103.             elements.add(new Element(id, time, text));
  104.         }
  105.         return elements.size();
  106.     }
  107.  
  108.     public void print() {
  109.         StringBuilder sb= new StringBuilder();
  110.         for(Element e : elements){
  111.             sb.append(e.toString());
  112.             if(e.equals(elements.get(elements.size()-1)))
  113.                 break;
  114.             sb.append("\n");
  115.         }
  116.  
  117.         System.out.println(sb.toString());
  118.     }
  119.  
  120.     public void shift(int shift) {
  121.   for(Element e: elements)
  122.         e.changeTime(shift);
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement