From c3ed68357730ecf903463d81ef53227f3cf7eb70 Mon Sep 17 00:00:00 2001 From: Jeena Date: Fri, 6 Aug 2021 04:43:12 +0200 Subject: [PATCH] Initial commit --- .env.original | 4 + .gitignore | 4 + Pipfile | 14 ++ Pipfile.lock | 288 ++++++++++++++++++++++++++++++++++++ README.md | 15 ++ client_secret.json.original | 11 ++ google-photos.py | 110 ++++++++++++++ run.sh | 5 + synology.py | 54 +++++++ 9 files changed, 505 insertions(+) create mode 100644 .env.original create mode 100644 .gitignore create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 README.md create mode 100644 client_secret.json.original create mode 100755 google-photos.py create mode 100755 run.sh create mode 100755 synology.py diff --git a/.env.original b/.env.original new file mode 100644 index 0000000..344a2fb --- /dev/null +++ b/.env.original @@ -0,0 +1,4 @@ +DB_HOST= +DB_USER= +DB_PASSWD= + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d68b091 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.env +__pycache__/ +client_secret.json +token.pickle diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..44c65b4 --- /dev/null +++ b/Pipfile @@ -0,0 +1,14 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +google-auth-oauthlib = "*" +psycopg2-binary = "*" +google-api-python-client = "*" + +[dev-packages] + +[requires] +python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..8250ca6 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,288 @@ +{ + "_meta": { + "hash": { + "sha256": "b35e976d9f0bbffebb2b0df18c4fb553d9ccf4cb3721df71dc60b46f44de7726" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "cachetools": { + "hashes": [ + "sha256:2cc0b89715337ab6dbba85b5b50effe2b0c74e035d83ee8ed637cf52f12ae001", + "sha256:61b5ed1e22a0924aed1d23b478f37e8d52549ff8a961de2909c69bf950020cff" + ], + "markers": "python_version ~= '3.5'", + "version": "==4.2.2" + }, + "certifi": { + "hashes": [ + "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", + "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" + ], + "version": "==2021.5.30" + }, + "charset-normalizer": { + "hashes": [ + "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b", + "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3" + ], + "markers": "python_version >= '3'", + "version": "==2.0.4" + }, + "google-api-core": { + "hashes": [ + "sha256:108cf94336aed7e614eafc53933ef02adf63b9f0fd87e8f8212acaa09eaca456", + "sha256:1d63e2b28057d79d64795c9a70abcecb5b7e96da732d011abf09606a39b48701" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.31.1" + }, + "google-api-python-client": { + "hashes": [ + "sha256:8375489232823f44c601196a960505e03ec58c95ddb6415c6b1d1d76b468f8ba", + "sha256:87af2462b922c976291fcd0d062a0011d4ac41b11cee04089aa9577dd7b44ae3" + ], + "index": "pypi", + "version": "==2.15.0" + }, + "google-auth": { + "hashes": [ + "sha256:bd6aa5916970a823e76ffb3d5c3ad3f0bedafca0a7fa53bc15149ab21cb71e05", + "sha256:f1094088bae046fb06f3d1a3d7df14717e8d959e9105b79c57725bd4e17597a2" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.34.0" + }, + "google-auth-httplib2": { + "hashes": [ + "sha256:31e49c36c6b5643b57e82617cb3e021e3e1d2df9da63af67252c02fa9c1f4a10", + "sha256:a07c39fd632becacd3f07718dfd6021bf396978f03ad3ce4321d060015cc30ac" + ], + "version": "==0.1.0" + }, + "google-auth-oauthlib": { + "hashes": [ + "sha256:4ab58e6c3dc6ccf112f921fcced40e5426fba266768986ea502228488276eaba", + "sha256:b5a1ce7c617d247ccb2dfbba9d4bfc734b41096803d854a2c52592ae80150a67" + ], + "index": "pypi", + "version": "==0.4.5" + }, + "googleapis-common-protos": { + "hashes": [ + "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4", + "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0" + ], + "markers": "python_version >= '3.6'", + "version": "==1.53.0" + }, + "httplib2": { + "hashes": [ + "sha256:0b12617eeca7433d4c396a100eaecfa4b08ee99aa881e6df6e257a7aad5d533d", + "sha256:2ad195faf9faf079723f6714926e9a9061f694d07724b846658ce08d40f522b4" + ], + "version": "==0.19.1" + }, + "idna": { + "hashes": [ + "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a", + "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3" + ], + "markers": "python_version >= '3'", + "version": "==3.2" + }, + "oauthlib": { + "hashes": [ + "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc", + "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3" + ], + "markers": "python_version >= '3.6'", + "version": "==3.1.1" + }, + "packaging": { + "hashes": [ + "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7", + "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14" + ], + "markers": "python_version >= '3.6'", + "version": "==21.0" + }, + "protobuf": { + "hashes": [ + "sha256:13ee7be3c2d9a5d2b42a1030976f760f28755fcf5863c55b1460fd205e6cd637", + "sha256:145ce0af55c4259ca74993ddab3479c78af064002ec8227beb3d944405123c71", + "sha256:14c1c9377a7ffbeaccd4722ab0aa900091f52b516ad89c4b0c3bb0a4af903ba5", + "sha256:1556a1049ccec58c7855a78d27e5c6e70e95103b32de9142bae0576e9200a1b0", + "sha256:26010f693b675ff5a1d0e1bdb17689b8b716a18709113288fead438703d45539", + "sha256:2ae692bb6d1992afb6b74348e7bb648a75bb0d3565a3f5eea5bec8f62bd06d87", + "sha256:2bfb815216a9cd9faec52b16fd2bfa68437a44b67c56bee59bc3926522ecb04e", + "sha256:4ffbd23640bb7403574f7aff8368e2aeb2ec9a5c6306580be48ac59a6bac8bde", + "sha256:59e5cf6b737c3a376932fbfb869043415f7c16a0cf176ab30a5bbc419cd709c1", + "sha256:6902a1e4b7a319ec611a7345ff81b6b004b36b0d2196ce7a748b3493da3d226d", + "sha256:6ce4d8bf0321e7b2d4395e253f8002a1a5ffbcfd7bcc0a6ba46712c07d47d0b4", + "sha256:6d847c59963c03fd7a0cd7c488cadfa10cda4fff34d8bc8cba92935a91b7a037", + "sha256:72804ea5eaa9c22a090d2803813e280fb273b62d5ae497aaf3553d141c4fdd7b", + "sha256:7a4c97961e9e5b03a56f9a6c82742ed55375c4a25f2692b625d4087d02ed31b9", + "sha256:85d6303e4adade2827e43c2b54114d9a6ea547b671cb63fafd5011dc47d0e13d", + "sha256:8727ee027157516e2c311f218ebf2260a18088ffb2d29473e82add217d196b1c", + "sha256:99938f2a2d7ca6563c0ade0c5ca8982264c484fdecf418bd68e880a7ab5730b1", + "sha256:9b7a5c1022e0fa0dbde7fd03682d07d14624ad870ae52054849d8960f04bc764", + "sha256:a22b3a0dbac6544dacbafd4c5f6a29e389a50e3b193e2c70dae6bbf7930f651d", + "sha256:a38bac25f51c93e4be4092c88b2568b9f407c27217d3dd23c7a57fa522a17554", + "sha256:a981222367fb4210a10a929ad5983ae93bd5a050a0824fc35d6371c07b78caf6", + "sha256:ab6bb0e270c6c58e7ff4345b3a803cc59dbee19ddf77a4719c5b635f1d547aa8", + "sha256:c56c050a947186ba51de4f94ab441d7f04fcd44c56df6e922369cc2e1a92d683", + "sha256:e76d9686e088fece2450dbc7ee905f9be904e427341d289acbe9ad00b78ebd47", + "sha256:ebcb546f10069b56dc2e3da35e003a02076aaa377caf8530fe9789570984a8d2", + "sha256:f0e59430ee953184a703a324b8ec52f571c6c4259d496a19d1cabcdc19dabc62", + "sha256:ffea251f5cd3c0b9b43c7a7a912777e0bc86263436a87c2555242a348817221b" + ], + "version": "==3.17.3" + }, + "psycopg2-binary": { + "hashes": [ + "sha256:0b7dae87f0b729922e06f85f667de7bf16455d411971b2043bbd9577af9d1975", + "sha256:0f2e04bd2a2ab54fa44ee67fe2d002bb90cee1c0f1cc0ebc3148af7b02034cbd", + "sha256:123c3fb684e9abfc47218d3784c7b4c47c8587951ea4dd5bc38b6636ac57f616", + "sha256:1473c0215b0613dd938db54a653f68251a45a78b05f6fc21af4326f40e8360a2", + "sha256:14db1752acdd2187d99cb2ca0a1a6dfe57fc65c3281e0f20e597aac8d2a5bd90", + "sha256:1e3a362790edc0a365385b1ac4cc0acc429a0c0d662d829a50b6ce743ae61b5a", + "sha256:1e85b74cbbb3056e3656f1cc4781294df03383127a8114cbc6531e8b8367bf1e", + "sha256:20f1ab44d8c352074e2d7ca67dc00843067788791be373e67a0911998787ce7d", + "sha256:2f62c207d1740b0bde5c4e949f857b044818f734a3d57f1d0d0edc65050532ed", + "sha256:3242b9619de955ab44581a03a64bdd7d5e470cc4183e8fcadd85ab9d3756ce7a", + "sha256:35c4310f8febe41f442d3c65066ca93cccefd75013df3d8c736c5b93ec288140", + "sha256:4235f9d5ddcab0b8dbd723dca56ea2922b485ea00e1dafacf33b0c7e840b3d32", + "sha256:5ced67f1e34e1a450cdb48eb53ca73b60aa0af21c46b9b35ac3e581cf9f00e31", + "sha256:7360647ea04db2e7dff1648d1da825c8cf68dc5fbd80b8fb5b3ee9f068dcd21a", + "sha256:8c13d72ed6af7fd2c8acbd95661cf9477f94e381fce0792c04981a8283b52917", + "sha256:988b47ac70d204aed01589ed342303da7c4d84b56c2f4c4b8b00deda123372bf", + "sha256:995fc41ebda5a7a663a254a1dcac52638c3e847f48307b5416ee373da15075d7", + "sha256:a36c7eb6152ba5467fb264d73844877be8b0847874d4822b7cf2d3c0cb8cdcb0", + "sha256:aed4a9a7e3221b3e252c39d0bf794c438dc5453bc2963e8befe9d4cd324dff72", + "sha256:aef9aee84ec78af51107181d02fe8773b100b01c5dfde351184ad9223eab3698", + "sha256:b0221ca5a9837e040ebf61f48899926b5783668b7807419e4adae8175a31f773", + "sha256:b4d7679a08fea64573c969f6994a2631908bb2c0e69a7235648642f3d2e39a68", + "sha256:c250a7ec489b652c892e4f0a5d122cc14c3780f9f643e1a326754aedf82d9a76", + "sha256:ca86db5b561b894f9e5f115d6a159fff2a2570a652e07889d8a383b5fae66eb4", + "sha256:cfc523edecddaef56f6740d7de1ce24a2fdf94fd5e704091856a201872e37f9f", + "sha256:da113b70f6ec40e7d81b43d1b139b9db6a05727ab8be1ee559f3a69854a69d34", + "sha256:f6fac64a38f6768e7bc7b035b9e10d8a538a9fadce06b983fb3e6fa55ac5f5ce", + "sha256:f8559617b1fcf59a9aedba2c9838b5b6aa211ffedecabca412b92a1ff75aac1a", + "sha256:fbb42a541b1093385a2d8c7eec94d26d30437d0e77c1d25dae1dcc46741a385e" + ], + "index": "pypi", + "version": "==2.9.1" + }, + "pyasn1": { + "hashes": [ + "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", + "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", + "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", + "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", + "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", + "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", + "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", + "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", + "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", + "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", + "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", + "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", + "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" + ], + "version": "==0.4.8" + }, + "pyasn1-modules": { + "hashes": [ + "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8", + "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199", + "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811", + "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed", + "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4", + "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e", + "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74", + "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb", + "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45", + "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd", + "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0", + "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d", + "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405" + ], + "version": "==0.2.8" + }, + "pyparsing": { + "hashes": [ + "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", + "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.4.7" + }, + "pytz": { + "hashes": [ + "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da", + "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798" + ], + "version": "==2021.1" + }, + "requests": { + "hashes": [ + "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", + "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==2.26.0" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d", + "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a", + "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc" + ], + "version": "==1.3.0" + }, + "rsa": { + "hashes": [ + "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2", + "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9" + ], + "markers": "python_version >= '3.6'", + "version": "==4.7.2" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "uritemplate": { + "hashes": [ + "sha256:07620c3f3f8eed1f12600845892b0e036a2420acf513c53f7de0abd911a5894f", + "sha256:5af8ad10cec94f215e3f48112de2022e1d5a37ed427fbd88652fa908f2ab7cae" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==3.0.1" + }, + "urllib3": { + "hashes": [ + "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", + "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "version": "==1.26.6" + } + }, + "develop": {} +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..3bdabec --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +Synology Moments extraction +=========================== + +I have all my photos in a Synology Moments database and want to do fun stuff with it. + +google-photos.py uploads 20 random pictures of specific people to a specific Google Photo album so that they are showed on my TV with help of the Chromecast. + +Installation +------------ + +``` +pipenv install +pipenv shell + +``` diff --git a/client_secret.json.original b/client_secret.json.original new file mode 100644 index 0000000..e66b9bf --- /dev/null +++ b/client_secret.json.original @@ -0,0 +1,11 @@ +{ +"installed": + { + "client_id":"", + "client_secret":"", + "auth_uri":"https://accounts.google.com/o/oauth2/auth", + "token_uri":"https://www.googleapis.com/oauth2/v3/token", + "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs", + "redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"] + } +} diff --git a/google-photos.py b/google-photos.py new file mode 100755 index 0000000..a9ab596 --- /dev/null +++ b/google-photos.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 + +import synology +import shutil +import os +import pickle +import json +from googleapiclient.discovery import build +from google.auth.transport.requests import Request +from google_auth_oauthlib.flow import InstalledAppFlow +import google_auth_httplib2 # This gotta be installed for build() to work +from googleapiclient.http import MediaFileUpload +import requests +import subprocess +import shlex + +def get_creds(): + SCOPES = ['https://www.googleapis.com/auth/photoslibrary.appendonly', + 'https://www.googleapis.com/auth/photoslibrary.sharing', + 'https://www.googleapis.com/auth/photoslibrary', + 'https://www.googleapis.com/auth/photoslibrary.readonly'] + creds = None + if(os.path.exists("token.pickle")): + with open("token.pickle", "rb") as tokenFile: + creds = pickle.load(tokenFile) + if not creds or not creds.valid: + if (creds and creds.expired and creds.refresh_token): + creds.refresh(Request()) + else: + # ssh -L 8081:localhost:8081 burgpreppach.swierczyniec.info + flow = InstalledAppFlow.from_client_secrets_file('client_secret.json', SCOPES) + creds = flow.run_local_server(port = 8081) + with open("token.pickle", "wb") as tokenFile: + pickle.dump(creds, tokenFile) + return creds + +def login_gphoto(creds): + return build('photoslibrary', 'v1', credentials = creds, static_discovery=False) + +def get_album(service, name): + results = service.albums().list(pageSize=10, fields='nextPageToken,albums(id,title)').execute() + if 'albums' in results: + for r in results['albums']: + if r['title'] == name: + return r + return None + +def create_album(service, name): + request_body = {'album': {'title': name }} + results = service.albums().create(body=request_body).execute() + return results + +def empty_album(service, album): + request_body = {'albumId': album['id'], 'pageSize': 100} + results = service.mediaItems().search(body=request_body).execute() + mediaItems = results.get('mediaItems') + if mediaItems == None: + return + mediaIds = [] + for item in mediaItems: + mediaIds.append(item['id']) + + request_body = { 'mediaItemIds': mediaIds } + response = service.albums().batchRemoveMediaItems(albumId=album['id'], body=request_body).execute() + +def upload_gphoto(service, creds, album, picture_path): + upload_url = 'https://photoslibrary.googleapis.com/v1/uploads' + headers = { + 'Authorization': 'Bearer ' + creds.token, + 'Content-type': 'application/octet-stream', + 'X-Goog-Upload-Protocol': 'raw' + } + img = open(os.path.join(picture_path), 'rb').read() + response = requests.post(upload_url, data=img, headers=headers) + request_body = { + 'albumId': album['id'], + 'newMediaItems': [ + { + 'simpleMediaItem': { + 'uploadToken': response.content.decode('utf-8') + } + } + ] + } + upload_response = service.mediaItems().batchCreate(body=request_body).execute() + +if __name__ == "__main__": + + get_pictures = True + if get_pictures: + host_ip = os.getenv('DB_HOST') + conn = synology.connect_db(host_ip, os.getenv('DB_USER'), os.getenv('DB_PASSWD')) + names = "richard|yingfen" + pictures = synology.fetch_paths_for_names(conn, names, 20) + synology.close_db(conn) + dirpath = synology.fetch_files("jeena@" + host_ip, "/var/services/homes/jeena/Drive", pictures) + + creds = get_creds() + gclient = login_gphoto(creds) + album = get_album(gclient, "Synology") + if album == None: + album = create_album(gclient, "Synology") + + empty_album(gclient, album) + + with os.scandir(dirpath) as dirs: + for entry in dirs: + upload_gphoto(gclient, creds, album, os.path.join(dirpath, entry.name)) + + shutil.rmtree(dirpath) diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..44371de --- /dev/null +++ b/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +PATH=/home/jeena/.local/bin/:$PATH +cd /home/jeena/Projects/synology-pictures/ +pipenv run python3 google-photos.py diff --git a/synology.py b/synology.py new file mode 100755 index 0000000..dfecca9 --- /dev/null +++ b/synology.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 + +import psycopg2 +import tempfile +import shutil +import os + +def connect_db(db_host, db_user, db_passwd): + return psycopg2.connect( + host=db_host, + database="synophoto", + user=db_user, + password=db_passwd) + +def close_db(conn): + conn.close() + +def fetch_paths_for_names(conn, names, limit=20): + sql_query = """ +SELECT folder.name, unit.filename +FROM unit + LEFT OUTER JOIN face ON face.ref_id_unit = unit.id + LEFT OUTER JOIN folder ON folder.id = unit.id_folder +WHERE + face.id_person in (SELECT id FROM person WHERE lower(name) SIMILAR TO %s) +ORDER BY random() +LIMIT %s; +""" + cur = conn.cursor() + cur.execute(sql_query, ('%(' + names + ')%', limit)) + pictures = cur.fetchall() + cur.close() + + return pictures + +def fetch_files(remotehost, lib_path, pictures): + dirpath = tempfile.mkdtemp() + for picture in pictures: + remotefile = '\ '.join('/'.join([lib_path, picture[0], picture[1]]).split()) + localfile = '/'.join([dirpath, picture[1]]) + escaped_remotefile = remotefile.replace(" ", "\ ").replace("(", "\(").replace(")", "\)").replace("&", "\&") + cmd = 'scp "' + remotehost + ':' + escaped_remotefile + '" "' + localfile + '"' + os.system(cmd) + return dirpath + + +if __name__ == "__main__": + host_ip = os.getenv('DB_HOST') + conn = connect_db(host_ip, os.getenv('DB_USER'), os.getenv('DB_PASSWD')) + names = "richard|yingfen" + pictures = fetch_paths_for_names(conn, names, 5) + close_db(conn) + dirpath = fetch_files("jeena@" + host_ip, "/var/services/homes/jeena/Drive", pictures) + shutil.rmtree(dirpath)