Skip to content

Instantly share code, notes, and snippets.

@hackruu
Last active April 19, 2024 21:06
Show Gist options
  • Star 43 You must be signed in to star a gist
  • Fork 20 You must be signed in to fork a gist
  • Save hackruu/6fc318e677b899f99751 to your computer and use it in GitHub Desktop.
Save hackruu/6fc318e677b899f99751 to your computer and use it in GitHub Desktop.
Generate di.fm premium account and playlist. Also supports radiotunes.com (ex sky.fm) and jazzradio.com.
#!/bin/bash
AGENT="AudioAddict-di/1.4.7 iOS/8.1"
COOKIES="./cookies.txt"
AUTH="ephemeron:dayeiph0ne@pp"
DOMAIN=gmail.com
PLAYLISTDI="di.fm.m3u"
PLAYLISTSKY="sky.fm.m3u"
PLAYLISTJAZZ="jazzradio.m3u"
PLAYLISTROCK="rockradio.m3u"
PLAYLISTCLASSICAL="classicalradio.m3u"
JSONDI="http://listen.di.fm/premium_high.json"
JSONSKY="http://listen.sky.fm/premium_high.json"
JSONJAZZ="http://listen.jazzradio.com/premium_high.json"
JSONROCK="http://listen.rockradio.com/premium_high.json"
JSONCLASSICAL="http://listen.classicalradio.com/premium_high.json"
function rndsleep()
{
sleep .$[ ( $RANDOM % 4 ) + 1 ]s
}
function playlist()
{
playlistfile="$1"
jsonurl="$2"
radioname="$3"
echo "#EXTM3U" > "$playlistfile"
json=$(curl -s "$jsonurl")
num=$(echo "$json" | jshon -l)
for i in $(seq 0 $num); do
name=$(echo $json | jshon -e $i -e name -u)
playlist=$(echo $json | jshon -e $i -e playlist -u)
echo "#EXTINF:0, $name" >> "$playlistfile"
echo $playlist?$listen_key >> "$playlistfile"
done
echo "$radioname" playlist written to "$playlistfile"
}
# check for jshon
which jshon >/dev/null || (echo "install jshon first"; exit 1) || exit 1
# check for pwgen
which pwgen >/dev/null || (echo "install pwgen first"; exit 1) || exit 1
# check for curl
which curl >/dev/null || (echo "install curl first"; exit 1) || exit 1
# generate identity and password
login=$(pwgen -0 $[ ( $RANDOM % 2 ) + 6 ] 1 | tr [A-Z] [a-z])
lastname=$(pwgen -0 $[ ( $RANDOM % 4 ) + 8 ] 1 | tr [A-Z] [a-z])
pass=$(pwgen -0 $[ ( $RANDOM % 2 ) + 6 ] 1 | tr [A-Z] [a-z])
# register
curl -b $COOKIES -c $COOKIES -s -u $AUTH --request POST 'https://api.audioaddict.com/v1/di/members' --user-agent "$AGENT" \
--data-urlencode "member[first_name]=$login" --data-urlencode "member[last_name]=$lastname" \
--data-urlencode "member[password_confirmation]=$pass" --data-urlencode "member[password]=$pass" --data-urlencode "member[email]=$login@$DOMAIN" >/dev/null
rndsleep
# get csrf-token
csrf_token=$(curl -s --request GET "https://www.di.fm/login" | awk -F'<input name="authenticity_token" type="hidden" value="' '{ print $2 }' | awk -F'"' '{ print $1 }'| sed '/^$/d')
rndsleep
# login
curl -c $COOKIES -s --request POST "https://www.di.fm/login" --user-agent "$AGENT" \
--data "utf8=%E2%9C%93" --data-urlencode "authenticity_token=$csrf_token" \
--data-urlencode "member_session[username]=$login@$DOMAIN" --data-urlencode "member_session[password]=$pass" \
--data-urlencode "member_session[remember_me]=0" >/dev/null
rndsleep
# subscribe to 7 day premium trial
curl -b $COOKIES -c $COOKIES -s --request GET "http://www.di.fm/member/premium/trial/activate" \
--user-agent "$AGENT" >/dev/null
rndsleep
#login again
json=$(curl -b $COOKIES -c $COOKIES -s -u $AUTH --request POST "https://api.audioaddict.com/v1/di/members/authenticate" --user-agent "$AGENT" \
--data-urlencode "username=$login@$DOMAIN" --data-urlencode "password=$pass")
# set envs
api_key=$(echo "$json" | jshon -e api_key -u)
listen_key=$(echo "$json" | jshon -e listen_key -u)
id=$(echo "$json" | jshon -e id)
activated=$(echo "$json" | jshon -e activated)
echo "activated $activated"
echo "listen_key $listen_key"
echo "api_key $api_key"
echo "id $id"
echo "login $login@$DOMAIN"
echo "password $pass"
# comment out these if you don't need playlists
playlist "$PLAYLISTDI" "$JSONDI" di.fm
playlist "$PLAYLISTSKY" "$JSONSKY" sky.fm
playlist "$PLAYLISTJAZZ" "$JSONJAZZ" jazzradio.com
playlist "$PLAYLISTROCK" "$JSONROCK" rockradio.com
playlist "$PLAYLISTCLASSICAL" "$JSONCLASSICAL" classicalradio.com
@lbiza
Copy link

