Packages

Fork of explay, a Google Play (Android Market) API implementation in Elixir

Current section

Files

Jump to
explay_fork lib explay asset.ex
Raw

lib/explay/asset.ex

defmodule ExPlay.Asset do
defstruct [:url, :cookies, :signature, :size, :path]
@moduledoc """
Struct wrapper for Google Play downloadables (APKs for now)
"""
@doc "Converts a Package Download Info map object into an Asset Struct"
def to_asset(info) do
%ExPlay.Asset{
url: info.downloadUrl,
size: info.downloadSize,
signature: info.signature,
cookies: Enum.reduce(info.downloadAuthCookie, "", &cookie_reducer/2)
}
end
@doc "Checks if Asset has been downloaded"
def downloaded?(%ExPlay.Asset{path: path}) do
!!(path)
end
@doc "Downloads Google Play asset to disk"
def download!(%ExPlay.Asset{} = asset, path) do
%HTTPoison.Response{status_code: 200, body: binary} =
HTTPoison.get!(asset.url, %{},
follow_redirect: true,
max_redirect: 5,
hackney: [cookie: [asset.cookies]]
)
path = Path.expand(path)
File.mkdir_p!(Path.dirname(path))
File.write!(path, binary)
%{ asset | path: path }
end
@doc "Fetches APK downloads details using authenticated account and then downloads it to disk"
def download!(account, {package, version}, path) do
{:ok, info} = ExPlay.Request.API.package_download_info(account, {package, version})
info
|> to_asset
|> download!(path)
end
def download!(account, package, path) do
download!(account, {package, nil}, path)
end
# Private Methods
defp cookie_reducer(%{"name" => name, "value" => value}, cookie) do
cookie <> "#{name}=#{value}; "
end
end