【问题标题】:Deezer iOS SDK - DZRTrack - Obtaining "alternative" track when readable is falseDeezer iOS SDK - DZRTrack - 当可读为假时获取“替代”轨道
【发布时间】:2015-04-02 08:56:24
【问题描述】:

我正在使用新的 Deezer iOS SDK (0.9.0),当返回的轨道将其 readable 属性设置为 NO 时,我需要找到替代轨道(如果有的话)。

这是我正在测试的曲目:http://www.deezer.com/track/95029960

它在英国(我所在的地方)不可用,但有替代轨道可用。

这是我在 API Explorer(来自英国)中查询曲目时的 API 响应:

{
  "id": 95029960,
  "readable": false,
  "title": "Looking To Hide (Radio Edit)",
  "isrc": "DKUCA1400209",
  "link": "http://www.deezer.com/track/95029960",
  "share": "http://www.deezer.com/track/95029960?utm_source=deezer&utm_content=track-95029960&utm_term=0_1427961877&utm_medium=web",
  "duration": 198,
  "track_position": 52,
  "disk_number": 1,
  "rank": 95640,
  "explicit_lyrics": false,
  "preview": "http://cdn-preview-0.deezer.com/stream/0fc9584d259b89c248e9bf6ccdb1a7bc-3.mp3",
  "bpm": 0,
  "gain": 0,
  "available_countries": [
    "DK",
    "IS"
  ],
  "alternative": {
    "id": 87700625,
    "readable": true,
    "title": "Looking to Hide",
    "isrc": "DKUCA1400209",
    "link": "http://www.deezer.com/track/87700625",
    "share": "http://www.deezer.com/track/87700625?utm_source=deezer&utm_content=track-87700625&utm_term=0_1427961877&utm_medium=web",
    "duration": 199,
    "track_position": 1,
    "disk_number": 1,
    "rank": 50142,
    "explicit_lyrics": false,
    "preview": "http://cdn-preview-e.deezer.com/stream/e7758b15d4d0b08dc6c69e617f16c46a-2.mp3",
    "bpm": 0,
    "gain": 0,
    "available_countries": [
      "AD",
      "AE",
      "AF",

      ...

      "ZM",
      "ZW"
    ],
    "contributors": [
      {
        "id": 1627159,
        "name": "Nadia Gattas",
        "link": "http://www.deezer.com/artist/1627159",
        "share": "http://www.deezer.com/artist/1627159?utm_source=deezer&utm_content=artist-1627159&utm_term=0_1427961877&utm_medium=web",
        "picture": "http://api.deezer.com/2.0/artist/1627159/image",
        "radio": false,
        "tracklist": "http://api.deezer.com/2.0/artist/1627159/top?limit=50",
        "role": "Main",
        "type": "artist"
      }
    ],
    "artist": {
      "id": 1627159,
      "name": "Nadia Gattas",
      "link": "http://www.deezer.com/artist/1627159",
      "share": "http://www.deezer.com/artist/1627159?utm_source=deezer&utm_content=artist-1627159&utm_term=0_1427961877&utm_medium=web",
      "picture": "http://api.deezer.com/2.0/artist/1627159/image",
      "radio": false,
      "tracklist": "http://api.deezer.com/2.0/artist/1627159/top?limit=50",
      "type": "artist"
    },
    "album": {
      "id": 8853909,
      "title": "Looking to Hide",
      "link": "http://www.deezer.com/album/8853909",
      "cover": "http://api.deezer.com/2.0/album/8853909/image",
      "release_date": "2014-10-27",
      "tracklist": "http://api.deezer.com/2.0/album/8853909/tracks",
      "type": "album"
    },
    "type": "track"
  },
  "contributors": [
    {
      "id": 1627159,
      "name": "Nadia Gattas",
      "link": "http://www.deezer.com/artist/1627159",
      "share": "http://www.deezer.com/artist/1627159?utm_source=deezer&utm_content=artist-1627159&utm_term=0_1427961877&utm_medium=web",
      "picture": "http://api.deezer.com/2.0/artist/1627159/image",
      "radio": false,
      "tracklist": "http://api.deezer.com/2.0/artist/1627159/top?limit=50",
      "role": "Main",
      "type": "artist"
    },
    {
      "id": 1627159,
      "name": "Nadia Gattas",
      "link": "http://www.deezer.com/artist/1627159",
      "share": "http://www.deezer.com/artist/1627159?utm_source=deezer&utm_content=artist-1627159&utm_term=0_1427961877&utm_medium=web",
      "picture": "http://api.deezer.com/2.0/artist/1627159/image",
      "radio": false,
      "tracklist": "http://api.deezer.com/2.0/artist/1627159/top?limit=50",
      "role": "Featured",
      "type": "artist"
    }
  ],
  "artist": {
    "id": 1627159,
    "name": "Nadia Gattas",
    "link": "http://www.deezer.com/artist/1627159",
    "share": "http://www.deezer.com/artist/1627159?utm_source=deezer&utm_content=artist-1627159&utm_term=0_1427961877&utm_medium=web",
    "picture": "http://api.deezer.com/2.0/artist/1627159/image",
    "radio": false,
    "tracklist": "http://api.deezer.com/2.0/artist/1627159/top?limit=50",
    "type": "artist"
  },
  "album": {
    "id": 9667910,
    "title": "Dance Chart 41",
    "link": "http://www.deezer.com/album/9667910",
    "cover": "http://api.deezer.com/2.0/album/9667910/image",
    "release_date": "2015-02-23",
    "tracklist": "http://api.deezer.com/2.0/album/9667910/tracks",
    "type": "album"
  },
  "type": "track"
}