lbiza commented Jul 25, 2016

ivit92, you need cygwin with curl, pwgen and gcc package. Also you need jshon and jansson(required for compile jshon). jshon and jansson need be compile from source.
or you can rewrite script to any other language. :)

How do I get curl, gcc, jshon, and jansson to work with cygwin lite for windows (didnt feel like installing cygwin the most bloated thing ever) just want the individual files. I was able to to get pwgen to work but that was it. the rest had DLL dependencies I didn't install correctly.

@hackruu
Copy link
Author

hackruu commented Nov 18, 2016

@ermis2
Added classicalradio.com as suggested, thanks.

@DonaldTsang
Copy link

DonaldTsang commented Jan 12, 2017

https://github.com/aph/difmplay/issues/1
As I have said in the link above, your listen key generator does not work anymore.
The maintainer of the music player says that auto-register might not work, even if the listen ID is provided.
Could you confirm or deny this? I really hope that you can combine the two gits together into onein the future.

@nihau
Copy link

nihau commented Jan 18, 2017

Acquiring trial fails returning HTTP 422 with reason "Unprocessable Entity". You still can activate account from web page (di.fm/trial).

@foxhnd
Copy link

foxhnd commented Feb 2, 2017

After the playlists are created, when added to Winamp the login box appears, yet the username and password displayed don't work as it always gives errors.

There is also RadioTunes added to their network: JSONRADIOTUNES="http://listen.radiotunes.com/premium_high.json"

@AcidScorpion
Copy link

AcidScorpion commented Feb 5, 2017

Seems, URL to get trial
https://api.audioaddict.com/v1/di/members/$id/subscriptions/trial/premium-pass
is not working for me
answer is:
{"errors":{"plan_key":"Invalid Plan"}
On active trial accouns is:

		"plan": {
			"allow_trial": true,
			"availability_ends_at": null,
			"availability_starts_at": "2016-12-20T06:25:00-05:00",
			"created_at": "2016-12-22T06:26:05-05:00",
			"id": 4,
			"key": "premium-radio-2016",
			"mobile_only": false,
			"name": "Premium Radio",
			"trial_duration_days": 7,
			"updated_at": "2016-12-22T07:47:22-05:00"
		}

But "plan_key" as "premium-radio-2016" doesn't work for me.
Any ideas?

@hackruu
Copy link
Author

hackruu commented Feb 12, 2017

that's right, but if you log in with generated credentials to http://www.di.fm/member/premium/trial/activate you will receive your premium. ideas welcome.

@Danfocus
Copy link

Danfocus commented Mar 7, 2017

Act as browser without checking avail.

--- di-fm-premium-account-generator.sh.orig	2017-03-08 01:23:29.000000000 +0500
+++ di-fm-premium-account-generator.sh.new	2017-03-08 01:26:44.000000000 +0500
@@ -56,27 +56,22 @@
 
 rndsleep
 
-# login
-json=$(curl -b $COOKIES -c $COOKIES -s -u $AUTH --request POST "https://api.audioaddict.com/v1/di/members/authenticate" --user-agent "$AGENT" \
---data-urlencode "username=$login@$DOMAIN" --data-urlencode "password=$pass")
+# get csrf-token
+csrf_token=$(curl -s --request GET "https://www.di.fm/login" | awk -F'<input name="authenticity_token" type="hidden" value="' '{ print $2 }' | awk -F'"' '{ print $1 }'| sed '/^$/d')
 
 rndsleep
 
-# set envs
-api_key=$(echo "$json" | jshon -e api_key -u)
-id=$(echo "$json" | jshon -e id -u)
-
-rndsleep
-
-# check premium avail for this acct.
-curl -b $COOKIES -c $COOKIES -s -u $AUTH --request GET "https://api.audioaddict.com/v1/di/members/$id/subscriptions/trial_allowed/premium-pass?api_key=$api_key" \
- --user-agent "$AGENT" >/dev/null
+# login
+curl -c $COOKIES -s --request POST "https://www.di.fm/login" --user-agent "$AGENT" \
+--data "utf8=%E2%9C%93" --data-urlencode "authenticity_token=$csrf_token" \
+--data-urlencode "member_session[username]=$login@$DOMAIN" --data-urlencode "member_session[password]=$pass" \
+--data-urlencode "member_session[remember_me]=0" >/dev/null
 
 rndsleep
 
 # subscribe to 7 day premium trial
-curl -b $COOKIES -c $COOKIES -s -u $AUTH --request POST "https://api.audioaddict.com/v1/di/members/$id/subscriptions/trial/premium-pass" \
- --user-agent "$AGENT" --data-urlencode "api_key=$api_key" >/dev/null
+curl -b $COOKIES -c $COOKIES -s --request GET "http://www.di.fm/member/premium/trial/activate" \
+ --user-agent "$AGENT" >/dev/null
 
 rndsleep
 

@hackruu
Copy link
Author

hackruu commented Mar 10, 2017

Brilliant! Applied proposed patch, tested, worked like a charm! Thanks. Gist updated.

@jijo1
Copy link

jijo1 commented Mar 11, 2017

playlist function fixed (check my fork):

   radioname="$3"
   echo "#EXTM3U" > "$playlistfile"
   json=$(curl -s "$jsonurl")
-  num=$(echo "$json" | jshon -l)
+  nlinks=$(echo "$json" | jshon -l)
+  num=$(($nlinks-1))
   for i in $(seq 0 $num); do
     name=$(echo $json | jshon -e $i -e name -u)
     playlist=$(echo $json | jshon -e $i -e playlist -u)
+    json2=$(curl -s $playlist)
+    playlist2=$(echo $json2 | grep -o -P '(?<=File1=).*(?= Title1)')
     echo "#EXTINF:0, $name" >> "$playlistfile"
-    echo $playlist?$listen_key >> "$playlistfile"
+    echo $playlist2?$listen_key >> "$playlistfile"
+    j=$((i+1))
+    echo "$j.- $playlist2"
   done
-  echo "$radioname" playlist written to "$playlistfile"
+  echo "$nlinks channels from $radioname written to $playlistfile playlist"
+  echo ""
 }
 
 # check for jshon

