Untitled

 avatar
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