Untitled
unknown
plain_text
10 months ago
5.9 kB
13
Indexable
# ============================================
# Pastikan Anda telah menginstal PyDrive dan tqdm
# Jalankan cell ini terlebih dahulu
# ============================================
!pip install -U -q PyDrive
!pip install -U -q tqdm
from google.colab import drive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from pydrive.files import GoogleDriveFileList
from tqdm.notebook import tqdm
# --- Pengaturan Anda ---
# Ganti dengan ID folder yang benar
SHARED_FOLDER_ID = 'ID_FOLDER_BERSAMA_ANDA'
MY_FOLDER_ID = 'ID_FOLDER_PRIBADI_ANDA'
# Atur batch size dan start index jika Anda perlu melanjutkan proses
# Jika ini adalah run pertama, biarkan START_INDEX = 0
BATCH_SIZE = 500 # Jumlah file yang akan disalin dalam satu batch
START_INDEX = 0 # Indeks awal (misalnya 500 jika Anda melanjutkan dari file ke-500)
# ============================================
# Kode di bawah ini adalah logika utama
# Jangan diubah kecuali Anda tahu apa yang Anda lakukan
# ============================================
def get_drive_service():
"""Menginisialisasi dan mengautentikasi layanan GoogleDrive."""
gauth = GoogleAuth()
gauth.LocalWebserverAuth() # Otorisasi otomatis di Colab
return GoogleDrive(gauth)
def list_files_recursively(service, folder_id):
"""Mengumpulkan daftar semua file dan folder secara rekursif."""
items = []
file_list = service.ListFile({'q': f"'{folder_id}' in parents and trashed=false"}).GetList()
for item in file_list:
if item['mimeType'] == 'application/vnd.google-apps.folder':
items.append(item)
items.extend(list_files_recursively(service, item['id']))
else:
items.append(item)
return items
def copy_items_in_batches(service, items, dest_folder_id, batch_size, start_index):
"""Menyalin item dalam batch dengan persentase kemajuan."""
total_items = len(items)
end_index = min(start_index + batch_size, total_items)
# Ambil item yang akan diproses di batch ini
items_to_process = items[start_index:end_index]
print(f"Total item yang ditemukan: {total_items}")
print(f"Memproses item dari {start_index + 1} sampai {end_index}")
# Dapatkan daftar file dan folder yang sudah ada di tujuan
existing_files = {f['title']: True for f in service.ListFile({'q': f"'{dest_folder_id}' in parents and trashed=false and mimeType!='application/vnd.google-apps.folder'"}).GetList()}
existing_folders = {f['title']: f for f in service.ListFile({'q': f"'{dest_folder_id}' in parents and trashed=false and mimeType='application/vnd.google-apps.folder'"}).GetList()}
with tqdm(total=total_items, initial=start_index, desc="Menyalin File") as pbar:
for item in items_to_process:
item_path = get_item_path(service, item)
# Tentukan folder tujuan yang tepat
parent_id = get_parent_id(service, item, dest_folder_id, existing_folders)
if item['mimeType'] == 'application/vnd.google-apps.folder':
if item['title'] not in existing_folders:
new_folder = service.CreateFile({
'title': item['title'],
'mimeType': 'application/vnd.google-apps.folder',
'parents': [{'id': parent_id}]
})
new_folder.Upload()
existing_folders[item['title']] = new_folder
print(f"Folder dibuat: {item_path}")
else:
print(f"Mengabaikan folder duplikat: {item_path}")
else:
if item['title'] not in existing_files:
try:
item.Copy(parent_id, title=item['title'])
print(f"File disalin: {item_path}")
except Exception as e:
print(f"Gagal menyalin file {item_path}: {e}")
else:
print(f"Mengabaikan file duplikat: {item_path}")
pbar.update(1)
if end_index < total_items:
print(f"\nSesi selesai. Masih ada {total_items - end_index} item tersisa.")
print(f"Untuk melanjutkan, ubah START_INDEX menjadi {end_index} dan jalankan lagi.")
else:
print("\nSemua item telah disalin. Proses selesai.")
def get_item_path(service, item):
"""Mendapatkan path relatif item."""
path = item['title']
parent_id = item['parents'][0]['id']
while True:
try:
parent = service.ListFile({'q': f"'{parent_id}' in parents and trashed=false and mimeType='application/vnd.google-apps.folder'"}).GetList()[0]
path = f"{parent['title']}/{path}"
parent_id = parent['parents'][0]['id']
if parent_id == 'root':
break
except:
break
return path
def get_parent_id(service, item, dest_folder_id, existing_folders):
"""Mencari folder tujuan yang tepat."""
parent_id = dest_folder_id
if item['parents'][0]['id'] != SHARED_FOLDER_ID:
# Ini adalah sub-item, temukan folder induk di tujuan
source_parent_folder = service.ListFile({'q': f"'{item['parents'][0]['id']}' in parents and trashed=false and mimeType='application/vnd.google-apps.folder'"}).GetList()[0]
parent_title = source_parent_folder['title']
if parent_title in existing_folders:
parent_id = existing_folders[parent_title]['id']
return parent_id
# --- Jalankan Skrip Utama ---
if __name__ == "__main__":
drive.mount('/content/drive')
service = get_drive_service()
# Ini akan memakan waktu untuk file dalam jumlah besar
print("Mengumpulkan daftar semua item... Mohon tunggu.")
all_items = list_files_recursively(service, SHARED_FOLDER_ID)
copy_items_in_batches(service, all_items, MY_FOLDER_ID, BATCH_SIZE, START_INDEX)Editor is loading...
Leave a Comment