rcrdit/src/main/java/com/moparisthebest/rcrdit/autorec/ProgramAutoRec.java

149 lines
5.1 KiB
Java

/*
* rcrdit records TV programs from TV tuners
* Copyright (C) 2017 Travis Burtrum
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.moparisthebest.rcrdit.autorec;
import com.moparisthebest.rcrdit.xmltv.Program;
import java.io.File;
import java.io.IOException;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.ResolverStyle;
import java.util.Locale;
import java.util.Objects;
import static java.time.temporal.ChronoField.*;
/**
* Created by mopar on 2/20/17.
*/
public class ProgramAutoRec implements Comparable<ProgramAutoRec> {
private final Program program;
private final AutoRec autoRec;
public ProgramAutoRec(final Program program, final AutoRec autoRec) {
Objects.requireNonNull(program, "program must be non-null");
Objects.requireNonNull(autoRec, "autoRec must be non-null");
this.program = program;
this.autoRec = autoRec;
}
public Program getProgram() {
return program;
}
public AutoRec getAutoRec() {
return autoRec;
}
private static final char[] allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-.0123456789".toCharArray();
private static String cleanFilename(final String name) {
final StringBuilder sb = new StringBuilder(name.length());
for (final char c : name.toCharArray()) {
if (c == ' ') {
sb.append('-');
} else {
for (final char a : allowedChars)
if (c == a) {
sb.append(c);
break;
}
}
}
return sb.toString();
}
private static String getName(final Program program, final String ext, final String extra, final int count) {
final StringBuilder sb = new StringBuilder(program.getTitle().length() * 3);
sb.append(program.getTitle());
if (program.getDesc() != null)
sb.append('-').append(program.getDesc());
if (program.getEpisodeNum() != null)
sb.append('-').append(program.getEpisodeNum());
if (extra != null) {
sb.append('-').append(extra);
if (count > 0)
sb.append('-').append(count);
}
// if no desc/num/extra append date so there will never be a Judge-Judy.ts
if (program.getDesc() == null && program.getEpisodeNum() == null && extra == null)
sb.append('-').append(fileUnique.format(program.getStart()));
sb.append('.').append(ext);
return sb.toString();
}
private static final DateTimeFormatter fileUnique = new DateTimeFormatterBuilder()
.appendValue(YEAR, 4)
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR, 2)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH, 2)
.appendLiteral('.')
.appendValue(HOUR_OF_DAY, 2)
.appendValue(MINUTE_OF_HOUR, 2)
.parseStrict()
.toFormatter(Locale.US)
.withZone(ZoneId.systemDefault())
.withResolverStyle(ResolverStyle.STRICT);
public File getNewFileToWrite(final String ext) throws IOException {
final File folder = new File(autoRec.getProfile().getFolder(), cleanFilename(program.getTitle()));
folder.mkdirs();
File file = new File(folder, cleanFilename(getName(program, ext, null, 0)));
if (file.createNewFile())
return file;
int count = -1;
// program.start in format 2017-02-20.1800
final String startDate = fileUnique.format(program.getStart());
do {
file = new File(folder, cleanFilename(getName(program, ext, startDate, ++count)));
} while (!file.createNewFile());
return file;
}
@Override
public int compareTo(final ProgramAutoRec o) {
return this.autoRec.compareTo(o.autoRec);
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (!(o instanceof ProgramAutoRec)) return false;
final ProgramAutoRec that = (ProgramAutoRec) o;
return Objects.equals(program, that.program) &&
Objects.equals(autoRec, that.autoRec);
}
@Override
public int hashCode() {
return Objects.hash(program, autoRec);
}
@Override
public String toString() {
return "ProgramAutoRec{" +
"program=" + program +
", autoRec=" + autoRec +
'}';
}
}