diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 791ca55908d9..a176e88c291f 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -4,6 +4,7 @@ * [*] [Jetpack-only] Stats: Made optimizations to enhance scrolling performance. [#22847] * [*] Simplify post list context menu sections [#23356] * [*] Fix an issue with incorrect snackbar shown when saving drafts manually [#23358] +* [**] Support editing media metadata for sites not powered by Jetpack and reliant on XML-RPC [#23316] * [*] Fix rare crash in the unsupported block editor [#23379] 25.1 diff --git a/WordPress/Classes/Models/Blog.h b/WordPress/Classes/Models/Blog.h index a5fe24c3f757..87359c1c8153 100644 --- a/WordPress/Classes/Models/Blog.h +++ b/WordPress/Classes/Models/Blog.h @@ -74,6 +74,8 @@ typedef NS_ENUM(NSUInteger, BlogFeature) { BlogFeatureNoncePreviews, /// Does the blog support editing media metadata? BlogFeatureMediaMetadataEditing, + /// Does the blog support editing media alternative text? + BlogFeatureMediaAltEditing, /// Does the blog support deleting media? BlogFeatureMediaDeletion, /// Does the blog support Stock Photos feature (free photos library) diff --git a/WordPress/Classes/Models/Blog.m b/WordPress/Classes/Models/Blog.m index a2cac5a03a44..6ca1c0341d85 100644 --- a/WordPress/Classes/Models/Blog.m +++ b/WordPress/Classes/Models/Blog.m @@ -592,7 +592,12 @@ - (BOOL)supports:(BlogFeature)feature case BlogFeatureNoncePreviews: return [self supportsRestApi] && ![self isHostedAtWPcom]; case BlogFeatureMediaMetadataEditing: - return [self supportsRestApi] && [self isAdmin]; + return [self isAdmin]; + case BlogFeatureMediaAltEditing: + // alt is not supported via XML-RPC API + // https://core.trac.wordpress.org/ticket/58582 + // https://github.com/wordpress-mobile/WordPress-Android/issues/18514#issuecomment-1589752274 + return [self supportsRestApi]; case BlogFeatureMediaDeletion: return [self isAdmin]; case BlogFeatureHomepageSettings: diff --git a/WordPress/Classes/ViewRelated/Media/MediaItemViewController.swift b/WordPress/Classes/ViewRelated/Media/MediaItemViewController.swift index 783d9d571920..0464ae16d339 100644 --- a/WordPress/Classes/ViewRelated/Media/MediaItemViewController.swift +++ b/WordPress/Classes/ViewRelated/Media/MediaItemViewController.swift @@ -66,7 +66,7 @@ final class MediaItemViewController: UITableViewController { action: editAlt()) var mediaInfoRows = [titleRow, captionRow, descRow] - if media.mediaType == .image { + if media.mediaType == .image && media.blog.supports(BlogFeature.mediaAltEditing) { mediaInfoRows.append(altRow) } diff --git a/WordPressKit/Sources/WordPressKit/Services/MediaServiceRemoteXMLRPC.m b/WordPressKit/Sources/WordPressKit/Services/MediaServiceRemoteXMLRPC.m index 0d0059eac0e3..33018c5b772e 100644 --- a/WordPressKit/Sources/WordPressKit/Services/MediaServiceRemoteXMLRPC.m +++ b/WordPressKit/Sources/WordPressKit/Services/MediaServiceRemoteXMLRPC.m @@ -183,13 +183,13 @@ - (void)uploadMedia:(RemoteMedia *)media success(remoteMedia); } } - } failure:^(NSError *error, NSHTTPURLResponse *httpResponse) { + } failure:^(NSError *error, NSHTTPURLResponse *httpResponse) { if (failure) { failure(error); } }]; - + if (progress) { *progress = localProgress; } @@ -199,10 +199,44 @@ - (void)updateMedia:(RemoteMedia *)media success:(void (^)(RemoteMedia *remoteMedia))success failure:(void (^)(NSError *error))failure { - //HACK: Sergio Estevao: 2016-04-06 this option doens't exist on XML-RPC so we will always say that all was good - if (success) { - success(media); + NSParameterAssert([media.mediaID longLongValue] > 0); + + NSMutableDictionary *content = [NSMutableDictionary dictionary]; + + if (media.title != nil) { + content[@"post_title"] = media.title; + } + + if (media.caption != nil) { + content[@"post_excerpt"] = media.caption; } + + if (media.descriptionText != nil) { + content[@"post_content"] = media.descriptionText; + } + + NSArray *extraDefaults = @[media.mediaID]; + NSArray *parameters = [self XMLRPCArgumentsWithExtraDefaults:extraDefaults andExtra:content]; + + [self.api callMethod:@"wp.editPost" + parameters:parameters + success:^(id responseObject, NSHTTPURLResponse *httpResponse) { + BOOL updated = [responseObject boolValue]; + if (updated) { + if (success) { + success(media); + } + } else { + if (failure) { + NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorUnknown userInfo:nil]; + failure(error); + } + } + } failure:^(NSError *error, NSHTTPURLResponse *httpResponse) { + if (failure) { + failure(error); + } + }]; } - (void)deleteMedia:(RemoteMedia *)media @@ -286,11 +320,11 @@ - (RemoteMedia *)remoteMediaFromXMLRPCDictionary:(NSDictionary*)xmlRPC link = [xmlRPC stringForKeyPath:@"link"]; } remoteMedia.file = [link lastPathComponent] ?: [[xmlRPC objectForKeyPath:@"file"] lastPathComponent]; - + if ([xmlRPC stringForKeyPath:@"metadata.sizes.large.file"] != nil) { remoteMedia.largeURL = [NSURL URLWithString: [NSString stringWithFormat:@"%@%@", remoteMedia.url.URLByDeletingLastPathComponent, [xmlRPC stringForKeyPath:@"metadata.sizes.large.file"]]]; } - + if ([xmlRPC stringForKeyPath:@"metadata.sizes.medium.file"] != nil) { remoteMedia.mediumURL = [NSURL URLWithString: [NSString stringWithFormat:@"%@%@", remoteMedia.url.URLByDeletingLastPathComponent, [xmlRPC stringForKeyPath:@"metadata.sizes.medium.file"]]]; }