Getting all listing images from an Etsy shop - api

THE SITUATION
I've been tooling around in the Etsy sandbox API trying to figure out a solution for a client who wants to show the default image and title to all their Etsy listings. Upon clicking, they want it to direct them off the website and onto that Esty listing's page.
Now, figuring out how to get the name and url of all their listings was easy and can be done in one public API call:
http://openapi.etsy.com/v2/shops/:shop_id/listings/active?method=GET&api_key=:api_key
This call will not only return the name of the listing and the url of listing, but also a multitude of other information on that particular item. I suppose I should limit my call to just getting the fields I need, but for sake of example, I digress...
What surprises me most is that what is not included in that gigantic array of information is something I'd expect to find in there: the images associated with the listing or at least the main image. There is however a separate API call I can make to get the images for a single listing, but that would require getting the listing_id and making a separate API call for each item. This now turns what I would expect to be one (or hell, even two) calls to the Etsy API, into 1 plus however many items you return. Granted if you have 100 items you're selling in a shop, that's 101 API calls in just a few seconds! Call me crazy, but I feel there's got to be a better way to do this than what I've found.
THE QUESTION
What is the easiest way to make an Etsy API call to return all the images (or even the main image) for all the listings in a shop?

I ended up using the following code to include everything I needed into one API call:
http://openapi.etsy.com/v2/shops/:shop_id/listings/active?method=GET&api_key=:api_key&fields=title,url&limit=100&includes=MainImage
This way I defined my fields so I don't have unnecessary information, but I also set a limit on the results and used includes=MainImage as a query string. This was to the suggestion of a member of the Etsy developer community.

Related

Is it possible to use GetSellerList to get all the items listed by a different seller?

I am looking for a way to get all the items listed by a different seller. While this is possible to do through the eBay Browse API, there is a delay of a few minutes from when a seller lists an item to when it is visible in the eBay search.
As such, I am looking for a method to return all the items a particular seller (that is not me) has listed that will return the most up to date results.
I have found the https://developer.ebay.com/devzone/xml/docs/reference/ebay/GetSellerList.html method, but I am not certain if it is possible to use it on other sellers. Can I use this method or is there another method that can achieve the required functionality
under the title of the linked url it is written:
Use this call to retrieve items listed by the authenticated user, including item data.
therefore it is clearly not possibile
you could use finding API setting in the filter the username of the seller and get the list of (almost) all the item sold by such seller with few details:
if you need full details then you need to call getItem for each itemID retrieved by finding API
but since eBay released some years ago new APis, if you have to start a new project it can be wise not using the old trading APIs (and also Finding??) that though not deprecated yet, they might be soon

Does it make sense to define a GET /users/{id}/photos route or should I just send multiple GET /photos/{id} requests to return a user's photos?

This is a dilemma I find myself facing very often when dealing with nested resources.
So suppose the target user has n photos. Does it make sense to define a GET /users/{id}/photos route or should I just send n GET /photos/{id} requests by first requesting the User object and then looping through that User's photo_ids attribute?
From a best practices perspective, I would not send several request for such similar resources. In that scenario, you end up creating more work for yourself by having to rate limit on the backend, in order to keep your users with a lot of pictures from blowing up your server. That would be impactful to your UX as well.
I recommend you format your route as such:
GET /users/photos?id={{id}}
And return all associated photos with that user ID all at once. You can always limit that to X number of photos per call too, and paginate:
GET /users/photos?id=658&page={{1,2,3, etc.}}
My personal preference is always to try to keep variable data in the URL parameters. Having spent the afternoon with several unrelated APIs, I can tell you a whole slew of developers agree.

Api call to all itunes stores

I'm looking to forward information to my google spreadsheet. Using the documentation for Itunes search on a specific movie, for example I tried, https://itunes.apple.com/search?term=AvengersEndgame&country=US&entity=movie and using a API connector add-on for google spreadsheet, this returned one result for the US store only, based on this movie.
Now adding the same parameters but changing the country code to CA would show the information for the Canada store. https://i.imgur.com/SPEdQj5.jpg
Now using them together as in
https://itunes.apple.com/search?term=AvengersEndgame&country=US&entity=movie
https://itunes.apple.com/search?term=AvengersEndgame&country=CA&entity=movie
https://i.imgur.com/X2GgUhL.jpg
it shows two results, nicely, but not always. Somehow it returns an empty .JSON request and I end up questioning why.
When I try to go furthur and add more stores by adding parameters but changing country letters, I end up recieving more and more empty .JSON requests.
That's when I realized I can only get about 20 calls a minute, I did end up being able to call for about 19 stores.
https://imgur.com/K52onOh with good results.
As there are about a 155 stores in Itunes, I'm looking for a faster way without the hassle of adding 155 of these parameters knowing it will not work as i can only call about 20 results a minute. Could I maybe call in a function to have it search 20 calls every minute untill all 155 are done for which then will be placed in different tabs in a google spreadsheet?
when i try a different movie on Annabelle Comes Home, i end up getting these errors when trying multiple stores.
https://i.imgur.com/CSvMbVu.jpg
using only 1 store for example US, shows a correct result. So what causes the error?
Hope someone can help me with this, as I have the parameters but looking for a way to cover all stores and get them on a spreadsheet which i can then furthur edit for a nice list. As not all stores have to be covered, i've broken down the list to 55 stores.

flickr API, getClusterPhotos with license filter