@Danfocus
Copy link

one less request, get all requests as browser without audioaddict api

--- di-fm-premium-account-generator.sh.orig	2017-03-11 21:46:30.000000000 +0500
+++ di-fm-premium-account-generator.sh.new	2017-03-11 23:11:58.000000000 +0500
@@ -1,7 +1,6 @@
 #!/bin/bash
-AGENT="AudioAddict-di/1.4.7 iOS/8.1"
+AGENT="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
 COOKIES="./cookies.txt"
-AUTH="ephemeron:dayeiph0ne@pp"
 DOMAIN=gmail.com
 PLAYLISTDI="di.fm.m3u"
 PLAYLISTSKY="sky.fm.m3u"
@@ -46,26 +45,21 @@
 
 # generate identity and password
 login=$(pwgen -0 $[ ( $RANDOM % 2 ) + 6 ] 1 | tr [A-Z] [a-z])
-lastname=$(pwgen -0 $[ ( $RANDOM % 4 ) + 8 ] 1 | tr [A-Z] [a-z])
 pass=$(pwgen -0 $[ ( $RANDOM % 2 ) + 6 ] 1 | tr [A-Z] [a-z])
 
-# register
-curl -b $COOKIES -c $COOKIES -s -u $AUTH --request POST 'https://api.audioaddict.com/v1/di/members' --user-agent "$AGENT" \
---data-urlencode "member[first_name]=$login" --data-urlencode "member[last_name]=$lastname" \
---data-urlencode "member[password_confirmation]=$pass" --data-urlencode "member[password]=$pass" --data-urlencode "member[email]=$login@$DOMAIN" >/dev/null
-
-rndsleep
-
 # get csrf-token
-csrf_token=$(curl -s --request GET "https://www.di.fm/login" | awk -F'<input name="authenticity_token" type="hidden" value="' '{ print $2 }' | awk -F'"' '{ print $1 }'| sed '/^$/d')
+csrf_token=$(curl -c $COOKIES -s --request GET "https://www.di.fm/join" --user-agent "$AGENT" \
+  | awk -F'<input name="authenticity_token" type="hidden" value="' '{ print $2 }' \
+  | awk -F'"' '{ print $1 }' \
+  | sed '/^$/d')
 
 rndsleep
 
-# login
-curl -c $COOKIES -s --request POST "https://www.di.fm/login" --user-agent "$AGENT" \
---data "utf8=%E2%9C%93" --data-urlencode "authenticity_token=$csrf_token" \
---data-urlencode "member_session[username]=$login@$DOMAIN" --data-urlencode "member_session[password]=$pass" \
---data-urlencode "member_session[remember_me]=0" >/dev/null
+# register
+curl -b $COOKIES -c $COOKIES -s --request POST "https://www.di.fm/member" -H "X-CSRF-Token: $csrf_token" \
+--user-agent "$AGENT" --data "utf8=%E2%9C%93" --data-urlencode "authenticity_token=$csrf_token" \
+--data-urlencode "member[email]=$login@$DOMAIN" --data-urlencode "member[password]=$pass" \
+--data-urlencode "member[password_confirmation]=$pass" >/dev/null
 
 rndsleep
 
