mirror of
https://github.com/fabianonline/telegram_backup.git
synced 2024-11-22 16:56:16 +00:00
You could call this version a first beta version.
This commit is contained in:
parent
265f3e854a
commit
c0bc3cdd2d
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@ build/
|
|||||||
auth.dat
|
auth.dat
|
||||||
dc.dat
|
dc.dat
|
||||||
data/
|
data/
|
||||||
|
.DS_Store
|
||||||
|
@ -9,6 +9,7 @@ import de.fabianonline.telegram_backup.Config;
|
|||||||
import de.fabianonline.telegram_backup.ApiStorage;
|
import de.fabianonline.telegram_backup.ApiStorage;
|
||||||
import de.fabianonline.telegram_backup.UserManager;
|
import de.fabianonline.telegram_backup.UserManager;
|
||||||
import de.fabianonline.telegram_backup.DownloadManager;
|
import de.fabianonline.telegram_backup.DownloadManager;
|
||||||
|
import de.fabianonline.telegram_backup.CommandLineDownloadProgress;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -61,12 +62,13 @@ public class CommandLineController {
|
|||||||
}
|
}
|
||||||
storage.setPrefix("+" + user.getUser().getPhone());
|
storage.setPrefix("+" + user.getUser().getPhone());
|
||||||
|
|
||||||
System.out.println("Next time, please run this tool with '--account " + user.getUser().getPhone() + " to use this account.");
|
System.out.println("Please run this tool with '--account +" + user.getUser().getPhone() + " to use this account.");
|
||||||
|
System.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("You are logged in as " + user.getUserString());
|
System.out.println("You are logged in as " + user.getUserString());
|
||||||
|
|
||||||
DownloadManager d = new DownloadManager(user, client);
|
DownloadManager d = new DownloadManager(user, client, new CommandLineDownloadProgress());
|
||||||
d.downloadMessages(options.limit_messages);
|
d.downloadMessages(options.limit_messages);
|
||||||
d.downloadMedia();
|
d.downloadMedia();
|
||||||
} catch (RpcErrorException e) {
|
} catch (RpcErrorException e) {
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package de.fabianonline.telegram_backup;
|
||||||
|
|
||||||
|
import de.fabianonline.telegram_backup.DownloadProgressInterface;
|
||||||
|
|
||||||
|
class CommandLineDownloadProgress implements DownloadProgressInterface {
|
||||||
|
private int mediaCount = 0;
|
||||||
|
private int i = 0;
|
||||||
|
|
||||||
|
public void onMessageDownloadStart(int count) { System.out.println("Downloading " + count + " messages."); }
|
||||||
|
public void onMessageDownloaded(int number) { System.out.print("" + number + "..."); }
|
||||||
|
public void onMessageDownloadFinished() { System.out.println(" done."); }
|
||||||
|
|
||||||
|
public void onMediaDownloadStart(int count) { i = 0; mediaCount = count; System.out.println("Checking " + count + " media."); }
|
||||||
|
|
||||||
|
public void onMediaDownloadedVideo(boolean n) { show(n, 'V'); }
|
||||||
|
public void onMediaDownloadedPhoto(boolean n) { show(n, 'P'); }
|
||||||
|
public void onMediaDownloadedDocument(boolean n) { show(n, 'D'); }
|
||||||
|
public void onMediaDownloadedSticker(boolean n) { show(n, 'S'); }
|
||||||
|
public void onMediaDownloadedOther(boolean n) { show(n, ' '); }
|
||||||
|
public void onMediaDownloadFinished() { showNewLine(); System.out.println("Done."); }
|
||||||
|
|
||||||
|
private void show(boolean n, char letter) { System.out.print(n ? letter : '.'); i++; if (i % 50 == 0) showNewLine();}
|
||||||
|
private void showNewLine() { System.out.println(" - " + i + "/" + mediaCount); }
|
||||||
|
}
|
||||||
|
|
@ -17,8 +17,8 @@ class Config {
|
|||||||
public static final String FILE_FILES_BASE = "files";
|
public static final String FILE_FILES_BASE = "files";
|
||||||
public static final String FILE_STICKER_BASE = "stickers";
|
public static final String FILE_STICKER_BASE = "stickers";
|
||||||
|
|
||||||
public static final int FILE_DOWNLOAD_BLOCK_SIZE = 1024*1024;
|
public static final int FILE_DOWNLOAD_BLOCK_SIZE = 10*1024*1024;
|
||||||
|
|
||||||
public static final int DELAY_AFTER_GET_FILE = 750;
|
public static final int DELAY_AFTER_GET_FILE = 200;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,7 +142,6 @@ class Database {
|
|||||||
} else if (msg.getMedia() instanceof TLMessageMediaPhoto) {
|
} else if (msg.getMedia() instanceof TLMessageMediaPhoto) {
|
||||||
text = ((TLMessageMediaPhoto)msg.getMedia()).getCaption();
|
text = ((TLMessageMediaPhoto)msg.getMedia()).getCaption();
|
||||||
}
|
}
|
||||||
System.out.println("" + msg.getId() + ": >" + text + "<");
|
|
||||||
}
|
}
|
||||||
ps.setString(5, text);
|
ps.setString(5, text);
|
||||||
ps.setString(6, ""+msg.getDate());
|
ps.setString(6, ""+msg.getDate());
|
||||||
@ -163,7 +162,6 @@ class Database {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sticker != null) {
|
if (sticker != null) {
|
||||||
System.out.println("" + msg.getId() + ": >" + msg.getMessage() + "< " + sticker);
|
|
||||||
ps.setString(9, sticker);
|
ps.setString(9, sticker);
|
||||||
} else {
|
} else {
|
||||||
ps.setNull(9, Types.VARCHAR);
|
ps.setNull(9, Types.VARCHAR);
|
||||||
|
@ -3,6 +3,7 @@ package de.fabianonline.telegram_backup;
|
|||||||
import de.fabianonline.telegram_backup.UserManager;
|
import de.fabianonline.telegram_backup.UserManager;
|
||||||
import de.fabianonline.telegram_backup.Database;
|
import de.fabianonline.telegram_backup.Database;
|
||||||
import de.fabianonline.telegram_backup.StickerConverter;
|
import de.fabianonline.telegram_backup.StickerConverter;
|
||||||
|
import de.fabianonline.telegram_backup.DownloadProgressInterface;
|
||||||
|
|
||||||
import com.github.badoualy.telegram.api.TelegramClient;
|
import com.github.badoualy.telegram.api.TelegramClient;
|
||||||
import com.github.badoualy.telegram.tl.core.TLIntVector;
|
import com.github.badoualy.telegram.tl.core.TLIntVector;
|
||||||
@ -23,10 +24,12 @@ class DownloadManager {
|
|||||||
UserManager user;
|
UserManager user;
|
||||||
TelegramClient client;
|
TelegramClient client;
|
||||||
Database db;
|
Database db;
|
||||||
|
DownloadProgressInterface prog = null;
|
||||||
|
|
||||||
public DownloadManager(UserManager u, TelegramClient c) {
|
public DownloadManager(UserManager u, TelegramClient c, DownloadProgressInterface p) {
|
||||||
this.user = u;
|
this.user = u;
|
||||||
this.client = c;
|
this.client = c;
|
||||||
|
this.prog = p;
|
||||||
this.db = new Database(u);
|
this.db = new Database(u);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,25 +63,30 @@ class DownloadManager {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prog.onMessageDownloadStart(end_id - current_start_id + 1);
|
||||||
|
|
||||||
while (current_start_id <= end_id) {
|
while (current_start_id <= end_id) {
|
||||||
int my_end_id = Math.min(current_start_id+99, end_id);
|
int my_end_id = Math.min(current_start_id+99, end_id);
|
||||||
ArrayList<Integer> a = makeIdList(current_start_id, my_end_id);
|
ArrayList<Integer> a = makeIdList(current_start_id, my_end_id);
|
||||||
TLIntVector ids = new TLIntVector();
|
TLIntVector ids = new TLIntVector();
|
||||||
ids.addAll(a);
|
ids.addAll(a);
|
||||||
my_end_id = ids.get(ids.size()-1);
|
my_end_id = ids.get(ids.size()-1);
|
||||||
System.out.println("Fetching messages from " + ids.get(0) + " to " + my_end_id + "...");
|
|
||||||
current_start_id = my_end_id + 1;
|
current_start_id = my_end_id + 1;
|
||||||
|
|
||||||
TLAbsMessages response = client.messagesGetMessages(ids);
|
TLAbsMessages response = client.messagesGetMessages(ids);
|
||||||
|
prog.onMessageDownloaded(response.getMessages().size());
|
||||||
db.save(response.getMessages());
|
db.save(response.getMessages());
|
||||||
try {
|
try {
|
||||||
Thread.sleep(750);
|
Thread.sleep(750);
|
||||||
} catch (InterruptedException e) {}
|
} catch (InterruptedException e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prog.onMessageDownloadFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void downloadMedia() throws RpcErrorException, IOException {
|
public void downloadMedia() throws RpcErrorException, IOException {
|
||||||
LinkedList<TLMessage> messages = this.db.getMessagesWithMedia();
|
LinkedList<TLMessage> messages = this.db.getMessagesWithMedia();
|
||||||
|
prog.onMediaDownloadStart(messages.size());
|
||||||
for (TLMessage msg : messages) {
|
for (TLMessage msg : messages) {
|
||||||
TLAbsMessageMedia media = msg.getMedia();
|
TLAbsMessageMedia media = msg.getMedia();
|
||||||
|
|
||||||
@ -88,22 +96,19 @@ class DownloadManager {
|
|||||||
this.downloadMessageMediaDocument(msg, (TLMessageMediaDocument)media);
|
this.downloadMessageMediaDocument(msg, (TLMessageMediaDocument)media);
|
||||||
} else if (media instanceof TLMessageMediaVideo) {
|
} else if (media instanceof TLMessageMediaVideo) {
|
||||||
this.downloadMessageMediaVideo(msg, (TLMessageMediaVideo)media);
|
this.downloadMessageMediaVideo(msg, (TLMessageMediaVideo)media);
|
||||||
} else if (media instanceof TLMessageMediaEmpty) {
|
} else if (media instanceof TLMessageMediaEmpty ||
|
||||||
// do nothing
|
media instanceof TLMessageMediaUnsupported ||
|
||||||
} else if (media instanceof TLMessageMediaUnsupported) {
|
media instanceof TLMessageMediaGeo ||
|
||||||
// do nothing
|
media instanceof TLMessageMediaWebPage ||
|
||||||
} else if (media instanceof TLMessageMediaGeo) {
|
media instanceof TLMessageMediaContact ||
|
||||||
// do nothing
|
media instanceof TLMessageMediaVenue) {
|
||||||
} else if (media instanceof TLMessageMediaWebPage) {
|
prog.onMediaDownloadedOther(true);
|
||||||
// do nothing
|
|
||||||
} else if (media instanceof TLMessageMediaContact) {
|
|
||||||
// do nothing
|
|
||||||
} else if (media instanceof TLMessageMediaVenue) {
|
|
||||||
// do nothing
|
// do nothing
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException("Unexpected " + media.getClass().getName());
|
throw new RuntimeException("Unexpected " + media.getClass().getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
prog.onMediaDownloadFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadMessageMediaPhoto(TLMessage msg, TLMessageMediaPhoto p) throws RpcErrorException, IOException {
|
private void downloadMessageMediaPhoto(TLMessage msg, TLMessageMediaPhoto p) throws RpcErrorException, IOException {
|
||||||
@ -122,7 +127,8 @@ class DownloadManager {
|
|||||||
throw new RuntimeException("Could not find a size for a photo.");
|
throw new RuntimeException("Could not find a size for a photo.");
|
||||||
}
|
}
|
||||||
if (size.getLocation() instanceof TLFileLocation) {
|
if (size.getLocation() instanceof TLFileLocation) {
|
||||||
this.downloadPhoto(msg.getId(), (TLFileLocation)size.getLocation());
|
boolean res = this.downloadPhoto(msg.getId(), (TLFileLocation)size.getLocation());
|
||||||
|
prog.onMediaDownloadedPhoto(res);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException("Got an unexpected " + p.getPhoto().getClass().getName());
|
throw new RuntimeException("Got an unexpected " + p.getPhoto().getClass().getName());
|
||||||
@ -164,7 +170,12 @@ class DownloadManager {
|
|||||||
filename = this.makeFilename(msg.getId(), ext);
|
filename = this.makeFilename(msg.getId(), ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.downloadDocument(filename, doc);
|
boolean res = this.downloadDocument(filename, doc);
|
||||||
|
if (sticker != null) {
|
||||||
|
prog.onMediaDownloadedSticker(res);
|
||||||
|
} else {
|
||||||
|
prog.onMediaDownloadedDocument(res);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException("Got an unexpected " + d.getDocument().getClass().getName());
|
throw new RuntimeException("Got an unexpected " + d.getDocument().getClass().getName());
|
||||||
}
|
}
|
||||||
@ -175,7 +186,8 @@ class DownloadManager {
|
|||||||
TLVideo vid = (TLVideo)v.getVideo();
|
TLVideo vid = (TLVideo)v.getVideo();
|
||||||
int i = vid.getMimeType().lastIndexOf('/');
|
int i = vid.getMimeType().lastIndexOf('/');
|
||||||
String ext = vid.getMimeType().substring(i+1).toLowerCase();
|
String ext = vid.getMimeType().substring(i+1).toLowerCase();
|
||||||
this.downloadVideo(this.makeFilename(msg.getId(), ext), vid);
|
boolean res = this.downloadVideo(this.makeFilename(msg.getId(), ext), vid);
|
||||||
|
prog.onMediaDownloadedVideo(res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,27 +198,27 @@ class DownloadManager {
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadPhoto(int msgId, TLFileLocation src) throws RpcErrorException, IOException {
|
private boolean downloadPhoto(int msgId, TLFileLocation src) throws RpcErrorException, IOException {
|
||||||
TLInputFileLocation loc = new TLInputFileLocation();
|
TLInputFileLocation loc = new TLInputFileLocation();
|
||||||
loc.setVolumeId(src.getVolumeId());
|
loc.setVolumeId(src.getVolumeId());
|
||||||
loc.setLocalId(src.getLocalId());
|
loc.setLocalId(src.getLocalId());
|
||||||
loc.setSecret(src.getSecret());
|
loc.setSecret(src.getSecret());
|
||||||
|
|
||||||
this.downloadFile(this.makeFilename(msgId, "jpg"), loc);
|
return this.downloadFile(this.makeFilename(msgId, "jpg"), loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadDocument(String filename, TLDocument doc) throws RpcErrorException, IOException {
|
private boolean downloadDocument(String filename, TLDocument doc) throws RpcErrorException, IOException {
|
||||||
TLInputDocumentFileLocation loc = new TLInputDocumentFileLocation();
|
TLInputDocumentFileLocation loc = new TLInputDocumentFileLocation();
|
||||||
loc.setId(doc.getId());
|
loc.setId(doc.getId());
|
||||||
loc.setAccessHash(doc.getAccessHash());
|
loc.setAccessHash(doc.getAccessHash());
|
||||||
this.downloadFileFromDc(filename, loc, doc.getDcId());
|
return this.downloadFileFromDc(filename, loc, doc.getDcId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadVideo(String filename, TLVideo vid) throws RpcErrorException, IOException {
|
private boolean downloadVideo(String filename, TLVideo vid) throws RpcErrorException, IOException {
|
||||||
TLInputDocumentFileLocation loc = new TLInputDocumentFileLocation();
|
TLInputDocumentFileLocation loc = new TLInputDocumentFileLocation();
|
||||||
loc.setId(vid.getId());
|
loc.setId(vid.getId());
|
||||||
loc.setAccessHash(vid.getAccessHash());
|
loc.setAccessHash(vid.getAccessHash());
|
||||||
this.downloadFileFromDc(filename, loc, vid.getDcId());
|
return this.downloadFileFromDc(filename, loc, vid.getDcId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private String makeFilename(int id, String ext) {
|
private String makeFilename(int id, String ext) {
|
||||||
@ -218,13 +230,13 @@ class DownloadManager {
|
|||||||
return path + id + ".dat";
|
return path + id + ".dat";
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadFile(String target, TLAbsInputFileLocation loc) throws RpcErrorException, IOException {
|
private boolean downloadFile(String target, TLAbsInputFileLocation loc) throws RpcErrorException, IOException {
|
||||||
downloadFileFromDc(target, loc, null);
|
return downloadFileFromDc(target, loc, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void downloadFileFromDc(String target, TLAbsInputFileLocation loc, Integer dcID) throws RpcErrorException, IOException {
|
private boolean downloadFileFromDc(String target, TLAbsInputFileLocation loc, Integer dcID) throws RpcErrorException, IOException {
|
||||||
// Don't download already existing files.
|
// Don't download already existing files.
|
||||||
if (new File(target).isFile()) return;
|
if (new File(target).isFile()) return false;
|
||||||
|
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
@ -243,6 +255,7 @@ class DownloadManager {
|
|||||||
try { Thread.sleep(Config.DELAY_AFTER_GET_FILE); } catch(InterruptedException e) {}
|
try { Thread.sleep(Config.DELAY_AFTER_GET_FILE); } catch(InterruptedException e) {}
|
||||||
} while(response.getBytes().getLength() == Config.FILE_DOWNLOAD_BLOCK_SIZE);
|
} while(response.getBytes().getLength() == Config.FILE_DOWNLOAD_BLOCK_SIZE);
|
||||||
fos.close();
|
fos.close();
|
||||||
|
return true;
|
||||||
} catch (java.io.IOException ex) {
|
} catch (java.io.IOException ex) {
|
||||||
if (fos!=null) fos.close();
|
if (fos!=null) fos.close();
|
||||||
new File(target).delete();
|
new File(target).delete();
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
package de.fabianonline.telegram_backup;
|
||||||
|
|
||||||
|
interface DownloadProgressInterface {
|
||||||
|
public void onMessageDownloadStart(int count);
|
||||||
|
public void onMessageDownloaded(int number);
|
||||||
|
public void onMessageDownloadFinished();
|
||||||
|
|
||||||
|
public void onMediaDownloadStart(int count);
|
||||||
|
public void onMediaDownloadedVideo(boolean n);
|
||||||
|
public void onMediaDownloadedPhoto(boolean n);
|
||||||
|
public void onMediaDownloadedDocument(boolean n);
|
||||||
|
public void onMediaDownloadedSticker(boolean n);
|
||||||
|
public void onMediaDownloadedOther(boolean n);
|
||||||
|
public void onMediaDownloadFinished();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user