import sys
import time
from urllib.parse import urlparse, parse_qs
+ import webbrowser
import requests
+from requests_cache import CachedSession as CSession
from fake_useragent import UserAgent
# local imports
from getmyancestors.classes.translation import translations
+ DEFAULT_CLIENT_ID = "a02j000000KTRjpAAH"
+ DEFAULT_REDIRECT_URI = "https://misbach.github.io/fs-auth/index_raw.html"
+
-class Session(requests.Session):
+# class Session(requests.Session):
+class GMASession:
"""Create a FamilySearch session
:param username and password: valid FamilySearch credentials
:param verbose: True to active verbose mode
while True:
try:
self.write_log("Downloading: " + url)
- r = self.get(base + url, timeout=self.timeout, headers=headers)
+ r = self.get(
- "https://api.familysearch.org" + url,
++ base + url,
+ timeout=self.timeout,
+ headers=headers,
+ )
except requests.exceptions.ReadTimeout:
self.write_log("Read timed out")
continue
default=False,
help="Save settings into file [False]",
)
- try:
- parser.add_argument(
- "-o",
- "--outfile",
- metavar="<FILE>",
- # type=argparse.FileType("w", encoding="UTF-8"),
- # default=sys.stdout,
- help="output GEDCOM file [stdout]",
- )
- parser.add_argument(
- "-l",
- "--logfile",
- metavar="<FILE>",
- type=argparse.FileType("w", encoding="UTF-8"),
- default=False,
- help="output log file [stderr]",
- )
- except TypeError:
- sys.stderr.write("Python >= 3.4 is required to run this script\n")
- sys.stderr.write("(see https://docs.python.org/3/whatsnew/3.4.html#argparse)\n")
- sys.exit(2)
+ parser.add_argument(
+ "-o",
+ "--outfile",
+ metavar="<FILE>",
+ type=argparse.FileType("w", encoding="UTF-8"),
+ default=sys.stdout,
+ help="output GEDCOM file [stdout]",
+ )
+ parser.add_argument(
+ "-l",
+ "--logfile",
+ metavar="<FILE>",
+ type=argparse.FileType("w", encoding="UTF-8"),
+ default=False,
+ help="output log file [stderr]",
+ )
+ parser.add_argument(
+ "--client_id", metavar="<STR>", type=str, help="Use Specific Client ID"
+ )
+ parser.add_argument(
+ "--redirect_uri", metavar="<STR>", type=str, help="Use Specific Redirect Uri"
+ )
+ parser.add_argument(
+ "-g",
+ "--geonames",
+ metavar="<STR>",
+ type=str,
+ help="Geonames.org username in order to download place data",
+ )
# extract arguments from the command line
try:
# initialize a FamilySearch session and a family tree object
print("Login to FamilySearch...", file=sys.stderr)
+ fs = Session(
+ args.username,
+ args.password,
+ args.client_id,
+ args.redirect_uri,
+ args.verbose,
+ args.logfile,
+ args.timeout,
+ )
+ if args.cache:
+ print("Using cache...", file=sys.stderr)
+ fs = CachedSession(args.username, args.password, args.verbose, args.logfile, args.timeout)
+ else:
+ fs = Session(args.username, args.password, args.verbose, args.logfile, args.timeout)
if not fs.logged:
sys.exit(2)
_ = fs._
- tree = Tree(fs)
+ tree = Tree(
- fs,
++ fs,
+ exclude=args.exclude,
+ geonames_key=args.geonames,
+ )
# check LDS account
if args.get_ordinances:
print(_("Downloading starting individuals..."), file=sys.stderr)
tree.add_indis(todo)
-
-
# download ancestors
- todo = set(tree.indi.keys())
- done = set()
- for i in range(args.ascend):
- if not todo:
- break
- done |= todo
- print(
- _("Downloading %s. of generations of ancestors...") % (i + 1),
- file=sys.stderr,
- )
- todo = tree.add_parents(todo) - done
-
- # download descendants
- todo = set(tree.indi.keys())
- done = set()
- for i in range(args.descend):
- if not todo:
- break
- done |= todo
- print(
- _("Downloading %s. of generations of descendants...") % (i + 1),
- file=sys.stderr,
- )
- todo = tree.add_children(todo) - done
+ if args.distance == 0:
+ todo = set(tree.indi.keys())
+ done = set()
+ for i in range(args.ascend):
+ if not todo:
+ break
+ done |= todo
+ print(
+ _("Downloading %s. of generations of ancestors...") % (i + 1),
+ file=sys.stderr,
+ )
+ todo = tree.add_parents(todo) - done
- # download spouses
- if args.marriage:
- print(_("Downloading spouses and marriage information..."), file=sys.stderr)
+ # download descendants
todo = set(tree.indi.keys())
- tree.add_spouses(todo)
+ done = set()
+ for i in range(args.descend):
+ if not todo:
+ break
+ done |= todo
+ print(
+ _("Downloading %s. of generations of descendants...") % (i + 1),
+ file=sys.stderr,
+ )
+ todo = tree.add_children(todo) - done
+
+ # download spouses
+ if args.marriage:
+ print(_("Downloading spouses and marriage information..."), file=sys.stderr)
+ todo = set(tree.indi.keys())
+ tree.add_spouses(todo)
+
+ else:
+ todo_bloodline = set(tree.indi.keys())
+ todo_others = set()
+ done = set()
+ for distance in range(args.distance):
+
+ if not todo_bloodline and not todo_others:
+ break
+ done |= todo_bloodline
+ print(
+ _("Downloading individuals at distance %s...") % (distance + 1),
+ file=sys.stderr,
+ )
+ parents = tree.add_parents(todo_bloodline) - done
+ children = tree.add_children(todo_bloodline) - done
+
+ # download spouses
+ if args.marriage:
+ print(_("Downloading spouses and marriage information..."), file=sys.stderr)
+ todo = set(tree.indi.keys())
+ tree.add_spouses(todo)
+
+ # spouses = tree.add_spouses(todo_bloodline) - done
+
+ todo_bloodline = parents | children
+ # if args.only_blood_relatives:
+ # # Downloading non bloodline parents
+ # tree.add_parents(todo_others)
+
+ # # TODO what is a non bloodline person becomes bloodline on another branch?
+ # todo_others = spouses
+ # else:
+ # todo_bloodline |= spouses
# download ordinances, notes and contributors
async def download_stuff(loop):