File: android-deltas-sync/x-verify-phone-part1-phone.py

#!/data/data/com.termux/files/usr/bin/python3
#!/usr/bin/env python3  <= fails in Termux:Widget (see also _etc shims)
"""
=======================================================================
Verify Phone Content, Part 1: Phone    [new in 1.1]

Run verifications occasionally (if ever) to prove that the on-phone 
content copy matches that on the PC; it's a useful but slow process.

Verify scripts can also be used to export phone content to a PC,
but may require a manual PC copy and proxy sync.  As of 1.2, the 
new x-export-* scripts perform fully-automated exports to both PC 
and proxy, and are recommended for most phone-to-PC export roles.

As of 1.2, this script is used as the on-phone part-1 step of both
verifies and exports.

See _README.html for license, attribution, version, and docs.

-----------------------------------------------------------------------
Usage:

Run this on your phone first (before running Part 2 on your PC), with:

     python3 x-verify-phone-part1-phone.py

Run this from the Termux app's console, or any other app with a 
console terminal.  This file may also be run with no command line 
from a Python IDE app (e.g., Pydroid 3 or QPython), and/or a 
home-screen shortcut or widget (e.g., Termux:Widget).

Run this from any folder.  It uses paths set in config_phone.py,
and finds commmon.py in its own folder automatically.

Step runtimes are shown in the console after step completion.  
Step outputs go to files in LOGS; watch with 'tail -f LOGS/file'.

-----------------------------------------------------------------------
Notes:

0) "PC" here means a Windows, macOS, or Linux device, but "phone" 
can be anything: though designed to sync changes to Android 11 and 
later, these scripts can also sync to earlier Androids and PCs.

1) You can run the zip and manual-move steps here manually;
this script is simply a convenience that automates the steps and
follows the rest of this package's motif, with error/safety checks.

2) This uses the phone config's settings unchanged, but inverts 
their meaning: "TO" (the on-phone copy) is really FROM here (it's
what is zipped), and "FROM" is assumed to be usable for creating 
the zip (and should be optimal: use app storage instead of shared 
storage for much faster zips).

3) Caveat: verification makes a full-content zipfile on the phone,
which is then moved to the proxy drive and unzipped on the PC.
Hence, you'll need _twice_ the size of full content on all three
devices.  This is unavoidable without on-phone POSIX USB access. 

4) This uses _uncompressed_ zips for speed; the space savings for 
compression is minimal, and won't help much with the preceding note.

5) As of 1.2, this file's code is now also used for part 1 of the 
export procedure, since it's identical (both simply zip the phone's
content in full and prompt for a manual copy to proxy).  See the 
export part 1 script's Dev notes for more on the reuse (hack).

6) As of 1.2, this was renamed from "verify..." to "x-verify..."
because it's a lesser and optional tool, and so that it appears at 
the end of by-name folder listings.  Exports are named similarly.
=======================================================================
"""

import os, sys, shutil
from os.path import join

import config_phone, common             # get phone settings and common code 
common.startup(config_phone, common)    # copy and use phone config's settings
from common import *                    # use both's top-level names as globals

# subjects
thesrc = join(TO,   STUFF)              # where content is on phone
thezip = join(FROM, 'PHONE.zip')        # where to zip on-phone content on phone

# 'from' must exist here
if not os.path.isdir(thesrc):
    print('The TO/STUFF on-phone content folder does not exist: "%s"' % thesrc)
    print('Exiting; please check the config file and rerun.')
    shutdown(bad=True)

# FROM is checked for isdir() in common.py

# Hack to reuse this code for exports: see x-export-phone-part1-phone.py
MODE = 'Export' if globals().get('EXPORTING') else 'Verify'

opener('%sing:\nfrom %s\nzip  %s\nlogs %s' %  (MODE, thesrc, thezip, LOGS))


#----------------------------------------------------------------
# Optional: for exports, offer to run nonportable-filenames fixer
#----------------------------------------------------------------

# Though rare, names created in Android app storage may fail on Windows

if MODE == 'Export': 
    offerFixnamesRun('export-0', target=thesrc)


#----------------------------------------------------------------
# 1) Zip phone content on phone with [zip-create.py -nocompress]
#----------------------------------------------------------------

# This silently blows away an existing zipfile, but all zips here do

announce('Zipping content on phone')
logto = join(LOGS, '%s--%s-1-phone-zip-log.txt' % (DATE, MODE.lower()))

runpy(join(ZIP, 'zip-create.py'), 
      thezip, thesrc, '-zip@.', '-skipcruft', '-nocompress',
      logpath=logto,
      tailing=(1, 'Zip create summary'))


#----------------------------------------------------------------
# 2) Copy verify zip from phone to proxy with an explorer app
#----------------------------------------------------------------

# Choose your app (but not Termux: POSIX cannot access USB in 11)

msg = """
Manually move PHONE.zip
    from %s
    to   the root of the USB drive
using any Android file-explorer app with suitable storage permissions.
""" % FROM

# wait for reply: include copy time in elapsed, and offer to remove
print(msg)
input('Press enter/return here when the move is finished...')

# did the move work?
if os.path.exists(thezip):
    userreply = input('%s zip still exists on phone: remove it now (y or n)?' % MODE)
    if userreply == 'y':
        timefunc(lambda: os.remove(thezip))


# cannot verify the move's USB desination here: check in step 2 on the PC
closer('See logs in "%s", and run part 2 on your PC.' % LOGS)



[Home page] Books Code Blog Python Author Train Find ©M.Lutz