{"id":29110336,"url":"https://github.com/movestill/smuggo","last_synced_at":"2025-06-29T08:03:59.701Z","repository":{"id":54839050,"uuid":"47302814","full_name":"movestill/smuggo","owner":"movestill","description":"A SmugMug client written in Go.","archived":false,"fork":false,"pushed_at":"2021-03-10T04:12:14.000Z","size":79,"stargazers_count":7,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-09-08T14:54:23.839Z","etag":null,"topics":["api","client","photos","smugmug"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/movestill.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-12-03T02:45:36.000Z","updated_at":"2023-09-08T14:54:23.840Z","dependencies_parsed_at":"2022-08-14T04:20:44.030Z","dependency_job_id":null,"html_url":"https://github.com/movestill/smuggo","commit_stats":null,"previous_names":[],"tags_count":5,"template":null,"template_full_name":null,"purl":"pkg:github/movestill/smuggo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/movestill%2Fsmuggo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/movestill%2Fsmuggo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/movestill%2Fsmuggo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/movestill%2Fsmuggo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/movestill","download_url":"https://codeload.github.com/movestill/smuggo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/movestill%2Fsmuggo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262559916,"owners_count":23328619,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","client","photos","smugmug"],"created_at":"2025-06-29T08:03:59.149Z","updated_at":"2025-06-29T08:03:59.682Z","avatar_url":"https://github.com/movestill.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# smuggo\n\n## Introduction\n\nsmuggo is a personal project that integrates SmugMug into my photo workflow.\nI use it as the last step in my workflow.  Once I \"develop\" a photo in\nCaptureOne, CaptureOne \"opens\" the photo in smuggo.  During the \"open\" step,\nsmuggo uploads the photo to my private SmugMug staging gallery.\n\nThis gives me a quick offsite backup of the developed image that's at least\nlarge enough to make a small print or incorporate into a video should disaster\nstrike at home.\n\nsmuggo is also an excuse to get back into the Go language.  I last touched it\nin December 2014, so it was almost like starting from zero, again.\n\n\n## Usage\n\n### Get a SmugMug API Key (do this first!)\n\nThe first step is to get your own API key from SmugMug.  Go to this page to\nrequest a key:  https://api.smugmug.com/api/developer/apply\n\nYou must be a SmugMug customer to get an key, but that's\nprobably a safe assumption if you want to use smuggo.  After getting your key,\nenter your key into smuggo by using the `apikey` command.\n\n```shell\nsmuggo apikey\n```\n\n### Authorization (do this second!)\n\nsmuggo **must be authorized** before it can do anything with your SmugMug\naccount.  Authorize it by typing:\n\n```shell\nsmuggo auth\n```\n\nThis command will immediately open your browser to SmugMug.  You may have to\nlogin with your SmugMug user name and password.  After doing so, SmugMug will\ngive you a six digit code to enter into smuggo.  This code will allow smuggo\nto authorize itself.\n\nIf you ever want to **revoke** smuggo's authorization, login to your SmugMug\naccount and go to Account Settings.  Click on Privacy and click the revoke\nbutton next to smuggo.\n\n### Getting Album Keys\n\nBefore you can upload into an album, you need to know its key.  smuggo has a\ncommand that lists all your albums and their associated keys.\n\n```shell\nsmuggo albums\n```\n\nsmuggo will output a list of your albums in alphabetical order.  If you have a\nlarge number of albums, you may want to pipe the output to grep or some other\nutility to find the one you want.  SmugMug also transfers a large amount of\ndata when listing albums.  This command may take some time to complete if you\nhave a large number of albums.\n\nIf you have a large number of albums, finding the right album alphabetically\nisn't the most efficient.  smuggo supports SmugMug's album search capability.\nSmugMug searches both the title and description for search terms that you\nsupply.\n\n```shell\nsmuggo search \u003csearch term 1\u003e ... \u003csearch term n\u003e\n```\n\nsmuggo will list the first 15 results and then ask if you wish to list more\nresults.\n\n### Uploading Files\n\nMy normal use case is to upload a single file since CaptureOne \"opens\" each\nphoto as it finishes processing.\n\nBasic syntax:\n\n```shell\nsmuggo upload \u003calbum key\u003e \u003cfilename\u003e\n```\n\nHere's a concrete example:\n\n```shell\nsmuggo upload 5Jbd2q awesome_photo.jpg\n```\n\nHowever, there are times where I may want to upload multiple files outside of\nmy normal CaptureOne workflow.  For those times, smuggo supports uploading\nfiles in parallel.\n\n```shell\nsmuggo multiupload \u003cnum parallel uploads\u003e \u003calbum key\u003e \u003cfilename 1\u003e . . . \u003cfilename n\u003e\n```\n\nThe `num parallel uploads` parameter specifies how many simultaneous\nuploads you'd like to do.  The right number depends on your system and your\nupload bandwidth.  Here's an actual example that specifies up to 4\nsimultaneous uploads of two JPEG files and all the GIFs in the current\ndirectory:\n\n```shell\nsmuggo multiupload 4 5Jbd2q awesome_photo1.jpg awesome_photo2.jpg *.gif\n```\n\n### Preventing Duplicate Uploads to an Album\n\nsmuggo can prevent duplicate image uploads to an album _if_ you run the `images`\ncommand for the album, beforehand.  This isn't done automatically because my\nworkflow uploads images, one at a time, as they are generated by CaptureOne.\nSo, if you have an album that already has images or you also add images using\nsomething other than smuggo, you'll need to run the `images` command to get\nthe current contents of your album.  smuggo saves the images that it uploads to\nSmugMug, but it doesn't know anything about images added to your album by other\nmeans.\n\n```shell\n# Get images already uploaded to the album and save them to smuggo's database.\nsmuggo images \u003calbum key\u003e\n```\n\nIf you try to upload a duplicate image, smuggo will tell you that the image\nalready exists and give you the filename of the image or images already in the\nalbum that are duplicates.\n\nIf you _want_ to allow duplicates, use the flag `-allowDupes` to tell smuggo\nduplicates are allowed:\n\n```shell\n# Single file.\nsmuggo -allowDupes upload \u003calbum key\u003e \u003cfilename\u003e\n\n# Multiple files.\nsmuggo -allowDupes multiupload \u003cnum parallel uploads\u003e \u003calbum key\u003e \u003cfilename 1\u003e . . . \u003cfilename n\u003e\n```\n\n## Building from Source\n\nDownload and install Go v1.16.x.  Be sure to set your GOPATH environment\nvariable as described in the Go installation instructions.\n\nGet the dependencies:\n\n```shell\ncd core\ngo mod download\n```\n\nBuild:\n\n```shell\ncd core\nmake\n```\n\n## License\n\nsmuggo is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html).\n\n\n## Credits\n\nThanks to Gary Burd for his OAuth library.  I'm not sure if I would have\ncontinued work on this project if I had to write the OAuth code, myself.\n\nAlso thanks to skratchdot for the open library that I use to conveniently open\nSmugMug in the browser for authorization.\n\nOf course, thanks to SmugMug for providing an API for building our own\ntools!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmovestill%2Fsmuggo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmovestill%2Fsmuggo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmovestill%2Fsmuggo/lists"}