A music player that connects to your cloud/distributed storage.
5
fork

Configure Feed

Select the types of activity you want to include in your feed.

Closes #375

+49 -12
+2
CHANGELOG.md
··· 3 3 ## 3.3.0 4 4 5 5 - **Removes the need to pick a user-data-storage service upfront.** You can now use the app immediately without having to sign in first. 6 + - Allows every WebDAV namespace to be used instead of just `d:`/`D:` 6 7 - Fixes authentication issue with RemoteStorage 8 + - Fixes issue with volume control 7 9 - Sets https://ipfs.io as the default IPFS gateway. 8 10 9 11
+1 -1
elm.json
··· 35 35 "icidasset/elm-binary": "2.1.0", 36 36 "icidasset/elm-material-icons": "11.0.0", 37 37 "icidasset/elm-sha": "2.0.2", 38 + "jinjor/elm-xml-parser": "2.0.0", 38 39 "jzxhuang/http-extras": "2.1.0", 39 40 "lobanov/elm-taskport": "2.0.1", 40 41 "mpizenberg/elm-pointer-events": "4.0.2", ··· 54 55 "elm/bytes": "1.0.8", 55 56 "elm/parser": "1.1.0", 56 57 "fredcy/elm-parseint": "2.0.1", 57 - "jinjor/elm-xml-parser": "2.0.0", 58 58 "pzp1997/assoc-list": "1.0.0", 59 59 "zwilias/elm-utf-tools": "2.0.1" 60 60 }
+46 -11
src/Library/Sources/Services/WebDav/Parser.elm
··· 6 6 import String.Ext as String 7 7 import Url 8 8 import Xml.Decode exposing (..) 9 + import XmlParser 9 10 10 11 11 12 ··· 18 19 currentDir = 19 20 Maybe.withDefault "//" (Marker.takeOne previousMarker) 20 21 22 + parseResult = 23 + XmlParser.parse response 24 + 25 + namespace = 26 + parseResult 27 + |> Result.map 28 + (\xml -> 29 + case xml.root of 30 + XmlParser.Element nodeName _ _ -> 31 + nodeName 32 + |> String.split ":" 33 + |> List.head 34 + 35 + _ -> 36 + Nothing 37 + ) 38 + |> Result.withDefault Nothing 39 + |> (\maybe -> 40 + case maybe of 41 + Just n -> 42 + n ++ ":" 43 + 44 + Nothing -> 45 + if String.contains "<d:" response then 46 + "d:" 47 + 48 + else 49 + "D:" 50 + ) 51 + 21 52 entries = 22 53 response 23 - |> String.replace "<d:" "<D:" 24 - |> String.replace "</d:" "</D:" 25 - |> decodeString treeDecoder 54 + |> decodeString (treeDecoder namespace) 26 55 |> Result.withDefault [] 27 56 |> List.map Url.percentDecode 28 57 |> Maybe.values ··· 40 69 } 41 70 42 71 43 - treeDecoder : Decoder (List String) 44 - treeDecoder = 45 - path [ "D:response" ] (leakyList treeItemDecoder) 72 + treeDecoder : String -> Decoder (List String) 73 + treeDecoder namespace = 74 + path 75 + [ namespace ++ "response" ] 76 + (leakyList <| treeItemDecoder namespace) 46 77 47 78 48 - treeItemDecoder : Decoder String 49 - treeItemDecoder = 79 + treeItemDecoder : String -> Decoder String 80 + treeItemDecoder namespace = 81 + let 82 + withNamespace = 83 + String.append namespace 84 + in 50 85 map2 51 86 (\_ h -> h) 52 87 (oneOf ··· 54 89 -------- 55 90 string 56 91 |> single 57 - |> path [ "D:propstat", "D:prop", "D:getcontenttype" ] 92 + |> path [ withNamespace "propstat", withNamespace "prop", withNamespace "getcontenttype" ] 58 93 |> andThen mustBeAudio 59 94 60 95 -- Directory 61 96 ------------ 62 97 , string 63 98 |> single 64 - |> path [ "D:propstat", "D:prop", "D:resourcetype", "D:collection" ] 99 + |> path [ withNamespace "propstat", withNamespace "prop", withNamespace "resourcetype", withNamespace "collection" ] 65 100 ] 66 101 ) 67 - (path [ "D:href" ] (single string)) 102 + (path [ withNamespace "href" ] (single string)) 68 103 69 104 70 105 mustBeAudio : String -> Decoder String