u/mohdnader

Finding the "Unrecognized" or "Face available to Add" : How I finally automated the discovery of thousands of hidden faces in Google Photos

Finding the "Unrecognized" or "Face available to Add" : How I finally automated the discovery of thousands of hidden faces in Google Photos

I am at my breaking point. I have over 85,000 photos in my library and the number still increasing, and Google Photos has completely failed to manage all faces.

The core problem?

The "Unrecognized" faces or "Face available to Add" We all know they are there buried deep and Google makes it impossible to see a list of them. You can't search, filter or even use the AI Ask photos feature. The manually clicking through 85,000 photos to find which ones have an "Available to add" tag is a literal prison sentence. I contacted Google one support, and you know the answer.

Seriously I considered leaving for other services, but the "Google One" ecosystem trap is too strong specially with AI package. I was locked in. So, I decided to stop waiting for Google to fix their product and built my own scanner to extract these hidden faces.

I used AI to build a custom tool that scans my library, identifies exactly which photos have faces waiting for a name, and exports the direct links into a clean CSV file.

The Solution: Targeted Face Discovery

This script doesn't just "scrape" it mimics human behavior to avoid being bot, carefully navigating your library to find those "Available to add" tags that are impossible to search for manually.

How to reclaim your library (Step-by-Step):

Just a heads up: these steps are a general overview. I’m not a developer, so if you get stuck along the way, don't hesitate to use an AI assistant to help you debug or clarify any part of the process

  • Install Python
  • Install VS Code
  • Setup Your Folder
  • Create a new folder on your Desktop and name it GooglePhotosScanner.
  • Open VS Code.
  • Click File > Open Folder and select the GooglePhotosScanner folder you just created. In VS Code, look at the sidebar on the left.
  • Right-click in the empty space, select New File, and name it scan.py.
  • Copy the code block paste it into the file, and press Command + S (or Ctrl + S on Windows) to save it.

Python

from playwright.sync_api import sync_playwright
import csv
import sys
import time

sys.stdout.reconfigure(line_buffering=True)

# Settings
MAX_WAIT_TIME = 2.0 
BASE_WAIT = 1.0 

def run():
    print("--- Starting Scan with Robust Navigation ---")
    
    # Start the timer
    start_time = time.time()
    
    total_scanned = 0
    faces_found = 0
    no_faces = 0
    
    with sync_playwright() as p:
        browser = p.chromium.connect_over_cdp("http://127.0.0.1:9222")
        page = browser.contexts[0].pages[0]
        
        try:
            with open('unrecognized_faces.csv', mode='a', newline='', encoding='utf-8') as file:
                writer = csv.writer(file)
                while True:
                    current_url = page.url
                    total_scanned += 1 
                    
                    found = False
                    page.wait_for_timeout(int(BASE_WAIT * 1000))
                    
                    max_attempts = int(MAX_WAIT_TIME / 0.25)
                    for _ in range(max_attempts): 
                        if any(el.is_visible() for el in page.get_by_text("available to add", exact=False).all()):
                            found = True
                            break
                        page.wait_for_timeout(250)

                    if found:
                        faces_found += 1
                        writer.writerow([current_url])
                        file.flush()
                        print(f"✅ Found: {current_url}")
                    else:
                        no_faces += 1
                        print(f"❌ Clean: {current_url}")

                    # ==========================================
                    # 🔄 Robust Navigation Strategy
                    # ==========================================
                    navigated = False
                    for attempt in range(3): 
                        page.keyboard.press("ArrowRight")
                        
                        try:
                            page.wait_for_function(f"window.location.href !== '{current_url}'", timeout=4000)
                            navigated = True
                            break 
                        except Exception:
                            print(f"⚠️ Browser is slow... Navigation attempt {attempt + 2} of 3")
                            page.wait_for_timeout(1000) 
                    
                    if not navigated:
                        print("\n--- Reached the end of the album (or browser is completely stuck) ---")
                        break
                        
        except KeyboardInterrupt:
            print("\n--- Scan stopped manually by user ---")

    # Stop the timer and calculate elapsed time
    end_time = time.time()
    elapsed_time = end_time - start_time
    
    minutes, seconds = divmod(int(elapsed_time), 60)
    hours, minutes = divmod(minutes, 60)
    
    if hours > 0:
        time_str = f"{hours}h {minutes}m {seconds}s"
    else:
        time_str = f"{minutes}m {seconds}s"

    # Print Final Report
    print("\n" + "="*40)
    print("📊 FINAL SCAN REPORT:")
    print("="*40)
    print(f"📷 Total photos scanned:      {total_scanned}")
    print(f"⚠️ Photos with faces found:   {faces_found}")
    print(f"✅ Clean photos (No faces):   {no_faces}")
    print(f"⏱️ Total time elapsed:        {time_str}")
    print("="*40 + "\n")

if __name__ == "__main__":
    run()
  • In VS Code, click the Terminal menu at the top, then select New Terminal.
  • A window will pop up at the bottom of VS Code. Make sure it says GooglePhotosScanner in the path.
    • pip install playwright
    • playwright install chromium
    • Open Chrome in Debug Mode (so the script can see it):
    • Windows: "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
    • Mac: /Applications/Google\ [Chrome.app/Contents/MacOS/Google\](http://Chrome.app/Contents/MacOS/Google) Chrome --remote-debugging-port=9222
  • Sign in to your google account, open Google photos
  • This is important and this how is did it, In google photos search, typed Jan 2010 - Dec 2010, Open the 1st image (not in the most relevant section) then click on "i" to open the side info
  • Make sure the only chrome opened is the with the debug mode, and its viewing the 1st image in your list with side info details is opened
  • Go back to VS Code, Open new terminal while the 1st one still running and type: python3 scan.py
  • You’ll get a CSV list of every single photo in your library that contains an unidentified face.

https://preview.redd.it/ras4rlf2pb2h1.png?width=2356&format=png&auto=webp&s=1f9173da9eb4697ab06e1926fa6bdcda3e3969c3

I added a "Base Wait" of 1 second. Why? Because we want to mimic human behavior. If you go too fast, Google will flag you. This pace is safe, reliable, and it saved me months of work.

Why this changes everything: Instead of staring at thousands of photos, I now have a simple list. I can tackle 5K - 10K faces a day without breaking my back. If you are struggling with a massive, unorganized library, don't keep searching for a feature that doesn't exist. Automate the discovery yourself.

Final word: If you are currently struggling with 10k, 50k, or 85k+ photos and you feel like the system is working against you, don't give up. The solution isn't in Google's settings; it’s in taking control of the browser yourself.

Troubleshooting: If you run into any permission issues, path errors, or the script isn't detecting the port—don't panic. Just ask an AI to help you with the traceback errors. It helped me iterate and fix every bottleneck I encountered.

reddit.com
u/mohdnader — 1 day ago