如您所见,readablefalsealternative.readabletrue。在这种情况下,我想使用 alternative 轨道的 id,因为原始轨道在我的国家/地区不可用。

基于此响应,我可以简单地将替代标识符拉出并使用它,但是因为我使用的是新的 Deezer iOS SDK,我似乎无法做到这一点..

按照文档,我使用以下代码从 API 获取我需要的所有值:

// the manager to use in the requests
DZRRequestManager *manager = [DZRRequestManager defaultManager];
// the keys we wish to obtain
NSArray *keys = @[ @"id", @"readable", @"alternative.id", @"alternative.readable" ];
// the track id
NSString *identifier = @"95029960";
// fetch the track
[DZRTrack objectWithIdentifier:identifier requestManager:manager callback:^(DZRTrack *track, NSError *error) {
    // fetch the keys
    [track valuesForKeyPaths:keys withRequestManager:manager callback:^(NSDictionary *values, NSError *keyPathsError) {
        // log what we got.
        NSLog(@"Got Values: %@", values);
    }];
}];

现在,我期望返回所有 4 个值,前提是它们存在于 JSON api 响应中(它们是),但我得到以下输出:

2015-04-02 09:48:35.485 <redacted>[694:115244] Got Values: {
    id = 95029960;
    readable = 0;
}

然后我查看了tracksupportedInfoKeysalternative 似乎不存在。为什么是这样?

是否有其他方法可以在 Deezer iOS SDK 中获取替代曲目?


更新:

我被要求检查 keyPathsError 是否被退回。我以前没有做过的事情,因为我不知道您可以同时退回 valueskeyPathsError 但是我有设置以下错误:

Domain: DZRModelErrorDomain,
Code: 4,
UserInfo: {
    "NSLocalizedDescriptionKey" : "Some object could not be parsed",
    "DZROriginalErrorsKey" : [
        {
            Domain: DZRModelErrorDomain,
            Code: 4,
            UserInfo: {
                "NSLocalizedDescriptionKey" : "You requested and unknown key from Deezer Object",
                "DZRRequestedPropertyKey" : "alternative"
            }
        }
    ]
}

这显然表明我试图获取不受支持的密钥,但为什么不受支持?

【问题讨论】:

  • 您能检查一下keyPathsError 中的内容吗?
  • @rckoenes 请查看我的更新。谢谢。

标签: ios objective-c deezer


【解决方案1】:

它不是一个受支持的密钥,因为 SDK 的播放器还没有考虑替代方案,我想它很快就会这样做。您可以通过调配一点方法来绕过这个限制。

因此,您需要在 DZRTrack 上创建一个类别并调整 -[DZRObject supportedInfoKeys] 以在数组末尾添加键 alternative。仅此一项就会在DZRTrack 的实例上为您提供一个“属性”alternative,这将是一个带有JSON 内容的NSDictionary

不过,您可以走得更远,取回完整的 DZRTrack 对象作为替代方案。 SDK 在解析来自 API 的响应时,似乎有时会在实例上寻找 parseFoo:error: 方法。因此,通过将方法 parseAlternative:error: 方法放在您的类别中,您可以解析 JSON 并获取 DZRTrack 对象。为此,您需要使用 SDK 的私有 API:+[DZROject objectFromJSON:error:]

包含的是类的实现。

@interface DZRObject (AlternativeTrack)
+ (id)objectFromJSON:(id)JSON error:(NSError **)error;
@end

@implementation DZRTrack (AlternativeTrack)
+ (void)load
{
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        Class aClass = [self class];

        SEL original = @selector(supportedInfoKeys);
        SEL swizzled = @selector(alternativeTrack_supportedInfoKeys);

        Method originalMethod = class_getInstanceMethod(aClass, original);
        Method swizzledMethod = class_getInstanceMethod(aClass, swizzled);

        BOOL didAddMethod = class_addMethod(aClass, original,
            method_getImplementation(swizzledMethod),
            method_getTypeEncoding(swizzledMethod));
        if (didAddMethod) {
            class_replaceMethod(aClass, swizzled,
                method_getImplementation(originalMethod),
                method_getTypeEncoding(originalMethod));
        }
        else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

- (NSArray *)alternativeTrack_supportedInfoKeys
{
    return [[self alternativeTrack_supportedInfoKeys] arrayByAddingObject:@"alternative"];
}

- (id)parseAlternative:(id)JSON error:(NSError **)error
{
    return [DZRObject objectFromJSON:JSON error:error];
}
@end

【讨论】:

  • 谢谢,但我认为此修复程序无法正常工作。如果我在 API 中存在“替代”轨道时调用 -[DZRTrack valuesForKeyPaths:withRequestManager:callback:],那么如果“替代”轨道则调用完成块track 不存在于 API 响应中,则完成块在解析时永远不会被调用。看起来我需要先以某种方式检查替代字段是否将出现在轨道中,然后再请求替代密钥。我们可以通过适当的修复来更新 SDK 吗?
  • 你是对的,如果 keypath 中的中间值为 nil,则存在阻止调用回调的错误。这将在 SDK 的下一版本中修复。或者,如果您被阻止,您可以使用[DZRObject valueForKey:error:callback:] 方法请求轨道的alternative。此调用将导致 SDK 调用您的回调,然后查询备用轨道上的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
相关资源
最近更新 更多