@@ -75,17 +69,19 @@
 
 rndsleep
 
-#login again
-json=$(curl -b $COOKIES -c $COOKIES -s -u $AUTH --request POST "https://api.audioaddict.com/v1/di/members/authenticate" --user-agent "$AGENT" \
---data-urlencode "username=$login@$DOMAIN" --data-urlencode "password=$pass")
+# get audioaddict config
+json=$(curl -b $COOKIES -c $COOKIES -s --request GET "http://www.di.fm" --user-agent "$AGENT" \
+  | awk -F' this.AudioAddict.API.Config = ' '{ print $2 }' \
+  | awk -F';' '{ print $1 }' \
+  | sed '/^$/d')
 
 # set envs
-api_key=$(echo "$json" | jshon -e api_key -u)
-listen_key=$(echo "$json" | jshon -e listen_key -u)
-id=$(echo "$json" | jshon -e id)
-activated=$(echo "$json" | jshon -e activated)
+api_key=$(echo "$json" | jshon -e member | jshon -e api_key -u)
+listen_key=$(echo "$json" | jshon -e listenKey -u)
+id=$(echo "$json" | jshon -e member | jshon -e id)
+access=$(echo "$json" | jshon -e access)
 
-echo "activated $activated"
+echo "access $access"
 echo "listen_key $listen_key"
 echo "api_key $api_key"
 echo "id $id"

@Nahasean94
Copy link

Hey guys...just bumped into this code by accident...But I am a listener of di.fm...so what does the code in this repository do exactly? Is it like a way to unlock premium membership in the site or sth?

@Danfocus
Copy link

This gist generate one week trial playlist for audioaddict's radios.

@ChangePlaces
Copy link

ChangePlaces commented May 19, 2018

the output of this is now asking for auth on play. trials are only permitted on mobiles, and the urls for the web trial signup 404

@mylix
Copy link

mylix commented Mar 10, 2019

as ChangePlaces mentioned. this no longer works. tested today.

@tbhasme
Copy link

tbhasme commented May 18, 2019

'trial premium' is no longer offered... :-(
this won't work anymore...

@Yaroslav457-cmd
Copy link

Я вообще не знаю как сделать, чтобы было premium? Через какое приложение нужно делать, чтобы получить подписку?

@Yaroslav457-cmd
Copy link

Я вообще не знаю как сделать, чтобы было premium? Через какое приложение нужно делать, чтобы получить подписку? Кто делал подскажите пожалуйста буду благодарен

@Yaroslav457-cmd
Copy link

Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?

@Yaroslav457-cmd
Copy link

"пробна премія" більше не пропонується... :-( це більше не працюватиме...

Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?

@Yaroslav457-cmd
Copy link

як згадано ChangePlaces. це більше не працює. перевірено сьогодні.

Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?ммПодскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом

@Yaroslav457-cmd
Copy link

результат цього тепер запитує авторизацію під час відтворення. пробні версії дозволені лише на мобільних телефонах, а URL-адреси для реєстрації в пробній веб-сторінці 404

Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?ммПодскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?

@Yaroslav457-cmd
Copy link

це так, але якщо ви увійдете зі згенерованими обліковими даними на http://www.di.fm/member/premium/trial/activate , ви отримаєте свою премію. ідеї вітаються.

Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?

@Yaroslav457-cmd
Copy link

так, ви можете запускати цей скрипт раз на тиждень :)

Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?

@Yaroslav457-cmd
Copy link

хтось може підказати мені, будь ласка, як налаштувати це на преміум-версію radiotunes?

Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?

@Yaroslav457-cmd
Copy link

Спасибі.

Порада: Ви також можете додати http://classicalradio.com , який було додано до мережі.

JSONCLASSICAL=" http://listen.classicalradio.com/premium_high.json "

Подскажи пожалуйста как активировать premium аккаунт? Что нужно делать с кодом?

@slava-nikulin
Copy link

@Yaroslav457-cmd ты еблан? иди на хуй отсюда

@widepixel
Copy link

Ditube - Experimental service for free listetening DI.FM channels https://ditube.opn.pm

@iArtem88
Copy link

@Yaroslav457-cmd ты еблан? иди на хуй отсюда

бхахаха, красава

@Neogamezzz
Copy link

Ditube - Experimental service for free listetening DI.FM channels https://ditube.opn.pm

This is awesome!!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment