Jelajahi Sumber

Merge pull request #189 from jsopenrb/patch-1

Some tracks might have several `allowed` fields, librespot assumes that all fields must match, otherwise track cannot be played.

This change collects all `allowed` and `forbidden` lists, then does the final check on whole lists at once.
Paul Liétar 7 tahun lalu
induk
melakukan
d09f469aad
1 mengubah file dengan 25 tambahan dan 7 penghapusan
  1. 25 7
      src/metadata.rs

+ 25 - 7
src/metadata.rs

@@ -16,13 +16,31 @@ fn countrylist_contains(list: &str, country: &str) -> bool {
 fn parse_restrictions<'s, I>(restrictions: I, country: &str, catalogue: &str) -> bool
     where I: IntoIterator<Item = &'s protocol::metadata::Restriction>
 {
-    restrictions.into_iter()
-                .filter(|r| r.get_catalogue_str().contains(&catalogue.to_owned()))
-                .all(|r| {
-                    !countrylist_contains(r.get_countries_forbidden(), country) &&
-                    (!r.has_countries_allowed() ||
-                     countrylist_contains(r.get_countries_allowed(), country))
-                })
+    let mut forbidden = "".to_string();
+    let mut has_forbidden = false;
+
+    let mut allowed = "".to_string();
+    let mut has_allowed = false;
+
+    let rs = restrictions.into_iter().filter(|r|
+        r.get_catalogue_str().contains(&catalogue.to_owned())
+    );
+
+    for r in rs {
+        if r.has_countries_forbidden() {
+            forbidden.push_str(r.get_countries_forbidden());
+            has_forbidden = true;
+        }
+
+        if r.has_countries_allowed() {
+            allowed.push_str(r.get_countries_allowed());
+            has_allowed = true;
+        }
+    }
+
+    (has_forbidden || has_allowed) &&
+    (!has_forbidden || !countrylist_contains(forbidden.as_str(), country)) &&
+    (!has_allowed || countrylist_contains(allowed.as_str(), country))
 }
 
 pub trait MetadataTrait : Send + 'static {