I am getting a collection of photos via this flickr API:
description: http://www.flickr.com/services/api/flickr.tags.getClusterPhotos.html
example: http://www.flickr.com/services/api/explore/flickr.tags.getClusterPhotos
I see no option to include the license parameter on the API query and I thus get copyrighted images returned, which I do not want. I see that I can get the license info by calling flickr.photos.getInfo on each individual image, but this will be quite time consuming. Are there any other methods to get a collection of photos from a tag cluster with a particular license?
License is one of the parameters listed in their api here:
http://www.flickr.com/services/api/flickr.photos.search.html
I would try just using the id's from the results listed here in their return:
http://www.flickr.com/services/api/flickr.photos.licenses.getInfo.html
for example:
&license=4
It may be better to use "flickr.photos.search" instead. You can search for a specific tag and license (there is no need to do a second call on each image).
https://www.flickr.com/services/api/explore/flickr.photos.search

How to decide whether to split up a VB.Net application and, if so, how to split it up?

I have 2 1/2 years experience of VB.Net, mostly self taught, so please bear with me if I seem rather noobish still and do not know some of the basics. I would recommend you grab a cup of tea before starting on this, as it appears to have got quite long...
I currently have a rather large application (VB.Net website) of over 15000 lines of code at the last count. It does not do retail or anything particularly complex like that - it is literally just a wholesale viewing website with admin frontend, catalogue / catalogue management system and pageview system.
I don't really know much about how .Net applications work in the background - whether they are all loaded on the same thread or if each has its own thread... I just know how to code them, or at least like to think I do... :-)
Basically my application is set up as follows:
There are two different areas - the customer area and the administration frontend.
The main part of the customer frontend is the Catalogue. The MasterPage will load a list of products but that's all, and this is common to all the customer frontend pages.
I tend to work on only one or several parts of the application at a time before uploading the changes. So, for example, I may alter the hierarchy of the Catalogue and change the Catalogue page to match the hierarchy change whilst leaving everything else alone.
The pageview database is getting really quite large and so it is getting rather slow when the application is first requested due to the way it works.
The application timeout is set to 5 minutes - don't know how to change it, I have even tried asking this question on here and seem to remember the solution was quite complex and I was recommended not to change it, but if a customer requests the application 5 minutes after the last page view then it will reload the application from scratch. This means there is a very slow page load whenever it exceeds 5 minutes of inactivity.
I am not sure if this needs consideration to determine how best to split the application up, if at all, but each part of the catalogue system is set up as follows:
A Manager class at the top level, which is used by the admin frontend to add, edit and remove items of the specified type and the customer frontend to retrieve a list of items of the specified type. For example the "RangeManager" will contain a list of product "Ranges" and will be used to interact with these from the customer frontend.
An Item class, for example Range, which contains a list of Attributes. For example Name, Description, Visible, Created, CreatedBy and so on. The form for adding / editing loops through these to display relevant controls for the administrator. For example a Checkbox for BooleanAttribute.
An Attribute class, which can be of type StringAttribute, BooleanAttribute, IntegerAttribute and so on. There are also custom Attributes (not just datatypes) such as RangeAttribute, UserAttribute and so on. These are given a data field which is used to get a piece of data specific to the item it is contained in when it is first requested. Basically the Item is given a DataRow which is stored and accessed by Attributes only when they are first requested.
When one item is requested from a specific manager is requested, the manager will loop through all the items in the database and create a new instance of the item class. For example when a Range is requested from the RangeManager, the RangeManager will loop through all of the DataRows in the Ranges table and create a new instance of Range for each one. As stated above it simply creates a new instance with the DataRow, rather than loading all the data into it there and then. The Attributes themselves fetch the relevant data from the DataRow as and when they're first requested.
It just seems a tad stupid, in my mind, to recompile and upload the entire application every time I fix a minor bug or a spelling mistake for a word which is in the code behind (for example if I set the text of a Label dynamically). A fix / change to the Catalogue page, the way it is now, may mean a customer trying to view the Contact page, which is in no way related to the Catalogue page apart from by having the same MasterPage, cannot do so because the DLL is being uploaded.
Basically my question is, given my current situation, how would people suggest I change the architecture of the application by way of splitting it into multiple applications? I mean would it be just customer / admin, or customer / admin and pageviews, or some other way? Or not at all? Are there any other alternatives which I have not mentioned here? Could web services come in handy here? Like split the catalogue itself into a different application and just have the masterpage for all the other pages use a web service to get the names of the products to list on the left hand side? Am I just way WAY over-complicating things? Judging by the length of this question I probably am, and it wouldn't be the first time... I have tried to keep it short, but I always fail... :-)
Many thanks in advance, and sorry if I have just totally confused you!
Regards,
Richard
15000 LOC is not really all that big.
It sounds like you are not pre-compiling your site for publishing. You may want to read this: http://msdn.microsoft.com/en-us/library/1y1404zt(v=vs.80).aspx
Recompiling and uploading the application is the best way to do it. If all you are changing is your markup, that can be uploaded individually (e.g. changing some html layout in an aspx page).
I don't know what you mean here by application timeout, but if your app domain recycles every 5 minutes, then that doesn't seem right at all. You should look into this.
Also, if you find yourself working on various different parts of the site (i.e. many different changes), but need to deploy only some items in isolation, then you should look into how you are using your source control tools (you are using one, aren't you?). Look into something like GIT and branching/merging.
Start by reading:
Application Architecture Guide