App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2021-04-24 229976b4c8a0a11a30efabbb8ada5bdd0cbba8cd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package de.uhilger.calypso;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author ulrich
 */
public class OMXLogLeser {
  
  private static final Logger logger = Logger.getLogger(OMXLogLeser.class.getName());
  
  public static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  
  private static final long MILLIS = (long) 1000;
  
  private static final long MINSEC = (long) 60;
  
  
  public String logDirLesen(File logDir) throws IOException, FileNotFoundException, ParseException {
    Blocks blocks = new Blocks();
    File[] files = logDir.listFiles();
    for(File file : files) {
      lesen(file, blocks);
    }
    return blocks.getTimeString();
  }
      
  /**
   * 
   * <p>Die Spieldauer laut OMX-Log ergibt sich aus dem Zeitstempel des 
   * letzten Eintrags abzueglich des Zeitstempels des 
   * ersten Eintrags abzueglich der Pausen</p>
   * 
   * <p>Eine Pause ist der Zeitraum vom Zeitstempel eines Eintrags mit 
   * <code>Keyboard: character p (0x70)</code> bis zum Zeitstempel des 
   * n&auml;chsten Eintrags mit <code>Keyboard: character p</code></p>
   * 
   * 
   * @param logfile
   * @param blocks
   * @return  die Spieldauer als String im Format H:MM:SS
   * @throws FileNotFoundException
   * @throws IOException
   * @throws ParseException 
   */
  public void lesen(File logfile, Blocks blocks) throws FileNotFoundException, IOException, ParseException {    
    boolean inPause = false;
    logger.info("Starting to parse log..");
    Date parseStart = new Date();
    long lineCount = 0;
    InputStream is = new FileInputStream(logfile);
    BufferedReader r = new BufferedReader(new InputStreamReader(is));
    String firstLine = r.readLine();
    ++lineCount;
    String lastLine = "";
    String line = r.readLine();
    //Blocks blocks = new Blocks();
    Block currentBlock = new Block();
    while(line != null) {
      ++lineCount;
      if(currentBlock.getStart() == null) {
        currentBlock.setStart(line.substring(0, 8));
      }
      if(line.contains("Keyboard: character p")) {
        if(inPause) {
          currentBlock.setStart(line.substring(0, 8));          
        } else {
          currentBlock.setEnd(line.substring(0, 8));
          blocks.add(currentBlock);
          currentBlock = new Block();
        }
        inPause = !inPause;
      }
      lastLine = line;
      line = r.readLine();
    }
    currentBlock.setEnd(lastLine.substring(0, 8));
    blocks.add(currentBlock);
    Date parseEnd = new Date();
    long timeMillis = parseEnd.getTime() - parseStart.getTime();
    long timeSeconds = timeMillis / MILLIS;
    long secMillis = timeSeconds * MILLIS;
    long restMillis = timeMillis - secMillis;
    logger.log(Level.INFO, 
            "{0} lines parsed in {1} seconds and {2} milliseconds.", 
            new Object[]{lineCount, timeSeconds, restMillis});
    //return blocks.getTimeString();
  }
  
  class Block {
    private String start = null;
    private String end = null;
    
    public long getDuration() throws ParseException {
      Date startDate = sdf.parse(start);
      Date endDate = sdf.parse(end);
      return endDate.getTime() - startDate.getTime();
    }
 
    public String getStart() {
      return start;
    }
 
    public void setStart(String start) {
      //logger.log(Level.FINER, "Start: ''{0}''", start);
      this.start = start;
    }
 
    public String getEnd() {
      return end;
    }
 
    public void setEnd(String end) {
      //logger.log(Level.FINER, "End: ''{0}''", end);
      this.end = end;
    }
    
    
  }
  
  class Blocks {
    
    private final List<Block> blocks = new ArrayList();
    
    public void add(Block block) {
      blocks.add(block);
    }
    
    public long getDuration() throws ParseException {
      long duration = (long) 0;
      Iterator<Block> i = blocks.iterator();
      while(i.hasNext()) {
        Block b = i.next();
        duration += b.getDuration();
      }
      return duration;
    }
    
    public String getTimeString() throws ParseException {
      long diff = getDuration();
      long h = diff / MILLIS / MINSEC / MINSEC;
      long hmillis = h * MINSEC * MINSEC  * MILLIS;
      long m = (diff - hmillis) / MILLIS / MINSEC;
      long mmillis = m * MINSEC * MILLIS;
      long s = (diff - hmillis - mmillis) / MILLIS;
      //logger.log(Level.FINER, "{0}:{1}:{2}", new Object[]{h, m, s});
      return h + ":" + m + ":" + s;
    }
  }
}