1
0
mirror of https://github.com/mitb-archive/filebot synced 2024-11-11 20:05:04 -05:00
filebot/source/net/filebot/torrent/Torrent.java

162 lines
3.5 KiB
Java

package net.filebot.torrent;
import static java.nio.charset.StandardCharsets.*;
import static java.util.Collections.*;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.filebot.vfs.FileInfo;
import net.filebot.vfs.SimpleFileInfo;
public class Torrent {
private String name;
private String encoding;
private String createdBy;
private String announce;
private String comment;
private Long creationDate;
private Long pieceLength;
private List<FileInfo> files;
private boolean singleFileTorrent;
protected Torrent() {
// used by serializer
}
public Torrent(File torrent) throws IOException {
this(decodeTorrent(torrent));
}
public Torrent(Map<?, ?> torrentMap) {
Charset charset = UTF_8;
encoding = decodeString(torrentMap.get("encoding"), charset);
try {
charset = Charset.forName(encoding);
} catch (IllegalArgumentException e) {
// invalid encoding, just keep using UTF-8
}
createdBy = decodeString(torrentMap.get("created by"), charset);
announce = decodeString(torrentMap.get("announce"), charset);
comment = decodeString(torrentMap.get("comment"), charset);
creationDate = decodeLong(torrentMap.get("creation date"));
Map<?, ?> infoMap = (Map<?, ?>) torrentMap.get("info");
name = decodeString(infoMap.get("name"), charset);
pieceLength = (Long) infoMap.get("piece length");
if (infoMap.containsKey("files")) {
// torrent contains multiple entries
singleFileTorrent = false;
List<FileInfo> entries = new ArrayList<FileInfo>();
for (Object fileMapObject : (List<?>) infoMap.get("files")) {
Map<?, ?> fileMap = (Map<?, ?>) fileMapObject;
List<?> pathList = (List<?>) fileMap.get("path");
StringBuilder path = new StringBuilder(80);
Iterator<?> iterator = pathList.iterator();
while (iterator.hasNext()) {
// append path element
path.append(decodeString(iterator.next(), charset));
// append separator
if (iterator.hasNext()) {
path.append("/");
}
}
Long length = decodeLong(fileMap.get("length"));
entries.add(new SimpleFileInfo(path.toString(), length));
}
files = unmodifiableList(entries);
} else {
// single file torrent
singleFileTorrent = true;
Long length = decodeLong(infoMap.get("length"));
files = singletonList(new SimpleFileInfo(name, length));
}
}
private static Map<?, ?> decodeTorrent(File torrent) throws IOException {
InputStream in = new BufferedInputStream(new FileInputStream(torrent));
try {
return BDecoder.decode(in);
} finally {
in.close();
}
}
private String decodeString(Object byteArray, Charset charset) {
if (byteArray == null)
return null;
return new String((byte[]) byteArray, charset);
}
private Long decodeLong(Object number) {
if (number == null)
return null;
return (Long) number;
}
public String getAnnounce() {
return announce;
}
public String getComment() {
return comment;
}
public String getCreatedBy() {
return createdBy;
}
public Long getCreationDate() {
return creationDate;
}
public String getEncoding() {
return encoding;
}
public List<FileInfo> getFiles() {
return files;
}
public String getName() {
return name;
}
public Long getPieceLength() {
return pieceLength;
}
public boolean isSingleFileTorrent() {
return singleFileTorrent;
}
}