2022-12-28 20:59:08 +00:00
|
|
|
"
|
|
|
|
I model the API for the [Invidious](https://invidious.io/) open source front-end for YouTube.
|
|
|
|
"
|
|
|
|
Class {
|
|
|
|
#name : #Invidious,
|
|
|
|
#superclass : #Object,
|
|
|
|
#instVars : [
|
|
|
|
'uri',
|
|
|
|
'region',
|
2022-12-29 15:13:54 +00:00
|
|
|
'api',
|
|
|
|
'monitor'
|
2022-12-28 20:59:08 +00:00
|
|
|
],
|
|
|
|
#category : #VideoWeb
|
|
|
|
}
|
|
|
|
|
2022-12-29 15:13:54 +00:00
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious class >> defaultInstance [
|
|
|
|
^ self instances select: [ :instance | instance api = true ]
|
|
|
|
]
|
|
|
|
|
2022-12-28 20:59:08 +00:00
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious class >> instances [
|
|
|
|
|
|
|
|
^ self rawInstances collect: [ :instanceData |
|
|
|
|
| instanceDict |
|
|
|
|
instanceDict := instanceData second.
|
|
|
|
Invidious new fromDictionary: instanceDict ]
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious class >> rawInstances [
|
|
|
|
^ STON
|
|
|
|
fromString: 'https://api.invidious.io/instances.json?sort_by=type,users' asUrl
|
|
|
|
retrieveContents
|
|
|
|
]
|
|
|
|
|
2022-12-29 15:43:43 +00:00
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> api [
|
|
|
|
^ api
|
|
|
|
]
|
|
|
|
|
2022-12-28 20:59:08 +00:00
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> api: booleanValue [
|
2022-12-29 15:43:43 +00:00
|
|
|
api := booleanValue.
|
2022-12-28 20:59:08 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> fromDictionary: aDictionary [
|
2022-12-29 15:13:54 +00:00
|
|
|
| rawMonitor|
|
2022-12-28 20:59:08 +00:00
|
|
|
self
|
|
|
|
uri: (aDictionary at: 'uri');
|
|
|
|
region: (aDictionary at: 'region');
|
2022-12-29 15:13:54 +00:00
|
|
|
api: (aDictionary at: 'api').
|
|
|
|
rawMonitor := aDictionary at: 'monitor'.
|
|
|
|
rawMonitor ifNil: [ ^ self ].
|
|
|
|
self monitor
|
|
|
|
at: '90DaysRatio' put: ((aDictionary at: 'monitor' at: '90dRatio') at: 'ratio');
|
|
|
|
at: '30DaysRatio' put: ((aDictionary at: 'monitor' at: '30dRatio') at: 'ratio');
|
|
|
|
yourself.
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> monitor [
|
|
|
|
^ monitor ifNil: [ monitor := Dictionary new]
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> monitor: aDictionary [
|
|
|
|
monitor := aDictionary
|
2022-12-28 20:59:08 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> printOn: aStream [
|
2022-12-29 15:43:43 +00:00
|
|
|
| ratio |
|
|
|
|
ratio := self monitor at: '90DaysRatio' ifAbsent: [ '--' ].
|
2022-12-28 20:59:08 +00:00
|
|
|
super printOn: aStream.
|
2022-12-29 15:43:43 +00:00
|
|
|
^ aStream nextPutAll: ' ( ', self uri asString, ' | ', self region, ' | ', ratio, '% ) '
|
2022-12-28 20:59:08 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> region [
|
|
|
|
^ region
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> region: countryISOCode [
|
|
|
|
region := countryISOCode
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> uri [
|
|
|
|
^ uri
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #accessing }
|
|
|
|
Invidious >> uri: urlString [
|
|
|
|
uri := urlString asUrl
|
|
|
|
]
|