{ "info": { "author": "Stephan Esterhuizen", "author_email": "esterhui@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "=====================\npypu - python pusher\n=====================\n\nSee github repository: http://github.com/esterhui/pypu\n\nThis command line interface (CLI) tool provides an easy way to manage photo\nalbums and wordpress blogs. It currently has interface to flickr, facebook, and\nwordpress.\n\nThe philosophy is to make this software similar to svn or git, where one \nadds/removes media files locally, then does a 'push' to synchronize with \nremote server, where this 'server' is facebook, flickr, wordpress. \n\nThis software can be interfaced easily with an image program like 'feh' to\ngraphically add photos to flickr/facebook.\n\nInstall\n=======\n\nEasiest is to do a pip install::\n\n pip install pypu\n\nThe script 'pypu' should be installed in /usr/bin or similar location.\n\nDependencies\n============\n\nThese dependencies should be pulled in when installing pypu\n\n- facebook_sdk\n- flickrapi \n- wordpress_xmlrpc\n- pygeocoder \n- exifread \n- PIL ('pillow' package in gentoo)\n\n\nGExiv2 - For rewriting exif information after image resize\n----------------------------------------------------------\n\nNote, there is no pip install for this package, you must install\nthe proper libexiv2 library. See this page for details: http://goo.gl/0bhDGx\n\nOn **gentoo** Linux, emerge media-libs/gexiv2 with the *introspection* USE flag.\nIf this isn't installed, images will not be resized, original version will\nbe uploaded\n\nWebsite\n=======\n\nhttp://github.com/esterhui/pypu\n\nAuthentication\n==============\n\nThe pypu app is registered with both facebook and flickr. Before pypu can \naccess your photo albums, you need to authorize the app to do so. The very\nfirst time a facebook or flickr login is required, the script will open a tab in\nyour browser, and interact with either facebook or flickr to grant this\npermission. \n\n- Facebook grants a 2 month token, thus this process only needs to be performed every two months\n If you want to change who can see pypu posts, change privacy settings here: \n \n https://www.facebook.com/settings/?tab=applications\n\n- Flickr grants a authorization token until it is revoked by the user\n\nExample Usage - Adding an album\n===============================\n\nLet's say you want to add a few photos to flickr:\n\n::\n\n > cd samples/\n > ls \n location.txt megapixels.txt sets.txt sl.jpg sl2.jpg tags.txt\n\nThe jpegs can be added to flickr, while the \\*.txt files are used for meta \ndata. Pusher will only add files to the repository that it knowns how to handle,\nlet's try adding this whole directory\n\n::\n\n > pypu -sflickr add *\n A location.txt (flickr[A])\n A megapixels_flickr.txt (flickr[A])\n A sets.txt (flickr[A])\n A sl.jpg (flickr[A])\n A sl2.jpg (flickr[A])\n A tags.txt (flickr[A])\n\nHere we tell pusher to add all the files to the service flickr. If -s option was\nnot given, all services that manage these files will try to handle them, eg.\nthe \\*.jpg files will also be managed by the facebook service.\n\nNOTE: Currently you need to open service_flickr.py and modify 'myid' to point to\nyour flickr username or whatnot.\n\nNow, let's actually push this stuff to flickr (upload to flickr):\n\n::\n\n > pypu push .\n sl.jpg - Uploading to flickr, tags[\"slow loris\" \"funny animal\" \"test\"] size=0.5 MP\n sl2.jpg - Uploading to flickr, tags[\"slow loris\" \"funny animal\" \"test\"] size=0.5 MP\n location.txt - Updating geotag information\n megapixels_flickr.txt - Updating photo size\n sets.txt - Updating sets\n tags.txt - Updating tags\n S location.txt (flickr[S])\n S megapixels_flickr.txt (flickr[S])\n S sets.txt (flickr[S])\n S sl.jpg (flickr[S])\n S sl2.jpg (flickr[S])\n S tags.txt (flickr[S])\n\nThe 'S' indicates that the data has been synchronized with the service (flickr). The\ntxt files only contain meta data and is used to update things like the 'photo\nsets' the jpegs belong to, geotagging information (if no lat/lon in EXIF).\n\nThe current sets.txt looks like this:\n\n::\n\n > cat sets.txt\n Slow loris album, test album\n\nWe actually don't want it in the test album, so let's modify sets.txt to look\nlike this:\n\n::\n\n > cat sets.txt\n Slow loris album\n\nNow, if you ask pusher to look at the status of the files, it will notice the\nmd5 checksum of the file has changed (as well as the modification time):\n\n::\n\n > pypu st .\n S location.txt (flickr[S])\n S megapixels_flickr.txt (flickr[S])\n M sets.txt (flickr[M])\n S sl.jpg (flickr[M])\n S sl2.jpg (flickr[S])\n S tags.txt (flickr[S])\n\nNotice how sets.txt has a 'M' flag, indicating it has been modified and needs to\nbe re-synchronized. Tell pusher to update photo albums (sets):\n\n::\n\n > pypu push .\n sets.txt - Updating sets\n S sets.txt (flickr[S])\n\nAll photo sets are now updated on flickr. Any of the other meta files (\\*.txt)\ncan be modified in this fashion and pusher will correctly handle the change of\nmeta data.\n\n\nExample Usage - Deleting album\n===============================\n\nOk, let's clean up this test album. Do this by removing all files from pusher.\n\n::\n\n > pypu rm *\n D location.txt (flickr[D])\n D megapixels_flickr.txt (flickr[D])\n D sets.txt (flickr[D])\n D sl.jpg (flickr[D])\n D sl2.jpg (flickr[D])\n D tags.txt (flickr[D])\n\nThis instructs pusher to issue a delete action to all services managing the\n files. In this current setup this will ask flickr to remove these files.\n\nNow issue a push command to actually apply the action:\n\n::\n \n > pypu push .\n sl.jpg - Deleting from flickr [local copy intact]\n sl2.jpg - Deleting from flickr [local copy intact]\n ? location.txt\n ? megapixels_flickr.txt\n ? sets.txt\n ? sl.jpg\n ? sl2.jpg\n ? tags.txt\n\nNotice how the two jpeg files have been removed from the flickr \nalbum as well as all meta files.\n\nSupported services\n==================\n\nTo print out all supported services, type\n\n::\n pypu services list\n\nCurrently this script supports uploading/deleting stuff via:\n\n- Facebook (fb)\n- Flickr (flickr)\n- Wordpress (wp)\n\n\nConfig files\n============\n\nlocation.txt [flickr]\n The location of the all media files in this directory. This location is \n only used when jpg file has no GPS data in the EXIF. Location is a string\n you would type into google maps eg:: \n Holcomb Valley Campground, California\n\n Pusher uses google geo-coding to look up a lat/lon coordinate for\n the given name. This lat/lon is then associated with all photos\n not geotagged via EXIF.\n \nmegapixels_flickr.txt [flickr] megapixels_fb [fb]\n The megapixels files (megapixel_flickr.txt for flickr and megapixel_fb.txt \n for facebook) is used to resize images to the specified megapixels.\n If the image is smaller than the specified megapixels, original image\n size will be used. To resize to 2.0 megapixels, this file will contain::\n 2.0\n\nsets.txt [flickr,fb]\n Only the first line is read, it's a comma separated list of photo \n sets the photos belong to. For flickr one photo can belong to many photo sets,\n for facebook, only the first set is used as the facebook album name. Here is\n an example of two photo sets::\n South Africa, travel\n \ntags.txt [flickr]\n Flickr supports adding text tags to photos. This file should contain a\n comma separated list of tags to apply to all photos in this directory::\n south africa, pretoria, hatfield\n\n.title [flickr,fb]\n If jpeg has corresponding .title file, will use text in file as\n the title. For instance if your image is loris.jpg, then \n loris.jpg.title will be read for the title.\n\n\nfeh interfacing\n===============\n\nFeh allows one to run scripts on the current image being viewed (like adding the image to flickr), and even read data from stdin to display on the image. We can take advantage of this to seamlessly integrate feh and pusher::\n\n alias f='feh -B black --draw-tinted --draw-exif -G -P -Z -g 1366x768 -d -S filename --info \"image-pusher.sh show %F\" --action \"pypu add %F\" --action4 \"pypu rm %F\" --action1 \";image-pusher.sh edit-title %F\"'\n\nNow one can browse images with 'f \\*.jpg' and use:\n\n- **Enter** : To add a picture to flickr and facebook\n- **1** : To add a title to the image\n- **4** : To remove image from services\n\nMake sure scripts/image-pusher.sh is in the search path. The very \nbottom line in feh also shows the current status of the file as viewed\nby pusher. Eg, you will see text on the image::\n A sl.jpg (fb[A] flickr[A])\n\nThis indicates this image will be added to both flickr and facebook. Remember to do a pypu push sl.jpg to actually sync this image with services.\n\nHere is an example screenshot:\n\n.. image:: docs/feh_pusher.png\n\nFlickr album on google maps\n===========================\n\nUse *build_json_from_flickr.py* to generate maps like http://gps.pythion.com\n\nTIPS\n=====\n\n- To rename all files by exif date, use exiv2 utility::\n\n exiv2 rename *.JPG\n\n\nTODO\n=====\n\n- Add support for:\n - youtube\n - google+\n- Add wordpress documentation\n- Read flickr user name from config file\n- Explain how scripts/build_json_from_flickr.py works \n- Add something like *pypu flickr init* to generate skeleton metadata files\n- Document how to add new services\n- Progress bar for large files\n- Add N/M photos uploaded\n- Supress exif warnings (enable with flag)", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/esterhui/pypu", "keywords": null, "license": "GPLv2", "maintainer": null, "maintainer_email": null, "name": "pypu", "package_url": "https://pypi.org/project/pypu/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/pypu/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/esterhui/pypu" }, "release_url": "https://pypi.org/project/pypu/0.2.0/", "requires_dist": null, "requires_python": null, "summary": "UNKNOWN", "version": "0.2.0" }, "last_serial": 1220106, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "6f372e181b2d2f25137faaf3ced1fee4", "sha256": "a3c8286d39bb1c82a76fa841f00bb862e4b0ddc842f586db90a2b8b358aa41da" }, "downloads": -1, "filename": "pypu-0.1.tar.gz", "has_sig": false, "md5_digest": "6f372e181b2d2f25137faaf3ced1fee4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114083, "upload_time": "2013-12-31T22:22:10", "url": "https://files.pythonhosted.org/packages/f3/46/dd112288194a71b6ced43185696ec97299d2d287e7c49b0f92907f8e1742/pypu-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "d2903652ab50c4978a84db595a775174", "sha256": "d5b26e3cdda6096ebfb44d8b50b41dbdba292a600301d1b3633a25cdebefdc79" }, "downloads": -1, "filename": "pypu-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d2903652ab50c4978a84db595a775174", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 114904, "upload_time": "2013-12-31T22:28:03", "url": "https://files.pythonhosted.org/packages/2c/bb/27d8cbfc061669554c8b18db92b87656be0c7ef34770efd51cd0e779fb5c/pypu-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "0e745042b29d4725c72233a65d69da62", "sha256": "6fb01dd5f49c410e51be0fed6000f93079b64c15925b7524db9422ba7a3f079c" }, "downloads": -1, "filename": "pypu-0.1.2.tar.gz", "has_sig": false, "md5_digest": "0e745042b29d4725c72233a65d69da62", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115315, "upload_time": "2013-12-31T22:54:58", "url": "https://files.pythonhosted.org/packages/05/31/29e03e470d4f567253f2ed2e4c290e5a69d93d1ab1dd79ce1b0c309dc439/pypu-0.1.2.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "584bbad4be204909664462bb03cdf1ce", "sha256": "1501c210e071f80c2a3b968605963a29cb69d3742f5858403d2083cdc7405a81" }, "downloads": -1, "filename": "pypu-0.1.4.tar.gz", "has_sig": false, "md5_digest": "584bbad4be204909664462bb03cdf1ce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115385, "upload_time": "2014-01-01T04:50:41", "url": "https://files.pythonhosted.org/packages/b8/58/32a21404ce86567d011beb299578effd58dcdfc303190ec5620c935df8cc/pypu-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "d8573ef6921bd64d2692b049460d78dd", "sha256": "0c5c3a11ac45ac06f367d106b5aebb4e0ce26ef4cbf2929257f45f83248fb66f" }, "downloads": -1, "filename": "pypu-0.1.5.tar.gz", "has_sig": false, "md5_digest": "d8573ef6921bd64d2692b049460d78dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115519, "upload_time": "2014-01-01T05:35:27", "url": "https://files.pythonhosted.org/packages/cc/fc/cb12227ccc5f24e7fd279c4bc150eee37213b79205ae331fb40474d094bb/pypu-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "8d299bb592895e3751adcfa39ff1846a", "sha256": "78646dc46346724294d5fc9702fee40a89c19c9c8edd2b6bd5c0a6eca2f4172d" }, "downloads": -1, "filename": "pypu-0.1.6.tar.gz", "has_sig": false, "md5_digest": "8d299bb592895e3751adcfa39ff1846a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115787, "upload_time": "2014-01-01T16:05:30", "url": "https://files.pythonhosted.org/packages/78/29/889b6fa188b6000042fa2818cd533604f5e9ef66b9268ff0b5ed8c603ac7/pypu-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "2db1851568fcbcb3ece0de8dd203cf6f", "sha256": "f0b67d3a5c73b2c1b04b25d94ff5dd049dce358ea1c225e84284b71f1a5c7de4" }, "downloads": -1, "filename": "pypu-0.1.7.tar.gz", "has_sig": false, "md5_digest": "2db1851568fcbcb3ece0de8dd203cf6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115798, "upload_time": "2014-01-08T01:54:29", "url": "https://files.pythonhosted.org/packages/94/3a/553a65d353aeb5de7db24def451248cf1675fcc6d6aa1efea7880df15b2a/pypu-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "c46412bd778d6cb90169f1a74d433ff3", "sha256": "8fb08eee6ed2d4f0a65639c1c8c5f13e5dbf143e731b6b15a9b7757becdf5317" }, "downloads": -1, "filename": "pypu-0.1.8.tar.gz", "has_sig": false, "md5_digest": "c46412bd778d6cb90169f1a74d433ff3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115813, "upload_time": "2014-01-12T02:13:44", "url": "https://files.pythonhosted.org/packages/1c/f5/717198aeb3e44015170ebc1dc3d51deb7e8fbbba3821381f66101fc52339/pypu-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "39fb8e2c46b3d7cfdca5f78f8d43687c", "sha256": "0ac658e3a7127807f76be594364c49590184d6dd407a7673ca8938f65d94aa36" }, "downloads": -1, "filename": "pypu-0.1.9.tar.gz", "has_sig": false, "md5_digest": "39fb8e2c46b3d7cfdca5f78f8d43687c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 115847, "upload_time": "2014-01-12T02:14:29", "url": "https://files.pythonhosted.org/packages/84/59/88e2e94333e3524456589117237a558937b98a6628360e98b3a5060b09e7/pypu-0.1.9.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "8210675a7c840e05f5155429f0a08c55", "sha256": "9a9b6cc0f84a040e927d64278c709e796a7d9af5665dae54ac9216712f98d557" }, "downloads": -1, "filename": "pypu-0.2.0.tar.gz", "has_sig": false, "md5_digest": "8210675a7c840e05f5155429f0a08c55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 118270, "upload_time": "2014-09-11T05:38:38", "url": "https://files.pythonhosted.org/packages/a0/44/e7b9423bb0d09b06ea847af0871c1139fe5b103cccd86b58d00079720313/pypu-0.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8210675a7c840e05f5155429f0a08c55", "sha256": "9a9b6cc0f84a040e927d64278c709e796a7d9af5665dae54ac9216712f98d557" }, "downloads": -1, "filename": "pypu-0.2.0.tar.gz", "has_sig": false, "md5_digest": "8210675a7c840e05f5155429f0a08c55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 118270, "upload_time": "2014-09-11T05:38:38", "url": "https://files.pythonhosted.org/packages/a0/44/e7b9423bb0d09b06ea847af0871c1139fe5b103cccd86b58d00079720313/pypu-0.2.0.tar.gz" } ] }