File size: 4,437 Bytes
35f26df
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import pandas as pd
import random
import os
import asyncio
from googleapiclient.discovery import build
from config import LOCAL_EXCEL_PATH, DRIVE_EXCEL_FILE_ID, TEMP_VIDEO_DIR
import google_utils
import facebook_utils

# Lock để tránh 2 page cùng ghi file Excel 1 lúc
excel_lock = asyncio.Lock()

async def process_single_page(page_config, drive_credentials):
    sheet_name = page_config['sheet_name']
    print(f"🚀 [Processor] Bắt đầu xử lý cho Sheet: {sheet_name}")
    
    drive_service = build('drive', 'v3', credentials=drive_credentials)
    
    async with excel_lock:
        # 1. Tải file Excel mới nhất về
        await google_utils.download_file_from_drive(drive_service, DRIVE_EXCEL_FILE_ID, LOCAL_EXCEL_PATH)
        
        # 2. Đọc dữ liệu
        try:
            df = pd.read_excel(LOCAL_EXCEL_PATH, sheet_name=sheet_name)
        except ValueError:
            print(f"❌ Không tìm thấy sheet {sheet_name}")
            return

        # 3. Lọc các dòng NYS (Giả sử cột Status là cột E - index 4)
        # Cấu trúc: A:STT, B:Desc, C:Shopee, D:DriveID, E:Status
        # Pandas index cột: 0, 1, 2, 3, 4
        
        # Chuẩn hóa tên cột để dễ gọi
        df.columns = ['STT', 'Desc', 'ShopeeLink', 'DriveVideoID', 'Status', 'NewContent'] # Thêm cột NewContent nếu cần
        
        nys_rows = df[df['Status'] == 'NYS']
        
        if nys_rows.empty:
            print(f"⚠️ Sheet {sheet_name} đã hết bài (không còn NYS).")
            return

        # 4. Chọn ngẫu nhiên
        selected_row_index = random.choice(nys_rows.index)
        row_data = df.loc[selected_row_index]
        
        print(f"--- Đã chọn dòng {selected_row_index + 2} ---")

    # (Nhả lock Excel ra để xử lý nặng)

    try:
        # 5. Gemini viết lại nội dung
        original_desc = str(row_data['Desc'])
        new_content = await google_utils.generate_content_with_gemini(original_desc)
        
        # 6. Tải video
        video_drive_id = str(row_data['DriveVideoID'])
        if not os.path.exists(TEMP_VIDEO_DIR): os.makedirs(TEMP_VIDEO_DIR)
        local_video_path = os.path.join(TEMP_VIDEO_DIR, f"{sheet_name}_{video_drive_id}.mp4")
        
        await google_utils.download_video_by_id(drive_service, video_drive_id, local_video_path)
        
        # 7. Upload Facebook
        video_id = await facebook_utils.upload_reel(
            page_config['page_id'],
            page_config['access_token'],
            local_video_path,
            new_content
        )
        print(f"✅ Upload thành công. ID: {video_id}")
        
        # 8. Comment
        cta = "🔥 Săn ngay tại đây cả nhà ơi: "
        comment_msg = f"{cta} {row_data['ShopeeLink']}"
        await facebook_utils.comment_on_video(video_id, page_config['access_token'], comment_msg)
        
        # 9. Cập nhật Excel (Cần Lock lại)
        async with excel_lock:
            # Đọc lại file để đảm bảo không đè dữ liệu của luồng khác
            # (Trong thực tế nên dùng Google Sheets API update cell trực tiếp sẽ tốt hơn download/upload)
            # Nhưng ở đây ta làm theo logic file Excel local
            df_update = pd.read_excel(LOCAL_EXCEL_PATH, sheet_name=None) # Đọc tất cả sheet
            
            # Cập nhật sheet hiện tại
            sheet_df = df_update[sheet_name]
            sheet_df.at[selected_row_index, 'Status'] = 'Uploaded'
            # Giả sử cột F là nội dung mới
            if len(sheet_df.columns) > 5:
                sheet_df.iloc[selected_row_index, 5] = new_content 
            
            # Lưu và Upload
            with pd.ExcelWriter(LOCAL_EXCEL_PATH, engine='openpyxl') as writer:
                for s_name, s_df in df_update.items():
                    s_df.to_excel(writer, sheet_name=s_name, index=False)
            
            await google_utils.upload_file_to_drive(drive_service, LOCAL_EXCEL_PATH, DRIVE_EXCEL_FILE_ID)
            print(f"✅ Đã cập nhật Excel lên Drive.")

        # Dọn dẹp
        if os.path.exists(local_video_path): os.remove(local_video_path)

    except Exception as e:
        print(f"❌ Lỗi xử lý Page {sheet_name}: {e}")