-
-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Audio files and attached files doesn't get downloaded in some cases #52
Comments
Update: I have added audio file downloads to fix-lesson-dl branch. Please test it out. https://github.com/sumeetweb/Thinki-Downloader/tree/fix-lesson-dl |
Hi Sumeet,
this is the api response for an audio lesson:
<!DOCTYPE html>
<html lang='en'>
<head>
<link href='https://cdn.thinkific.com' rel='preconnect'>
<link crossorigin='true' href='https://fonts.gstatic.com'
rel='preconnect'>
<link rel='preload' href='//
cdn-internal.thinkific.com/kobayashi/assets/vendor-ed5462f20c50cc94c351a7ebd7fe1d6a.js'
as='script' crossorigin></link>
<link rel='preload' href='//
cdn-internal.thinkific.com/kobayashi/assets/course-player-v2-95e89352fd76e85df4a993e215c59e11.js'
as='script' crossorigin></link>
<link rel='preload' href='//
cdn-internal.thinkific.com/kobayashi/assets/vendor-e0cb822bbe090c173fe20baeb13b0c48.css'
as='style' crossorigin></link>
<link rel='preload' href='//
cdn-internal.thinkific.com/kobayashi/assets/course-player-v2-14b76be7ee27216b34794a7cd39efded.css'
as='style' crossorigin></link>
<script>
if (typeof mixpanel === 'undefined') {
(function(e, b) {
if (!b.__SV) {
var a, f, i, g;
window.mixpanel = b;
a = e.createElement("script");
a.type = "text/javascript";
a.async = !0;
a.src = ("https:" === e.location.protocol ?
"https:" : "http:") + '//cdn.mxpnl.com/libs/mixpanel-2.2.min.js';
f = e.getElementsByTagName("script")[0];
f.parentNode.insertBefore(a, f);
b._i = [];
b.init = function(a, e, d) {
function f(b, h) {
var a = h.split(".");
2 == a.length && (b = b[a[0]],
h = a[1]);
b[h] = function() {
b.push([h].concat(Array.prototype.slice.call(arguments, 0)))
}
}
var c = b;
"undefined" !== typeof d ? c = b[d] = [] : d =
"mixpanel";
c.people = c.people || [];
c.toString = function(b) {
var a = "mixpanel";
"mixpanel" !== d && (a += "." + d);
b || (a += " (stub)");
return a
}
;
c.people.toString = function() {
return c.toString(1) + ".people (stub)"
}
;
i = "disable track track_pageview track_links
track_forms register register_once alias unregister identify name_tag
set_config people.set people.set_once people.increment people.append
people.track_charge people.clear_charges people.delete_user".split(" ");
for (g = 0; g < i.length; g++)
f(c, i[g]);
b._i.push([a, e, d])
}
;
b.__SV = 1.2
}
}
)(document, window.mixpanel || []);
}
if (true) {
mixpanel.init('5ee93aa75fafbe6cc89f65e39fd442a9', {
cross_subdomain_cookie: false
});
}
if (false) {
mixpanel.init('e9f85a260e22673665c335ea07907e45', {
cross_subdomain_cookie: false,
loaded: function(thinkificSystem) {
thinkificSystem.identify('154e9031cf8348-05bb36cac95b17-133b6d56-240000-154e9031cf95a8');
const MAX_ATTEMPTS = 5;
let attempts = 0;
let delay = 500;
const processEvents = function() {
attempts += 1;
delay *= 2;
if (typeof ThinkificAnalytics !== 'undefined') {
ThinkificAnalytics.process_system_events_queue();
} else if (attempts < MAX_ATTEMPTS) {
setTimeout(processEvents, delay);
}
}
// Attempt to process system events after an
initial delay to allow time for ThinkificAnalytics
// to become available on the window object.
Supports incrementally-delayed retries up to a maximum
// amount to accommodate for cases where
ThinkificAnalytics takes longer than normal to be mounted.
setTimeout(processEvents, delay);
}
}, 'thinkific_system');
// Unregister particular tenant event properties for
thinkific_system events on Tenant sites.
// Properties will be re-registered when initializing
mixpanel via the _mixpanel_instructor partial.
mixpanel.thinkific_system.unregister('Application');
mixpanel.thinkific_system.unregister('Current Page');
mixpanel.thinkific_system.unregister('Referrer Page');
}
</script>
<script>
(function() {
window.Thinkific = window.Thinkific || {};
if (true) {
window.Thinkific.current_user = {
"id": 1**,
"first_name": "Molan",
"last_name": "K. STUDENT",
"email": ***@***.***",
"external_source": null,
"subdomain": "rachels-english-academy",
"full_name": "Molan K. STUDENT",
"created_at": 1*,
"last_sign_in_at": 1*,
"number_courses_complete": 0,
"external_id": null,
"tenant_id": 1*,
"groups": [],
"locale": "en",
"site_owner": false
};
} else {
window.Thinkific.current_user = null;
}
window.dispatchEvent(new
Event('thnc.current_user-initialized'));
}
)();
</script>
<title>MODULE 3: Imitation Skills - Rachel's English Academy
</title>
<!--[if lt IE 9]>
<script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
<script type="text/javascript">
window.NREUM || (NREUM = {});
NREUM.info = {
"beacon": "bam.nr-data.net",
"errorBeacon": "bam.nr-data.net",
"licenseKey": "NRJS-2b2a25e4f5dd02e6159",
"applicationID": "546174210",
"transactionName": "JwkNERYOCVpXSxcADBEUEAAXThFXWVw=",
"queueTime": 2,
"applicationTime": 275,
"agent": ""
}
</script>
<script type="text/javascript">
(window.NREUM || (NREUM = {})).init = {
privacy: {
cookies_enabled: true
},
ajax: {
deny_list: ["bam.nr-data.net"]
},
distributed_tracing: {
enabled: true
}
};
(window.NREUM || (NREUM = {})).loader_config = {
agentID: "594336846",
accountID: "3481338",
trustKey: "3414783",
xpid: "VwIPUFVQABAFUFdTAAUFV1Q=",
licenseKey: "NRJS-2b2a25e4f5dd02e6159",
applicationID: "546174210"
};
;/*! For license information please see
nr-loader-spa-1.249.0.min.js.LICENSE.txt */
(()=>{
var e, t, r = {
234: (e,t,r)=>{
"use strict";
r.d(t, {
P_: ()=>m,
Mt: ()=>b,
C5: ()=>s,
DL: ()=>A,
OP: ()=>N,
lF: ()=>j,
Yu: ()=>E,
Dg: ()=>v,
CX: ()=>c,
GE: ()=>x,
sU: ()=>R
});
var n = r(8632)
, i = r(9567);
const o = {
beacon: n.ce.beacon,
errorBeacon: n.ce.errorBeacon,
licenseKey: void 0,
applicationID: void 0,
sa: void 0,
queueTime: void 0,
applicationTime: void 0,
ttGuid: void 0,
user: void 0,
account: void 0,
product: void 0,
extra: void 0,
jsAttributes: {},
userAttributes: void 0,
atts: void 0,
transactionName: void 0,
tNamePlain: void 0
}
, a = {};
function s(e) {
if (!e)
throw new Error("All info objects require
an agent identifier!");
if (!a[e])
throw new Error("Info for ".concat(e, " was
never set"));
return a[e]
}
function c(e, t) {
if (!e)
throw new Error("All info objects require
an agent identifier!");
a[e] = (0,
i.D)(t, o);
const r = (0,
n.ek)(e);
r && (r.info = a[e])
}
const u = e=>{
if (!e || "string" != typeof e)
return !1;
try {
document.createDocumentFragment().querySelector(e)
} catch {
return !1
}
return !0
}
;
var d = r(7056)
, l = r(50);
const f = "[data-nr-mask]"
, h = ()=>{
const e = {
mask_selector: "*",
block_selector: "[data-nr-block]",
mask_input_options: {
color: !1,
date: !1,
"datetime-local": !1,
email: !1,
month: !1,
number: !1,
range: !1,
search: !1,
tel: !1,
text: !1,
time: !1,
url: !1,
week: !1,
textarea: !1,
select: !1,
password: !0
}
};
return {
feature_flags: [],
proxy: {
assets: void 0,
beacon: void 0
},
privacy: {
cookies_enabled: !0
},
ajax: {
deny_list: void 0,
block_internal: !0,
enabled: !0,
harvestTimeSeconds: 10,
autoStart: !0
},
distributed_tracing: {
enabled: void 0,
exclude_newrelic_header: void 0,
cors_use_newrelic_header: void 0,
cors_use_tracecontext_headers: void 0,
allowed_origins: void 0
},
session: {
domain: void 0,
expiresMs: d.oD,
inactiveMs: d.Hb
},
ssl: void 0,
obfuscate: void 0,
jserrors: {
enabled: !0,
harvestTimeSeconds: 10,
autoStart: !0
},
metrics: {
enabled: !0,
autoStart: !0
},
page_action: {
enabled: !0,
harvestTimeSeconds: 30,
autoStart: !0
},
page_view_event: {
enabled: !0,
autoStart: !0
},
page_view_timing: {
enabled: !0,
harvestTimeSeconds: 30,
long_task: !1,
autoStart: !0
},
session_trace: {
enabled: !0,
harvestTimeSeconds: 10,
autoStart: !0
},
harvest: {
tooManyRequestsDelay: 60
},
session_replay: {
autoStart: !0,
enabled: !1,
harvestTimeSeconds: 60,
sampling_rate: 50,
error_sampling_rate: 50,
collect_fonts: !1,
inline_images: !1,
inline_stylesheet: !0,
mask_all_inputs: !0,
get mask_text_selector() {
return e.mask_selector
},
set mask_text_selector(t) {
u(t) ? e.mask_selector =
"".concat(t, ",").concat(f) : "" === t || null === t ? e.mask_selector = f
: (0,
l.Z)("An invalid
session_replay.mask_selector was provided. '*' will be used.", t)
},
get block_class() {
return "nr-block"
},
get ignore_class() {
return "nr-ignore"
},
get mask_text_class() {
return "nr-mask"
},
get block_selector() {
return e.block_selector
},
set block_selector(t) {
u(t) ? e.block_selector +=
",".concat(t) : "" !== t && (0,
l.Z)("An invalid
session_replay.block_selector was provided and will not be used", t)
},
get mask_input_options() {
return e.mask_input_options
},
set mask_input_options(t) {
t && "object" == typeof t ?
e.mask_input_options = {
...t,
password: !0
} : (0,
l.Z)("An invalid
session_replay.mask_input_option was provided and will not be used", t)
}
},
spa: {
enabled: !0,
harvestTimeSeconds: 10,
autoStart: !0
}
}
}
, p = {}
, g = "All configuration objects require an agent
identifier!";
function m(e) {
if (!e)
throw new Error(g);
if (!p[e])
throw new Error("Configuration for
".concat(e, " was never set"));
return p[e]
}
function v(e, t) {
if (!e)
throw new Error(g);
p[e] = (0,
i.D)(t, h());
const r = (0,
n.ek)(e);
r && (r.init = p[e])
}
function b(e, t) {
if (!e)
throw new Error(g);
var r = m(e);
if (r) {
for (var n = t.split("."), i = 0; i <
n.length - 1; i++)
if ("object" != typeof (r = r[n[i]]))
return;
r = r[n[n.length - 1]]
}
return r
}
const y = {
accountID: void 0,
trustKey: void 0,
agentID: void 0,
licenseKey: void 0,
applicationID: void 0,
xpid: void 0
}
, w = {};
function A(e) {
if (!e)
throw new Error("All loader-config objects
require an agent identifier!");
if (!w[e])
throw new Error("LoaderConfig for
".concat(e, " was never set"));
return w[e]
}
function x(e, t) {
if (!e)
throw new Error("All loader-config objects
require an agent identifier!");
w[e] = (0,
i.D)(t, y);
const r = (0,
n.ek)(e);
r && (r.loader_config = w[e])
}
const E = (0,
n.mF)().o;
var _ = r(385)
, T = r(6818);
const S = {
buildEnv: T.Re,
customTransaction: void 0,
disabled: !1,
distMethod: T.gF,
isolatedBacklog: !1,
loaderType: void 0,
maxBytes: 3e4,
offset:
Math.floor(_._A?.performance?.timeOrigin ||
_._A?.performance?.timing?.navigationStart || Date.now()),
onerror: void 0,
origin: "" + _._A.location,
ptid: void 0,
releaseIds: {},
session: void 0,
xhrWrappable: "function" == typeof
_._A.XMLHttpRequest?.prototype?.addEventListener,
version: T.q4,
denyList: void 0
}
, D = {};
function N(e) {
if (!e)
throw new Error("All runtime objects
require an agent identifier!");
if (!D[e])
throw new Error("Runtime for ".concat(e, "
was never set"));
return D[e]
}
function R(e, t) {
if (!e)
throw new Error("All runtime objects
require an agent identifier!");
D[e] = (0,
i.D)(t, S);
const r = (0,
n.ek)(e);
r && (r.runtime = D[e])
}
function j(e) {
return function(e) {
try {
const t = s(e);
return !!t.licenseKey &&
!!t.errorBeacon && !!t.applicationID
} catch (e) {
return !1
}
}(e)
}
}
,
9567: (e,t,r)=>{
"use strict";
r.d(t, {
D: ()=>i
});
var n = r(50);
function i(e, t) {
try {
if (!e || "object" != typeof e)
return (0,
n.Z)("Setting a Configurable requires
an object as input");
if (!t || "object" != typeof t)
return (0,
n.Z)("Setting a Configurable requires a
model to set its initial properties");
const r =
Object.create(Object.getPrototypeOf(t), Object.getOwnPropertyDescriptors(t))
, o = 0 === Object.keys(r).length ? e : r;
for (let a in o)
if (void 0 !== e[a])
try {
Array.isArray(e[a]) &&
Array.isArray(t[a]) ? r[a] = Array.from(new Set([...e[a], ...t[a]])) :
"object" == typeof e[a] && "object" == typeof t[a] ? r[a] = i(e[a], t[a]) :
r[a] = e[a]
} catch (e) {
(0,
n.Z)("An error occurred while
setting a property of a Configurable", e)
}
return r
} catch (e) {
(0,
n.Z)("An error occured while setting a
Configurable", e)
}
}
}
,
6818: (e,t,r)=>{
"use strict";
r.d(t, {
Re: ()=>i,
gF: ()=>o,
lF: ()=>a,
q4: ()=>n
});
const n = "1.249.0"
, i = "PROD"
, o = "CDN"
, a = "2.0.0-alpha.11"
}
,
385: (e,t,r)=>{
"use strict";
r.d(t, {
FN: ()=>c,
IF: ()=>l,
LW: ()=>a,
Nk: ()=>h,
Tt: ()=>u,
_A: ()=>o,
cv: ()=>p,
iS: ()=>s,
il: ()=>n,
ux: ()=>d,
v6: ()=>i,
w1: ()=>f
});
const n = "undefined" != typeof window &&
!!window.document
, i = "undefined" != typeof WorkerGlobalScope &&
("undefined" != typeof self && self instanceof WorkerGlobalScope &&
self.navigator instanceof WorkerNavigator || "undefined" != typeof
globalThis && globalThis instanceof WorkerGlobalScope &&
globalThis.navigator instanceof WorkerNavigator)
, o = n ? window : "undefined" != typeof
WorkerGlobalScope && ("undefined" != typeof self && self instanceof
WorkerGlobalScope && self || "undefined" != typeof globalThis && globalThis
instanceof WorkerGlobalScope && globalThis)
, a = "complete" === o?.document?.readyState
, s = Boolean("hidden" ===
o?.document?.visibilityState)
, c = "" + o?.location
, u =
/iPad|iPhone|iPod/.test(o.navigator?.userAgent)
, d = u && "undefined" == typeof SharedWorker
, l = (()=>{
const e =
o.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);
return Array.isArray(e) && e.length >= 2 ?
+e[1] : 0
}
)()
, f = Boolean(n && window.document.documentMode)
, h = !!o.navigator?.sendBeacon
, p = Math.floor(o?.performance?.timeOrigin ||
o?.performance?.timing?.navigationStart || Date.now())
}
,
1117: (e,t,r)=>{
"use strict";
r.d(t, {
w: ()=>o
});
var n = r(50);
const i = {
agentIdentifier: "",
ee: void 0
};
class o {
constructor(e) {
try {
if ("object" != typeof e)
return (0,
n.Z)("shared context requires an
object as input");
this.sharedContext = {},
Object.assign(this.sharedContext, i),
Object.entries(e).forEach((e=>{
let[t,r] = e;
Object.keys(i).includes(t) &&
(this.sharedContext[t] = r)
}
))
} catch (e) {
(0,
n.Z)("An error occured while setting
SharedContext", e)
}
}
}
}
,
8e3: (e,t,r)=>{
"use strict";
r.d(t, {
L: ()=>d,
R: ()=>c
});
var n = r(8325)
, i = r(1284)
, o = r(4322)
, a = r(3325);
const s = {};
function c(e, t) {
const r = {
staged: !1,
priority: a.p[t] || 0
};
u(e),
s[e].get(t) || s[e].set(t, r)
}
function u(e) {
e && (s[e] || (s[e] = new Map))
}
function d() {
let e = arguments.length > 0 && void 0 !==
arguments[0] ? arguments[0] : ""
, t = arguments.length > 1 && void 0 !==
arguments[1] ? arguments[1] : "feature";
if (u(e),
!e || !s[e].get(t))
return a(t);
s[e].get(t).staged = !0;
const r = [...s[e]];
function a(t) {
const r = e ? n.ee.get(e) : n.ee
, a = o.X.handlers;
if (r.backlog && a) {
var s = r.backlog[t]
, c = a[t];
if (c) {
for (var u = 0; s && u < s.length;
++u)
l(s[u], c);
(0,
i.D)(c, (function(e, t) {
(0,
i.D)(t, (function(t, r) {
r[0].on(e, r[1])
}
))
}
))
}
delete a[t],
r.backlog[t] = null,
r.emit("drain-" + t, [])
}
}
r.every((e=>{
let[t,r] = e;
return r.staged
}
)) && (r.sort(((e,t)=>e[1].priority -
t[1].priority)),
r.forEach((t=>{
let[r] = t;
s[e].delete(r),
a(r)
}
)))
}
function l(e, t) {
var r = e[1];
(0,
i.D)(t[r], (function(t, r) {
var n = e[0];
if (r[0] === n) {
var i = r[1]
, o = e[3]
, a = e[2];
i.apply(o, a)
}
}
))
}
}
,
8325: (e,t,r)=>{
"use strict";
r.d(t, {
A: ()=>c,
ee: ()=>u
});
var n = r(8632)
, i = r(2210)
, o = r(234);
class a {
constructor(e) {
this.contextId = e
}
}
var s = r(3117);
const c = ***@***.***:".concat(s.a)
, u = function e(t, r) {
var n = {}
, s = {}
, d = {}
, f = !1;
try {
f = 16 === r.length && (0,
o.OP)(r).isolatedBacklog
} catch (e) {}
var h = {
on: g,
addEventListener: g,
removeEventListener: function(e, t) {
var r = n[e];
if (!r)
return;
for (var i = 0; i < r.length; i++)
r[i] === t && r.splice(i, 1)
},
emit: function(e, r, n, i, o) {
!1 !== o && (o = !0);
if (u.aborted && !i)
return;
t && o && t.emit(e, r, n);
for (var a = p(n), c = m(e), d =
c.length, l = 0; l < d; l++)
c[l].apply(a, r);
var f = b()[s[e]];
f && f.push([h, e, r, a]);
return a
},
get: v,
listeners: m,
context: p,
buffer: function(e, t) {
const r = b();
if (t = t || "feature",
h.aborted)
return;
Object.entries(e || {}).forEach((e=>{
let[n,i] = e;
s[i] = t,
t in r || (r[t] = [])
}
))
},
abort: l,
aborted: !1,
isBuffering: function(e) {
return !!b()[s[e]]
},
debugId: r,
backlog: f ? {} : t && "object" == typeof
t.backlog ? t.backlog : {}
};
return h;
function p(e) {
return e && e instanceof a ? e : e ? (0,
i.X)(e, c, (()=>new a(c))) : new a(c)
}
function g(e, t) {
n[e] = m(e).concat(t)
}
function m(e) {
return n[e] || []
}
function v(t) {
return d[t] = d[t] || e(h, t)
}
function b() {
return h.backlog
}
}(void 0, "globalEE")
, d = (0,
n.fP)();
function l() {
u.aborted = !0,
u.backlog = {}
}
d.ee || (d.ee = u)
}
,
5546: (e,t,r)=>{
"use strict";
r.d(t, {
E: ()=>n,
p: ()=>i
});
var n = r(8325).ee.get("handle");
function i(e, t, r, i, o) {
o ? (o.buffer([e], i),
o.emit(e, t, r)) : (n.buffer([e], i),
n.emit(e, t, r))
}
}
,
4322: (e,t,r)=>{
"use strict";
r.d(t, {
X: ()=>o
});
var n = r(5546);
o.on = a;
var i = o.handlers = {};
function o(e, t, r, o) {
a(o || n.E, i, e, t, r)
}
function a(e, t, r, i, o) {
o || (o = "feature"),
e || (e = n.E);
var a = t[o] = t[o] || {};
(a[r] = a[r] || []).push([e, i])
}
}
,
3239: (e,t,r)=>{
"use strict";
r.d(t, {
bP: ()=>s,
iz: ()=>c,
m$: ()=>a
});
var n = r(385);
let i = !1
, o = !1;
try {
const e = {
get passive() {
return i = !0,
!1
},
get signal() {
return o = !0,
!1
}
};
n._A.addEventListener("test", null, e),
n._A.removeEventListener("test", null, e)
} catch (e) {}
function a(e, t) {
return i || o ? {
capture: !!e,
passive: i,
signal: t
} : !!e
}
function s(e, t) {
let r = arguments.length > 2 && void 0 !==
arguments[2] && arguments[2]
, n = arguments.length > 3 ? arguments[3] :
void 0;
window.addEventListener(e, t, a(r, n))
}
function c(e, t) {
let r = arguments.length > 2 && void 0 !==
arguments[2] && arguments[2]
, n = arguments.length > 3 ? arguments[3] :
void 0;
document.addEventListener(e, t, a(r, n))
}
}
,
3117: (e,t,r)=>{
"use strict";
r.d(t, {
a: ()=>n
});
const n = (0,
r(4402).Rl)()
}
,
4402: (e,t,r)=>{
"use strict";
r.d(t, {
Ht: ()=>u,
M: ()=>c,
Rl: ()=>a,
ky: ()=>s
});
var n = r(385);
const i = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
function o(e, t) {
return e ? 15 & e[t] : 16 * Math.random() | 0
}
function a() {
const e = n._A?.crypto || n._A?.msCrypto;
let t, r = 0;
return e && e.getRandomValues && (t =
e.getRandomValues(new Uint8Array(30))),
i.split("").map((e=>"x" === e ? o(t,
r++).toString(16) : "y" === e ? (3 & o() | 8).toString(16) : e)).join("")
}
function s(e) {
const t = n._A?.crypto || n._A?.msCrypto;
let r, i = 0;
t && t.getRandomValues && (r =
t.getRandomValues(new Uint8Array(e)));
const a = [];
for (var s = 0; s < e; s++)
a.push(o(r, ++i).toString(16));
return a.join("")
}
function c() {
return s(16)
}
function u() {
return s(32)
}
}
,
7056: (e,t,r)=>{
"use strict";
r.d(t, {
Bq: ()=>n,
Hb: ()=>o,
oD: ()=>i
});
const n = "NRBA"
, i = 144e5
, o = 18e5
}
,
7894: (e,t,r)=>{
"use strict";
function n() {
return Math.round(performance.now())
}
r.d(t, {
z: ()=>n
})
}
,
7243: (e,t,r)=>{
"use strict";
r.d(t, {
e: ()=>i
});
var n = r(385);
function i(e) {
if (0 === (e || "").indexOf("data:"))
return {
protocol: "data"
};
try {
const t = new URL(e,location.href)
, r = {
port: t.port,
hostname: t.hostname,
pathname: t.pathname,
search: t.search,
protocol: t.protocol.slice(0,
t.protocol.indexOf(":")),
sameOrigin: t.protocol ===
n._A?.location?.protocol && t.host === n._A?.location?.host
};
return r.port && "" !== r.port || ("http:"
=== t.protocol && (r.port = "80"),
"https:" === t.protocol && (r.port =
"443")),
r.pathname && "" !== r.pathname ?
r.pathname.startsWith("/") || (r.pathname = "/".concat(r.pathname)) :
r.pathname = "/",
r
} catch (e) {
return {}
}
}
}
,
50: (e,t,r)=>{
"use strict";
function n(e, t) {
"function" == typeof console.warn &&
(console.warn("New Relic: ".concat(e)),
t && console.warn(t))
}
r.d(t, {
Z: ()=>n
})
}
,
2825: (e,t,r)=>{
"use strict";
r.d(t, {
N: ()=>d,
T: ()=>l
});
var n = r(8325)
, i = r(5546)
, o = r(3325)
, a = r(385);
const s = "newrelic";
const c = {
stn: [o.D.sessionTrace],
err: [o.D.jserrors, o.D.metrics],
ins: [o.D.pageAction],
spa: [o.D.spa],
sr: [o.D.sessionReplay, o.D.sessionTrace]
}
, u = new Set;
function d(e, t) {
const r = n.ee.get(t);
e && "object" == typeof e && (u.has(t) ||
(Object.entries(e).forEach((e=>{
let[t,n] = e;
c[t] ? c[t].forEach((e=>{
n ? (0,
i.p)("feat-" + t, [], void 0, e, r) :
(0,
i.p)("block-" + t, [], void 0, e, r),
(0,
i.p)("rumresp-" + t, [Boolean(n)], void
0, e, r)
}
)) : n && (0,
i.p)("feat-" + t, [], void 0, void 0, r),
l[t] = Boolean(n)
}
)),
Object.keys(c).forEach((e=>{
void 0 === l[e] && (c[e]?.forEach((t=>(0,
i.p)("rumresp-" + e, [!1], void 0, t, r))),
l[e] = !1)
}
)),
u.add(t),
function() {
let e = arguments.length > 0 && void 0 !==
arguments[0] ? arguments[0] : {};
try {
a._A.dispatchEvent(new CustomEvent(s,{
detail: e
}))
} catch (e) {}
}({
loaded: !0
})))
}
const l = {}
}
,
2210: (e,t,r)=>{
"use strict";
r.d(t, {
X: ()=>i
});
var n = Object.prototype.hasOwnProperty;
function i(e, t, r) {
if (n.call(e, t))
return e[t];
var i = r();
if (Object.defineProperty && Object.keys)
try {
return Object.defineProperty(e, t, {
value: i,
writable: !0,
enumerable: !1
}),
i
} catch (e) {}
return e[t] = i,
i
}
}
,
1284: (e,t,r)=>{
"use strict";
r.d(t, {
D: ()=>n
});
const n = (e,t)=>Object.entries(e || {}).map((e=>{
let[r,n] = e;
return t(r, n)
}
))
}
,
4351: (e,t,r)=>{
"use strict";
r.d(t, {
P: ()=>o
});
var n = r(8325);
const i = ()=>{
const e = new WeakSet;
return (t,r)=>{
if ("object" == typeof r && null !== r) {
if (e.has(r))
return;
e.add(r)
}
return r
}
}
;
function o(e) {
try {
return JSON.stringify(e, i())
} catch (e) {
try {
n.ee.emit("internal-error", [e])
} catch (e) {}
}
}
}
,
3960: (e,t,r)=>{
"use strict";
r.d(t, {
KB: ()=>a,
b2: ()=>o
});
var n = r(3239);
function i() {
return "undefined" == typeof document ||
"complete" === document.readyState
}
function o(e, t) {
if (i())
return e();
(0,
n.bP)("load", e, t)
}
function a(e) {
if (i())
return e();
(0,
n.iz)("DOMContentLoaded", e)
}
}
,
8632: (e,t,r)=>{
"use strict";
r.d(t, {
EZ: ()=>d,
ce: ()=>o,
ek: ()=>u,
fP: ()=>a,
gG: ()=>l,
h5: ()=>c,
mF: ()=>s
});
var n = r(7894)
, i = r(385);
const o = {
beacon: "bam.nr-data.net",
errorBeacon: "bam.nr-data.net"
};
function a() {
return i._A.NREUM || (i._A.NREUM = {}),
void 0 === i._A.newrelic && (i._A.newrelic =
i._A.NREUM),
i._A.NREUM
}
function s() {
let e = a();
return e.o || (e.o = {
ST: i._A.setTimeout,
SI: i._A.setImmediate,
CT: i._A.clearTimeout,
XHR: i._A.XMLHttpRequest,
REQ: i._A.Request,
EV: i._A.Event,
PR: i._A.Promise,
MO: i._A.MutationObserver,
FETCH: i._A.fetch
}),
e
}
function c(e, t) {
let r = a();
r.initializedAgents ??= {},
t.initializedAt = {
ms: (0,
n.z)(),
date: new Date
},
r.initializedAgents[e] = t
}
function u(e) {
let t = a();
return t.initializedAgents?.[e]
}
function d(e, t) {
a()[e] = t
}
function l() {
return function() {
let e = a();
const t = e.info || {};
e.info = {
beacon: o.beacon,
errorBeacon: o.errorBeacon,
...t
}
}(),
function() {
let e = a();
const t = e.init || {};
e.init = {
...t
}
}(),
s(),
function() {
let e = a();
const t = e.loader_config || {};
e.loader_config = {
...t
}
}(),
a()
}
}
,
7956: (e,t,r)=>{
"use strict";
r.d(t, {
N: ()=>i
});
var n = r(3239);
function i(e) {
let t = arguments.length > 1 && void 0 !==
arguments[1] && arguments[1]
, r = arguments.length > 2 ? arguments[2] :
void 0
, i = arguments.length > 3 ? arguments[3] :
void 0;
(0,
n.iz)("visibilitychange", (function() {
if (t)
return void ("hidden" ===
document.visibilityState && e());
e(document.visibilityState)
}
), r, i)
}
}
,
1214: (e,t,r)=>{
"use strict";
r.d(t, {
em: ()=>b,
u5: ()=>D,
QU: ()=>j,
_L: ()=>I,
Gm: ()=>H,
Lg: ()=>L,
BV: ()=>G,
Kf: ()=>Y
});
var n = r(8325)
, i = r(3117);
const o = ***@***.***:".concat(i.a);
var a = Object.prototype.hasOwnProperty
, s = !1;
function c(e, t) {
return e || (e = n.ee),
r.inPlace = function(e, t, n, i, o) {
n || (n = "");
const a = "-" === n.charAt(0);
for (let s = 0; s < t.length; s++) {
const c = t[s]
, u = e[c];
d(u) || (e[c] = r(u, a ? c + n : n, i,
c, o))
}
}
,
r.flag = o,
r;
function r(t, r, n, s, c) {
return d(t) ? t : (r || (r = ""),
nrWrapper[o] = t,
function(e, t, r) {
if (Object.defineProperty &&
Object.keys)
try {
return
Object.keys(e).forEach((function(r) {
Object.defineProperty(t, r,
{
get: function() {
return e[r]
},
set: function(t) {
return e[r] = t,
t
}
})
}
)),
t
} catch (e) {
u([e], r)
}
for (var n in e)
a.call(e, n) && (t[n] = e[n])
}(t, nrWrapper, e),
nrWrapper);
function nrWrapper() {
var o, a, d, l;
try {
a = this,
o = [...arguments],
d = "function" == typeof n ? n(o,
a) : n || {}
} catch (t) {
u([t, "", [o, a, s], d], e)
}
i(r + "start", [o, a, s], d, c);
try {
return l = t.apply(a, o)
} catch (e) {
throw i(r + "err", [o, a, e], d, c),
e
} finally {
i(r + "end", [o, a, l], d, c)
}
}
}
function i(r, n, i, o) {
if (!s || t) {
var a = s;
s = !0;
try {
e.emit(r, n, i, t, o)
} catch (t) {
u([t, r, n, i], e)
}
s = a
}
}
}
function u(e, t) {
t || (t = n.ee);
try {
t.emit("internal-error", e)
} catch (e) {}
}
function d(e) {
return !(e && "function" == typeof e && e.apply
&& !e[o])
}
var l = r(2210)
, f = r(385);
const h = {}
, p = f._A.XMLHttpRequest
, g = "addEventListener"
, m = "removeEventListener"
, v = ***@***.***:".concat(n.A);
function b(e) {
var t = function(e) {
return (e || n.ee).get("events")
}(e);
if (h[t.debugId]++)
return t;
h[t.debugId] = 1;
var r = c(t, !0);
function i(e) {
r.inPlace(e, [g, m], "-", o)
}
function o(e, t) {
return e[1]
}
return "getPrototypeOf"in Object && (f.il &&
y(document, i),
y(f._A, i),
y(p.prototype, i)),
t.on(g + "-start", (function(e, t) {
var n = e[1];
if (null !== n && ("function" == typeof n
|| "object" == typeof n)) {
var i = (0,
l.X)(n, v, (function() {
var e = {
object: function() {
if ("function" != typeof
n.handleEvent)
return;
return
n.handleEvent.apply(n, arguments)
},
function: n
}[typeof n];
return e ? r(e, "fn-", null, e.name
|| "anonymous") : n
}
));
this.wrapped = e[1] = i
}
}
)),
t.on(m + "-start", (function(e) {
e[1] = this.wrapped || e[1]
}
)),
t
}
function y(e, t) {
let r = e;
for (; "object" == typeof r &&
!Object.prototype.hasOwnProperty.call(r, g); )
r = Object.getPrototypeOf(r);
for (var n = arguments.length, i = new Array(n
2 ? n - 2 : 0), o = 2; o < n; o++)
i[o - 2] = arguments[o];
|
I have added audio file downloads to fix-lesson-dl branch. Please test it
out.
https://github.com/sumeetweb/Thinki-Downloader/tree/fix-lesson-dl
…On Tue, Dec 19, 2023 at 1:33 AM thereals ***@***.***> wrote:
Hi Sumeet,
this is the api response for an audio lesson:
<!DOCTYPE html>
<html lang='en'>
<head>
<link href='https://cdn.thinkific.com' rel='preconnect'>
<link crossorigin='true' href='https://fonts.gstatic.com'
rel='preconnect'>
<link rel='preload' href='//
cdn-internal.thinkific.com/kobayashi/assets/vendor-ed5462f20c50cc94c351a7ebd7fe1d6a.js'
as='script' crossorigin></link>
<link rel='preload' href='//
cdn-internal.thinkific.com/kobayashi/assets/course-player-v2-95e89352fd76e85df4a993e215c59e11.js'
as='script' crossorigin></link>
<link rel='preload' href='//
cdn-internal.thinkific.com/kobayashi/assets/vendor-e0cb822bbe090c173fe20baeb13b0c48.css'
as='style' crossorigin></link>
<link rel='preload' href='//
cdn-internal.thinkific.com/kobayashi/assets/course-player-v2-14b76be7ee27216b34794a7cd39efded.css'
as='style' crossorigin></link>
<script>
if (typeof mixpanel === 'undefined') {
(function(e, b) {
if (!b.__SV) {
var a, f, i, g;
window.mixpanel = b;
a = e.createElement("script");
a.type = "text/javascript";
a.async = !0;
a.src = ("https:" === e.location.protocol ?
"https:" : "http:") + '//cdn.mxpnl.com/libs/mixpanel-2.2.min.js';
f = e.getElementsByTagName("script")[0];
f.parentNode.insertBefore(a, f);
b._i = [];
b.init = function(a, e, d) {
function f(b, h) {
var a = h.split(".");
2 == a.length && (b = b[a[0]],
h = a[1]);
b[h] = function() {
b.push([h].concat(Array.prototype.slice.call(arguments, 0)))
}
}
var c = b;
"undefined" !== typeof d ? c = b[d] = [] : d =
"mixpanel";
c.people = c.people || [];
c.toString = function(b) {
var a = "mixpanel";
"mixpanel" !== d && (a += "." + d);
b || (a += " (stub)");
return a
}
;
c.people.toString = function() {
return c.toString(1) + ".people (stub)"
}
;
i = "disable track track_pageview track_links
track_forms register register_once alias unregister identify name_tag
set_config people.set people.set_once people.increment people.append
people.track_charge people.clear_charges people.delete_user".split(" ");
for (g = 0; g < i.length; g++)
f(c, i[g]);
b._i.push([a, e, d])
}
;
b.__SV = 1.2
}
}
)(document, window.mixpanel || []);
}
if (true) {
mixpanel.init('5ee93aa75fafbe6cc89f65e39fd442a9', {
cross_subdomain_cookie: false
});
}
if (false) {
mixpanel.init('e9f85a260e22673665c335ea07907e45', {
cross_subdomain_cookie: false,
loaded: function(thinkificSystem) {
thinkificSystem.identify('154e9031cf8348-05bb36cac95b17-133b6d56-240000-154e9031cf95a8');
const MAX_ATTEMPTS = 5;
let attempts = 0;
let delay = 500;
const processEvents = function() {
attempts += 1;
delay *= 2;
if (typeof ThinkificAnalytics !== 'undefined') {
ThinkificAnalytics.process_system_events_queue();
} else if (attempts < MAX_ATTEMPTS) {
setTimeout(processEvents, delay);
}
}
// Attempt to process system events after an
initial delay to allow time for ThinkificAnalytics
// to become available on the window object.
Supports incrementally-delayed retries up to a maximum
// amount to accommodate for cases where
ThinkificAnalytics takes longer than normal to be mounted.
setTimeout(processEvents, delay);
}
}, 'thinkific_system');
// Unregister particular tenant event properties for
thinkific_system events on Tenant sites.
// Properties will be re-registered when initializing
mixpanel via the _mixpanel_instructor partial.
mixpanel.thinkific_system.unregister('Application');
mixpanel.thinkific_system.unregister('Current Page');
mixpanel.thinkific_system.unregister('Referrer Page');
}
</script>
<script>
(function() {
window.Thinkific = window.Thinkific || {};
if (true) {
window.Thinkific.current_user = {
"id": 1**,
"first_name": "Molan",
"last_name": "K. STUDENT",
"email": ***@***.***",
"external_source": null,
"subdomain": "rachels-english-academy",
"full_name": "Molan K. STUDENT",
"created_at": 1*,
"last_sign_in_at": 1*,
"number_courses_complete": 0,
"external_id": null,
"tenant_id": 1*,
"groups": [],
"locale": "en",
"site_owner": false
};
} else {
window.Thinkific.current_user = null;
}
window.dispatchEvent(new
Event('thnc.current_user-initialized'));
}
)();
</script>
<title>MODULE 3: Imitation Skills - Rachel's English Academy
</title>
<!--[if lt IE 9]>
<script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
<script type="text/javascript">
window.NREUM || (NREUM = {});
NREUM.info = {
"beacon": "bam.nr-data.net",
"errorBeacon": "bam.nr-data.net",
"licenseKey": "NRJS-2b2a25e4f5dd02e6159",
"applicationID": "546174210",
"transactionName": "JwkNERYOCVpXSxcADBEUEAAXThFXWVw=",
"queueTime": 2,
"applicationTime": 275,
"agent": ""
}
</script>
<script type="text/javascript">
(window.NREUM || (NREUM = {})).init = {
privacy: {
cookies_enabled: true
},
ajax: {
deny_list: ["bam.nr-data.net"]
},
distributed_tracing: {
enabled: true
}
};
(window.NREUM || (NREUM = {})).loader_config = {
agentID: "594336846",
accountID: "3481338",
trustKey: "3414783",
xpid: "VwIPUFVQABAFUFdTAAUFV1Q=",
licenseKey: "NRJS-2b2a25e4f5dd02e6159",
applicationID: "546174210"
};
;/*! For license information please see
nr-loader-spa-1.249.0.min.js.LICENSE.txt */
(()=>{
var e, t, r = {
234: (e,t,r)=>{
"use strict";
r.d(t, {
P_: ()=>m,
Mt: ()=>b,
C5: ()=>s,
DL: ()=>A,
OP: ()=>N,
lF: ()=>j,
Yu: ()=>E,
Dg: ()=>v,
CX: ()=>c,
GE: ()=>x,
sU: ()=>R
});
var n = r(8632)
, i = r(9567);
const o = {
beacon: n.ce.beacon,
errorBeacon: n.ce.errorBeacon,
licenseKey: void 0,
applicationID: void 0,
sa: void 0,
queueTime: void 0,
applicationTime: void 0,
ttGuid: void 0,
user: void 0,
account: void 0,
product: void 0,
extra: void 0,
jsAttributes: {},
userAttributes: void 0,
atts: void 0,
transactionName: void 0,
tNamePlain: void 0
}
, a = {};
function s(e) {
if (!e)
throw new Error("All info objects require
an agent identifier!");
if (!a[e])
throw new Error("Info for ".concat(e, " was
never set"));
return a[e]
}
function c(e, t) {
if (!e)
throw new Error("All info objects require
an agent identifier!");
a[e] = (0,
i.D)(t, o);
const r = (0,
n.ek)(e);
r && (r.info = a[e])
}
const u = e=>{
if (!e || "string" != typeof e)
return !1;
try {
document.createDocumentFragment().querySelector(e)
} catch {
return !1
}
return !0
}
;
var d = r(7056)
, l = r(50);
const f = "[data-nr-mask]"
, h = ()=>{
const e = {
mask_selector: "*",
block_selector: "[data-nr-block]",
mask_input_options: {
color: !1,
date: !1,
"datetime-local": !1,
email: !1,
month: !1,
number: !1,
range: !1,
search: !1,
tel: !1,
text: !1,
time: !1,
url: !1,
week: !1,
textarea: !1,
select: !1,
password: !0
}
};
return {
feature_flags: [],
proxy: {
assets: void 0,
beacon: void 0
},
privacy: {
cookies_enabled: !0
},
ajax: {
deny_list: void 0,
block_internal: !0,
enabled: !0,
harvestTimeSeconds: 10,
autoStart: !0
},
distributed_tracing: {
enabled: void 0,
exclude_newrelic_header: void 0,
cors_use_newrelic_header: void 0,
cors_use_tracecontext_headers: void 0,
allowed_origins: void 0
},
session: {
domain: void 0,
expiresMs: d.oD,
inactiveMs: d.Hb
},
ssl: void 0,
obfuscate: void 0,
jserrors: {
enabled: !0,
harvestTimeSeconds: 10,
autoStart: !0
},
metrics: {
enabled: !0,
autoStart: !0
},
page_action: {
enabled: !0,
harvestTimeSeconds: 30,
autoStart: !0
},
page_view_event: {
enabled: !0,
autoStart: !0
},
page_view_timing: {
enabled: !0,
harvestTimeSeconds: 30,
long_task: !1,
autoStart: !0
},
session_trace: {
enabled: !0,
harvestTimeSeconds: 10,
autoStart: !0
},
harvest: {
tooManyRequestsDelay: 60
},
session_replay: {
autoStart: !0,
enabled: !1,
harvestTimeSeconds: 60,
sampling_rate: 50,
error_sampling_rate: 50,
collect_fonts: !1,
inline_images: !1,
inline_stylesheet: !0,
mask_all_inputs: !0,
get mask_text_selector() {
return e.mask_selector
},
set mask_text_selector(t) {
u(t) ? e.mask_selector =
"".concat(t, ",").concat(f) : "" === t || null === t ? e.mask_selector = f
: (0,
l.Z)("An invalid
session_replay.mask_selector was provided. '*' will be used.", t)
},
get block_class() {
return "nr-block"
},
get ignore_class() {
return "nr-ignore"
},
get mask_text_class() {
return "nr-mask"
},
get block_selector() {
return e.block_selector
},
set block_selector(t) {
u(t) ? e.block_selector +=
",".concat(t) : "" !== t && (0,
l.Z)("An invalid
session_replay.block_selector was provided and will not be used", t)
},
get mask_input_options() {
return e.mask_input_options
},
set mask_input_options(t) {
t && "object" == typeof t ?
e.mask_input_options = {
...t,
password: !0
} : (0,
l.Z)("An invalid
session_replay.mask_input_option was provided and will not be used", t)
}
},
spa: {
enabled: !0,
harvestTimeSeconds: 10,
autoStart: !0
}
}
}
, p = {}
, g = "All configuration objects require an agent
identifier!";
function m(e) {
if (!e)
throw new Error(g);
if (!p[e])
throw new Error("Configuration for
".concat(e, " was never set"));
return p[e]
}
function v(e, t) {
if (!e)
throw new Error(g);
p[e] = (0,
i.D)(t, h());
const r = (0,
n.ek)(e);
r && (r.init = p[e])
}
function b(e, t) {
if (!e)
throw new Error(g);
var r = m(e);
if (r) {
for (var n = t.split("."), i = 0; i <
n.length - 1; i++)
if ("object" != typeof (r = r[n[i]]))
return;
r = r[n[n.length - 1]]
}
return r
}
const y = {
accountID: void 0,
trustKey: void 0,
agentID: void 0,
licenseKey: void 0,
applicationID: void 0,
xpid: void 0
}
, w = {};
function A(e) {
if (!e)
throw new Error("All loader-config objects
require an agent identifier!");
if (!w[e])
throw new Error("LoaderConfig for
".concat(e, " was never set"));
return w[e]
}
function x(e, t) {
if (!e)
throw new Error("All loader-config objects
require an agent identifier!");
w[e] = (0,
i.D)(t, y);
const r = (0,
n.ek)(e);
r && (r.loader_config = w[e])
}
const E = (0,
n.mF)().o;
var _ = r(385)
, T = r(6818);
const S = {
buildEnv: T.Re,
customTransaction: void 0,
disabled: !1,
distMethod: T.gF,
isolatedBacklog: !1,
loaderType: void 0,
maxBytes: 3e4,
offset:
Math.floor(_._A?.performance?.timeOrigin ||
_._A?.performance?.timing?.navigationStart || Date.now()),
onerror: void 0,
origin: "" + _._A.location,
ptid: void 0,
releaseIds: {},
session: void 0,
xhrWrappable: "function" == typeof
_._A.XMLHttpRequest?.prototype?.addEventListener,
version: T.q4,
denyList: void 0
}
, D = {};
function N(e) {
if (!e)
throw new Error("All runtime objects
require an agent identifier!");
if (!D[e])
throw new Error("Runtime for ".concat(e, "
was never set"));
return D[e]
}
function R(e, t) {
if (!e)
throw new Error("All runtime objects
require an agent identifier!");
D[e] = (0,
i.D)(t, S);
const r = (0,
n.ek)(e);
r && (r.runtime = D[e])
}
function j(e) {
return function(e) {
try {
const t = s(e);
return !!t.licenseKey &&
!!t.errorBeacon && !!t.applicationID
} catch (e) {
return !1
}
}(e)
}
}
,
9567: (e,t,r)=>{
"use strict";
r.d(t, {
D: ()=>i
});
var n = r(50);
function i(e, t) {
try {
if (!e || "object" != typeof e)
return (0,
n.Z)("Setting a Configurable requires
an object as input");
if (!t || "object" != typeof t)
return (0,
n.Z)("Setting a Configurable requires a
model to set its initial properties");
const r =
Object.create(Object.getPrototypeOf(t),
Object.getOwnPropertyDescriptors(t))
, o = 0 === Object.keys(r).length ? e : r;
for (let a in o)
if (void 0 !== e[a])
try {
Array.isArray(e[a]) &&
Array.isArray(t[a]) ? r[a] = Array.from(new Set([...e[a], ...t[a]])) :
"object" == typeof e[a] && "object" == typeof t[a] ? r[a] = i(e[a], t[a])
:
r[a] = e[a]
} catch (e) {
(0,
n.Z)("An error occurred while
setting a property of a Configurable", e)
}
return r
} catch (e) {
(0,
n.Z)("An error occured while setting a
Configurable", e)
}
}
}
,
6818: (e,t,r)=>{
"use strict";
r.d(t, {
Re: ()=>i,
gF: ()=>o,
lF: ()=>a,
q4: ()=>n
});
const n = "1.249.0"
, i = "PROD"
, o = "CDN"
, a = "2.0.0-alpha.11"
}
,
385: (e,t,r)=>{
"use strict";
r.d(t, {
FN: ()=>c,
IF: ()=>l,
LW: ()=>a,
Nk: ()=>h,
Tt: ()=>u,
_A: ()=>o,
cv: ()=>p,
iS: ()=>s,
il: ()=>n,
ux: ()=>d,
v6: ()=>i,
w1: ()=>f
});
const n = "undefined" != typeof window &&
!!window.document
, i = "undefined" != typeof WorkerGlobalScope &&
("undefined" != typeof self && self instanceof WorkerGlobalScope &&
self.navigator instanceof WorkerNavigator || "undefined" != typeof
globalThis && globalThis instanceof WorkerGlobalScope &&
globalThis.navigator instanceof WorkerNavigator)
, o = n ? window : "undefined" != typeof
WorkerGlobalScope && ("undefined" != typeof self && self instanceof
WorkerGlobalScope && self || "undefined" != typeof globalThis &&
globalThis
instanceof WorkerGlobalScope && globalThis)
, a = "complete" === o?.document?.readyState
, s = Boolean("hidden" ===
o?.document?.visibilityState)
, c = "" + o?.location
, u =
/iPad|iPhone|iPod/.test(o.navigator?.userAgent)
, d = u && "undefined" == typeof SharedWorker
, l = (()=>{
const e =
o.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);
return Array.isArray(e) && e.length >= 2 ?
+e[1] : 0
}
)()
, f = Boolean(n && window.document.documentMode)
, h = !!o.navigator?.sendBeacon
, p = Math.floor(o?.performance?.timeOrigin ||
o?.performance?.timing?.navigationStart || Date.now())
}
,
1117: (e,t,r)=>{
"use strict";
r.d(t, {
w: ()=>o
});
var n = r(50);
const i = {
agentIdentifier: "",
ee: void 0
};
class o {
constructor(e) {
try {
if ("object" != typeof e)
return (0,
n.Z)("shared context requires an
object as input");
this.sharedContext = {},
Object.assign(this.sharedContext, i),
Object.entries(e).forEach((e=>{
let[t,r] = e;
Object.keys(i).includes(t) &&
(this.sharedContext[t] = r)
}
))
} catch (e) {
(0,
n.Z)("An error occured while setting
SharedContext", e)
}
}
}
}
,
8e3: (e,t,r)=>{
"use strict";
r.d(t, {
L: ()=>d,
R: ()=>c
});
var n = r(8325)
, i = r(1284)
, o = r(4322)
, a = r(3325);
const s = {};
function c(e, t) {
const r = {
staged: !1,
priority: a.p[t] || 0
};
u(e),
s[e].get(t) || s[e].set(t, r)
}
function u(e) {
e && (s[e] || (s[e] = new Map))
}
function d() {
let e = arguments.length > 0 && void 0 !==
arguments[0] ? arguments[0] : ""
, t = arguments.length > 1 && void 0 !==
arguments[1] ? arguments[1] : "feature";
if (u(e),
!e || !s[e].get(t))
return a(t);
s[e].get(t).staged = !0;
const r = [...s[e]];
function a(t) {
const r = e ? n.ee.get(e) : n.ee
, a = o.X.handlers;
if (r.backlog && a) {
var s = r.backlog[t]
, c = a[t];
if (c) {
for (var u = 0; s && u < s.length;
++u)
l(s[u], c);
(0,
i.D)(c, (function(e, t) {
(0,
i.D)(t, (function(t, r) {
r[0].on(e, r[1])
}
))
}
))
}
delete a[t],
r.backlog[t] = null,
r.emit("drain-" + t, [])
}
}
r.every((e=>{
let[t,r] = e;
return r.staged
}
)) && (r.sort(((e,t)=>e[1].priority -
t[1].priority)),
r.forEach((t=>{
let[r] = t;
s[e].delete(r),
a(r)
}
)))
}
function l(e, t) {
var r = e[1];
(0,
i.D)(t[r], (function(t, r) {
var n = e[0];
if (r[0] === n) {
var i = r[1]
, o = e[3]
, a = e[2];
i.apply(o, a)
}
}
))
}
}
,
8325: (e,t,r)=>{
"use strict";
r.d(t, {
A: ()=>c,
ee: ()=>u
});
var n = r(8632)
, i = r(2210)
, o = r(234);
class a {
constructor(e) {
this.contextId = e
}
}
var s = r(3117);
const c = ***@***.***:".concat(s.a)
, u = function e(t, r) {
var n = {}
, s = {}
, d = {}
, f = !1;
try {
f = 16 === r.length && (0,
o.OP)(r).isolatedBacklog
} catch (e) {}
var h = {
on: g,
addEventListener: g,
removeEventListener: function(e, t) {
var r = n[e];
if (!r)
return;
for (var i = 0; i < r.length; i++)
r[i] === t && r.splice(i, 1)
},
emit: function(e, r, n, i, o) {
!1 !== o && (o = !0);
if (u.aborted && !i)
return;
t && o && t.emit(e, r, n);
for (var a = p(n), c = m(e), d =
c.length, l = 0; l < d; l++)
c[l].apply(a, r);
var f = b()[s[e]];
f && f.push([h, e, r, a]);
return a
},
get: v,
listeners: m,
context: p,
buffer: function(e, t) {
const r = b();
if (t = t || "feature",
h.aborted)
return;
Object.entries(e || {}).forEach((e=>{
let[n,i] = e;
s[i] = t,
t in r || (r[t] = [])
}
))
},
abort: l,
aborted: !1,
isBuffering: function(e) {
return !!b()[s[e]]
},
debugId: r,
backlog: f ? {} : t && "object" == typeof
t.backlog ? t.backlog : {}
};
return h;
function p(e) {
return e && e instanceof a ? e : e ? (0,
i.X)(e, c, (()=>new a(c))) : new a(c)
}
function g(e, t) {
n[e] = m(e).concat(t)
}
function m(e) {
return n[e] || []
}
function v(t) {
return d[t] = d[t] || e(h, t)
}
function b() {
return h.backlog
}
}(void 0, "globalEE")
, d = (0,
n.fP)();
function l() {
u.aborted = !0,
u.backlog = {}
}
d.ee || (d.ee = u)
}
,
5546: (e,t,r)=>{
"use strict";
r.d(t, {
E: ()=>n,
p: ()=>i
});
var n = r(8325).ee.get("handle");
function i(e, t, r, i, o) {
o ? (o.buffer([e], i),
o.emit(e, t, r)) : (n.buffer([e], i),
n.emit(e, t, r))
}
}
,
4322: (e,t,r)=>{
"use strict";
r.d(t, {
X: ()=>o
});
var n = r(5546);
o.on = a;
var i = o.handlers = {};
function o(e, t, r, o) {
a(o || n.E, i, e, t, r)
}
function a(e, t, r, i, o) {
o || (o = "feature"),
e || (e = n.E);
var a = t[o] = t[o] || {};
(a[r] = a[r] || []).push([e, i])
}
}
,
3239: (e,t,r)=>{
"use strict";
r.d(t, {
bP: ()=>s,
iz: ()=>c,
m$: ()=>a
});
var n = r(385);
let i = !1
, o = !1;
try {
const e = {
get passive() {
return i = !0,
!1
},
get signal() {
return o = !0,
!1
}
};
n._A.addEventListener("test", null, e),
n._A.removeEventListener("test", null, e)
} catch (e) {}
function a(e, t) {
return i || o ? {
capture: !!e,
passive: i,
signal: t
} : !!e
}
function s(e, t) {
let r = arguments.length > 2 && void 0 !==
arguments[2] && arguments[2]
, n = arguments.length > 3 ? arguments[3] :
void 0;
window.addEventListener(e, t, a(r, n))
}
function c(e, t) {
let r = arguments.length > 2 && void 0 !==
arguments[2] && arguments[2]
, n = arguments.length > 3 ? arguments[3] :
void 0;
document.addEventListener(e, t, a(r, n))
}
}
,
3117: (e,t,r)=>{
"use strict";
r.d(t, {
a: ()=>n
});
const n = (0,
r(4402).Rl)()
}
,
4402: (e,t,r)=>{
"use strict";
r.d(t, {
Ht: ()=>u,
M: ()=>c,
Rl: ()=>a,
ky: ()=>s
});
var n = r(385);
const i = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
function o(e, t) {
return e ? 15 & e[t] : 16 * Math.random() | 0
}
function a() {
const e = n._A?.crypto || n._A?.msCrypto;
let t, r = 0;
return e && e.getRandomValues && (t =
e.getRandomValues(new Uint8Array(30))),
i.split("").map((e=>"x" === e ? o(t,
r++).toString(16) : "y" === e ? (3 & o() | 8).toString(16) : e)).join("")
}
function s(e) {
const t = n._A?.crypto || n._A?.msCrypto;
let r, i = 0;
t && t.getRandomValues && (r =
t.getRandomValues(new Uint8Array(e)));
const a = [];
for (var s = 0; s < e; s++)
a.push(o(r, ++i).toString(16));
return a.join("")
}
function c() {
return s(16)
}
function u() {
return s(32)
}
}
,
7056: (e,t,r)=>{
"use strict";
r.d(t, {
Bq: ()=>n,
Hb: ()=>o,
oD: ()=>i
});
const n = "NRBA"
, i = 144e5
, o = 18e5
}
,
7894: (e,t,r)=>{
"use strict";
function n() {
return Math.round(performance.now())
}
r.d(t, {
z: ()=>n
})
}
,
7243: (e,t,r)=>{
"use strict";
r.d(t, {
e: ()=>i
});
var n = r(385);
function i(e) {
if (0 === (e || "").indexOf("data:"))
return {
protocol: "data"
};
try {
const t = new URL(e,location.href)
, r = {
port: t.port,
hostname: t.hostname,
pathname: t.pathname,
search: t.search,
protocol: t.protocol.slice(0,
t.protocol.indexOf(":")),
sameOrigin: t.protocol ===
n._A?.location?.protocol && t.host === n._A?.location?.host
};
return r.port && "" !== r.port || ("http:"
=== t.protocol && (r.port = "80"),
"https:" === t.protocol && (r.port =
"443")),
r.pathname && "" !== r.pathname ?
r.pathname.startsWith("/") || (r.pathname = "/".concat(r.pathname)) :
r.pathname = "/",
r
} catch (e) {
return {}
}
}
}
,
50: (e,t,r)=>{
"use strict";
function n(e, t) {
"function" == typeof console.warn &&
(console.warn("New Relic: ".concat(e)),
t && console.warn(t))
}
r.d(t, {
Z: ()=>n
})
}
,
2825: (e,t,r)=>{
"use strict";
r.d(t, {
N: ()=>d,
T: ()=>l
});
var n = r(8325)
, i = r(5546)
, o = r(3325)
, a = r(385);
const s = "newrelic";
const c = {
stn: [o.D.sessionTrace],
err: [o.D.jserrors, o.D.metrics],
ins: [o.D.pageAction],
spa: [o.D.spa],
sr: [o.D.sessionReplay, o.D.sessionTrace]
}
, u = new Set;
function d(e, t) {
const r = n.ee.get(t);
e && "object" == typeof e && (u.has(t) ||
(Object.entries(e).forEach((e=>{
let[t,n] = e;
c[t] ? c[t].forEach((e=>{
n ? (0,
i.p)("feat-" + t, [], void 0, e, r) :
(0,
i.p)("block-" + t, [], void 0, e, r),
(0,
i.p)("rumresp-" + t, [Boolean(n)], void
0, e, r)
}
)) : n && (0,
i.p)("feat-" + t, [], void 0, void 0, r),
l[t] = Boolean(n)
}
)),
Object.keys(c).forEach((e=>{
void 0 === l[e] && (c[e]?.forEach((t=>(0,
i.p)("rumresp-" + e, [!1], void 0, t, r))),
l[e] = !1)
}
)),
u.add(t),
function() {
let e = arguments.length > 0 && void 0 !==
arguments[0] ? arguments[0] : {};
try {
a._A.dispatchEvent(new CustomEvent(s,{
detail: e
}))
} catch (e) {}
}({
loaded: !0
})))
}
const l = {}
}
,
2210: (e,t,r)=>{
"use strict";
r.d(t, {
X: ()=>i
});
var n = Object.prototype.hasOwnProperty;
function i(e, t, r) {
if (n.call(e, t))
return e[t];
var i = r();
if (Object.defineProperty && Object.keys)
try {
return Object.defineProperty(e, t, {
value: i,
writable: !0,
enumerable: !1
}),
i
} catch (e) {}
return e[t] = i,
i
}
}
,
1284: (e,t,r)=>{
"use strict";
r.d(t, {
D: ()=>n
});
const n = (e,t)=>Object.entries(e || {}).map((e=>{
let[r,n] = e;
return t(r, n)
}
))
}
,
4351: (e,t,r)=>{
"use strict";
r.d(t, {
P: ()=>o
});
var n = r(8325);
const i = ()=>{
const e = new WeakSet;
return (t,r)=>{
if ("object" == typeof r && null !== r) {
if (e.has(r))
return;
e.add(r)
}
return r
}
}
;
function o(e) {
try {
return JSON.stringify(e, i())
} catch (e) {
try {
n.ee.emit("internal-error", [e])
} catch (e) {}
}
}
}
,
3960: (e,t,r)=>{
"use strict";
r.d(t, {
KB: ()=>a,
b2: ()=>o
});
var n = r(3239);
function i() {
return "undefined" == typeof document ||
"complete" === document.readyState
}
function o(e, t) {
if (i())
return e();
(0,
n.bP)("load", e, t)
}
function a(e) {
if (i())
return e();
(0,
n.iz)("DOMContentLoaded", e)
}
}
,
8632: (e,t,r)=>{
"use strict";
r.d(t, {
EZ: ()=>d,
ce: ()=>o,
ek: ()=>u,
fP: ()=>a,
gG: ()=>l,
h5: ()=>c,
mF: ()=>s
});
var n = r(7894)
, i = r(385);
const o = {
beacon: "bam.nr-data.net",
errorBeacon: "bam.nr-data.net"
};
function a() {
return i._A.NREUM || (i._A.NREUM = {}),
void 0 === i._A.newrelic && (i._A.newrelic =
i._A.NREUM),
i._A.NREUM
}
function s() {
let e = a();
return e.o || (e.o = {
ST: i._A.setTimeout,
SI: i._A.setImmediate,
CT: i._A.clearTimeout,
XHR: i._A.XMLHttpRequest,
REQ: i._A.Request,
EV: i._A.Event,
PR: i._A.Promise,
MO: i._A.MutationObserver,
FETCH: i._A.fetch
}),
e
}
function c(e, t) {
let r = a();
r.initializedAgents ??= {},
t.initializedAt = {
ms: (0,
n.z)(),
date: new Date
},
r.initializedAgents[e] = t
}
function u(e) {
let t = a();
return t.initializedAgents?.[e]
}
function d(e, t) {
a()[e] = t
}
function l() {
return function() {
let e = a();
const t = e.info || {};
e.info = {
beacon: o.beacon,
errorBeacon: o.errorBeacon,
...t
}
}(),
function() {
let e = a();
const t = e.init || {};
e.init = {
...t
}
}(),
s(),
function() {
let e = a();
const t = e.loader_config || {};
e.loader_config = {
...t
}
}(),
a()
}
}
,
7956: (e,t,r)=>{
"use strict";
r.d(t, {
N: ()=>i
});
var n = r(3239);
function i(e) {
let t = arguments.length > 1 && void 0 !==
arguments[1] && arguments[1]
, r = arguments.length > 2 ? arguments[2] :
void 0
, i = arguments.length > 3 ? arguments[3] :
void 0;
(0,
n.iz)("visibilitychange", (function() {
if (t)
return void ("hidden" ===
document.visibilityState && e());
e(document.visibilityState)
}
), r, i)
}
}
,
1214: (e,t,r)=>{
"use strict";
r.d(t, {
em: ()=>b,
u5: ()=>D,
QU: ()=>j,
_L: ()=>I,
Gm: ()=>H,
Lg: ()=>L,
BV: ()=>G,
Kf: ()=>Y
});
var n = r(8325)
, i = r(3117);
const o = ***@***.***:".concat(i.a);
var a = Object.prototype.hasOwnProperty
, s = !1;
function c(e, t) {
return e || (e = n.ee),
r.inPlace = function(e, t, n, i, o) {
n || (n = "");
const a = "-" === n.charAt(0);
for (let s = 0; s < t.length; s++) {
const c = t[s]
, u = e[c];
d(u) || (e[c] = r(u, a ? c + n : n, i,
c, o))
}
}
,
r.flag = o,
r;
function r(t, r, n, s, c) {
return d(t) ? t : (r || (r = ""),
nrWrapper[o] = t,
function(e, t, r) {
if (Object.defineProperty &&
Object.keys)
try {
return
Object.keys(e).forEach((function(r) {
Object.defineProperty(t, r,
{
get: function() {
return e[r]
},
set: function(t) {
return e[r] = t,
t
}
})
}
)),
t
} catch (e) {
u([e], r)
}
for (var n in e)
a.call(e, n) && (t[n] = e[n])
}(t, nrWrapper, e),
nrWrapper);
function nrWrapper() {
var o, a, d, l;
try {
a = this,
o = [...arguments],
d = "function" == typeof n ? n(o,
a) : n || {}
} catch (t) {
u([t, "", [o, a, s], d], e)
}
i(r + "start", [o, a, s], d, c);
try {
return l = t.apply(a, o)
} catch (e) {
throw i(r + "err", [o, a, e], d, c),
e
} finally {
i(r + "end", [o, a, l], d, c)
}
}
}
function i(r, n, i, o) {
if (!s || t) {
var a = s;
s = !0;
try {
e.emit(r, n, i, t, o)
} catch (t) {
u([t, r, n, i], e)
}
s = a
}
}
}
function u(e, t) {
t || (t = n.ee);
try {
t.emit("internal-error", e)
} catch (e) {}
}
function d(e) {
return !(e && "function" == typeof e && e.apply
&& !e[o])
}
var l = r(2210)
, f = r(385);
const h = {}
, p = f._A.XMLHttpRequest
, g = "addEventListener"
, m = "removeEventListener"
, v = ***@***.***:".concat(n.A);
function b(e) {
var t = function(e) {
return (e || n.ee).get("events")
}(e);
if (h[t.debugId]++)
return t;
h[t.debugId] = 1;
var r = c(t, !0);
function i(e) {
r.inPlace(e, [g, m], "-", o)
}
function o(e, t) {
return e[1]
}
return "getPrototypeOf"in Object && (f.il &&
y(document, i),
y(f._A, i),
y(p.prototype, i)),
t.on(g + "-start", (function(e, t) {
var n = e[1];
if (null !== n && ("function" == typeof n
|| "object" == typeof n)) {
var i = (0,
l.X)(n, v, (function() {
var e = {
object: function() {
if ("function" != typeof
n.handleEvent)
return;
return
n.handleEvent.apply(n, arguments)
},
function: n
}[typeof n];
return e ? r(e, "fn-", null, e.name
|| "anonymous") : n
}
));
this.wrapped = e[1] = i
}
}
)),
t.on(m + "-start", (function(e) {
e[1] = this.wrapped || e[1]
}
)),
t
}
function y(e, t) {
let r = e;
for (; "object" == typeof r &&
!Object.prototype.hasOwnProperty.call(r, g); )
r = Object.getPrototypeOf(r);
for (var n = arguments.length, i = new Array(n
> 2 ? n - 2 : 0), o = 2; o < n; o++)
i[o - 2] = arguments[o];
—
Reply to this email directly, view it on GitHub
<#52 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AF734XTKV3MPW55WNIR4LF3YKCORXAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRRGUYDCMRTGE>
.
You are receiving this because you were assigned.Message ID:
***@***.***>
|
Hi Sumeet,
Thank you so much for providing a fix!
I tested it.
It recognizes the audio lesson page and even creates a folder for it.
However, the folder is empty meaning the audio file wasn't downloaded.
Cheers,
SP
Am Di., 19. Dez. 2023 um 06:43 Uhr schrieb Sumeet Naik <
***@***.***>:
… I have added audio file downloads to fix-lesson-dl branch. Please test it
out.
https://github.com/sumeetweb/Thinki-Downloader/tree/fix-lesson-dl
On Tue, Dec 19, 2023 at 1:33 AM thereals ***@***.***> wrote:
> Hi Sumeet,
>
> this is the api response for an audio lesson:
>
> <!DOCTYPE html>
> <html lang='en'>
> <head>
> <link href='https://cdn.thinkific.com' rel='preconnect'>
> <link crossorigin='true' href='https://fonts.gstatic.com'
> rel='preconnect'>
> <link rel='preload' href='//
>
>
cdn-internal.thinkific.com/kobayashi/assets/vendor-ed5462f20c50cc94c351a7ebd7fe1d6a.js'
>
> as='script' crossorigin></link>
> <link rel='preload' href='//
>
>
cdn-internal.thinkific.com/kobayashi/assets/course-player-v2-95e89352fd76e85df4a993e215c59e11.js'
>
> as='script' crossorigin></link>
> <link rel='preload' href='//
>
>
cdn-internal.thinkific.com/kobayashi/assets/vendor-e0cb822bbe090c173fe20baeb13b0c48.css'
>
> as='style' crossorigin></link>
> <link rel='preload' href='//
>
>
cdn-internal.thinkific.com/kobayashi/assets/course-player-v2-14b76be7ee27216b34794a7cd39efded.css'
>
> as='style' crossorigin></link>
> <script>
> if (typeof mixpanel === 'undefined') {
> (function(e, b) {
> if (!b.__SV) {
> var a, f, i, g;
> window.mixpanel = b;
> a = e.createElement("script");
> a.type = "text/javascript";
> a.async = !0;
> a.src = ("https:" === e.location.protocol ?
> "https:" : "http:") + '//cdn.mxpnl.com/libs/mixpanel-2.2.min.js';
> f = e.getElementsByTagName("script")[0];
> f.parentNode.insertBefore(a, f);
> b._i = [];
> b.init = function(a, e, d) {
> function f(b, h) {
> var a = h.split(".");
> 2 == a.length && (b = b[a[0]],
> h = a[1]);
> b[h] = function() {
>
> b.push([h].concat(Array.prototype.slice.call(arguments, 0)))
> }
> }
> var c = b;
> "undefined" !== typeof d ? c = b[d] = [] : d =
> "mixpanel";
> c.people = c.people || [];
> c.toString = function(b) {
> var a = "mixpanel";
> "mixpanel" !== d && (a += "." + d);
> b || (a += " (stub)");
> return a
> }
> ;
> c.people.toString = function() {
> return c.toString(1) + ".people (stub)"
> }
> ;
> i = "disable track track_pageview track_links
> track_forms register register_once alias unregister identify name_tag
> set_config people.set people.set_once people.increment people.append
> people.track_charge people.clear_charges people.delete_user".split(" ");
> for (g = 0; g < i.length; g++)
> f(c, i[g]);
> b._i.push([a, e, d])
> }
> ;
> b.__SV = 1.2
> }
> }
> )(document, window.mixpanel || []);
> }
>
> if (true) {
> mixpanel.init('5ee93aa75fafbe6cc89f65e39fd442a9', {
> cross_subdomain_cookie: false
> });
> }
>
> if (false) {
> mixpanel.init('e9f85a260e22673665c335ea07907e45', {
> cross_subdomain_cookie: false,
> loaded: function(thinkificSystem) {
>
>
thinkificSystem.identify('154e9031cf8348-05bb36cac95b17-133b6d56-240000-154e9031cf95a8');
>
>
> const MAX_ATTEMPTS = 5;
> let attempts = 0;
> let delay = 500;
>
> const processEvents = function() {
> attempts += 1;
> delay *= 2;
>
> if (typeof ThinkificAnalytics !== 'undefined') {
>
> ThinkificAnalytics.process_system_events_queue();
> } else if (attempts < MAX_ATTEMPTS) {
> setTimeout(processEvents, delay);
> }
> }
>
> // Attempt to process system events after an
> initial delay to allow time for ThinkificAnalytics
> // to become available on the window object.
> Supports incrementally-delayed retries up to a maximum
> // amount to accommodate for cases where
> ThinkificAnalytics takes longer than normal to be mounted.
> setTimeout(processEvents, delay);
> }
> }, 'thinkific_system');
>
> // Unregister particular tenant event properties for
> thinkific_system events on Tenant sites.
> // Properties will be re-registered when initializing
> mixpanel via the _mixpanel_instructor partial.
> mixpanel.thinkific_system.unregister('Application');
> mixpanel.thinkific_system.unregister('Current Page');
> mixpanel.thinkific_system.unregister('Referrer Page');
> }
> </script>
> <script>
> (function() {
> window.Thinkific = window.Thinkific || {};
>
> if (true) {
> window.Thinkific.current_user = {
> "id": 1**,
> "first_name": "Molan",
> "last_name": "K. STUDENT",
> "email": ***@***.***",
> "external_source": null,
> "subdomain": "rachels-english-academy",
> "full_name": "Molan K. STUDENT",
> "created_at": 1*,
> "last_sign_in_at": 1*,
> "number_courses_complete": 0,
> "external_id": null,
> "tenant_id": 1*,
> "groups": [],
> "locale": "en",
> "site_owner": false
> };
> } else {
> window.Thinkific.current_user = null;
> }
> window.dispatchEvent(new
> Event('thnc.current_user-initialized'));
> }
> )();
> </script>
> <title>MODULE 3: Imitation Skills - Rachel's English Academy
> </title>
> <!--[if lt IE 9]>
> <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script>
> <![endif]-->
> <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
> <meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>
> <script type="text/javascript">
> window.NREUM || (NREUM = {});
> NREUM.info = {
> "beacon": "bam.nr-data.net",
> "errorBeacon": "bam.nr-data.net",
> "licenseKey": "NRJS-2b2a25e4f5dd02e6159",
> "applicationID": "546174210",
> "transactionName": "JwkNERYOCVpXSxcADBEUEAAXThFXWVw=",
> "queueTime": 2,
> "applicationTime": 275,
> "agent": ""
> }
> </script>
> <script type="text/javascript">
> (window.NREUM || (NREUM = {})).init = {
> privacy: {
> cookies_enabled: true
> },
> ajax: {
> deny_list: ["bam.nr-data.net"]
> },
> distributed_tracing: {
> enabled: true
> }
> };
> (window.NREUM || (NREUM = {})).loader_config = {
> agentID: "594336846",
> accountID: "3481338",
> trustKey: "3414783",
> xpid: "VwIPUFVQABAFUFdTAAUFV1Q=",
> licenseKey: "NRJS-2b2a25e4f5dd02e6159",
> applicationID: "546174210"
> };
> ;/*! For license information please see
> nr-loader-spa-1.249.0.min.js.LICENSE.txt */
> (()=>{
> var e, t, r = {
> 234: (e,t,r)=>{
> "use strict";
> r.d(t, {
> P_: ()=>m,
> Mt: ()=>b,
> C5: ()=>s,
> DL: ()=>A,
> OP: ()=>N,
> lF: ()=>j,
> Yu: ()=>E,
> Dg: ()=>v,
> CX: ()=>c,
> GE: ()=>x,
> sU: ()=>R
> });
> var n = r(8632)
> , i = r(9567);
> const o = {
> beacon: n.ce.beacon,
> errorBeacon: n.ce.errorBeacon,
> licenseKey: void 0,
> applicationID: void 0,
> sa: void 0,
> queueTime: void 0,
> applicationTime: void 0,
> ttGuid: void 0,
> user: void 0,
> account: void 0,
> product: void 0,
> extra: void 0,
> jsAttributes: {},
> userAttributes: void 0,
> atts: void 0,
> transactionName: void 0,
> tNamePlain: void 0
> }
> , a = {};
> function s(e) {
> if (!e)
> throw new Error("All info objects require
> an agent identifier!");
> if (!a[e])
> throw new Error("Info for ".concat(e, " was
> never set"));
> return a[e]
> }
> function c(e, t) {
> if (!e)
> throw new Error("All info objects require
> an agent identifier!");
> a[e] = (0,
> i.D)(t, o);
> const r = (0,
> n.ek)(e);
> r && (r.info = a[e])
> }
> const u = e=>{
> if (!e || "string" != typeof e)
> return !1;
> try {
>
> document.createDocumentFragment().querySelector(e)
> } catch {
> return !1
> }
> return !0
> }
> ;
> var d = r(7056)
> , l = r(50);
> const f = "[data-nr-mask]"
> , h = ()=>{
> const e = {
> mask_selector: "*",
> block_selector: "[data-nr-block]",
> mask_input_options: {
> color: !1,
> date: !1,
> "datetime-local": !1,
> email: !1,
> month: !1,
> number: !1,
> range: !1,
> search: !1,
> tel: !1,
> text: !1,
> time: !1,
> url: !1,
> week: !1,
> textarea: !1,
> select: !1,
> password: !0
> }
> };
> return {
> feature_flags: [],
> proxy: {
> assets: void 0,
> beacon: void 0
> },
> privacy: {
> cookies_enabled: !0
> },
> ajax: {
> deny_list: void 0,
> block_internal: !0,
> enabled: !0,
> harvestTimeSeconds: 10,
> autoStart: !0
> },
> distributed_tracing: {
> enabled: void 0,
> exclude_newrelic_header: void 0,
> cors_use_newrelic_header: void 0,
> cors_use_tracecontext_headers: void 0,
> allowed_origins: void 0
> },
> session: {
> domain: void 0,
> expiresMs: d.oD,
> inactiveMs: d.Hb
> },
> ssl: void 0,
> obfuscate: void 0,
> jserrors: {
> enabled: !0,
> harvestTimeSeconds: 10,
> autoStart: !0
> },
> metrics: {
> enabled: !0,
> autoStart: !0
> },
> page_action: {
> enabled: !0,
> harvestTimeSeconds: 30,
> autoStart: !0
> },
> page_view_event: {
> enabled: !0,
> autoStart: !0
> },
> page_view_timing: {
> enabled: !0,
> harvestTimeSeconds: 30,
> long_task: !1,
> autoStart: !0
> },
> session_trace: {
> enabled: !0,
> harvestTimeSeconds: 10,
> autoStart: !0
> },
> harvest: {
> tooManyRequestsDelay: 60
> },
> session_replay: {
> autoStart: !0,
> enabled: !1,
> harvestTimeSeconds: 60,
> sampling_rate: 50,
> error_sampling_rate: 50,
> collect_fonts: !1,
> inline_images: !1,
> inline_stylesheet: !0,
> mask_all_inputs: !0,
> get mask_text_selector() {
> return e.mask_selector
> },
> set mask_text_selector(t) {
> u(t) ? e.mask_selector =
> "".concat(t, ",").concat(f) : "" === t || null === t ? e.mask_selector =
f
> : (0,
> l.Z)("An invalid
> session_replay.mask_selector was provided. '*' will be used.", t)
> },
> get block_class() {
> return "nr-block"
> },
> get ignore_class() {
> return "nr-ignore"
> },
> get mask_text_class() {
> return "nr-mask"
> },
> get block_selector() {
> return e.block_selector
> },
> set block_selector(t) {
> u(t) ? e.block_selector +=
> ",".concat(t) : "" !== t && (0,
> l.Z)("An invalid
> session_replay.block_selector was provided and will not be used", t)
> },
> get mask_input_options() {
> return e.mask_input_options
> },
> set mask_input_options(t) {
> t && "object" == typeof t ?
> e.mask_input_options = {
> ...t,
> password: !0
> } : (0,
> l.Z)("An invalid
> session_replay.mask_input_option was provided and will not be used", t)
> }
> },
> spa: {
> enabled: !0,
> harvestTimeSeconds: 10,
> autoStart: !0
> }
> }
> }
> , p = {}
> , g = "All configuration objects require an agent
> identifier!";
> function m(e) {
> if (!e)
> throw new Error(g);
> if (!p[e])
> throw new Error("Configuration for
> ".concat(e, " was never set"));
> return p[e]
> }
> function v(e, t) {
> if (!e)
> throw new Error(g);
> p[e] = (0,
> i.D)(t, h());
> const r = (0,
> n.ek)(e);
> r && (r.init = p[e])
> }
> function b(e, t) {
> if (!e)
> throw new Error(g);
> var r = m(e);
> if (r) {
> for (var n = t.split("."), i = 0; i <
> n.length - 1; i++)
> if ("object" != typeof (r = r[n[i]]))
> return;
> r = r[n[n.length - 1]]
> }
> return r
> }
> const y = {
> accountID: void 0,
> trustKey: void 0,
> agentID: void 0,
> licenseKey: void 0,
> applicationID: void 0,
> xpid: void 0
> }
> , w = {};
> function A(e) {
> if (!e)
> throw new Error("All loader-config objects
> require an agent identifier!");
> if (!w[e])
> throw new Error("LoaderConfig for
> ".concat(e, " was never set"));
> return w[e]
> }
> function x(e, t) {
> if (!e)
> throw new Error("All loader-config objects
> require an agent identifier!");
> w[e] = (0,
> i.D)(t, y);
> const r = (0,
> n.ek)(e);
> r && (r.loader_config = w[e])
> }
> const E = (0,
> n.mF)().o;
> var _ = r(385)
> , T = r(6818);
> const S = {
> buildEnv: T.Re,
> customTransaction: void 0,
> disabled: !1,
> distMethod: T.gF,
> isolatedBacklog: !1,
> loaderType: void 0,
> maxBytes: 3e4,
> offset:
> Math.floor(_._A?.performance?.timeOrigin ||
> _._A?.performance?.timing?.navigationStart || Date.now()),
> onerror: void 0,
> origin: "" + _._A.location,
> ptid: void 0,
> releaseIds: {},
> session: void 0,
> xhrWrappable: "function" == typeof
> _._A.XMLHttpRequest?.prototype?.addEventListener,
> version: T.q4,
> denyList: void 0
> }
> , D = {};
> function N(e) {
> if (!e)
> throw new Error("All runtime objects
> require an agent identifier!");
> if (!D[e])
> throw new Error("Runtime for ".concat(e, "
> was never set"));
> return D[e]
> }
> function R(e, t) {
> if (!e)
> throw new Error("All runtime objects
> require an agent identifier!");
> D[e] = (0,
> i.D)(t, S);
> const r = (0,
> n.ek)(e);
> r && (r.runtime = D[e])
> }
> function j(e) {
> return function(e) {
> try {
> const t = s(e);
> return !!t.licenseKey &&
> !!t.errorBeacon && !!t.applicationID
> } catch (e) {
> return !1
> }
> }(e)
> }
> }
> ,
> 9567: (e,t,r)=>{
> "use strict";
> r.d(t, {
> D: ()=>i
> });
> var n = r(50);
> function i(e, t) {
> try {
> if (!e || "object" != typeof e)
> return (0,
> n.Z)("Setting a Configurable requires
> an object as input");
> if (!t || "object" != typeof t)
> return (0,
> n.Z)("Setting a Configurable requires a
> model to set its initial properties");
> const r =
> Object.create(Object.getPrototypeOf(t),
> Object.getOwnPropertyDescriptors(t))
> , o = 0 === Object.keys(r).length ? e : r;
> for (let a in o)
> if (void 0 !== e[a])
> try {
> Array.isArray(e[a]) &&
> Array.isArray(t[a]) ? r[a] = Array.from(new Set([...e[a], ...t[a]])) :
> "object" == typeof e[a] && "object" == typeof t[a] ? r[a] = i(e[a],
t[a])
> :
> r[a] = e[a]
> } catch (e) {
> (0,
> n.Z)("An error occurred while
> setting a property of a Configurable", e)
> }
> return r
> } catch (e) {
> (0,
> n.Z)("An error occured while setting a
> Configurable", e)
> }
> }
> }
> ,
> 6818: (e,t,r)=>{
> "use strict";
> r.d(t, {
> Re: ()=>i,
> gF: ()=>o,
> lF: ()=>a,
> q4: ()=>n
> });
> const n = "1.249.0"
> , i = "PROD"
> , o = "CDN"
> , a = "2.0.0-alpha.11"
> }
> ,
> 385: (e,t,r)=>{
> "use strict";
> r.d(t, {
> FN: ()=>c,
> IF: ()=>l,
> LW: ()=>a,
> Nk: ()=>h,
> Tt: ()=>u,
> _A: ()=>o,
> cv: ()=>p,
> iS: ()=>s,
> il: ()=>n,
> ux: ()=>d,
> v6: ()=>i,
> w1: ()=>f
> });
> const n = "undefined" != typeof window &&
> !!window.document
> , i = "undefined" != typeof WorkerGlobalScope &&
> ("undefined" != typeof self && self instanceof WorkerGlobalScope &&
> self.navigator instanceof WorkerNavigator || "undefined" != typeof
> globalThis && globalThis instanceof WorkerGlobalScope &&
> globalThis.navigator instanceof WorkerNavigator)
> , o = n ? window : "undefined" != typeof
> WorkerGlobalScope && ("undefined" != typeof self && self instanceof
> WorkerGlobalScope && self || "undefined" != typeof globalThis &&
> globalThis
> instanceof WorkerGlobalScope && globalThis)
> , a = "complete" === o?.document?.readyState
> , s = Boolean("hidden" ===
> o?.document?.visibilityState)
> , c = "" + o?.location
> , u =
> /iPad|iPhone|iPod/.test(o.navigator?.userAgent)
> , d = u && "undefined" == typeof SharedWorker
> , l = (()=>{
> const e =
> o.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);
> return Array.isArray(e) && e.length >= 2 ?
> +e[1] : 0
> }
> )()
> , f = Boolean(n && window.document.documentMode)
> , h = !!o.navigator?.sendBeacon
> , p = Math.floor(o?.performance?.timeOrigin ||
> o?.performance?.timing?.navigationStart || Date.now())
> }
> ,
> 1117: (e,t,r)=>{
> "use strict";
> r.d(t, {
> w: ()=>o
> });
> var n = r(50);
> const i = {
> agentIdentifier: "",
> ee: void 0
> };
> class o {
> constructor(e) {
> try {
> if ("object" != typeof e)
> return (0,
> n.Z)("shared context requires an
> object as input");
> this.sharedContext = {},
> Object.assign(this.sharedContext, i),
> Object.entries(e).forEach((e=>{
> let[t,r] = e;
> Object.keys(i).includes(t) &&
> (this.sharedContext[t] = r)
> }
> ))
> } catch (e) {
> (0,
> n.Z)("An error occured while setting
> SharedContext", e)
> }
> }
> }
> }
> ,
> 8e3: (e,t,r)=>{
> "use strict";
> r.d(t, {
> L: ()=>d,
> R: ()=>c
> });
> var n = r(8325)
> , i = r(1284)
> , o = r(4322)
> , a = r(3325);
> const s = {};
> function c(e, t) {
> const r = {
> staged: !1,
> priority: a.p[t] || 0
> };
> u(e),
> s[e].get(t) || s[e].set(t, r)
> }
> function u(e) {
> e && (s[e] || (s[e] = new Map))
> }
> function d() {
> let e = arguments.length > 0 && void 0 !==
> arguments[0] ? arguments[0] : ""
> , t = arguments.length > 1 && void 0 !==
> arguments[1] ? arguments[1] : "feature";
> if (u(e),
> !e || !s[e].get(t))
> return a(t);
> s[e].get(t).staged = !0;
> const r = [...s[e]];
> function a(t) {
> const r = e ? n.ee.get(e) : n.ee
> , a = o.X.handlers;
> if (r.backlog && a) {
> var s = r.backlog[t]
> , c = a[t];
> if (c) {
> for (var u = 0; s && u < s.length;
> ++u)
> l(s[u], c);
> (0,
> i.D)(c, (function(e, t) {
> (0,
> i.D)(t, (function(t, r) {
> r[0].on(e, r[1])
> }
> ))
> }
> ))
> }
> delete a[t],
> r.backlog[t] = null,
> r.emit("drain-" + t, [])
> }
> }
> r.every((e=>{
> let[t,r] = e;
> return r.staged
> }
> )) && (r.sort(((e,t)=>e[1].priority -
> t[1].priority)),
> r.forEach((t=>{
> let[r] = t;
> s[e].delete(r),
> a(r)
> }
> )))
> }
> function l(e, t) {
> var r = e[1];
> (0,
> i.D)(t[r], (function(t, r) {
> var n = e[0];
> if (r[0] === n) {
> var i = r[1]
> , o = e[3]
> , a = e[2];
> i.apply(o, a)
> }
> }
> ))
> }
> }
> ,
> 8325: (e,t,r)=>{
> "use strict";
> r.d(t, {
> A: ()=>c,
> ee: ()=>u
> });
> var n = r(8632)
> , i = r(2210)
> , o = r(234);
> class a {
> constructor(e) {
> this.contextId = e
> }
> }
> var s = r(3117);
> const c = ***@***.***:".concat(s.a)
> , u = function e(t, r) {
> var n = {}
> , s = {}
> , d = {}
> , f = !1;
> try {
> f = 16 === r.length && (0,
> o.OP)(r).isolatedBacklog
> } catch (e) {}
> var h = {
> on: g,
> addEventListener: g,
> removeEventListener: function(e, t) {
> var r = n[e];
> if (!r)
> return;
> for (var i = 0; i < r.length; i++)
> r[i] === t && r.splice(i, 1)
> },
> emit: function(e, r, n, i, o) {
> !1 !== o && (o = !0);
> if (u.aborted && !i)
> return;
> t && o && t.emit(e, r, n);
> for (var a = p(n), c = m(e), d =
> c.length, l = 0; l < d; l++)
> c[l].apply(a, r);
> var f = b()[s[e]];
> f && f.push([h, e, r, a]);
> return a
> },
> get: v,
> listeners: m,
> context: p,
> buffer: function(e, t) {
> const r = b();
> if (t = t || "feature",
> h.aborted)
> return;
> Object.entries(e || {}).forEach((e=>{
> let[n,i] = e;
> s[i] = t,
> t in r || (r[t] = [])
> }
> ))
> },
> abort: l,
> aborted: !1,
> isBuffering: function(e) {
> return !!b()[s[e]]
> },
> debugId: r,
> backlog: f ? {} : t && "object" == typeof
> t.backlog ? t.backlog : {}
> };
> return h;
> function p(e) {
> return e && e instanceof a ? e : e ? (0,
> i.X)(e, c, (()=>new a(c))) : new a(c)
> }
> function g(e, t) {
> n[e] = m(e).concat(t)
> }
> function m(e) {
> return n[e] || []
> }
> function v(t) {
> return d[t] = d[t] || e(h, t)
> }
> function b() {
> return h.backlog
> }
> }(void 0, "globalEE")
> , d = (0,
> n.fP)();
> function l() {
> u.aborted = !0,
> u.backlog = {}
> }
> d.ee || (d.ee = u)
> }
> ,
> 5546: (e,t,r)=>{
> "use strict";
> r.d(t, {
> E: ()=>n,
> p: ()=>i
> });
> var n = r(8325).ee.get("handle");
> function i(e, t, r, i, o) {
> o ? (o.buffer([e], i),
> o.emit(e, t, r)) : (n.buffer([e], i),
> n.emit(e, t, r))
> }
> }
> ,
> 4322: (e,t,r)=>{
> "use strict";
> r.d(t, {
> X: ()=>o
> });
> var n = r(5546);
> o.on = a;
> var i = o.handlers = {};
> function o(e, t, r, o) {
> a(o || n.E, i, e, t, r)
> }
> function a(e, t, r, i, o) {
> o || (o = "feature"),
> e || (e = n.E);
> var a = t[o] = t[o] || {};
> (a[r] = a[r] || []).push([e, i])
> }
> }
> ,
> 3239: (e,t,r)=>{
> "use strict";
> r.d(t, {
> bP: ()=>s,
> iz: ()=>c,
> m$: ()=>a
> });
> var n = r(385);
> let i = !1
> , o = !1;
> try {
> const e = {
> get passive() {
> return i = !0,
> !1
> },
> get signal() {
> return o = !0,
> !1
> }
> };
> n._A.addEventListener("test", null, e),
> n._A.removeEventListener("test", null, e)
> } catch (e) {}
> function a(e, t) {
> return i || o ? {
> capture: !!e,
> passive: i,
> signal: t
> } : !!e
> }
> function s(e, t) {
> let r = arguments.length > 2 && void 0 !==
> arguments[2] && arguments[2]
> , n = arguments.length > 3 ? arguments[3] :
> void 0;
> window.addEventListener(e, t, a(r, n))
> }
> function c(e, t) {
> let r = arguments.length > 2 && void 0 !==
> arguments[2] && arguments[2]
> , n = arguments.length > 3 ? arguments[3] :
> void 0;
> document.addEventListener(e, t, a(r, n))
> }
> }
> ,
> 3117: (e,t,r)=>{
> "use strict";
> r.d(t, {
> a: ()=>n
> });
> const n = (0,
> r(4402).Rl)()
> }
> ,
> 4402: (e,t,r)=>{
> "use strict";
> r.d(t, {
> Ht: ()=>u,
> M: ()=>c,
> Rl: ()=>a,
> ky: ()=>s
> });
> var n = r(385);
> const i = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
> function o(e, t) {
> return e ? 15 & e[t] : 16 * Math.random() | 0
> }
> function a() {
> const e = n._A?.crypto || n._A?.msCrypto;
> let t, r = 0;
> return e && e.getRandomValues && (t =
> e.getRandomValues(new Uint8Array(30))),
> i.split("").map((e=>"x" === e ? o(t,
> r++).toString(16) : "y" === e ? (3 & o() | 8).toString(16) :
e)).join("")
> }
> function s(e) {
> const t = n._A?.crypto || n._A?.msCrypto;
> let r, i = 0;
> t && t.getRandomValues && (r =
> t.getRandomValues(new Uint8Array(e)));
> const a = [];
> for (var s = 0; s < e; s++)
> a.push(o(r, ++i).toString(16));
> return a.join("")
> }
> function c() {
> return s(16)
> }
> function u() {
> return s(32)
> }
> }
> ,
> 7056: (e,t,r)=>{
> "use strict";
> r.d(t, {
> Bq: ()=>n,
> Hb: ()=>o,
> oD: ()=>i
> });
> const n = "NRBA"
> , i = 144e5
> , o = 18e5
> }
> ,
> 7894: (e,t,r)=>{
> "use strict";
> function n() {
> return Math.round(performance.now())
> }
> r.d(t, {
> z: ()=>n
> })
> }
> ,
> 7243: (e,t,r)=>{
> "use strict";
> r.d(t, {
> e: ()=>i
> });
> var n = r(385);
> function i(e) {
> if (0 === (e || "").indexOf("data:"))
> return {
> protocol: "data"
> };
> try {
> const t = new URL(e,location.href)
> , r = {
> port: t.port,
> hostname: t.hostname,
> pathname: t.pathname,
> search: t.search,
> protocol: t.protocol.slice(0,
> t.protocol.indexOf(":")),
> sameOrigin: t.protocol ===
> n._A?.location?.protocol && t.host === n._A?.location?.host
> };
> return r.port && "" !== r.port || ("http:"
> === t.protocol && (r.port = "80"),
> "https:" === t.protocol && (r.port =
> "443")),
> r.pathname && "" !== r.pathname ?
> r.pathname.startsWith("/") || (r.pathname = "/".concat(r.pathname)) :
> r.pathname = "/",
> r
> } catch (e) {
> return {}
> }
> }
> }
> ,
> 50: (e,t,r)=>{
> "use strict";
> function n(e, t) {
> "function" == typeof console.warn &&
> (console.warn("New Relic: ".concat(e)),
> t && console.warn(t))
> }
> r.d(t, {
> Z: ()=>n
> })
> }
> ,
> 2825: (e,t,r)=>{
> "use strict";
> r.d(t, {
> N: ()=>d,
> T: ()=>l
> });
> var n = r(8325)
> , i = r(5546)
> , o = r(3325)
> , a = r(385);
> const s = "newrelic";
> const c = {
> stn: [o.D.sessionTrace],
> err: [o.D.jserrors, o.D.metrics],
> ins: [o.D.pageAction],
> spa: [o.D.spa],
> sr: [o.D.sessionReplay, o.D.sessionTrace]
> }
> , u = new Set;
> function d(e, t) {
> const r = n.ee.get(t);
> e && "object" == typeof e && (u.has(t) ||
> (Object.entries(e).forEach((e=>{
> let[t,n] = e;
> c[t] ? c[t].forEach((e=>{
> n ? (0,
> i.p)("feat-" + t, [], void 0, e, r) :
> (0,
> i.p)("block-" + t, [], void 0, e, r),
> (0,
> i.p)("rumresp-" + t, [Boolean(n)], void
> 0, e, r)
> }
> )) : n && (0,
> i.p)("feat-" + t, [], void 0, void 0, r),
> l[t] = Boolean(n)
> }
> )),
> Object.keys(c).forEach((e=>{
> void 0 === l[e] && (c[e]?.forEach((t=>(0,
> i.p)("rumresp-" + e, [!1], void 0, t, r))),
> l[e] = !1)
> }
> )),
> u.add(t),
> function() {
> let e = arguments.length > 0 && void 0 !==
> arguments[0] ? arguments[0] : {};
> try {
> a._A.dispatchEvent(new CustomEvent(s,{
> detail: e
> }))
> } catch (e) {}
> }({
> loaded: !0
> })))
> }
> const l = {}
> }
> ,
> 2210: (e,t,r)=>{
> "use strict";
> r.d(t, {
> X: ()=>i
> });
> var n = Object.prototype.hasOwnProperty;
> function i(e, t, r) {
> if (n.call(e, t))
> return e[t];
> var i = r();
> if (Object.defineProperty && Object.keys)
> try {
> return Object.defineProperty(e, t, {
> value: i,
> writable: !0,
> enumerable: !1
> }),
> i
> } catch (e) {}
> return e[t] = i,
> i
> }
> }
> ,
> 1284: (e,t,r)=>{
> "use strict";
> r.d(t, {
> D: ()=>n
> });
> const n = (e,t)=>Object.entries(e || {}).map((e=>{
> let[r,n] = e;
> return t(r, n)
> }
> ))
> }
> ,
> 4351: (e,t,r)=>{
> "use strict";
> r.d(t, {
> P: ()=>o
> });
> var n = r(8325);
> const i = ()=>{
> const e = new WeakSet;
> return (t,r)=>{
> if ("object" == typeof r && null !== r) {
> if (e.has(r))
> return;
> e.add(r)
> }
> return r
> }
> }
> ;
> function o(e) {
> try {
> return JSON.stringify(e, i())
> } catch (e) {
> try {
> n.ee.emit("internal-error", [e])
> } catch (e) {}
> }
> }
> }
> ,
> 3960: (e,t,r)=>{
> "use strict";
> r.d(t, {
> KB: ()=>a,
> b2: ()=>o
> });
> var n = r(3239);
> function i() {
> return "undefined" == typeof document ||
> "complete" === document.readyState
> }
> function o(e, t) {
> if (i())
> return e();
> (0,
> n.bP)("load", e, t)
> }
> function a(e) {
> if (i())
> return e();
> (0,
> n.iz)("DOMContentLoaded", e)
> }
> }
> ,
> 8632: (e,t,r)=>{
> "use strict";
> r.d(t, {
> EZ: ()=>d,
> ce: ()=>o,
> ek: ()=>u,
> fP: ()=>a,
> gG: ()=>l,
> h5: ()=>c,
> mF: ()=>s
> });
> var n = r(7894)
> , i = r(385);
> const o = {
> beacon: "bam.nr-data.net",
> errorBeacon: "bam.nr-data.net"
> };
> function a() {
> return i._A.NREUM || (i._A.NREUM = {}),
> void 0 === i._A.newrelic && (i._A.newrelic =
> i._A.NREUM),
> i._A.NREUM
> }
> function s() {
> let e = a();
> return e.o || (e.o = {
> ST: i._A.setTimeout,
> SI: i._A.setImmediate,
> CT: i._A.clearTimeout,
> XHR: i._A.XMLHttpRequest,
> REQ: i._A.Request,
> EV: i._A.Event,
> PR: i._A.Promise,
> MO: i._A.MutationObserver,
> FETCH: i._A.fetch
> }),
> e
> }
> function c(e, t) {
> let r = a();
> r.initializedAgents ??= {},
> t.initializedAt = {
> ms: (0,
> n.z)(),
> date: new Date
> },
> r.initializedAgents[e] = t
> }
> function u(e) {
> let t = a();
> return t.initializedAgents?.[e]
> }
> function d(e, t) {
> a()[e] = t
> }
> function l() {
> return function() {
> let e = a();
> const t = e.info || {};
> e.info = {
> beacon: o.beacon,
> errorBeacon: o.errorBeacon,
> ...t
> }
> }(),
> function() {
> let e = a();
> const t = e.init || {};
> e.init = {
> ...t
> }
> }(),
> s(),
> function() {
> let e = a();
> const t = e.loader_config || {};
> e.loader_config = {
> ...t
> }
> }(),
> a()
> }
> }
> ,
> 7956: (e,t,r)=>{
> "use strict";
> r.d(t, {
> N: ()=>i
> });
> var n = r(3239);
> function i(e) {
> let t = arguments.length > 1 && void 0 !==
> arguments[1] && arguments[1]
> , r = arguments.length > 2 ? arguments[2] :
> void 0
> , i = arguments.length > 3 ? arguments[3] :
> void 0;
> (0,
> n.iz)("visibilitychange", (function() {
> if (t)
> return void ("hidden" ===
> document.visibilityState && e());
> e(document.visibilityState)
> }
> ), r, i)
> }
> }
> ,
> 1214: (e,t,r)=>{
> "use strict";
> r.d(t, {
> em: ()=>b,
> u5: ()=>D,
> QU: ()=>j,
> _L: ()=>I,
> Gm: ()=>H,
> Lg: ()=>L,
> BV: ()=>G,
> Kf: ()=>Y
> });
> var n = r(8325)
> , i = r(3117);
> const o = ***@***.***:".concat(i.a);
> var a = Object.prototype.hasOwnProperty
> , s = !1;
> function c(e, t) {
> return e || (e = n.ee),
> r.inPlace = function(e, t, n, i, o) {
> n || (n = "");
> const a = "-" === n.charAt(0);
> for (let s = 0; s < t.length; s++) {
> const c = t[s]
> , u = e[c];
> d(u) || (e[c] = r(u, a ? c + n : n, i,
> c, o))
> }
> }
> ,
> r.flag = o,
> r;
> function r(t, r, n, s, c) {
> return d(t) ? t : (r || (r = ""),
> nrWrapper[o] = t,
> function(e, t, r) {
> if (Object.defineProperty &&
> Object.keys)
> try {
> return
> Object.keys(e).forEach((function(r) {
> Object.defineProperty(t, r,
> {
> get: function() {
> return e[r]
> },
> set: function(t) {
> return e[r] = t,
> t
> }
> })
> }
> )),
> t
> } catch (e) {
> u([e], r)
> }
> for (var n in e)
> a.call(e, n) && (t[n] = e[n])
> }(t, nrWrapper, e),
> nrWrapper);
> function nrWrapper() {
> var o, a, d, l;
> try {
> a = this,
> o = [...arguments],
> d = "function" == typeof n ? n(o,
> a) : n || {}
> } catch (t) {
> u([t, "", [o, a, s], d], e)
> }
> i(r + "start", [o, a, s], d, c);
> try {
> return l = t.apply(a, o)
> } catch (e) {
> throw i(r + "err", [o, a, e], d, c),
> e
> } finally {
> i(r + "end", [o, a, l], d, c)
> }
> }
> }
> function i(r, n, i, o) {
> if (!s || t) {
> var a = s;
> s = !0;
> try {
> e.emit(r, n, i, t, o)
> } catch (t) {
> u([t, r, n, i], e)
> }
> s = a
> }
> }
> }
> function u(e, t) {
> t || (t = n.ee);
> try {
> t.emit("internal-error", e)
> } catch (e) {}
> }
> function d(e) {
> return !(e && "function" == typeof e && e.apply
> && !e[o])
> }
> var l = r(2210)
> , f = r(385);
> const h = {}
> , p = f._A.XMLHttpRequest
> , g = "addEventListener"
> , m = "removeEventListener"
> , v = ***@***.***:".concat(n.A);
> function b(e) {
> var t = function(e) {
> return (e || n.ee).get("events")
> }(e);
> if (h[t.debugId]++)
> return t;
> h[t.debugId] = 1;
> var r = c(t, !0);
> function i(e) {
> r.inPlace(e, [g, m], "-", o)
> }
> function o(e, t) {
> return e[1]
> }
> return "getPrototypeOf"in Object && (f.il &&
> y(document, i),
> y(f._A, i),
> y(p.prototype, i)),
> t.on(g + "-start", (function(e, t) {
> var n = e[1];
> if (null !== n && ("function" == typeof n
> || "object" == typeof n)) {
> var i = (0,
> l.X)(n, v, (function() {
> var e = {
> object: function() {
> if ("function" != typeof
> n.handleEvent)
> return;
> return
> n.handleEvent.apply(n, arguments)
> },
> function: n
> }[typeof n];
> return e ? r(e, "fn-", null, e.name
> || "anonymous") : n
> }
> ));
> this.wrapped = e[1] = i
> }
> }
> )),
> t.on(m + "-start", (function(e) {
> e[1] = this.wrapped || e[1]
> }
> )),
> t
> }
> function y(e, t) {
> let r = e;
> for (; "object" == typeof r &&
> !Object.prototype.hasOwnProperty.call(r, g); )
> r = Object.getPrototypeOf(r);
> for (var n = arguments.length, i = new Array(n
> > 2 ? n - 2 : 0), o = 2; o < n; o++)
> i[o - 2] = arguments[o];
>
> —
> Reply to this email directly, view it on GitHub
> <
#52 (comment)>,
> or unsubscribe
> <
https://github.com/notifications/unsubscribe-auth/AF734XTKV3MPW55WNIR4LF3YKCORXAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRRGUYDCMRTGE>
> .
> You are receiving this because you were assigned.Message ID:
> ***@***.***>
>
—
Reply to this email directly, view it on GitHub
<#52 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AFJBPYMVQ5QEN4S3G7XNYHLYKELQDAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRSGEYDSMBZG4>
.
You are receiving this because you commented.Message ID:
***@***.***>
|
Hi @thereals, It is fixed now. https://github.com/sumeetweb/Thinki-Downloader/tree/fix-lesson-dl |
The issue was file name being set as null before saving the file. |
It works. Thanks a bunch!
I tested delta loading and full-new loading of a course.
In both cases it worked like a charm!
You'll get a coffee soon :-)
On another note, I tested it also on a guitar instructional thinkific page
and it also worked there. It not only downloaded the PDFs, Audios and
Videos but also Guitar Pro files which is awesome!
The one and only issue is that most of his instructional videos are
uploaded on Soundslice for the purpose of synchronized playback of video
and the played notes.
However, when I tried to use your downloader it downloads the HTML but the
player frame is empty and just has a text box which reads: Failed embed
allowlist check.
Apparently, Soundslice has a whitelist check so that only the original
website can embed the soundslice player, right?
Isn't there a way outwit soundslice?
Here is the api response from his site (Soundslice lesson pages are from
"contentable_type": "HtmlItem"):
{
"course": {
"id": 952513,
"name": "Rhythm Recipe: Blues",
"slug": "rhythm-recipe-blues",
"landing_page_url": "
https://members.tastyguitar.com/courses/rhythm-recipe-blues",
"checkout_page_url": "https://members.tastyguitar.com/enroll/1000802
",
"site_twitter_handle": "",
"support_email": ***@***.***",
"subdomain": "tastyguitar",
"use_linkedin_profile_certification": false,
"completion_page_html": "",
"use_custom_completion_page_html": false,
"reviews_enabled": false,
"goals_enabled": false,
"autoplay_all_videos": false,
"require_video_completion": false,
"video_completion_percentage": "100",
"disable_chapter_completed_modal": false,
"theme": "course_player_white",
"primary_color": "#ffffff",
"font": "Montserrat",
"logo": null,
"show_logo": true,
"disable_text_selection": false,
"hide_lesson_type_label_and_icon": false,
"hide_lesson_type_icon": false,
"is_onboarding_demo_course": false,
"social_share_course_completion_overridden": false,
"social_share_chapter_completion_overridden": false,
"social_share_message": null,
"facebook_shared_landing_page_url": "
https://members.tastyguitar.com/zcq1p",
"linkedin_shared_landing_page_url": "
https://members.tastyguitar.com/4yu3m",
"twitter_shared_landing_page_url": "
https://members.tastyguitar.com/duzhk",
"shared_landing_page_url": "https://members.tastyguitar.com/w992n",
"chapter_ids": [
4267060,
4382810,
4271018,
4271019,
7020683
],
"product_id": 1000802
},
"contents": [
{
"id": 17413492,
"position": 0,
"chapter_id": 4267060,
"name": "Blues Rhythm Intro Video",
"contentable_type": "Lesson",
"slug": "17413492-blues-rhythm-intro-video",
"is_free_trial": false,
"next_content_id": 17413478,
"next_content_slug":
"17413478-how-to-use-the-soundslice-player",
"next_content_type": "Lesson",
"display_name": "Video",
"contentable": 6981226,
"contentable_id": 6981226,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": false,
"meta_data": {
"duration_in_seconds": 141
},
"expand_enabled": true,
"lesson_type_label": null,
"lesson_type_icon": null,
"default_lesson_type_label": "Video",
"default_lesson_type_icon": "video",
"under_construction": false
},
{
"id": 17413478,
"position": 1,
"chapter_id": 4267060,
"name": "How To Use The Soundslice Player",
"contentable_type": "Lesson",
"slug": "17413478-how-to-use-the-soundslice-player",
"is_free_trial": false,
"next_content_id": 16731820,
"next_content_slug":
"16731820-downloadable-guitar-pro-pdf-files",
"next_content_type": "Download",
"display_name": "Video",
"contentable": 6981219,
"contentable_id": 6981219,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": false,
"meta_data": {
"duration_in_seconds": 370
},
"expand_enabled": true,
"lesson_type_label": null,
"lesson_type_icon": null,
"default_lesson_type_label": "Video",
"default_lesson_type_icon": "video",
"under_construction": false
},
{
"id": 16731820,
"position": 2,
"chapter_id": 4267060,
"name": "Downloadable Guitar Pro \u0026 PDF Files",
"contentable_type": "Download",
"slug": "16731820-downloadable-guitar-pro-pdf-files",
"is_free_trial": false,
"next_content_id": 18344568,
"next_content_slug":
"18344568-how-to-submit-a-video-for-feedback",
"next_content_type": "Lesson",
"display_name": "Download",
"contentable": 506167,
"contentable_id": 506167,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": false,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": null,
"lesson_type_icon": null,
"default_lesson_type_label": "Download",
"default_lesson_type_icon": "download",
"under_construction": false
},
{
"id": 18344568,
"position": 3,
"chapter_id": 4267060,
"name": "How To Submit a Video for Feedback",
"contentable_type": "Lesson",
"slug": "18344568-how-to-submit-a-video-for-feedback",
"is_free_trial": false,
"next_content_id": 16731821,
"next_content_slug":
"16731821-12-bar-blues-in-g-straight-feel-vs-shuffle-feel",
"next_content_type": "HtmlItem",
"display_name": "Video",
"contentable": 7388785,
"contentable_id": 7388785,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": false,
"meta_data": {
"duration_in_seconds": 78
},
"expand_enabled": false,
"lesson_type_label": null,
"lesson_type_icon": null,
"default_lesson_type_label": "Video",
"default_lesson_type_icon": "video",
"under_construction": false
},
{
"id": 16731821,
"position": 0,
"chapter_id": 4382810,
"name": "12 Bar Blues in G - Straight Feel vs Shuffle Feel",
"contentable_type": "HtmlItem",
"slug":
"16731821-12-bar-blues-in-g-straight-feel-vs-shuffle-feel",
"is_free_trial": false,
"next_content_id": 17336841,
"next_content_slug":
"17336841-12-bar-blues-in-g-w-quick-change",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4291200,
"contentable_id": 4291200,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 2,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17336841,
"position": 1,
"chapter_id": 4382810,
"name": "12 Bar Blues in G w/ Quick Change",
"contentable_type": "HtmlItem",
"slug": "17336841-12-bar-blues-in-g-w-quick-change",
"is_free_trial": false,
"next_content_id": 17336924,
"next_content_slug":
"17336924-12-bar-blues-in-g-w-b7th-extension",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429760,
"contentable_id": 4429760,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17336924,
"position": 2,
"chapter_id": 4382810,
"name": "12 Bar Blues in G w/ b7th Extension",
"contentable_type": "HtmlItem",
"slug": "17336924-12-bar-blues-in-g-w-b7th-extension",
"is_free_trial": false,
"next_content_id": 17337034,
"next_content_slug":
"17337034-12-bar-blues-in-g-w-b7th-extension-quick-change",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429775,
"contentable_id": 4429775,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17337034,
"position": 3,
"chapter_id": 4382810,
"name": "12 Bar Blues in G w/ b7th Extension \u0026 Quick
Change",
"contentable_type": "HtmlItem",
"slug":
"17337034-12-bar-blues-in-g-w-b7th-extension-quick-change",
"is_free_trial": false,
"next_content_id": 17337083,
"next_content_slug": "17337083-side-dish-key-to-the-highway",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429785,
"contentable_id": 4429785,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17337083,
"position": 4,
"chapter_id": 4382810,
"name": "Side Dish - Key To The Highway",
"contentable_type": "HtmlItem",
"slug": "17337083-side-dish-key-to-the-highway",
"is_free_trial": false,
"next_content_id": 17337180,
"next_content_slug":
"17337180-12-bar-blues-in-d-the-root-5-form",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429794,
"contentable_id": 4429794,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17337180,
"position": 5,
"chapter_id": 4382810,
"name": "12 Bar Blues in D - The Root 5 Form",
"contentable_type": "HtmlItem",
"slug": "17337180-12-bar-blues-in-d-the-root-5-form",
"is_free_trial": false,
"next_content_id": 17337458,
"next_content_slug":
"17337458-playing-the-rootless-boogie-blues",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429802,
"contentable_id": 4429802,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17337458,
"position": 6,
"chapter_id": 4382810,
"name": "Playing The Rootless Boogie Blues",
"contentable_type": "HtmlItem",
"slug": "17337458-playing-the-rootless-boogie-blues",
"is_free_trial": false,
"next_content_id": 17337500,
"next_content_slug":
"17337500-variations-on-the-straight-boogie-blues",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429866,
"contentable_id": 4429866,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17337500,
"position": 7,
"chapter_id": 4382810,
"name": "Variations on the Straight Boogie Blues",
"contentable_type": "HtmlItem",
"slug": "17337500-variations-on-the-straight-boogie-blues",
"is_free_trial": false,
"next_content_id": 17337982,
"next_content_slug":
"17337982-3-essential-box-patterns-for-12-bar-blues",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429877,
"contentable_id": 4429877,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17337982,
"position": 8,
"chapter_id": 4382810,
"name": "3 Essential \"Box\" Patterns For 12 Bar Blues",
"contentable_type": "HtmlItem",
"slug": "17337982-3-essential-box-patterns-for-12-bar-blues",
"is_free_trial": false,
"next_content_id": 17338114,
"next_content_slug": "17338114-side-dish-tore-down",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429942,
"contentable_id": 4429942,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338114,
"position": 9,
"chapter_id": 4382810,
"name": "Side Dish - Tore Down",
"contentable_type": "HtmlItem",
"slug": "17338114-side-dish-tore-down",
"is_free_trial": false,
"next_content_id": 17338342,
"next_content_slug":
"17338342-using-block-barre-chords-in-the-blues",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429960,
"contentable_id": 4429960,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338342,
"position": 10,
"chapter_id": 4382810,
"name": "Using Block(Barre) Chords In The Blues",
"contentable_type": "HtmlItem",
"slug": "17338342-using-block-barre-chords-in-the-blues",
"is_free_trial": false,
"next_content_id": 17338425,
"next_content_slug": "17338425-adding-that-texas-feel",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429979,
"contentable_id": 4429979,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338425,
"position": 11,
"chapter_id": 4382810,
"name": "Adding That \"Texas\" Feel",
"contentable_type": "HtmlItem",
"slug": "17338425-adding-that-texas-feel",
"is_free_trial": false,
"next_content_id": 17338541,
"next_content_slug": "17338541-the-minor-blues-part-1",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4429994,
"contentable_id": 4429994,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338541,
"position": 12,
"chapter_id": 4382810,
"name": "The Minor Blues - Part 1",
"contentable_type": "HtmlItem",
"slug": "17338541-the-minor-blues-part-1",
"is_free_trial": false,
"next_content_id": 17338650,
"next_content_slug":
"17338650-the-minor-blues-part-2-common-alternate-chord-changes",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430004,
"contentable_id": 4430004,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338650,
"position": 13,
"chapter_id": 4382810,
"name": "The Minor Blues - Part 2 - Common Alternate Chord
Changes",
"contentable_type": "HtmlItem",
"slug":
"17338650-the-minor-blues-part-2-common-alternate-chord-changes",
"is_free_trial": false,
"next_content_id": 17338729,
"next_content_slug":
"17338729-15-side-dish-the-thrill-is-gone-bb-king",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430023,
"contentable_id": 4430023,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338729,
"position": 14,
"chapter_id": 4382810,
"name": "15 Side Dish - The Thrill Is Gone - BB King",
"contentable_type": "HtmlItem",
"slug": "17338729-15-side-dish-the-thrill-is-gone-bb-king",
"is_free_trial": false,
"next_content_id": 17338841,
"next_content_slug":
"17338841-the-charleston-rhythm-feel-rootless-chord-voicings",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430033,
"contentable_id": 4430033,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338841,
"position": 1,
"chapter_id": 4271018,
"name": "The \"Charleston\" Rhythm Feel \u0026 Rootless Chord
Voicings",
"contentable_type": "HtmlItem",
"slug":
"17338841-the-charleston-rhythm-feel-rootless-chord-voicings",
"is_free_trial": false,
"next_content_id": 17338920,
"next_content_slug":
"17338920-using-passing-chords-in-the-blues",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430049,
"contentable_id": 4430049,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338920,
"position": 2,
"chapter_id": 4271018,
"name": "Using Passing Chords In The Blues ",
"contentable_type": "HtmlItem",
"slug": "17338920-using-passing-chords-in-the-blues",
"is_free_trial": false,
"next_content_id": 17338996,
"next_content_slug":
"17338996-adding-the-backbeat-feel-to-blues-rhythm",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430062,
"contentable_id": 4430062,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17338996,
"position": 3,
"chapter_id": 4271018,
"name": "Adding The Backbeat Feel To Blues Rhythm",
"contentable_type": "HtmlItem",
"slug": "17338996-adding-the-backbeat-feel-to-blues-rhythm",
"is_free_trial": false,
"next_content_id": 17339108,
"next_content_slug": "17339108-the-6th-chord-in-the-blues",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430079,
"contentable_id": 4430079,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 1,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339108,
"position": 4,
"chapter_id": 4271018,
"name": "The 6th Chord in the Blues",
"contentable_type": "HtmlItem",
"slug": "17339108-the-6th-chord-in-the-blues",
"is_free_trial": false,
"next_content_id": 17339221,
"next_content_slug":
"17339221-the-6th-chord-in-the-blues-part-2-adding-passing-chords-and-slides",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430095,
"contentable_id": 4430095,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 1,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339221,
"position": 5,
"chapter_id": 4271018,
"name": "The 6th Chord in the Blues Part 2 - Adding Passing
Chords and Slides",
"contentable_type": "HtmlItem",
"slug":
"17339221-the-6th-chord-in-the-blues-part-2-adding-passing-chords-and-slides",
"is_free_trial": false,
"next_content_id": 17339253,
"next_content_slug":
"17339253-9th-chords-in-the-the-blues-part-1",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430123,
"contentable_id": 4430123,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 2,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339253,
"position": 6,
"chapter_id": 4271018,
"name": "9th Chords in the The Blues - Part 1",
"contentable_type": "HtmlItem",
"slug": "17339253-9th-chords-in-the-the-blues-part-1",
"is_free_trial": false,
"next_content_id": 17339294,
"next_content_slug":
"17339294-9th-chords-in-the-the-blues-part-2",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430129,
"contentable_id": 4430129,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339294,
"position": 7,
"chapter_id": 4271018,
"name": "9th Chords in the The Blues - Part 2",
"contentable_type": "HtmlItem",
"slug": "17339294-9th-chords-in-the-the-blues-part-2",
"is_free_trial": false,
"next_content_id": 17339338,
"next_content_slug": "17339338-side-dish-messin-with-the-kid",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430134,
"contentable_id": 4430134,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339338,
"position": 8,
"chapter_id": 4271018,
"name": "Side Dish - Messin' With The Kid",
"contentable_type": "HtmlItem",
"slug": "17339338-side-dish-messin-with-the-kid",
"is_free_trial": false,
"next_content_id": 17339430,
"next_content_slug":
"17339430-piano-style-blues-comping-part-1",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430148,
"contentable_id": 4430148,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339430,
"position": 9,
"chapter_id": 4271018,
"name": "Piano Style Blues Comping - Part 1",
"contentable_type": "HtmlItem",
"slug": "17339430-piano-style-blues-comping-part-1",
"is_free_trial": false,
"next_content_id": 17339566,
"next_content_slug":
"17339566-piano-style-blues-comping-part-2",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430164,
"contentable_id": 4430164,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 1,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339566,
"position": 10,
"chapter_id": 4271018,
"name": "Piano Style Blues Comping - Part 2",
"contentable_type": "HtmlItem",
"slug": "17339566-piano-style-blues-comping-part-2",
"is_free_trial": false,
"next_content_id": 17339601,
"next_content_slug": "17339601-the-6th-9th-chord-rhythm",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430186,
"contentable_id": 4430186,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 1,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339601,
"position": 11,
"chapter_id": 4271018,
"name": "The 6th - 9th Chord Rhythm",
"contentable_type": "HtmlItem",
"slug": "17339601-the-6th-9th-chord-rhythm",
"is_free_trial": false,
"next_content_id": 17339643,
"next_content_slug":
"17339643-variations-on-the-6th-9th-rhythm-part-1",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430194,
"contentable_id": 4430194,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339643,
"position": 12,
"chapter_id": 4271018,
"name": "Variations on the 6th-9th Rhythm - Part 1",
"contentable_type": "HtmlItem",
"slug": "17339643-variations-on-the-6th-9th-rhythm-part-1",
"is_free_trial": false,
"next_content_id": 17339729,
"next_content_slug":
"17339729-variations-on-the-6th-9th-rhythm-part-2",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430204,
"contentable_id": 4430204,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339729,
"position": 13,
"chapter_id": 4271018,
"name": "Variations on the 6th-9th Rhythm - Part 2",
"contentable_type": "HtmlItem",
"slug": "17339729-variations-on-the-6th-9th-rhythm-part-2",
"is_free_trial": false,
"next_content_id": 17339968,
"next_content_slug":
"17339968-the-heavy-swingin-6th-9th-chord-rhythm",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430230,
"contentable_id": 4430230,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17339968,
"position": 14,
"chapter_id": 4271018,
"name": "The Heavy Swingin 6th - 9th Chord Rhythm",
"contentable_type": "HtmlItem",
"slug": "17339968-the-heavy-swingin-6th-9th-chord-rhythm",
"is_free_trial": false,
"next_content_id": 17340010,
"next_content_slug":
"17340010-side-dish-empty-arms-stevie-ray-vaughan",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430258,
"contentable_id": 4430258,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 1,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340010,
"position": 15,
"chapter_id": 4271018,
"name": "Side Dish - Empty Arms - Stevie Ray Vaughan",
"contentable_type": "HtmlItem",
"slug": "17340010-side-dish-empty-arms-stevie-ray-vaughan",
"is_free_trial": false,
"next_content_id": 17340151,
"next_content_slug":
"17340151-a-new-orleans-style-piano-rhythm-for-blues-guitar",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430267,
"contentable_id": 4430267,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 1,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340151,
"position": 1,
"chapter_id": 4271019,
"name": "A New Orleans Style Piano Rhythm for Blues Guitar",
"contentable_type": "HtmlItem",
"slug":
"17340151-a-new-orleans-style-piano-rhythm-for-blues-guitar",
"is_free_trial": false,
"next_content_id": 17340159,
"next_content_slug": "17340159-the-i-to-iv-chromatic-walkup",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430307,
"contentable_id": 4430307,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340159,
"position": 2,
"chapter_id": 4271019,
"name": "The I to IV Chromatic Walkup",
"contentable_type": "HtmlItem",
"slug": "17340159-the-i-to-iv-chromatic-walkup",
"is_free_trial": false,
"next_content_id": 17340207,
"next_content_slug": "17340207-advanced-shuffle-rhythms-part-1",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430314,
"contentable_id": 4430314,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340207,
"position": 3,
"chapter_id": 4271019,
"name": "Advanced Shuffle Rhythms - Part 1",
"contentable_type": "HtmlItem",
"slug": "17340207-advanced-shuffle-rhythms-part-1",
"is_free_trial": false,
"next_content_id": 17340235,
"next_content_slug": "17340235-advanced-shuffle-rhythms-part-2",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430330,
"contentable_id": 4430330,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340235,
"position": 4,
"chapter_id": 4271019,
"name": "Advanced Shuffle Rhythms - Part 2",
"contentable_type": "HtmlItem",
"slug": "17340235-advanced-shuffle-rhythms-part-2",
"is_free_trial": false,
"next_content_id": 17340430,
"next_content_slug":
"17340430-side-dish-wall-of-denial-srv-rhythm-part",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430338,
"contentable_id": 4430338,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 1,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340430,
"position": 5,
"chapter_id": 4271019,
"name": "Side Dish - Wall of Denial - SRV - Rhythm Part",
"contentable_type": "HtmlItem",
"slug": "17340430-side-dish-wall-of-denial-srv-rhythm-part",
"is_free_trial": false,
"next_content_id": 17340449,
"next_content_slug":
"17340449-the-funky-fingerstyle-shuffle-feel-side-dish-senor-blues",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430351,
"contentable_id": 4430351,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340449,
"position": 6,
"chapter_id": 4271019,
"name": "The Funky Fingerstyle Shuffle Feel/Side Dish - Senor
Blues",
"contentable_type": "HtmlItem",
"slug":
"17340449-the-funky-fingerstyle-shuffle-feel-side-dish-senor-blues",
"is_free_trial": false,
"next_content_id": 17340479,
"next_content_slug": "17340479-13th-chords-in-the-blues",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430359,
"contentable_id": 4430359,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340479,
"position": 7,
"chapter_id": 4271019,
"name": "13th Chords in the Blues",
"contentable_type": "HtmlItem",
"slug": "17340479-13th-chords-in-the-blues",
"is_free_trial": false,
"next_content_id": 17340492,
"next_content_slug": "17340492-the-jazz-blues-form",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430366,
"contentable_id": 4430366,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340492,
"position": 8,
"chapter_id": 4271019,
"name": "The Jazz-Blues Form",
"contentable_type": "HtmlItem",
"slug": "17340492-the-jazz-blues-form",
"is_free_trial": false,
"next_content_id": 17340874,
"next_content_slug":
"17340874-chromatic-embellishment-fills-in-blues-rhythm",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430369,
"contentable_id": 4430369,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340874,
"position": 9,
"chapter_id": 4271019,
"name": "Chromatic Embellishment Fills in Blues Rhythm",
"contentable_type": "HtmlItem",
"slug":
"17340874-chromatic-embellishment-fills-in-blues-rhythm",
"is_free_trial": false,
"next_content_id": 17340899,
"next_content_slug":
"17340899-common-endings-for-blues-songs-rhythm-guitar",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430482,
"contentable_id": 4430482,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340899,
"position": 10,
"chapter_id": 4271019,
"name": "Common Endings For Blues Songs - Rhythm Guitar",
"contentable_type": "HtmlItem",
"slug": "17340899-common-endings-for-blues-songs-rhythm-guitar",
"is_free_trial": false,
"next_content_id": 17340904,
"next_content_slug": "17340904-the-rhumba-blues-feel",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430483,
"contentable_id": 4430483,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340904,
"position": 11,
"chapter_id": 4271019,
"name": "The Rhumba Blues Feel",
"contentable_type": "HtmlItem",
"slug": "17340904-the-rhumba-blues-feel",
"is_free_trial": false,
"next_content_id": 17340922,
"next_content_slug": "17340922-side-dish-crosscut-saw",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430485,
"contentable_id": 4430485,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340922,
"position": 12,
"chapter_id": 4271019,
"name": "Side Dish - Crosscut Saw",
"contentable_type": "HtmlItem",
"slug": "17340922-side-dish-crosscut-saw",
"is_free_trial": false,
"next_content_id": 17340939,
"next_content_slug":
"17340939-3-extrordinary-blues-turnarounds",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430490,
"contentable_id": 4430490,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340939,
"position": 13,
"chapter_id": 4271019,
"name": "3 Extrordinary Blues Turnarounds",
"contentable_type": "HtmlItem",
"slug": "17340939-3-extrordinary-blues-turnarounds",
"is_free_trial": false,
"next_content_id": 17340946,
"next_content_slug":
"17340946-advanced-chords-in-the-blues-part-1-altered-chords",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430496,
"contentable_id": 4430496,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340946,
"position": 14,
"chapter_id": 4271019,
"name": "Advanced Chords in the Blues Part 1 - Altered Chords",
"contentable_type": "HtmlItem",
"slug":
"17340946-advanced-chords-in-the-blues-part-1-altered-chords",
"is_free_trial": false,
"next_content_id": 17340969,
"next_content_slug":
"17340969-advanced-chords-in-the-blues-part-2-diminished-chords",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430499,
"contentable_id": 4430499,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 17340969,
"position": 15,
"chapter_id": 4271019,
"name": "Advanced Chords in the Blues Part 2 -Diminished
Chords",
"contentable_type": "HtmlItem",
"slug":
"17340969-advanced-chords-in-the-blues-part-2-diminished-chords",
"is_free_trial": false,
"next_content_id": 41530728,
"next_content_slug":
"41530728-3-ways-to-funk-up-a-blues-rhythm",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 4430505,
"contentable_id": 4430505,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 41530728,
"position": 0,
"chapter_id": 7020683,
"name": "3 Ways To Funk Up a Blues Rhythm",
"contentable_type": "HtmlItem",
"slug": "41530728-3-ways-to-funk-up-a-blues-rhythm",
"is_free_trial": false,
"next_content_id": 36409976,
"next_content_slug": "36409976-5-blistering-blues-chord-fills",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 10587463,
"contentable_id": 10587463,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 36409976,
"position": 1,
"chapter_id": 7020683,
"name": "5 Blistering Blues Chord Fills",
"contentable_type": "HtmlItem",
"slug": "36409976-5-blistering-blues-chord-fills",
"is_free_trial": false,
"next_content_id": 28626176,
"next_content_slug":
"28626176-jazzy-blues-guitar-voicings-you-should-be-playing",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 9243777,
"contentable_id": 9243777,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 28626176,
"position": 2,
"chapter_id": 7020683,
"name": "Jazzy Blues Guitar Voicings You Should Be Playing",
"contentable_type": "HtmlItem",
"slug":
"28626176-jazzy-blues-guitar-voicings-you-should-be-playing",
"is_free_trial": false,
"next_content_id": 46655721,
"next_content_slug":
"46655721-slow-blues-lesson-3-sweet-chord-substitutions",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 7175062,
"contentable_id": 7175062,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 1,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 46655721,
"position": 3,
"chapter_id": 7020683,
"name": "Slow Blues Lesson - 3 Sweet Chord Substitutions",
"contentable_type": "HtmlItem",
"slug":
"46655721-slow-blues-lesson-3-sweet-chord-substitutions",
"is_free_trial": false,
"next_content_id": 46655792,
"next_content_slug": "46655792-funky-blues-shuffle-rhythm",
"next_content_type": "HtmlItem",
"display_name": "Text",
"contentable": 11993091,
"contentable_id": 11993091,
"payment_required": false,
"draft": false,
"is_released": true,
"release_date": null,
"prerequisite": false,
"total_post_count": 0,
"discussions_enabled": true,
"meta_data": null,
"expand_enabled": true,
"lesson_type_label": "Video Lesson",
"lesson_type_icon": "video",
"default_lesson_type_label": "Text",
"default_lesson_type_icon": "text",
"under_construction": false
},
{
"id": 46655792,
"position": 4,
"chapter_id": 7020683,
"name": "Funky Blues Shuffle Rhythm",
"contentable_type": "HtmlItem",
"slug": "46655792-funky-blues-shuffle-rhythm",
"is_free_trial": false,
"next_content_id": null,
"next_content_slug": null,
"next_content_type": null,
"display_name": "Text",
"contentable": 11993103,
"contentable_id": 11993103,
"payment_required": false,
|
Hi there. Good to know, it worked. The above seems to be the course json file. Can you send a sample HtmlItem response, which has the embed player? I will debug. |
Hi,
there is a one html_item file titled "
https://members.tastyguitar.com/api/course_player/v2/html_items/4291200"
and it has this response:
{
"html_item": {
"id": 4291200,
"html_text": "\u003cdiv class=\"fr-view\"\u003e\u003cp
dir=\"ltr\"\u003e\u003cstrong\u003eLESSON
DESCRIPTION:\u003c/strong\u003e\u003c/p\u003e\u003cp dir=\"ltr\"\u003eIn
this first lesson, we take on the most fundamental aspect of blues rhythm:
\u0026nbsp;straight feel vs shuffle feel. You will gain an understanding of
the triplet foundation of the shuffle feel, how to count it and feel it,
and also how to play it with basic \u0026ldquo;boogie\u0026rdquo; chords in
a basic 12 bar blues form in the key of G.\u003c/p\u003e\u003cp
data-empty=\"true\"\u003e\u003cbr\u003e\u003ciframe src=\"
https://www.soundslice.com/slices/bHvVc/embed/\" width=\"100%\"
height=\"500\"
allowfullscreen=\"\"\u003e\u003c/iframe\u003e\u003c/p\u003e\u003cp
dir=\"ltr\"\u003e\u003cstrong\u003eRECOMMENDED
PRACTICE:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003eStart
by playing the to G to G6 form in straight 8th note feel with the
metronome, \u0026nbsp;making sure that you are keeping in strict time, not
rushing or dragging, and also tapping your foot on the metronome
clicks.\u0026nbsp;\u003c/li\u003e\u003cli\u003ePractice triplets with the
metronome, \u0026nbsp;and then the shuffle feel, still making sure you are
playing in strict time.\u0026nbsp;\u003c/li\u003e\u003cli\u003ePlay both
straight and shuffle versions of the 12 bar blues in
G.\u0026nbsp;\u003c/li\u003e\u003cli\u003eMake sure as you change chords
you keep the fretting hand shape
intact.\u0026nbsp;\u003c/li\u003e\u003cli\u003eWhen ready, submit a video
for \u0026nbsp;Rick\u0026rsquo;s review by clicking the discussions link
above.\u0026nbsp;\u003c/li\u003e\u003c/ul\u003e\u003cp
dir=\"ltr\"\u003e\u003cbr\u003e\u003c/p\u003e\u003c/div\u003e"
}
}
There is no other html item which I could provide you.
Am Mi., 20. Dez. 2023 um 11:15 Uhr schrieb Sumeet Naik <
***@***.***>:
… Hi there,
This the embed player api data. I wanted the html item data, in which the
player is embedded.
Thanks.
On Wed, Dec 20, 2023 at 1:25 PM thereals ***@***.***> wrote:
> Hi,
> below I pasted the api response for theXHR object named "scoredata/"
which
> (hopefully) represents the embedded soundslice player.
> I clicked on it and selected the tab "Response".
> This ought to be the right one.
> One question though: How can you debug this? Is there a tutorial which
> shows how to do it?
>
> {
> "id": 414722,
> "slug": "414722",
> "sh": "bHvVc",
> "name": "12 Bar Blues in G - Straight Feel vs Shuffle Feel",
> "a": "",
> "cp": true,
> "st": false,
> "s": 1,
> "es": 4,
> "n": true,
> "d": "
>
>
https://d1vuq0zzaa789.cloudfront.net/json/414722/data4.json?Expires=1703058827&Signature=LvbmR~6rYh-BVaYjIz4HUHMmEPFt4DW2rqpXJmvpcRSDpi9qld68YY9fSl1Jn7sRNpebXWWMBrVArI2-mbSAUcL0eQR3d6-Y2kTeO3Y-k5NDugflzdWFYj1vh0ipbDr9ShWAVKpiQprHxuerEkFPN7SGE6gUMA4oS-QQD1KYBqtBi9M6SBnyCzbtdt85SaWrFXGysHjeEsZbdoUxICjVm31NnBmVODsQTUtEUlwmEy2bj~ie8ICAC-XWBvfZLF0bqQ6~Lk9MwSAkOSelKZ03TwkffPwGPnstjHg2ykh2aEav9oDYtZ9-ZIO6GLv6d47C2PvYtcSOWX30IiTYIdVK-A__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> ",
> "r": [
> {
> "id": 365280,
> "s": 2,
> "sync": "
>
>
https://d1vuq0zzaa789.cloudfront.net/json/414722/sync365280-6.json?Expires=1703058827&Signature=MF9JCIxFd84N63WmoY0JlAEeHJ5uAplEsSxWETRtfwmxNRSACsN-HhhlulPD50LD6~41IEIATeBoJjgabTMwrqNuBlMzglmnvUcmZ8JU8rIG2MhUA7cRLGiVBIxd45qWrYlgCVkqV75H8A0h72oD1OrMjwVYsXH2qD5xL6tl9PxXUvQT89mJel6Lau5gcVR1XCT-G56xBsXpLsq~OGGsK7~ozMmhRplHzVo8csqNv-8adlhVAUHdFyU6vGpChtSNTH-IB3eWm0hNondrEi7VMeX123~PQgPIu6E1HdBowdFlgyZ54cI82LggTlwhflChTrwgGG8s5FD44sCKXEMLXg__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> ",
> "sd": "",
> "sr": 48000,
> "name": "Backing Track - Shuffle Feel",
> "cs": null,
> "ce": 259.008,
> "duration": 259,
> "mediaurl":
> "/api/v1/slices/bHvVc/recordings/365280/url/?embed=1",
> "renwurl": "",
> "ind": true
> },
> {
> "id": 365279,
> "s": 2,
> "sync": "
>
>
https://d1vuq0zzaa789.cloudfront.net/json/414722/sync365279-1.json?Expires=1703058827&Signature=BqpdWwQdP5n9uYHm1Etm3crsE9Xa7AuZPDtlf6I7GV0SPO2xLkxhWyUFGdkS2RrulY2o1R~HUASO6mCGNknS2g3Q6Iz6caTeaoX1XnjuNvogwwRFeaja14gbJCL60ng1FU9PT~snhH0NDuAUAjmOsW31nSuWUCUMealT5Hu7AWp2J4Y9EvNHlAIJhfY~JOD6yW7cIpJRWbzP926L1wYaTHWzMDswA9vGBbinSOjKUk8bR9OlDrCMWtk~0M0LVMWWldqA5y6StexpHmid3kUovrcouc11vyKi-VWjxmBjr9bbRt2sWGFMHWLZlRIKD0vdQX0QnMxp7F6XEihf~Gso9Q__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> ",
> "sd": "",
> "sr": 48000,
> "name": "Backing Track - Straight Feel",
> "cs": null,
> "ce": null,
> "duration": 259,
> "mediaurl":
> "/api/v1/slices/bHvVc/recordings/365279/url/?embed=1",
> "renwurl": "",
> "ind": true
> },
> {
> "id": 284312,
> "s": 6,
> "sync": "
>
>
https://d1vuq0zzaa789.cloudfront.net/json/414722/sync284312-1.json?Expires=1703058827&Signature=Byg18egrqlQf1gt4L40htdDTupgUFsll3sFN1ZuqQ9-M~y3zkI4YeXFlrjAUXT256zbvF3FbAY8DesH546icwA--a4kkz2NI2Riq3sgf~P~6bPsVg30brdT7Kgq2LlAPHiD20RMUbNs06A7Jj-7HpcCYUoiEO8FVIIIBuELY38Bar~zIh442ozUTwIRYN7LHBUkeXVE07BYZkVtK846tCBehk-wYEvzU3ui1I22QfJEUS9swPAh6VgDoV3lMFvaeTAbytRsPgOCk5POvjQRet2D2ieGZMPLQwavPPReaZot~-xEierZAffQzHTkw3fRzYaXnaXvADXT~652nPcGJaA__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> ",
> "sd": "425242687",
> "sr": 44100,
> "name": "Left Hand Close Up View",
> "cs": null,
> "ce": 779.112,
> "duration": 779,
> "mediaurl": "
>
>
https://player.vimeo.com/progressive_redirect/playback/425242687/rendition/720p/file.mp4?loc=external&oauth2_token_id=1343299132&signature=e01a999f0e8c727f5b940e33f8a1a615203a3421b3d1aae6a708836605ce3462
> ",
> "renwurl": "",
> "ind": true,
> "hls": "
>
>
https://player.vimeo.com/external/425242687.m3u8?s=53da65d9e1e7e8f7ded61742a7c3ca9ca41fdaff&oauth2_token_id=1343299132
> "
> },
> {
> "id": 284313,
> "s": 6,
> "sync": "
>
>
https://d1vuq0zzaa789.cloudfront.net/json/414722/sync284313-1.json?Expires=1703058827&Signature=f~lAAMqjRw8aUN8J1F4NBLSh2fsaiNMwQ8isMoff5s-4rkSi8oY63Luezua7gIBy1DdGAPrik~tY7Fn8FQv6Qhj6~VjuNi-EgMSmKi-DpzFPx5Ttv0f~Pnabd11Qyaqm0XJAklHMNizKuJmgK-77U~KbCHUi8aqHEX7Orb0GTvFLJgi6G90EIjK6~yPwVwyFqa6iL8IA172B3RLtVkXInaKnZGhhkXdJljexb3VuLbjCLNG9dtmgPFuZkeaLEQZF2~XSaj1ccRXY6lFdhOmF6smAYWJniUskubtrjOJjps3PWEcaI8nOWdK9Rvmdemjzyq-MyKQ1T4qlXIp6I7W0yA__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> ",
> "sd": "425236691",
> "sr": 44100,
> "name": "Wide View",
> "cs": null,
> "ce": 779.112,
> "duration": 779,
> "mediaurl": "
>
>
https://player.vimeo.com/progressive_redirect/playback/425236691/rendition/1080p/file.mp4?loc=external&oauth2_token_id=1343299132&signature=61dd34337d9d1d5db96dfa34372298f8e0095d597914dfb0a62d5b38fd8e0921
> ",
> "renwurl": "",
> "ind": true,
> "hls": "
>
>
https://player.vimeo.com/external/425236691.m3u8?s=33dd7745a2951b1df23e4f072a09939a2ac5d96b&oauth2_token_id=1343299132
> "
> }
> ],
> "synthurl": "
>
>
https://d2c3nvafyekx5z.cloudfront.net/json/synth.de-6d0fa36eb119024855c064e31bfbfc19.json
> ",
> "u": null,
> "lang": "de",
> "owns": false,
> "v": 4,
> "sn": true,
> "pd": "",
> "pp": false,
> "ap": 1,
> "pfc": 1,
> "sy": true,
> "cc": 0,
> "ns": 0,
> "aup": false
> }
>
>
> Am Mi., 20. Dez. 2023 um 06:23 Uhr schrieb Sumeet Naik <
> ***@***.***>:
>
> > Hi there. Good to know, it worked. The above seems to be the course
json
> > file. Can you send a sample HtmlItem response, which has the embed
> player?
> > I will debug.
> >
> > —
> > Reply to this email directly, view it on GitHub
> > <
>
#52 (comment)>,
>
> > or unsubscribe
> > <
>
https://github.com/notifications/unsubscribe-auth/AFJBPYOUEKJJWF3UA732HCLYKJR2RAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRTHAZDINBWG4>
>
> > .
> > You are receiving this because you were mentioned.Message ID:
> > ***@***.***>
> >
>
> —
> Reply to this email directly, view it on GitHub
> <
#52 (comment)>,
> or unsubscribe
> <
https://github.com/notifications/unsubscribe-auth/AF734XQARAIPLJZZ4RC5EU3YKKKV7AVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRUGAZDAMBXGE>
> .
> You are receiving this because you were assigned.Message ID:
> ***@***.***>
>
—
Reply to this email directly, view it on GitHub
<#52 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AFJBPYM3FJMCZQFJWX7C55LYKKUCPAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRUGEYTQMJUGI>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
Hi Sumeet,
do you think it's technically feasible to read out via Javascript or
another language the three parameters request_url, set-cookie and
X-Thinkific-Client-Date?
It's very cumbersome to do it for 50+ courses with just 5 videos each.
Regards
MJ
Am Mi., 20. Dez. 2023 um 12:53 Uhr schrieb M.J. ***@***.***>:
… Hi,
there is a one html_item file titled "
https://members.tastyguitar.com/api/course_player/v2/html_items/4291200"
and it has this response:
{
"html_item": {
"id": 4291200,
"html_text": "\u003cdiv class=\"fr-view\"\u003e\u003cp
dir=\"ltr\"\u003e\u003cstrong\u003eLESSON
DESCRIPTION:\u003c/strong\u003e\u003c/p\u003e\u003cp dir=\"ltr\"\u003eIn
this first lesson, we take on the most fundamental aspect of blues rhythm:
\u0026nbsp;straight feel vs shuffle feel. You will gain an understanding of
the triplet foundation of the shuffle feel, how to count it and feel it,
and also how to play it with basic \u0026ldquo;boogie\u0026rdquo; chords in
a basic 12 bar blues form in the key of G.\u003c/p\u003e\u003cp
data-empty=\"true\"\u003e\u003cbr\u003e\u003ciframe src=\"
https://www.soundslice.com/slices/bHvVc/embed/\" width=\"100%\"
height=\"500\"
allowfullscreen=\"\"\u003e\u003c/iframe\u003e\u003c/p\u003e\u003cp
dir=\"ltr\"\u003e\u003cstrong\u003eRECOMMENDED
PRACTICE:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003eStart
by playing the to G to G6 form in straight 8th note feel with the
metronome, \u0026nbsp;making sure that you are keeping in strict time, not
rushing or dragging, and also tapping your foot on the metronome
clicks.\u0026nbsp;\u003c/li\u003e\u003cli\u003ePractice triplets with the
metronome, \u0026nbsp;and then the shuffle feel, still making sure you are
playing in strict time.\u0026nbsp;\u003c/li\u003e\u003cli\u003ePlay both
straight and shuffle versions of the 12 bar blues in
G.\u0026nbsp;\u003c/li\u003e\u003cli\u003eMake sure as you change chords
you keep the fretting hand shape
intact.\u0026nbsp;\u003c/li\u003e\u003cli\u003eWhen ready, submit a video
for \u0026nbsp;Rick\u0026rsquo;s review by clicking the discussions link
above.\u0026nbsp;\u003c/li\u003e\u003c/ul\u003e\u003cp
dir=\"ltr\"\u003e\u003cbr\u003e\u003c/p\u003e\u003c/div\u003e"
}
}
There is no other html item which I could provide you.
Am Mi., 20. Dez. 2023 um 11:15 Uhr schrieb Sumeet Naik <
***@***.***>:
> Hi there,
>
> This the embed player api data. I wanted the html item data, in which the
> player is embedded.
>
> Thanks.
>
> On Wed, Dec 20, 2023 at 1:25 PM thereals ***@***.***> wrote:
>
> > Hi,
> > below I pasted the api response for theXHR object named "scoredata/"
> which
> > (hopefully) represents the embedded soundslice player.
> > I clicked on it and selected the tab "Response".
> > This ought to be the right one.
> > One question though: How can you debug this? Is there a tutorial which
> > shows how to do it?
> >
> > {
> > "id": 414722,
> > "slug": "414722",
> > "sh": "bHvVc",
> > "name": "12 Bar Blues in G - Straight Feel vs Shuffle Feel",
> > "a": "",
> > "cp": true,
> > "st": false,
> > "s": 1,
> > "es": 4,
> > "n": true,
> > "d": "
> >
> >
> https://d1vuq0zzaa789.cloudfront.net/json/414722/data4.json?Expires=1703058827&Signature=LvbmR~6rYh-BVaYjIz4HUHMmEPFt4DW2rqpXJmvpcRSDpi9qld68YY9fSl1Jn7sRNpebXWWMBrVArI2-mbSAUcL0eQR3d6-Y2kTeO3Y-k5NDugflzdWFYj1vh0ipbDr9ShWAVKpiQprHxuerEkFPN7SGE6gUMA4oS-QQD1KYBqtBi9M6SBnyCzbtdt85SaWrFXGysHjeEsZbdoUxICjVm31NnBmVODsQTUtEUlwmEy2bj~ie8ICAC-XWBvfZLF0bqQ6~Lk9MwSAkOSelKZ03TwkffPwGPnstjHg2ykh2aEav9oDYtZ9-ZIO6GLv6d47C2PvYtcSOWX30IiTYIdVK-A__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> > ",
> > "r": [
> > {
> > "id": 365280,
> > "s": 2,
> > "sync": "
> >
> >
> https://d1vuq0zzaa789.cloudfront.net/json/414722/sync365280-6.json?Expires=1703058827&Signature=MF9JCIxFd84N63WmoY0JlAEeHJ5uAplEsSxWETRtfwmxNRSACsN-HhhlulPD50LD6~41IEIATeBoJjgabTMwrqNuBlMzglmnvUcmZ8JU8rIG2MhUA7cRLGiVBIxd45qWrYlgCVkqV75H8A0h72oD1OrMjwVYsXH2qD5xL6tl9PxXUvQT89mJel6Lau5gcVR1XCT-G56xBsXpLsq~OGGsK7~ozMmhRplHzVo8csqNv-8adlhVAUHdFyU6vGpChtSNTH-IB3eWm0hNondrEi7VMeX123~PQgPIu6E1HdBowdFlgyZ54cI82LggTlwhflChTrwgGG8s5FD44sCKXEMLXg__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> > ",
> > "sd": "",
> > "sr": 48000,
> > "name": "Backing Track - Shuffle Feel",
> > "cs": null,
> > "ce": 259.008,
> > "duration": 259,
> > "mediaurl":
> > "/api/v1/slices/bHvVc/recordings/365280/url/?embed=1",
> > "renwurl": "",
> > "ind": true
> > },
> > {
> > "id": 365279,
> > "s": 2,
> > "sync": "
> >
> >
> https://d1vuq0zzaa789.cloudfront.net/json/414722/sync365279-1.json?Expires=1703058827&Signature=BqpdWwQdP5n9uYHm1Etm3crsE9Xa7AuZPDtlf6I7GV0SPO2xLkxhWyUFGdkS2RrulY2o1R~HUASO6mCGNknS2g3Q6Iz6caTeaoX1XnjuNvogwwRFeaja14gbJCL60ng1FU9PT~snhH0NDuAUAjmOsW31nSuWUCUMealT5Hu7AWp2J4Y9EvNHlAIJhfY~JOD6yW7cIpJRWbzP926L1wYaTHWzMDswA9vGBbinSOjKUk8bR9OlDrCMWtk~0M0LVMWWldqA5y6StexpHmid3kUovrcouc11vyKi-VWjxmBjr9bbRt2sWGFMHWLZlRIKD0vdQX0QnMxp7F6XEihf~Gso9Q__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> > ",
> > "sd": "",
> > "sr": 48000,
> > "name": "Backing Track - Straight Feel",
> > "cs": null,
> > "ce": null,
> > "duration": 259,
> > "mediaurl":
> > "/api/v1/slices/bHvVc/recordings/365279/url/?embed=1",
> > "renwurl": "",
> > "ind": true
> > },
> > {
> > "id": 284312,
> > "s": 6,
> > "sync": "
> >
> >
> https://d1vuq0zzaa789.cloudfront.net/json/414722/sync284312-1.json?Expires=1703058827&Signature=Byg18egrqlQf1gt4L40htdDTupgUFsll3sFN1ZuqQ9-M~y3zkI4YeXFlrjAUXT256zbvF3FbAY8DesH546icwA--a4kkz2NI2Riq3sgf~P~6bPsVg30brdT7Kgq2LlAPHiD20RMUbNs06A7Jj-7HpcCYUoiEO8FVIIIBuELY38Bar~zIh442ozUTwIRYN7LHBUkeXVE07BYZkVtK846tCBehk-wYEvzU3ui1I22QfJEUS9swPAh6VgDoV3lMFvaeTAbytRsPgOCk5POvjQRet2D2ieGZMPLQwavPPReaZot~-xEierZAffQzHTkw3fRzYaXnaXvADXT~652nPcGJaA__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> > ",
> > "sd": "425242687",
> > "sr": 44100,
> > "name": "Left Hand Close Up View",
> > "cs": null,
> > "ce": 779.112,
> > "duration": 779,
> > "mediaurl": "
> >
> >
> https://player.vimeo.com/progressive_redirect/playback/425242687/rendition/720p/file.mp4?loc=external&oauth2_token_id=1343299132&signature=e01a999f0e8c727f5b940e33f8a1a615203a3421b3d1aae6a708836605ce3462
> > ",
> > "renwurl": "",
> > "ind": true,
> > "hls": "
> >
> >
> https://player.vimeo.com/external/425242687.m3u8?s=53da65d9e1e7e8f7ded61742a7c3ca9ca41fdaff&oauth2_token_id=1343299132
> > "
> > },
> > {
> > "id": 284313,
> > "s": 6,
> > "sync": "
> >
> >
> https://d1vuq0zzaa789.cloudfront.net/json/414722/sync284313-1.json?Expires=1703058827&Signature=f~lAAMqjRw8aUN8J1F4NBLSh2fsaiNMwQ8isMoff5s-4rkSi8oY63Luezua7gIBy1DdGAPrik~tY7Fn8FQv6Qhj6~VjuNi-EgMSmKi-DpzFPx5Ttv0f~Pnabd11Qyaqm0XJAklHMNizKuJmgK-77U~KbCHUi8aqHEX7Orb0GTvFLJgi6G90EIjK6~yPwVwyFqa6iL8IA172B3RLtVkXInaKnZGhhkXdJljexb3VuLbjCLNG9dtmgPFuZkeaLEQZF2~XSaj1ccRXY6lFdhOmF6smAYWJniUskubtrjOJjps3PWEcaI8nOWdK9Rvmdemjzyq-MyKQ1T4qlXIp6I7W0yA__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
> > ",
> > "sd": "425236691",
> > "sr": 44100,
> > "name": "Wide View",
> > "cs": null,
> > "ce": 779.112,
> > "duration": 779,
> > "mediaurl": "
> >
> >
> https://player.vimeo.com/progressive_redirect/playback/425236691/rendition/1080p/file.mp4?loc=external&oauth2_token_id=1343299132&signature=61dd34337d9d1d5db96dfa34372298f8e0095d597914dfb0a62d5b38fd8e0921
> > ",
> > "renwurl": "",
> > "ind": true,
> > "hls": "
> >
> >
> https://player.vimeo.com/external/425236691.m3u8?s=33dd7745a2951b1df23e4f072a09939a2ac5d96b&oauth2_token_id=1343299132
> > "
> > }
> > ],
> > "synthurl": "
> >
> >
> https://d2c3nvafyekx5z.cloudfront.net/json/synth.de-6d0fa36eb119024855c064e31bfbfc19.json
> > ",
> > "u": null,
> > "lang": "de",
> > "owns": false,
> > "v": 4,
> > "sn": true,
> > "pd": "",
> > "pp": false,
> > "ap": 1,
> > "pfc": 1,
> > "sy": true,
> > "cc": 0,
> > "ns": 0,
> > "aup": false
> > }
> >
> >
> > Am Mi., 20. Dez. 2023 um 06:23 Uhr schrieb Sumeet Naik <
> > ***@***.***>:
> >
> > > Hi there. Good to know, it worked. The above seems to be the course
> json
> > > file. Can you send a sample HtmlItem response, which has the embed
> > player?
> > > I will debug.
> > >
> > > —
> > > Reply to this email directly, view it on GitHub
> > > <
> >
> #52 (comment)>,
>
> >
> > > or unsubscribe
> > > <
> >
> https://github.com/notifications/unsubscribe-auth/AFJBPYOUEKJJWF3UA732HCLYKJR2RAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRTHAZDINBWG4>
>
> >
> > > .
> > > You are receiving this because you were mentioned.Message ID:
> > > ***@***.***>
> > >
> >
> > —
> > Reply to this email directly, view it on GitHub
> > <
> #52 (comment)>,
>
> > or unsubscribe
> > <
> https://github.com/notifications/unsubscribe-auth/AF734XQARAIPLJZZ4RC5EU3YKKKV7AVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRUGAZDAMBXGE>
>
> > .
> > You are receiving this because you were assigned.Message ID:
> > ***@***.***>
> >
>
> —
> Reply to this email directly, view it on GitHub
> <#52 (comment)>,
> or unsubscribe
> <https://github.com/notifications/unsubscribe-auth/AFJBPYM3FJMCZQFJWX7C55LYKKUCPAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRUGEYTQMJUGI>
> .
> You are receiving this because you were mentioned.Message ID:
> ***@***.***>
>
|
Hi Sumeet,
I now encountered another download issue.
There are also quiz pages on one thinkific teaching site.
Here, the html including questions and answers are getting downloaded.
However, there are also videos embedded.
Unfortunately, they're not being downloaded.
Response of file
https://www.r********.com/api/course_player/v2/quizzes/2257911
{
"quiz": {
"id": 2257911,
"pass_fail": false,
"show_explanation": false,
"passing_score": null,
"question_ids": [
15847533,
15847534,
15847535,
15847536,
15847537,
15847538,
15847539,
15847540,
15847541,
15847542
]
},
"choices": [
{
"id": 56207708,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "NDlmYWxzZTc3",
"question_id": 15847533,
"position": 0
},
{
"id": 56207709,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "NjJmYWxzZTEy",
"question_id": 15847533,
"position": 1
},
{
"id": 56207710,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "MjNmYWxzZTU4",
"question_id": 15847533,
"position": 2
},
{
"id": 56207711,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "OTRmYWxzZTk1",
"question_id": 15847533,
"position": 3
},
{
"id": 56207712,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "NzJ0cnVlODA=",
"question_id": 15847533,
"position": 4
},
{
"id": 56207713,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "MzBmYWxzZTY3",
"question_id": 15847533,
"position": 5
},
{
"id": 56207714,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "OGZhbHNlMzA=",
"question_id": 15847534,
"position": 0
},
{
"id": 56207715,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "MTdmYWxzZTQ=",
"question_id": 15847534,
"position": 1
},
{
"id": 56207716,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "MTBmYWxzZTM1",
"question_id": 15847534,
"position": 2
},
{
"id": 56207717,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "NzZmYWxzZTU0",
"question_id": 15847534,
"position": 3
},
{
"id": 56207718,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "MzV0cnVlNTg=",
"question_id": 15847534,
"position": 4
},
{
"id": 56207719,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "MjRmYWxzZTcw",
"question_id": 15847534,
"position": 5
},
{
"id": 56207720,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "MTJmYWxzZTQ3",
"question_id": 15847535,
"position": 0
},
{
"id": 56207721,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "MTJ0cnVlNzE=",
"question_id": 15847535,
"position": 1
},
{
"id": 56207722,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "NzdmYWxzZTIx",
"question_id": 15847535,
"position": 2
},
{
"id": 56207723,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "NTRmYWxzZTY3",
"question_id": 15847535,
"position": 3
},
{
"id": 56207724,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "NDFmYWxzZTY=",
"question_id": 15847535,
"position": 4
},
{
"id": 56207725,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "N2ZhbHNlMTk=",
"question_id": 15847535,
"position": 5
},
{
"id": 56207726,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "MTJmYWxzZTM5",
"question_id": 15847536,
"position": 0
},
{
"id": 56207727,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "NzZmYWxzZTkw",
"question_id": 15847536,
"position": 1
},
{
"id": 56207728,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "NTBmYWxzZTM4",
"question_id": 15847536,
"position": 2
},
{
"id": 56207729,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "MjZ0cnVlNjY=",
"question_id": 15847536,
"position": 3
},
{
"id": 56207730,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "NDBmYWxzZTk=",
"question_id": 15847536,
"position": 4
},
{
"id": 56207731,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "NDdmYWxzZTY0",
"question_id": 15847536,
"position": 5
},
{
"id": 56207732,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "NWZhbHNlMTc=",
"question_id": 15847537,
"position": 0
},
{
"id": 56207733,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "MTJmYWxzZTk3",
"question_id": 15847537,
"position": 1
},
{
"id": 56207734,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "OTJmYWxzZTcy",
"question_id": 15847537,
"position": 2
},
{
"id": 56207735,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "MjJmYWxzZTQ4",
"question_id": 15847537,
"position": 3
},
{
"id": 56207736,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "OTV0cnVlNTY=",
"question_id": 15847537,
"position": 4
},
{
"id": 56207737,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "NjFmYWxzZTM3",
"question_id": 15847537,
"position": 5
},
{
"id": 56207738,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "NDlmYWxzZTQy",
"question_id": 15847538,
"position": 0
},
{
"id": 56207739,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "MTVmYWxzZTQw",
"question_id": 15847538,
"position": 1
},
{
"id": 56207740,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "NjVmYWxzZTcy",
"question_id": 15847538,
"position": 2
},
{
"id": 56207741,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "NjlmYWxzZTMx",
"question_id": 15847538,
"position": 3
},
{
"id": 56207742,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "ODd0cnVlMQ==",
"question_id": 15847538,
"position": 4
},
{
"id": 56207743,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "MjhmYWxzZTk=",
"question_id": 15847538,
"position": 5
},
{
"id": 56207744,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "MTFmYWxzZTgz",
"question_id": 15847539,
"position": 0
},
{
"id": 56207745,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "MThmYWxzZTY0",
"question_id": 15847539,
"position": 1
},
{
"id": 56207746,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "MzlmYWxzZTQx",
"question_id": 15847539,
"position": 2
},
{
"id": 56207747,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "NTZ0cnVlNA==",
"question_id": 15847539,
"position": 3
},
{
"id": 56207748,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "MjNmYWxzZTg1",
"question_id": 15847539,
"position": 4
},
{
"id": 56207749,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "MzRmYWxzZTA=",
"question_id": 15847539,
"position": 5
},
{
"id": 56207750,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "NDFmYWxzZTI1",
"question_id": 15847540,
"position": 0
},
{
"id": 56207751,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "ODFmYWxzZTEz",
"question_id": 15847540,
"position": 1
},
{
"id": 56207752,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "NDZmYWxzZTQ5",
"question_id": 15847540,
"position": 2
},
{
"id": 56207753,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "ODJmYWxzZTMy",
"question_id": 15847540,
"position": 3
},
{
"id": 56207754,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "OTB0cnVlMjE=",
"question_id": 15847540,
"position": 4
},
{
"id": 56207755,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "OTNmYWxzZTg4",
"question_id": 15847540,
"position": 5
},
{
"id": 56207756,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "ODFmYWxzZTc3",
"question_id": 15847541,
"position": 0
},
{
"id": 56207757,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "MmZhbHNlOTI=",
"question_id": 15847541,
"position": 1
},
{
"id": 56207758,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "MjRmYWxzZTM3",
"question_id": 15847541,
"position": 2
},
{
"id": 56207759,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "MjV0cnVlMzY=",
"question_id": 15847541,
"position": 3
},
{
"id": 56207760,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "OTZmYWxzZTY1",
"question_id": 15847541,
"position": 4
},
{
"id": 56207761,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "NDhmYWxzZTU4",
"question_id": 15847541,
"position": 5
},
{
"id": 56207762,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e1\u003c/p\u003e\u003c/div\u003e",
"credited": "MWZhbHNlNjE=",
"question_id": 15847542,
"position": 0
},
{
"id": 56207763,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e2\u003c/p\u003e\u003c/div\u003e",
"credited": "OTdmYWxzZTkx",
"question_id": 15847542,
"position": 1
},
{
"id": 56207764,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e3\u003c/p\u003e\u003c/div\u003e",
"credited": "NDh0cnVlMzE=",
"question_id": 15847542,
"position": 2
},
{
"id": 56207765,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e4\u003c/p\u003e\u003c/div\u003e",
"credited": "NDFmYWxzZTE4",
"question_id": 15847542,
"position": 3
},
{
"id": 56207766,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e5\u003c/p\u003e\u003c/div\u003e",
"credited": "OGZhbHNlNTk=",
"question_id": 15847542,
"position": 4
},
{
"id": 56207767,
"text": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e6\u003c/p\u003e\u003c/div\u003e",
"credited": "NTdmYWxzZTk2",
"question_id": 15847542,
"position": 5
}
],
"questions": [
{
"id": 15847533,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you hear? Thought groups are separated by small pauses in
speech.\u0026nbsp;\u003c/em\u003e\u003c/p\u003e\u003cbr\u003eA few days
after my husband Paul was diagnosed with stage IV lung cancer, we were
lying in our bed at home, and Paul said, \u0026quot;Its going to be
OK\u0026quot;.\u003c/div\u003e\u003cp
data-empty=\"true\"\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"fr-view\"\u003e\u003cdiv class=\"wistia_responsive_padding\"
style=\"padding:56.25% 0 28px 0;position:relative;\"\u003e\u003cdiv
class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/9m3ijtmuu0?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003eThese answers can be up for debate.
Sometimes I\u0026#39;ll hear a pause that is very brief, not a full pause,
and I won\u0026#39;t count it. Sometimes I will because it\u0026#39;s the
only partial break in a sentence. So if you don\u0026#39;t get the answer
\u0026#39;right\u0026#39;, and you have a specific argument for why you
think there are more or less thought groups, that\u0026#39;s okay. :) Here
we\u0026#39;re just getting used to the idea of thought groups in speaking,
and in studying the way Americans use them. Sometimes a pause in speaking
is very obvious, and other times it\u0026#39;s just a quick lift in
sound.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__fragment\" style=\"background-color:
initial;\"\u003eI hear 5 thought groups, separated by 4
pauses:\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\" style=\"background-color:
initial;\"\u003eA few days after my husband Paul // was diagnosed with
stage IV lung cancer,\u003c/span\u003e // \u003cspan
class=\"talk-transcript__fragment\" style=\"background-color:
initial;\"\u003ewe were lying in our bed at home,\u003c/span\u003e //
\u003cspan class=\"talk-transcript__fragment\" style=\"background-color:
initial;\"\u003eand Paul said, //\u003c/span\u003e \u003cspan
class=\"talk-transcript__fragment\" style=\"background-color:
initial;\"\u003e\u0026quot;It\u0026#39;s going to be
OK.\u0026quot;\u003c/span\u003e\u0026nbsp;\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eListen
again, and note these thought groups.\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 0,
"display_type": "radio",
"choice_ids": [
56207708,
56207709,
56207710,
56207711,
56207712,
56207713
]
},
{
"id": 15847534,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u0026nbsp;\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eAnd I remember answering
back,\u003c/span\u003e \u003cspan
class=\"talk-transcript__fragment\"\u003e\u0026quot;Yes.\u003c/span\u003e
\u003cspan class=\"talk-transcript__fragment\"\u003eWe just don\u0026#39;t
know what OK means
yet.\u0026quot;\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/rffde9dmrf?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003eAgain, there are 5 thought groups.
Notice some of them line up with punctuation, like a comma or a period, in
written speech. And some of them do
not:\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eAnd I remember answering back,
//\u003c/span\u003e \u003cspan
class=\"talk-transcript__fragment\"\u003e\u0026quot;Yes.\u003c/span\u003e
//\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003eWe just
don\u0026#39;t know // what OK // means
yet.\u0026quot;\u003c/strong\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eListen again, and note these
thought groups.
\u003cbr\u003e\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 1,
"display_type": "radio",
"choice_ids": [
56207714,
56207715,
56207716,
56207717,
56207718,
56207719
]
},
{
"id": 15847535,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003ePaul
and I had met as first-year medical students at Yale. He was smart and kind
and super
funny.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/36nw1rv6y7?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003ePaul and I had met as
first-year\nmedical students at Yale.\u003c/span\u003e
//\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003eHe was smart and
kind and super
funny.\u003c/strong\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eIf
you answered 3, I get it: I also thought there was a little break after
\u0026#39;met\u0026#39;.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eListen
again, and note these thought groups.\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 2,
"display_type": "radio",
"choice_ids": [
56207720,
56207721,
56207722,
56207723,
56207724,
56207725
]
},
{
"id": 15847536,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eHe
used to keep a gorilla suit in the trunk of his car, and he\u0026#39;d say,
\u0026quot;It\u0026#39;s for emergencies
only.\u0026quot;\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/wq9xmo2ikf?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003eI hear four thought
groups:\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eHe used to keep a gorilla suit //
in the trunk of his car,
//\u003c/span\u003e\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003eand
he\u0026#39;d say, // \u0026quot;It\u0026#39;s for emergencies
only.\u0026quot;\u003c/strong\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eListen again, and note these
thought groups.
\u003cbr\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 3,
"display_type": "radio",
"choice_ids": [
56207726,
56207727,
56207728,
56207729,
56207730,
56207731
]
},
{
"id": 15847537,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eI
fell in love with Paul as I watched the care he took with his patients. He
stayed late talking with them, seeking to understand the experience of
illness and not just its
technicalities.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/3nvshqwxfd?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003eI hear 5 thought
groups:\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eI fell in love with Paul as I
watched\nthe care he took with his patients.\u003c/span\u003e // \u003cspan
class=\"talk-transcript__fragment\"\u003eHe stayed late talking with them,
//\u003c/span\u003e \u003cspan
class=\"talk-transcript__fragment\"\u003eseeking to understand //\nthe
experience of illness\u003c/span\u003e
//\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003eand not just its
technicalities.\u003c/strong\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eListen again, and note these
thought groups.
\u003cbr\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 4,
"display_type": "radio",
"choice_ids": [
56207732,
56207733,
56207734,
56207735,
56207736,
56207737
]
},
{
"id": 15847538,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eHe
later told me he fell in love with me when he saw me cry over an EKG of a
heart that had ceased
beating.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/j8rvug4xmp?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003eI hear 5 thought
groups:\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eHe later told me he fell in love
with me //\u003c/span\u003e\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003ewhen he saw me
cry // over an EKG //\nof a heart // that had ceased
beating.\u003c/strong\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eListen again, and note these
thought groups.
\u003cbr\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 5,
"display_type": "radio",
"choice_ids": [
56207738,
56207739,
56207740,
56207741,
56207742,
56207743
]
},
{
"id": 15847539,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eWe
didn\u0026#39;t know it yet, but even in the heady days of young love, we
were learning how to approach suffering
together.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/lxgf2x20wc?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eWe didn\u0026#39;t know it
yet,\u003c/span\u003e // \u003cspan
class=\"talk-transcript__fragment\"\u003ebut // even in the heady days of
young love,\u003c/span\u003e //\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003ewe were learning
how\nto approach suffering
together.\u003c/strong\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eIf
you thought there was a pause \u0026#39;learning\u0026#39; and
\u0026#39;approach\u0026#39;, I do think there were little lifts
there.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eListen
again, and note these thought groups.\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 6,
"display_type": "radio",
"choice_ids": [
56207744,
56207745,
56207746,
56207747,
56207748,
56207749
]
},
{
"id": 15847540,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eWe
got married and became doctors. I was working as an internist and Paul was
finishing his training as a neurosurgeon when he started to lose
weight.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/oleuxn6mfz?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003eI hear 5 thought
groups:\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eWe got married and became
doctors.\u003c/span\u003e // \u003cspan
class=\"talk-transcript__fragment\"\u003eI was working as an
internist\u003c/span\u003e // \u003cspan
class=\"talk-transcript__fragment\"\u003eand // Paul was finishing his
training\nas a neurosurgeon\u003c/span\u003e
//\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003ewhen he started
to lose
weight.\u003c/strong\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eListen again, and note these
thought groups.
\u003cbr\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 7,
"display_type": "radio",
"choice_ids": [
56207750,
56207751,
56207752,
56207753,
56207754,
56207755
]
},
{
"id": 15847541,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eHe
developed excruciating back pain and a cough that wouldn\u0026#39;t go
away. And when he was admitted to the hospital, a CT scan revealed tumors
in Paul\u0026#39;s lungs and in his
bones.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/p09byxqxdz?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003eI hear 4 thought
groups:\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\" style=\"background-color:
initial;\"\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eHe developed excruciating back
pain // and a cough that wouldn\u0026#39;t go away.\u003c/span\u003e //
\u003cspan class=\"talk-transcript__fragment\"\u003eAnd when he was
admitted to the hospital,\u003c/span\u003e
//\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003ea CT scan
revealed tumors\nin Paul\u0026#39;s lungs and in his
bones.\u003c/strong\u003e\u003c/span\u003e\u0026nbsp;\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eI
also hear a half-pause after
\u0026#39;developed\u0026#39;.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eListen
again, and note these thought groups.\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 8,
"display_type": "radio",
"choice_ids": [
56207756,
56207757,
56207758,
56207759,
56207760,
56207761
]
},
{
"id": 15847542,
"prompt": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003e\u003cem\u003eHow many thought groups
do you
hear?\u003c/em\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003eWe
had both cared for patients with devastating diagnoses; now it was our
turn.\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cdiv
class=\"wistia_responsive_padding\" style=\"padding:56.25% 0 28px
0;position:relative;\"\u003e\u003cdiv class=\"wistia_responsive_wrapper\"
style=\"height:100%;left:0;position:absolute;top:0;width:100%;\"\u003e\u003ciframe
src=\"//
fast.wistia.net/embed/iframe/8s2zfkd9om?videoFoam=true\u0026autoplay=true\"
scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\"
allowfullscreen=\"\" mozallowfullscreen=\"\" webkitallowfullscreen=\"\"
width=\"100%\"
height=\"100%\"\u003e\u003c/iframe\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e",
"text_explanation": "\u003cdiv
class=\"fr-view\"\u003e\u003cp\u003eI hear 3 thought
groups:\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cstrong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eWe had both cared for
patients\nwith devastating diagnoses;\u003c/span\u003e
//\u0026nbsp;\u003c/strong\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u003cstrong\u003enow // it was
our
turn.\u003c/strong\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cbr\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003eListen again, and note these
thought
groups.\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan
class=\"talk-transcript__para__text\"\u003e\u003cspan
class=\"talk-transcript__fragment\"\u003e\u0026nbsp;\u003cbr\u003e\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cp\u003eIf
you want to listen to the whole talk, which is about 16 minutes, too hear
the rest of the story or to keep listening for thought groups, watch
\u003ca href=\"
https://www.ted.com/talks/lucy_kalanithi_what_makes_life_worth_living_in_the_face_of_death?language=en\"
target=\"_blank\"\u003ethe whole TEDtalk here\u003c/a\u003e, given by Lucy
Kalanithi\u003cspan
class=\"redactor-invisible-space\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/div\u003e",
"quiz_id": 2257911,
"position": 9,
"display_type": "radio",
"choice_ids": [
56207762,
56207763,
56207764,
56207765,
56207766,
56207767
]
}
]
}
Am Fr., 22. Dez. 2023 um 10:08 Uhr schrieb M.J. ***@***.***>:
… Hi Sumeet,
do you think it's technically feasible to read out via Javascript or
another language the three parameters request_url, set-cookie and
X-Thinkific-Client-Date?
It's very cumbersome to do it for 50+ courses with just 5 videos each.
Regards
MJ
Am Mi., 20. Dez. 2023 um 12:53 Uhr schrieb M.J. ***@***.***>:
> Hi,
> there is a one html_item file titled "
> https://members.tastyguitar.com/api/course_player/v2/html_items/4291200"
> and it has this response:
>
> {
> "html_item": {
> "id": 4291200,
> "html_text": "\u003cdiv class=\"fr-view\"\u003e\u003cp
> dir=\"ltr\"\u003e\u003cstrong\u003eLESSON
> DESCRIPTION:\u003c/strong\u003e\u003c/p\u003e\u003cp dir=\"ltr\"\u003eIn
> this first lesson, we take on the most fundamental aspect of blues rhythm:
> \u0026nbsp;straight feel vs shuffle feel. You will gain an understanding of
> the triplet foundation of the shuffle feel, how to count it and feel it,
> and also how to play it with basic \u0026ldquo;boogie\u0026rdquo; chords in
> a basic 12 bar blues form in the key of G.\u003c/p\u003e\u003cp
> data-empty=\"true\"\u003e\u003cbr\u003e\u003ciframe src=\"
> https://www.soundslice.com/slices/bHvVc/embed/\" width=\"100%\"
> height=\"500\"
> allowfullscreen=\"\"\u003e\u003c/iframe\u003e\u003c/p\u003e\u003cp
> dir=\"ltr\"\u003e\u003cstrong\u003eRECOMMENDED
> PRACTICE:\u003c/strong\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003eStart
> by playing the to G to G6 form in straight 8th note feel with the
> metronome, \u0026nbsp;making sure that you are keeping in strict time, not
> rushing or dragging, and also tapping your foot on the metronome
> clicks.\u0026nbsp;\u003c/li\u003e\u003cli\u003ePractice triplets with the
> metronome, \u0026nbsp;and then the shuffle feel, still making sure you are
> playing in strict time.\u0026nbsp;\u003c/li\u003e\u003cli\u003ePlay both
> straight and shuffle versions of the 12 bar blues in
> G.\u0026nbsp;\u003c/li\u003e\u003cli\u003eMake sure as you change chords
> you keep the fretting hand shape
> intact.\u0026nbsp;\u003c/li\u003e\u003cli\u003eWhen ready, submit a video
> for \u0026nbsp;Rick\u0026rsquo;s review by clicking the discussions link
> above.\u0026nbsp;\u003c/li\u003e\u003c/ul\u003e\u003cp
> dir=\"ltr\"\u003e\u003cbr\u003e\u003c/p\u003e\u003c/div\u003e"
> }
> }
>
> There is no other html item which I could provide you.
>
> Am Mi., 20. Dez. 2023 um 11:15 Uhr schrieb Sumeet Naik <
> ***@***.***>:
>
>> Hi there,
>>
>> This the embed player api data. I wanted the html item data, in which
>> the
>> player is embedded.
>>
>> Thanks.
>>
>> On Wed, Dec 20, 2023 at 1:25 PM thereals ***@***.***> wrote:
>>
>> > Hi,
>> > below I pasted the api response for theXHR object named "scoredata/"
>> which
>> > (hopefully) represents the embedded soundslice player.
>> > I clicked on it and selected the tab "Response".
>> > This ought to be the right one.
>> > One question though: How can you debug this? Is there a tutorial which
>> > shows how to do it?
>> >
>> > {
>> > "id": 414722,
>> > "slug": "414722",
>> > "sh": "bHvVc",
>> > "name": "12 Bar Blues in G - Straight Feel vs Shuffle Feel",
>> > "a": "",
>> > "cp": true,
>> > "st": false,
>> > "s": 1,
>> > "es": 4,
>> > "n": true,
>> > "d": "
>> >
>> >
>> https://d1vuq0zzaa789.cloudfront.net/json/414722/data4.json?Expires=1703058827&Signature=LvbmR~6rYh-BVaYjIz4HUHMmEPFt4DW2rqpXJmvpcRSDpi9qld68YY9fSl1Jn7sRNpebXWWMBrVArI2-mbSAUcL0eQR3d6-Y2kTeO3Y-k5NDugflzdWFYj1vh0ipbDr9ShWAVKpiQprHxuerEkFPN7SGE6gUMA4oS-QQD1KYBqtBi9M6SBnyCzbtdt85SaWrFXGysHjeEsZbdoUxICjVm31NnBmVODsQTUtEUlwmEy2bj~ie8ICAC-XWBvfZLF0bqQ6~Lk9MwSAkOSelKZ03TwkffPwGPnstjHg2ykh2aEav9oDYtZ9-ZIO6GLv6d47C2PvYtcSOWX30IiTYIdVK-A__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
>> > ",
>> > "r": [
>> > {
>> > "id": 365280,
>> > "s": 2,
>> > "sync": "
>> >
>> >
>> https://d1vuq0zzaa789.cloudfront.net/json/414722/sync365280-6.json?Expires=1703058827&Signature=MF9JCIxFd84N63WmoY0JlAEeHJ5uAplEsSxWETRtfwmxNRSACsN-HhhlulPD50LD6~41IEIATeBoJjgabTMwrqNuBlMzglmnvUcmZ8JU8rIG2MhUA7cRLGiVBIxd45qWrYlgCVkqV75H8A0h72oD1OrMjwVYsXH2qD5xL6tl9PxXUvQT89mJel6Lau5gcVR1XCT-G56xBsXpLsq~OGGsK7~ozMmhRplHzVo8csqNv-8adlhVAUHdFyU6vGpChtSNTH-IB3eWm0hNondrEi7VMeX123~PQgPIu6E1HdBowdFlgyZ54cI82LggTlwhflChTrwgGG8s5FD44sCKXEMLXg__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
>> > ",
>> > "sd": "",
>> > "sr": 48000,
>> > "name": "Backing Track - Shuffle Feel",
>> > "cs": null,
>> > "ce": 259.008,
>> > "duration": 259,
>> > "mediaurl":
>> > "/api/v1/slices/bHvVc/recordings/365280/url/?embed=1",
>> > "renwurl": "",
>> > "ind": true
>> > },
>> > {
>> > "id": 365279,
>> > "s": 2,
>> > "sync": "
>> >
>> >
>> https://d1vuq0zzaa789.cloudfront.net/json/414722/sync365279-1.json?Expires=1703058827&Signature=BqpdWwQdP5n9uYHm1Etm3crsE9Xa7AuZPDtlf6I7GV0SPO2xLkxhWyUFGdkS2RrulY2o1R~HUASO6mCGNknS2g3Q6Iz6caTeaoX1XnjuNvogwwRFeaja14gbJCL60ng1FU9PT~snhH0NDuAUAjmOsW31nSuWUCUMealT5Hu7AWp2J4Y9EvNHlAIJhfY~JOD6yW7cIpJRWbzP926L1wYaTHWzMDswA9vGBbinSOjKUk8bR9OlDrCMWtk~0M0LVMWWldqA5y6StexpHmid3kUovrcouc11vyKi-VWjxmBjr9bbRt2sWGFMHWLZlRIKD0vdQX0QnMxp7F6XEihf~Gso9Q__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
>> > ",
>> > "sd": "",
>> > "sr": 48000,
>> > "name": "Backing Track - Straight Feel",
>> > "cs": null,
>> > "ce": null,
>> > "duration": 259,
>> > "mediaurl":
>> > "/api/v1/slices/bHvVc/recordings/365279/url/?embed=1",
>> > "renwurl": "",
>> > "ind": true
>> > },
>> > {
>> > "id": 284312,
>> > "s": 6,
>> > "sync": "
>> >
>> >
>> https://d1vuq0zzaa789.cloudfront.net/json/414722/sync284312-1.json?Expires=1703058827&Signature=Byg18egrqlQf1gt4L40htdDTupgUFsll3sFN1ZuqQ9-M~y3zkI4YeXFlrjAUXT256zbvF3FbAY8DesH546icwA--a4kkz2NI2Riq3sgf~P~6bPsVg30brdT7Kgq2LlAPHiD20RMUbNs06A7Jj-7HpcCYUoiEO8FVIIIBuELY38Bar~zIh442ozUTwIRYN7LHBUkeXVE07BYZkVtK846tCBehk-wYEvzU3ui1I22QfJEUS9swPAh6VgDoV3lMFvaeTAbytRsPgOCk5POvjQRet2D2ieGZMPLQwavPPReaZot~-xEierZAffQzHTkw3fRzYaXnaXvADXT~652nPcGJaA__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
>> > ",
>> > "sd": "425242687",
>> > "sr": 44100,
>> > "name": "Left Hand Close Up View",
>> > "cs": null,
>> > "ce": 779.112,
>> > "duration": 779,
>> > "mediaurl": "
>> >
>> >
>> https://player.vimeo.com/progressive_redirect/playback/425242687/rendition/720p/file.mp4?loc=external&oauth2_token_id=1343299132&signature=e01a999f0e8c727f5b940e33f8a1a615203a3421b3d1aae6a708836605ce3462
>> > ",
>> > "renwurl": "",
>> > "ind": true,
>> > "hls": "
>> >
>> >
>> https://player.vimeo.com/external/425242687.m3u8?s=53da65d9e1e7e8f7ded61742a7c3ca9ca41fdaff&oauth2_token_id=1343299132
>> > "
>> > },
>> > {
>> > "id": 284313,
>> > "s": 6,
>> > "sync": "
>> >
>> >
>> https://d1vuq0zzaa789.cloudfront.net/json/414722/sync284313-1.json?Expires=1703058827&Signature=f~lAAMqjRw8aUN8J1F4NBLSh2fsaiNMwQ8isMoff5s-4rkSi8oY63Luezua7gIBy1DdGAPrik~tY7Fn8FQv6Qhj6~VjuNi-EgMSmKi-DpzFPx5Ttv0f~Pnabd11Qyaqm0XJAklHMNizKuJmgK-77U~KbCHUi8aqHEX7Orb0GTvFLJgi6G90EIjK6~yPwVwyFqa6iL8IA172B3RLtVkXInaKnZGhhkXdJljexb3VuLbjCLNG9dtmgPFuZkeaLEQZF2~XSaj1ccRXY6lFdhOmF6smAYWJniUskubtrjOJjps3PWEcaI8nOWdK9Rvmdemjzyq-MyKQ1T4qlXIp6I7W0yA__&Key-Pair-Id=APKAJNLCKIXIPCJV62XA
>> > ",
>> > "sd": "425236691",
>> > "sr": 44100,
>> > "name": "Wide View",
>> > "cs": null,
>> > "ce": 779.112,
>> > "duration": 779,
>> > "mediaurl": "
>> >
>> >
>> https://player.vimeo.com/progressive_redirect/playback/425236691/rendition/1080p/file.mp4?loc=external&oauth2_token_id=1343299132&signature=61dd34337d9d1d5db96dfa34372298f8e0095d597914dfb0a62d5b38fd8e0921
>> > ",
>> > "renwurl": "",
>> > "ind": true,
>> > "hls": "
>> >
>> >
>> https://player.vimeo.com/external/425236691.m3u8?s=33dd7745a2951b1df23e4f072a09939a2ac5d96b&oauth2_token_id=1343299132
>> > "
>> > }
>> > ],
>> > "synthurl": "
>> >
>> >
>> https://d2c3nvafyekx5z.cloudfront.net/json/synth.de-6d0fa36eb119024855c064e31bfbfc19.json
>> > ",
>> > "u": null,
>> > "lang": "de",
>> > "owns": false,
>> > "v": 4,
>> > "sn": true,
>> > "pd": "",
>> > "pp": false,
>> > "ap": 1,
>> > "pfc": 1,
>> > "sy": true,
>> > "cc": 0,
>> > "ns": 0,
>> > "aup": false
>> > }
>> >
>> >
>> > Am Mi., 20. Dez. 2023 um 06:23 Uhr schrieb Sumeet Naik <
>> > ***@***.***>:
>> >
>> > > Hi there. Good to know, it worked. The above seems to be the course
>> json
>> > > file. Can you send a sample HtmlItem response, which has the embed
>> > player?
>> > > I will debug.
>> > >
>> > > —
>> > > Reply to this email directly, view it on GitHub
>> > > <
>> >
>> #52 (comment)>,
>>
>> >
>> > > or unsubscribe
>> > > <
>> >
>> https://github.com/notifications/unsubscribe-auth/AFJBPYOUEKJJWF3UA732HCLYKJR2RAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRTHAZDINBWG4>
>>
>> >
>> > > .
>> > > You are receiving this because you were mentioned.Message ID:
>> > > ***@***.***>
>> > >
>> >
>> > —
>> > Reply to this email directly, view it on GitHub
>> > <
>> #52 (comment)>,
>>
>> > or unsubscribe
>> > <
>> https://github.com/notifications/unsubscribe-auth/AF734XQARAIPLJZZ4RC5EU3YKKKV7AVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRUGAZDAMBXGE>
>>
>> > .
>> > You are receiving this because you were assigned.Message ID:
>> > ***@***.***>
>> >
>>
>> —
>> Reply to this email directly, view it on GitHub
>> <#52 (comment)>,
>> or unsubscribe
>> <https://github.com/notifications/unsubscribe-auth/AFJBPYM3FJMCZQFJWX7C55LYKKUCPAVCNFSM6AAAAAA65WSJFCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNRUGEYTQMJUGI>
>> .
>> You are receiving this because you were mentioned.Message ID:
>> ***@***.***>
>>
>
|
Hi there, I tried for the cookie and date, and was able to fetch, but for course link, I didn't find any APIs to get list of enrollments with course slug. Need to check one more time. |
Thanks. I will integrate these. |
Hi @thereals. Can you please test wistia-iframe-dl branch if it fixes soundslice videos downloading and quiz issue? https://github.com/sumeetweb/Thinki-Downloader/tree/wistia-iframe-dl |
Hi @sumeetweb,
|
Long time about a year on this issue. I am getting now, why OSS is hard for people with jobs. I am planning to refactor whole thing in python and create separate modules for each third party service to download. For Quiz, It requires custom html parser which replaces the iframe with video link if video downloads are enabled else it will just add https:// in front of iframe source. The html issue was fixed in wistia iframe branch, but I included the network protocol (i.e. https://) in the regex and which caused the issue. On what I remember, soundslice seems like it will require ffmpeg to combine the parts and again join them with audio later on. |
Verification Required:
Script doesn't download audio files for contentable type: audio
It also doesn't download attached files from pages where you have text and then attached files at the bottom of the page.
contentable type: HtmlItem with attached files.
The text was updated successfully, but these errors were encountered: