diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES index cf2ddd9..6e6dd2b 100644 --- a/.openapi-generator/FILES +++ b/.openapi-generator/FILES @@ -9,23 +9,19 @@ doc/StreamItem.md doc/Subtitle.md doc/UnauthenticatedApi.md doc/VideoInfo.md -lib/piped_api.dart -lib/src/api.dart -lib/src/api/unauthenticated_api.dart -lib/src/api_util.dart -lib/src/auth/api_key_auth.dart -lib/src/auth/auth.dart -lib/src/auth/basic_auth.dart -lib/src/auth/bearer_auth.dart -lib/src/auth/oauth.dart -lib/src/date_serializer.dart -lib/src/model/channel_info.dart -lib/src/model/date.dart -lib/src/model/exception_error.dart -lib/src/model/regions.dart -lib/src/model/stream.dart -lib/src/model/stream_item.dart -lib/src/model/subtitle.dart -lib/src/model/video_info.dart -lib/src/serializers.dart +lib/api.dart +lib/api/unauthenticated_api.dart +lib/api_util.dart +lib/auth/api_key_auth.dart +lib/auth/auth.dart +lib/auth/basic_auth.dart +lib/auth/oauth.dart +lib/model/channel_info.dart +lib/model/exception_error.dart +lib/model/regions.dart +lib/model/stream.dart +lib/model/stream_item.dart +lib/model/subtitle.dart +lib/model/video_info.dart +lib/serializers.dart pubspec.yaml diff --git a/README.md b/README.md index a3914c1..5d7306e 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,33 @@ -# piped_api (EXPERIMENTAL) +# piped_api This is an API specification for Piped API instances. This Dart package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project: - API version: 1.0.0 -- Build package: org.openapitools.codegen.languages.DartDioNextClientCodegen +- Build package: org.openapitools.codegen.languages.DartDioClientCodegen For more information, please visit [https://github.com/TeamPiped/Piped/issues](https://github.com/TeamPiped/Piped/issues) ## Requirements -* Dart 2.12.0 or later OR Flutter 1.26.0 or later -* Dio 4.0.0+ +Dart 2.7.0 or later OR Flutter 1.12 or later ## Installation & Usage -### pub.dev -To use the package from [pub.dev](https://pub.dev), please include the following in pubspec.yaml -```yaml -dependencies: - piped_api: 1.0.0 -``` - ### Github If this Dart package is published to Github, please include the following in pubspec.yaml -```yaml +``` +name: piped_api +version: 1.0.0 +description: Automatically generated OpenAPI bindings for Piped. dependencies: piped_api: - git: - url: https://github.com/GIT_USER_ID/GIT_REPO_ID.git - #ref: main + git: https://github.com/GIT_USER_ID/GIT_REPO_ID.git + version: 'any' ``` -### Local development -To use the package from your local drive, please include the following in pubspec.yaml -```yaml +### Local +To use the package in your local drive, please include the following in pubspec.yaml +``` dependencies: piped_api: path: /path/to/piped_api @@ -44,16 +38,16 @@ dependencies: Please follow the [installation procedure](#installation--usage) and then run the following: ```dart -import 'package:piped_api/piped_api.dart'; +import 'package:piped_api/api.dart'; -final api = PipedApi().getUnauthenticatedApi(); -final String channelId = UCs6KfncB4OV6Vug4o_bzijg; // String | The channel ID of the YouTube channel you want to get information about. +final api = UnauthenticatedApi(); +final channelId = UCs6KfncB4OV6Vug4o_bzijg; // String | The channel ID of the YouTube channel you want to get information about. try { final response = await api.channelInfoId(channelId); print(response); -} catch on DioError (e) { +} catch (e) { print("Exception when calling UnauthenticatedApi->channelInfoId: $e\n"); } @@ -65,11 +59,11 @@ All URIs are relative to *https://pipedapi.kavin.rocks* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- -[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**channelInfoId**](doc/UnauthenticatedApi.md#channelinfoid) | **GET** /channel/{channelId} | Gets Channel Information -[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**channelInfoName**](doc/UnauthenticatedApi.md#channelinfoname) | **GET** /c/{name} | Gets Channel Information -[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**channelInfoUsername**](doc/UnauthenticatedApi.md#channelinfousername) | **GET** /user/{username} | Gets Channel Information -[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**streamInfo**](doc/UnauthenticatedApi.md#streaminfo) | **GET** /streams/{videoId} | Gets Video Information -[*UnauthenticatedApi*](doc/UnauthenticatedApi.md) | [**trending**](doc/UnauthenticatedApi.md#trending) | **GET** /trending | Gets all Trending Videos +*UnauthenticatedApi* | [**channelInfoId**](doc/UnauthenticatedApi.md#channelinfoid) | **GET** /channel/{channelId} | Gets Channel Information +*UnauthenticatedApi* | [**channelInfoName**](doc/UnauthenticatedApi.md#channelinfoname) | **GET** /c/{name} | Gets Channel Information +*UnauthenticatedApi* | [**channelInfoUsername**](doc/UnauthenticatedApi.md#channelinfousername) | **GET** /user/{username} | Gets Channel Information +*UnauthenticatedApi* | [**streamInfo**](doc/UnauthenticatedApi.md#streaminfo) | **GET** /streams/{videoId} | Gets Video Information +*UnauthenticatedApi* | [**trending**](doc/UnauthenticatedApi.md#trending) | **GET** /trending | Gets all Trending Videos ## Documentation For Models diff --git a/doc/ChannelInfo.md b/doc/ChannelInfo.md index 0c0545c..26ab9ea 100644 --- a/doc/ChannelInfo.md +++ b/doc/ChannelInfo.md @@ -14,7 +14,7 @@ Name | Type | Description | Notes **id** | **String** | The ID of the channel. | [optional] **name** | **String** | The name of the channel. | [optional] **nextpage** | **String** | The parameter used to get the next page of related videos. | [optional] -**relatedStreams** | [**BuiltList<StreamItem>**](StreamItem.md) | | [optional] +**relatedStreams** | [**BuiltList**](StreamItem.md) | | [optional] **subscriberCount** | **int** | The number of subscribers the channel has. | [optional] **verified** | **bool** | Whether the channel is verified. | [optional] diff --git a/doc/UnauthenticatedApi.md b/doc/UnauthenticatedApi.md index a5d5946..26c01de 100644 --- a/doc/UnauthenticatedApi.md +++ b/doc/UnauthenticatedApi.md @@ -27,13 +27,13 @@ Gets all available Channel information about a channel. ```dart import 'package:piped_api/api.dart'; -final api = PipedApi().getUnauthenticatedApi(); -final String channelId = UCs6KfncB4OV6Vug4o_bzijg; // String | The channel ID of the YouTube channel you want to get information about. +var api_instance = new UnauthenticatedApi(); +var channelId = UCs6KfncB4OV6Vug4o_bzijg; // String | The channel ID of the YouTube channel you want to get information about. try { - final response = api.channelInfoId(channelId); - print(response); -} catch on DioError (e) { + var result = api_instance.channelInfoId(channelId); + print(result); +} catch (e) { print('Exception when calling UnauthenticatedApi->channelInfoId: $e\n'); } ``` @@ -70,13 +70,13 @@ Gets all available Channel information about a channel. ```dart import 'package:piped_api/api.dart'; -final api = PipedApi().getUnauthenticatedApi(); -final String name = Dream; // String | The name of the YouTube channel you want to get information about. +var api_instance = new UnauthenticatedApi(); +var name = Dream; // String | The name of the YouTube channel you want to get information about. try { - final response = api.channelInfoName(name); - print(response); -} catch on DioError (e) { + var result = api_instance.channelInfoName(name); + print(result); +} catch (e) { print('Exception when calling UnauthenticatedApi->channelInfoName: $e\n'); } ``` @@ -113,13 +113,13 @@ Gets all available Channel information about a channel. ```dart import 'package:piped_api/api.dart'; -final api = PipedApi().getUnauthenticatedApi(); -final String username = DreamTraps; // String | The username of the YouTube channel you want to get information about. +var api_instance = new UnauthenticatedApi(); +var username = DreamTraps; // String | The username of the YouTube channel you want to get information about. try { - final response = api.channelInfoUsername(username); - print(response); -} catch on DioError (e) { + var result = api_instance.channelInfoUsername(username); + print(result); +} catch (e) { print('Exception when calling UnauthenticatedApi->channelInfoUsername: $e\n'); } ``` @@ -156,13 +156,13 @@ Gets all available Stream information about a video. ```dart import 'package:piped_api/api.dart'; -final api = PipedApi().getUnauthenticatedApi(); -final String videoId = dQw4w9WgXcQ; // String | The video ID of the YouTube video you want to get information about. +var api_instance = new UnauthenticatedApi(); +var videoId = dQw4w9WgXcQ; // String | The video ID of the YouTube video you want to get information about. try { - final response = api.streamInfo(videoId); - print(response); -} catch on DioError (e) { + var result = api_instance.streamInfo(videoId); + print(result); +} catch (e) { print('Exception when calling UnauthenticatedApi->streamInfo: $e\n'); } ``` @@ -199,13 +199,13 @@ Gets all Trending Videos in the requested country. ```dart import 'package:piped_api/api.dart'; -final api = PipedApi().getUnauthenticatedApi(); -final Regions region = US; // Regions | The Region to get trending videos from. +var api_instance = new UnauthenticatedApi(); +var region = US; // Regions | The Region to get trending videos from. try { - final response = api.trending(region); - print(response); -} catch on DioError (e) { + var result = api_instance.trending(region); + print(result); +} catch (e) { print('Exception when calling UnauthenticatedApi->trending: $e\n'); } ``` @@ -218,7 +218,7 @@ Name | Type | Description | Notes ### Return type -[**BuiltList<StreamItem>**](StreamItem.md) +[**BuiltList**](StreamItem.md) ### Authorization diff --git a/doc/VideoInfo.md b/doc/VideoInfo.md index 955199f..b7a1b55 100644 --- a/doc/VideoInfo.md +++ b/doc/VideoInfo.md @@ -8,8 +8,8 @@ import 'package:piped_api/api.dart'; ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**audioStreams** | [**BuiltList<Stream>**](Stream.md) | | [optional] -**videoStreams** | [**BuiltList<Stream>**](Stream.md) | | [optional] +**audioStreams** | [**BuiltList**](Stream.md) | | [optional] +**videoStreams** | [**BuiltList**](Stream.md) | | [optional] **description** | **String** | The video's description. | [optional] **dislikes** | **int** | The number of dislikes the video has. | [optional] **duration** | **int** | The video's duration in seconds. | [optional] @@ -18,7 +18,7 @@ Name | Type | Description | Notes **likes** | **int** | The number of likes the video has. | [optional] **livestream** | **bool** | Whether the video is a livestream. | [optional] **proxyUrl** | **String** | The base URL of the backend instance's proxy. | [optional] -**subtitles** | [**BuiltList<Subtitle>**](Subtitle.md) | | [optional] +**subtitles** | [**BuiltList**](Subtitle.md) | | [optional] **dash** | **String** | The URL of the DASH manifest. | [optional] **thumbnailUrl** | **String** | The URL of the video's thumbnail. | [optional] **title** | **String** | The video's title. | [optional] @@ -27,7 +27,7 @@ Name | Type | Description | Notes **uploaderAvatar** | **String** | The URL of the video's uploader's avatar. | [optional] **uploaderUrl** | **String** | The relative URL of the video's uploader. | [optional] **uploaderVerified** | **bool** | Whether the video's uploader is verified. | [optional] -**relatedStreams** | [**BuiltList<StreamItem>**](StreamItem.md) | | [optional] +**relatedStreams** | [**BuiltList**](StreamItem.md) | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/lib/api.dart b/lib/api.dart new file mode 100644 index 0000000..cad6d15 --- /dev/null +++ b/lib/api.dart @@ -0,0 +1,74 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +library piped_api.api; + +import 'package:dio/dio.dart'; +import 'package:built_value/serializer.dart'; +import 'package:piped_api/serializers.dart'; +import 'package:piped_api/auth/api_key_auth.dart'; +import 'package:piped_api/auth/basic_auth.dart'; +import 'package:piped_api/auth/oauth.dart'; +import 'package:piped_api/api/unauthenticated_api.dart'; + + +final _defaultInterceptors = [ + OAuthInterceptor(), + BasicAuthInterceptor(), + ApiKeyAuthInterceptor(), +]; + +class PipedApi { + + static const String basePath = r'https://pipedapi.kavin.rocks'; + + final Dio dio; + + final Serializers serializers; + + PipedApi({ + Dio dio, + Serializers serializers, + String basePathOverride, + List interceptors, + }) : this.serializers = serializers ?? standardSerializers, + this.dio = dio ?? + Dio(BaseOptions( + baseUrl: basePathOverride ?? basePath, + connectTimeout: 5000, + receiveTimeout: 3000, + )) { + if (interceptors == null) { + this.dio.interceptors.addAll(_defaultInterceptors); + } else { + this.dio.interceptors.addAll(interceptors); + } + } + + void setOAuthToken(String name, String token) { + (this.dio.interceptors.firstWhere((element) => element is OAuthInterceptor, orElse: null) as OAuthInterceptor)?.tokens[name] = token; + } + + void setBasicAuth(String name, String username, String password) { + (this.dio.interceptors.firstWhere((element) => element is BasicAuthInterceptor, orElse: null) as BasicAuthInterceptor)?.authInfo[name] = BasicAuthInfo(username, password); + } + + void setApiKey(String name, String apiKey) { + (this.dio.interceptors.firstWhere((element) => element is ApiKeyAuthInterceptor, orElse: null) as ApiKeyAuthInterceptor)?.apiKeys[name] = apiKey; + } + + + /** + * Get UnauthenticatedApi instance, base route and serializer can be overridden by a given but be careful, + * by doing that all interceptors will not be executed + */ + UnauthenticatedApi getUnauthenticatedApi() { + return UnauthenticatedApi(dio, serializers); + } + + +} diff --git a/lib/api/unauthenticated_api.dart b/lib/api/unauthenticated_api.dart new file mode 100644 index 0000000..7f17429 --- /dev/null +++ b/lib/api/unauthenticated_api.dart @@ -0,0 +1,305 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'dart:async'; +import 'package:dio/dio.dart'; +import 'package:built_value/serializer.dart'; + +import 'package:built_collection/built_collection.dart'; +import 'package:piped_api/model/channel_info.dart'; +import 'package:piped_api/model/exception_error.dart'; +import 'package:piped_api/model/regions.dart'; +import 'package:piped_api/model/stream_item.dart'; +import 'package:piped_api/model/video_info.dart'; + +class UnauthenticatedApi { + + final Dio _dio; + + final Serializers _serializers; + + const UnauthenticatedApi(this._dio, this._serializers); + + /// Gets Channel Information + /// + /// Gets all available Channel information about a channel. + Future> channelInfoId( + String channelId, { + CancelToken cancelToken, + Map headers, + Map extra, + ValidateStatus validateStatus, + ProgressCallback onSendProgress, + ProgressCallback onReceiveProgress, + }) async { + final _request = RequestOptions( + path: r'/channel/{channelId}'.replaceAll('{' r'channelId' '}', channelId.toString()), + method: 'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + contentType: 'application/json', + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + dynamic _bodyData; + + final _response = await _dio.request( + _request.path, + data: _bodyData, + options: _request, + ); + + const _responseType = FullType(ChannelInfo); + final _responseData = _serializers.deserialize( + _response.data, + specifiedType: _responseType, + ) as ChannelInfo; + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + request: _response.request, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Gets Channel Information + /// + /// Gets all available Channel information about a channel. + Future> channelInfoName( + String name, { + CancelToken cancelToken, + Map headers, + Map extra, + ValidateStatus validateStatus, + ProgressCallback onSendProgress, + ProgressCallback onReceiveProgress, + }) async { + final _request = RequestOptions( + path: r'/c/{name}'.replaceAll('{' r'name' '}', name.toString()), + method: 'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + contentType: 'application/json', + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + dynamic _bodyData; + + final _response = await _dio.request( + _request.path, + data: _bodyData, + options: _request, + ); + + const _responseType = FullType(ChannelInfo); + final _responseData = _serializers.deserialize( + _response.data, + specifiedType: _responseType, + ) as ChannelInfo; + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + request: _response.request, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Gets Channel Information + /// + /// Gets all available Channel information about a channel. + Future> channelInfoUsername( + String username, { + CancelToken cancelToken, + Map headers, + Map extra, + ValidateStatus validateStatus, + ProgressCallback onSendProgress, + ProgressCallback onReceiveProgress, + }) async { + final _request = RequestOptions( + path: r'/user/{username}'.replaceAll('{' r'username' '}', username.toString()), + method: 'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + contentType: 'application/json', + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + dynamic _bodyData; + + final _response = await _dio.request( + _request.path, + data: _bodyData, + options: _request, + ); + + const _responseType = FullType(ChannelInfo); + final _responseData = _serializers.deserialize( + _response.data, + specifiedType: _responseType, + ) as ChannelInfo; + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + request: _response.request, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Gets Video Information + /// + /// Gets all available Stream information about a video. + Future> streamInfo( + String videoId, { + CancelToken cancelToken, + Map headers, + Map extra, + ValidateStatus validateStatus, + ProgressCallback onSendProgress, + ProgressCallback onReceiveProgress, + }) async { + final _request = RequestOptions( + path: r'/streams/{videoId}'.replaceAll('{' r'videoId' '}', videoId.toString()), + method: 'GET', + headers: { + ...?headers, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + contentType: 'application/json', + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + dynamic _bodyData; + + final _response = await _dio.request( + _request.path, + data: _bodyData, + options: _request, + ); + + const _responseType = FullType(VideoInfo); + final _responseData = _serializers.deserialize( + _response.data, + specifiedType: _responseType, + ) as VideoInfo; + + return Response( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + request: _response.request, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + + /// Gets all Trending Videos + /// + /// Gets all Trending Videos in the requested country. + Future>> trending( + Regions region, { + CancelToken cancelToken, + Map headers, + Map extra, + ValidateStatus validateStatus, + ProgressCallback onSendProgress, + ProgressCallback onReceiveProgress, + }) async { + final _request = RequestOptions( + path: r'/trending', + method: 'GET', + headers: { + ...?headers, + }, + queryParameters: { + r'region': region, + }, + extra: { + 'secure': >[], + ...?extra, + }, + validateStatus: validateStatus, + contentType: 'application/json', + cancelToken: cancelToken, + onSendProgress: onSendProgress, + onReceiveProgress: onReceiveProgress, + ); + + dynamic _bodyData; + + final _response = await _dio.request( + _request.path, + data: _bodyData, + options: _request, + ); + + const _responseType = FullType(BuiltList, [FullType(StreamItem)]); + final BuiltList _responseData = _serializers.deserialize( + _response.data, + specifiedType: _responseType, + ) as BuiltList; + + return Response>( + data: _responseData, + headers: _response.headers, + isRedirect: _response.isRedirect, + request: _response.request, + redirects: _response.redirects, + statusCode: _response.statusCode, + statusMessage: _response.statusMessage, + extra: _response.extra, + ); + } + +} diff --git a/lib/api_util.dart b/lib/api_util.dart new file mode 100644 index 0000000..a6ce785 --- /dev/null +++ b/lib/api_util.dart @@ -0,0 +1,31 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'dart:convert'; + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/serializer.dart'; + +/// Format the given form parameter object into something that Dio can handle. +/// Returns primitive or String. +/// Returns List/Map if the value is BuildList/BuiltMap. +dynamic encodeFormParameter(Serializers serializers, dynamic value, FullType type) { + if (value == null) { + return ''; + } + if (value is String || value is num || value is bool) { + return value; + } + final serialized = serializers.serialize(value, specifiedType: type); + if (serialized is String) { + return serialized; + } + if (value is BuiltList || value is BuiltMap) { + return serialized; + } + return json.encode(serialized); +} diff --git a/lib/auth/api_key_auth.dart b/lib/auth/api_key_auth.dart new file mode 100644 index 0000000..261921f --- /dev/null +++ b/lib/auth/api_key_auth.dart @@ -0,0 +1,33 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'dart:async'; +import 'package:piped_api/auth/auth.dart'; +import 'package:dio/dio.dart'; + +class ApiKeyAuthInterceptor extends AuthInterceptor { + Map apiKeys = {}; + + @override + Future onRequest(RequestOptions options) { + final authInfo = getAuthInfo(options, 'apiKey'); + for (final info in authInfo) { + final authName = info['name'] as String; + final authKeyName = info['keyName'] as String; + final authWhere = info['where'] as String; + final apiKey = apiKeys[authName]; + if (apiKey != null) { + if (authWhere == 'query') { + options.queryParameters[authKeyName] = apiKey; + } else { + options.headers[authKeyName] = apiKey; + } + } + } + return super.onRequest(options); + } +} diff --git a/lib/auth/auth.dart b/lib/auth/auth.dart new file mode 100644 index 0000000..de1ee79 --- /dev/null +++ b/lib/auth/auth.dart @@ -0,0 +1,27 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'package:dio/dio.dart'; + +abstract class AuthInterceptor extends Interceptor { + /// Get auth information on given route for the given type. + /// Can return an empty list if type is not present on auth data or + /// if route doesn't need authentication. + List> getAuthInfo(RequestOptions route, String type) { + if (route.extra.containsKey('secure')) { + final auth = route.extra['secure'] as List>; + final results = >[]; + for (final info in auth) { + if (info['type'] == type) { + results.add(info); + } + } + return results; + } + return []; + } +} diff --git a/lib/auth/basic_auth.dart b/lib/auth/basic_auth.dart new file mode 100644 index 0000000..6d4a1c4 --- /dev/null +++ b/lib/auth/basic_auth.dart @@ -0,0 +1,38 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'dart:async'; +import 'dart:convert'; +import 'package:piped_api/auth/auth.dart'; +import 'package:dio/dio.dart'; + +class BasicAuthInfo { + final String username; + final String password; + + const BasicAuthInfo(this.username, this.password); +} + +class BasicAuthInterceptor extends AuthInterceptor { + Map authInfo = {}; + + @override + Future onRequest(RequestOptions options) { + final metadataAuthInfo = getAuthInfo(options, 'basic'); + for (final info in metadataAuthInfo) { + final authName = info['name'] as String; + final basicAuthInfo = authInfo[authName]; + if (basicAuthInfo != null) { + final basicAuth = 'Basic ' + base64Encode(utf8.encode('${basicAuthInfo.username}:${basicAuthInfo.password}')); + options.headers['Authorization'] = basicAuth; + break; + } + } + + return super.onRequest(options); + } +} diff --git a/lib/auth/oauth.dart b/lib/auth/oauth.dart new file mode 100644 index 0000000..8734782 --- /dev/null +++ b/lib/auth/oauth.dart @@ -0,0 +1,27 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'dart:async'; +import 'package:piped_api/auth/auth.dart'; +import 'package:dio/dio.dart'; + +class OAuthInterceptor extends AuthInterceptor { + Map tokens = {}; + + @override + Future onRequest(RequestOptions options) { + final authInfo = getAuthInfo(options, 'oauth'); + for (final info in authInfo) { + final token = tokens[info['name']]; + if (token != null) { + options.headers['Authorization'] = 'Bearer ${token}'; + break; + } + } + return super.onRequest(options); + } +} diff --git a/lib/model/channel_info.dart b/lib/model/channel_info.dart new file mode 100644 index 0000000..3ed490e --- /dev/null +++ b/lib/model/channel_info.dart @@ -0,0 +1,191 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'package:built_collection/built_collection.dart'; +import 'package:piped_api/model/stream_item.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'channel_info.g.dart'; + +abstract class ChannelInfo implements Built { + + /// The URL of the channel's avatar. + @nullable + @BuiltValueField(wireName: r'avatarUrl') + String get avatarUrl; + + /// The URL of the channel's banner. + @nullable + @BuiltValueField(wireName: r'bannerUrl') + String get bannerUrl; + + /// The channel's description. + @nullable + @BuiltValueField(wireName: r'description') + String get description; + + /// The ID of the channel. + @nullable + @BuiltValueField(wireName: r'id') + String get id; + + /// The name of the channel. + @nullable + @BuiltValueField(wireName: r'name') + String get name; + + /// The parameter used to get the next page of related videos. + @nullable + @BuiltValueField(wireName: r'nextpage') + String get nextpage; + + @nullable + @BuiltValueField(wireName: r'relatedStreams') + BuiltList get relatedStreams; + + /// The number of subscribers the channel has. + @nullable + @BuiltValueField(wireName: r'subscriberCount') + int get subscriberCount; + + /// Whether the channel is verified. + @nullable + @BuiltValueField(wireName: r'verified') + bool get verified; + + ChannelInfo._(); + + static void _initializeBuilder(ChannelInfoBuilder b) => b; + + factory ChannelInfo([void updates(ChannelInfoBuilder b)]) = _$ChannelInfo; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ChannelInfoSerializer(); +} + +class _$ChannelInfoSerializer implements StructuredSerializer { + + @override + final Iterable types = const [ChannelInfo, _$ChannelInfo]; + @override + final String wireName = r'ChannelInfo'; + + @override + Iterable serialize(Serializers serializers, ChannelInfo object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + if (object.avatarUrl != null) { + result + ..add(r'avatarUrl') + ..add(serializers.serialize(object.avatarUrl, + specifiedType: const FullType(String))); + } + if (object.bannerUrl != null) { + result + ..add(r'bannerUrl') + ..add(serializers.serialize(object.bannerUrl, + specifiedType: const FullType(String))); + } + if (object.description != null) { + result + ..add(r'description') + ..add(serializers.serialize(object.description, + specifiedType: const FullType(String))); + } + if (object.id != null) { + result + ..add(r'id') + ..add(serializers.serialize(object.id, + specifiedType: const FullType(String))); + } + if (object.name != null) { + result + ..add(r'name') + ..add(serializers.serialize(object.name, + specifiedType: const FullType(String))); + } + if (object.nextpage != null) { + result + ..add(r'nextpage') + ..add(serializers.serialize(object.nextpage, + specifiedType: const FullType(String))); + } + if (object.relatedStreams != null) { + result + ..add(r'relatedStreams') + ..add(serializers.serialize(object.relatedStreams, + specifiedType: const FullType(BuiltList, [FullType(StreamItem)]))); + } + if (object.subscriberCount != null) { + result + ..add(r'subscriberCount') + ..add(serializers.serialize(object.subscriberCount, + specifiedType: const FullType(int))); + } + if (object.verified != null) { + result + ..add(r'verified') + ..add(serializers.serialize(object.verified, + specifiedType: const FullType(bool))); + } + return result; + } + + @override + ChannelInfo deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = ChannelInfoBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final dynamic value = iterator.current; + switch (key) { + case r'avatarUrl': + result.avatarUrl = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'bannerUrl': + result.bannerUrl = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'description': + result.description = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'id': + result.id = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'name': + result.name = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'nextpage': + result.nextpage = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'relatedStreams': + result.relatedStreams.replace(serializers.deserialize(value, + specifiedType: const FullType(BuiltList, [FullType(StreamItem)])) as BuiltList); + break; + case r'subscriberCount': + result.subscriberCount = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'verified': + result.verified = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; + } + } + return result.build(); + } +} + diff --git a/lib/model/exception_error.dart b/lib/model/exception_error.dart new file mode 100644 index 0000000..dee0920 --- /dev/null +++ b/lib/model/exception_error.dart @@ -0,0 +1,79 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'exception_error.g.dart'; + +abstract class ExceptionError implements Built { + + /// The stacktrace provided by the server. + @BuiltValueField(wireName: r'error') + String get error; + + /// The error message from the stacktrace. + @BuiltValueField(wireName: r'message') + String get message; + + ExceptionError._(); + + static void _initializeBuilder(ExceptionErrorBuilder b) => b; + + factory ExceptionError([void updates(ExceptionErrorBuilder b)]) = _$ExceptionError; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$ExceptionErrorSerializer(); +} + +class _$ExceptionErrorSerializer implements StructuredSerializer { + + @override + final Iterable types = const [ExceptionError, _$ExceptionError]; + @override + final String wireName = r'ExceptionError'; + + @override + Iterable serialize(Serializers serializers, ExceptionError object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + result + ..add(r'error') + ..add(serializers.serialize(object.error, + specifiedType: const FullType(String))); + result + ..add(r'message') + ..add(serializers.serialize(object.message, + specifiedType: const FullType(String))); + return result; + } + + @override + ExceptionError deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = ExceptionErrorBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final dynamic value = iterator.current; + switch (key) { + case r'error': + result.error = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'message': + result.message = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + } + } + return result.build(); + } +} + diff --git a/lib/model/regions.dart b/lib/model/regions.dart new file mode 100644 index 0000000..06cf48b --- /dev/null +++ b/lib/model/regions.dart @@ -0,0 +1,246 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'regions.g.dart'; + +class Regions extends EnumClass { + + @BuiltValueEnumConst(wireName: r'DZ') + static const Regions DZ = _$DZ; + @BuiltValueEnumConst(wireName: r'AR') + static const Regions AR = _$AR; + @BuiltValueEnumConst(wireName: r'AU') + static const Regions AU = _$AU; + @BuiltValueEnumConst(wireName: r'AT') + static const Regions AT = _$AT; + @BuiltValueEnumConst(wireName: r'AZ') + static const Regions AZ = _$AZ; + @BuiltValueEnumConst(wireName: r'BH') + static const Regions BH = _$BH; + @BuiltValueEnumConst(wireName: r'BD') + static const Regions BD = _$BD; + @BuiltValueEnumConst(wireName: r'BY') + static const Regions BY = _$BY; + @BuiltValueEnumConst(wireName: r'BE') + static const Regions BE = _$BE; + @BuiltValueEnumConst(wireName: r'BO') + static const Regions BO = _$BO; + @BuiltValueEnumConst(wireName: r'BA') + static const Regions BA = _$BA; + @BuiltValueEnumConst(wireName: r'BR') + static const Regions BR = _$BR; + @BuiltValueEnumConst(wireName: r'BG') + static const Regions BG = _$BG; + @BuiltValueEnumConst(wireName: r'CA') + static const Regions CA = _$CA; + @BuiltValueEnumConst(wireName: r'CL') + static const Regions CL = _$CL; + @BuiltValueEnumConst(wireName: r'CO') + static const Regions CO = _$CO; + @BuiltValueEnumConst(wireName: r'CR') + static const Regions CR = _$CR; + @BuiltValueEnumConst(wireName: r'HR') + static const Regions HR = _$HR; + @BuiltValueEnumConst(wireName: r'CY') + static const Regions CY = _$CY; + @BuiltValueEnumConst(wireName: r'CZ') + static const Regions CZ = _$CZ; + @BuiltValueEnumConst(wireName: r'DK') + static const Regions DK = _$DK; + @BuiltValueEnumConst(wireName: r'DO') + static const Regions DO = _$DO; + @BuiltValueEnumConst(wireName: r'EC') + static const Regions EC = _$EC; + @BuiltValueEnumConst(wireName: r'EG') + static const Regions EG = _$EG; + @BuiltValueEnumConst(wireName: r'SV') + static const Regions SV = _$SV; + @BuiltValueEnumConst(wireName: r'EE') + static const Regions EE = _$EE; + @BuiltValueEnumConst(wireName: r'FI') + static const Regions FI = _$FI; + @BuiltValueEnumConst(wireName: r'FR') + static const Regions FR = _$FR; + @BuiltValueEnumConst(wireName: r'GE') + static const Regions GE = _$GE; + @BuiltValueEnumConst(wireName: r'DE') + static const Regions DE = _$DE; + @BuiltValueEnumConst(wireName: r'GH') + static const Regions GH = _$GH; + @BuiltValueEnumConst(wireName: r'GR') + static const Regions GR = _$GR; + @BuiltValueEnumConst(wireName: r'GT') + static const Regions GT = _$GT; + @BuiltValueEnumConst(wireName: r'HN') + static const Regions HN = _$HN; + @BuiltValueEnumConst(wireName: r'HK') + static const Regions HK = _$HK; + @BuiltValueEnumConst(wireName: r'HU') + static const Regions HU = _$HU; + @BuiltValueEnumConst(wireName: r'IS') + static const Regions IS = _$IS; + @BuiltValueEnumConst(wireName: r'IN') + static const Regions IN = _$IN; + @BuiltValueEnumConst(wireName: r'ID') + static const Regions ID = _$ID; + @BuiltValueEnumConst(wireName: r'IQ') + static const Regions IQ = _$IQ; + @BuiltValueEnumConst(wireName: r'IE') + static const Regions IE = _$IE; + @BuiltValueEnumConst(wireName: r'IL') + static const Regions IL = _$IL; + @BuiltValueEnumConst(wireName: r'IT') + static const Regions IT = _$IT; + @BuiltValueEnumConst(wireName: r'JM') + static const Regions JM = _$JM; + @BuiltValueEnumConst(wireName: r'JP') + static const Regions JP = _$JP; + @BuiltValueEnumConst(wireName: r'JO') + static const Regions JO = _$JO; + @BuiltValueEnumConst(wireName: r'KZ') + static const Regions KZ = _$KZ; + @BuiltValueEnumConst(wireName: r'KE') + static const Regions KE = _$KE; + @BuiltValueEnumConst(wireName: r'KW') + static const Regions KW = _$KW; + @BuiltValueEnumConst(wireName: r'LV') + static const Regions LV = _$LV; + @BuiltValueEnumConst(wireName: r'LB') + static const Regions LB = _$LB; + @BuiltValueEnumConst(wireName: r'LY') + static const Regions LY = _$LY; + @BuiltValueEnumConst(wireName: r'LI') + static const Regions LI = _$LI; + @BuiltValueEnumConst(wireName: r'LT') + static const Regions LT = _$LT; + @BuiltValueEnumConst(wireName: r'LU') + static const Regions LU = _$LU; + @BuiltValueEnumConst(wireName: r'MY') + static const Regions MY = _$MY; + @BuiltValueEnumConst(wireName: r'MT') + static const Regions MT = _$MT; + @BuiltValueEnumConst(wireName: r'MX') + static const Regions MX = _$MX; + @BuiltValueEnumConst(wireName: r'ME') + static const Regions ME = _$ME; + @BuiltValueEnumConst(wireName: r'MA') + static const Regions MA = _$MA; + @BuiltValueEnumConst(wireName: r'NP') + static const Regions NP = _$NP; + @BuiltValueEnumConst(wireName: r'NL') + static const Regions NL = _$NL; + @BuiltValueEnumConst(wireName: r'NZ') + static const Regions NZ = _$NZ; + @BuiltValueEnumConst(wireName: r'NI') + static const Regions NI = _$NI; + @BuiltValueEnumConst(wireName: r'NG') + static const Regions NG = _$NG; + @BuiltValueEnumConst(wireName: r'MK') + static const Regions MK = _$MK; + @BuiltValueEnumConst(wireName: r'NO') + static const Regions NO = _$NO; + @BuiltValueEnumConst(wireName: r'OM') + static const Regions OM = _$OM; + @BuiltValueEnumConst(wireName: r'PK') + static const Regions PK = _$PK; + @BuiltValueEnumConst(wireName: r'PA') + static const Regions PA = _$PA; + @BuiltValueEnumConst(wireName: r'PG') + static const Regions PG = _$PG; + @BuiltValueEnumConst(wireName: r'PY') + static const Regions PY = _$PY; + @BuiltValueEnumConst(wireName: r'PE') + static const Regions PE = _$PE; + @BuiltValueEnumConst(wireName: r'PH') + static const Regions PH = _$PH; + @BuiltValueEnumConst(wireName: r'PL') + static const Regions PL = _$PL; + @BuiltValueEnumConst(wireName: r'PT') + static const Regions PT = _$PT; + @BuiltValueEnumConst(wireName: r'PR') + static const Regions PR = _$PR; + @BuiltValueEnumConst(wireName: r'QA') + static const Regions QA = _$QA; + @BuiltValueEnumConst(wireName: r'RO') + static const Regions RO = _$RO; + @BuiltValueEnumConst(wireName: r'RU') + static const Regions RU = _$RU; + @BuiltValueEnumConst(wireName: r'SA') + static const Regions SA = _$SA; + @BuiltValueEnumConst(wireName: r'SN') + static const Regions SN = _$SN; + @BuiltValueEnumConst(wireName: r'RS') + static const Regions RS = _$RS; + @BuiltValueEnumConst(wireName: r'SG') + static const Regions SG = _$SG; + @BuiltValueEnumConst(wireName: r'SK') + static const Regions SK = _$SK; + @BuiltValueEnumConst(wireName: r'SI') + static const Regions SI = _$SI; + @BuiltValueEnumConst(wireName: r'ZA') + static const Regions ZA = _$ZA; + @BuiltValueEnumConst(wireName: r'KR') + static const Regions KR = _$KR; + @BuiltValueEnumConst(wireName: r'ES') + static const Regions ES = _$ES; + @BuiltValueEnumConst(wireName: r'LK') + static const Regions LK = _$LK; + @BuiltValueEnumConst(wireName: r'SE') + static const Regions SE = _$SE; + @BuiltValueEnumConst(wireName: r'CH') + static const Regions CH = _$CH; + @BuiltValueEnumConst(wireName: r'TW') + static const Regions TW = _$TW; + @BuiltValueEnumConst(wireName: r'TZ') + static const Regions TZ = _$TZ; + @BuiltValueEnumConst(wireName: r'TH') + static const Regions TH = _$TH; + @BuiltValueEnumConst(wireName: r'TN') + static const Regions TN = _$TN; + @BuiltValueEnumConst(wireName: r'TR') + static const Regions TR = _$TR; + @BuiltValueEnumConst(wireName: r'UG') + static const Regions UG = _$UG; + @BuiltValueEnumConst(wireName: r'UA') + static const Regions UA = _$UA; + @BuiltValueEnumConst(wireName: r'AE') + static const Regions AE = _$AE; + @BuiltValueEnumConst(wireName: r'GB') + static const Regions GB = _$GB; + @BuiltValueEnumConst(wireName: r'US') + static const Regions US = _$US; + @BuiltValueEnumConst(wireName: r'UY') + static const Regions UY = _$UY; + @BuiltValueEnumConst(wireName: r'VE') + static const Regions VE = _$VE; + @BuiltValueEnumConst(wireName: r'VN') + static const Regions VN = _$VN; + @BuiltValueEnumConst(wireName: r'YE') + static const Regions YE = _$YE; + @BuiltValueEnumConst(wireName: r'ZW') + static const Regions ZW = _$ZW; + + static Serializer get serializer => _$regionsSerializer; + + const Regions._(String name): super(name); + + static BuiltSet get values => _$values; + static Regions valueOf(String name) => _$valueOf(name); +} + +/// Optionally, enum_class can generate a mixin to go with your enum for use +/// with Angular. It exposes your enum constants as getters. So, if you mix it +/// in to your Dart component class, the values become available to the +/// corresponding Angular template. +/// +/// Trigger mixin generation by writing a line like this one next to your enum. +abstract class RegionsMixin = Object with _$RegionsMixin; + diff --git a/lib/model/stream.dart b/lib/model/stream.dart new file mode 100644 index 0000000..21e1cc2 --- /dev/null +++ b/lib/model/stream.dart @@ -0,0 +1,284 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'stream.g.dart'; + +abstract class Stream implements Built { + + /// The URL of the stream. + @nullable + @BuiltValueField(wireName: r'url') + String get url; + + /// The format of the stream. + @nullable + @BuiltValueField(wireName: r'format') + StreamFormatEnum get format; + // enum formatEnum { MPEG_4, v3GPP, WEBM, M4A, WEBMA_OPUS, }; + + /// The quality of the stream. + @nullable + @BuiltValueField(wireName: r'quality') + String get quality; + + /// The mime type of the stream. + @nullable + @BuiltValueField(wireName: r'mimeType') + String get mimeType; + + /// The codec of the stream. + @nullable + @BuiltValueField(wireName: r'codec') + String get codec; + + @nullable + @BuiltValueField(wireName: r'videoOnly') + bool get videoOnly; + + @nullable + @BuiltValueField(wireName: r'bitrate') + int get bitrate; + + @nullable + @BuiltValueField(wireName: r'initStart') + int get initStart; + + @nullable + @BuiltValueField(wireName: r'initEnd') + int get initEnd; + + @nullable + @BuiltValueField(wireName: r'indexStart') + int get indexStart; + + @nullable + @BuiltValueField(wireName: r'indexEnd') + int get indexEnd; + + @nullable + @BuiltValueField(wireName: r'width') + int get width; + + @nullable + @BuiltValueField(wireName: r'height') + int get height; + + @nullable + @BuiltValueField(wireName: r'fps') + int get fps; + + Stream._(); + + static void _initializeBuilder(StreamBuilder b) => b; + + factory Stream([void updates(StreamBuilder b)]) = _$Stream; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$StreamSerializer(); +} + +class _$StreamSerializer implements StructuredSerializer { + + @override + final Iterable types = const [Stream, _$Stream]; + @override + final String wireName = r'Stream'; + + @override + Iterable serialize(Serializers serializers, Stream object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + if (object.url != null) { + result + ..add(r'url') + ..add(serializers.serialize(object.url, + specifiedType: const FullType(String))); + } + if (object.format != null) { + result + ..add(r'format') + ..add(serializers.serialize(object.format, + specifiedType: const FullType(StreamFormatEnum))); + } + if (object.quality != null) { + result + ..add(r'quality') + ..add(serializers.serialize(object.quality, + specifiedType: const FullType(String))); + } + if (object.mimeType != null) { + result + ..add(r'mimeType') + ..add(serializers.serialize(object.mimeType, + specifiedType: const FullType(String))); + } + if (object.codec != null) { + result + ..add(r'codec') + ..add(serializers.serialize(object.codec, + specifiedType: const FullType(String))); + } + if (object.videoOnly != null) { + result + ..add(r'videoOnly') + ..add(serializers.serialize(object.videoOnly, + specifiedType: const FullType(bool))); + } + if (object.bitrate != null) { + result + ..add(r'bitrate') + ..add(serializers.serialize(object.bitrate, + specifiedType: const FullType(int))); + } + if (object.initStart != null) { + result + ..add(r'initStart') + ..add(serializers.serialize(object.initStart, + specifiedType: const FullType(int))); + } + if (object.initEnd != null) { + result + ..add(r'initEnd') + ..add(serializers.serialize(object.initEnd, + specifiedType: const FullType(int))); + } + if (object.indexStart != null) { + result + ..add(r'indexStart') + ..add(serializers.serialize(object.indexStart, + specifiedType: const FullType(int))); + } + if (object.indexEnd != null) { + result + ..add(r'indexEnd') + ..add(serializers.serialize(object.indexEnd, + specifiedType: const FullType(int))); + } + if (object.width != null) { + result + ..add(r'width') + ..add(serializers.serialize(object.width, + specifiedType: const FullType(int))); + } + if (object.height != null) { + result + ..add(r'height') + ..add(serializers.serialize(object.height, + specifiedType: const FullType(int))); + } + if (object.fps != null) { + result + ..add(r'fps') + ..add(serializers.serialize(object.fps, + specifiedType: const FullType(int))); + } + return result; + } + + @override + Stream deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = StreamBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final dynamic value = iterator.current; + switch (key) { + case r'url': + result.url = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'format': + result.format = serializers.deserialize(value, + specifiedType: const FullType(StreamFormatEnum)) as StreamFormatEnum; + break; + case r'quality': + result.quality = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'mimeType': + result.mimeType = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'codec': + result.codec = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'videoOnly': + result.videoOnly = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; + case r'bitrate': + result.bitrate = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'initStart': + result.initStart = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'initEnd': + result.initEnd = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'indexStart': + result.indexStart = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'indexEnd': + result.indexEnd = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'width': + result.width = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'height': + result.height = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'fps': + result.fps = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + } + } + return result.build(); + } +} + +class StreamFormatEnum extends EnumClass { + + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'MPEG_4') + static const StreamFormatEnum mPEG4 = _$streamFormatEnum_mPEG4; + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'v3GPP') + static const StreamFormatEnum v3GPP = _$streamFormatEnum_v3GPP; + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'WEBM') + static const StreamFormatEnum WEBM = _$streamFormatEnum_WEBM; + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'M4A') + static const StreamFormatEnum m4A = _$streamFormatEnum_m4A; + /// The format of the stream. + @BuiltValueEnumConst(wireName: r'WEBMA_OPUS') + static const StreamFormatEnum WEBMA_OPUS = _$streamFormatEnum_WEBMA_OPUS; + + static Serializer get serializer => _$streamFormatEnumSerializer; + + const StreamFormatEnum._(String name): super(name); + + static BuiltSet get values => _$streamFormatEnumValues; + static StreamFormatEnum valueOf(String name) => _$streamFormatEnumValueOf(name); +} + diff --git a/lib/model/stream_item.dart b/lib/model/stream_item.dart new file mode 100644 index 0000000..7a6ad54 --- /dev/null +++ b/lib/model/stream_item.dart @@ -0,0 +1,208 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'stream_item.g.dart'; + +abstract class StreamItem implements Built { + + /// The duration of the video in seconds. + @BuiltValueField(wireName: r'duration') + int get duration; + + /// The thumbnail of the video. + @BuiltValueField(wireName: r'thumbnail') + String get thumbnail; + + /// The title of the video. + @BuiltValueField(wireName: r'title') + String get title; + + /// The date in unix epoch the video was uploaded. + @nullable + @BuiltValueField(wireName: r'uploaded') + int get uploaded; + + /// The relative date the video was uploaded on. + @nullable + @BuiltValueField(wireName: r'uploadedDate') + String get uploadedDate; + + /// The avatar of the channel of the video. + @nullable + @BuiltValueField(wireName: r'uploaderAvatar') + String get uploaderAvatar; + + /// The name of the channel of the video. + @nullable + @BuiltValueField(wireName: r'uploaderName') + String get uploaderName; + + /// The relative URL of the channel of the video. + @nullable + @BuiltValueField(wireName: r'uploaderUrl') + String get uploaderUrl; + + /// Whether or not the channel has a verified badge. + @nullable + @BuiltValueField(wireName: r'uploaderVerified') + bool get uploaderVerified; + + /// The relative URL to the video. + @BuiltValueField(wireName: r'url') + String get url; + + /// The number of views the video has. + @nullable + @BuiltValueField(wireName: r'views') + int get views; + + StreamItem._(); + + static void _initializeBuilder(StreamItemBuilder b) => b; + + factory StreamItem([void updates(StreamItemBuilder b)]) = _$StreamItem; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$StreamItemSerializer(); +} + +class _$StreamItemSerializer implements StructuredSerializer { + + @override + final Iterable types = const [StreamItem, _$StreamItem]; + @override + final String wireName = r'StreamItem'; + + @override + Iterable serialize(Serializers serializers, StreamItem object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + result + ..add(r'duration') + ..add(serializers.serialize(object.duration, + specifiedType: const FullType(int))); + result + ..add(r'thumbnail') + ..add(serializers.serialize(object.thumbnail, + specifiedType: const FullType(String))); + result + ..add(r'title') + ..add(serializers.serialize(object.title, + specifiedType: const FullType(String))); + if (object.uploaded != null) { + result + ..add(r'uploaded') + ..add(serializers.serialize(object.uploaded, + specifiedType: const FullType(int))); + } + if (object.uploadedDate != null) { + result + ..add(r'uploadedDate') + ..add(serializers.serialize(object.uploadedDate, + specifiedType: const FullType(String))); + } + if (object.uploaderAvatar != null) { + result + ..add(r'uploaderAvatar') + ..add(serializers.serialize(object.uploaderAvatar, + specifiedType: const FullType(String))); + } + if (object.uploaderName != null) { + result + ..add(r'uploaderName') + ..add(serializers.serialize(object.uploaderName, + specifiedType: const FullType(String))); + } + if (object.uploaderUrl != null) { + result + ..add(r'uploaderUrl') + ..add(serializers.serialize(object.uploaderUrl, + specifiedType: const FullType(String))); + } + if (object.uploaderVerified != null) { + result + ..add(r'uploaderVerified') + ..add(serializers.serialize(object.uploaderVerified, + specifiedType: const FullType(bool))); + } + result + ..add(r'url') + ..add(serializers.serialize(object.url, + specifiedType: const FullType(String))); + if (object.views != null) { + result + ..add(r'views') + ..add(serializers.serialize(object.views, + specifiedType: const FullType(int))); + } + return result; + } + + @override + StreamItem deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = StreamItemBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final dynamic value = iterator.current; + switch (key) { + case r'duration': + result.duration = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'thumbnail': + result.thumbnail = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'title': + result.title = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploaded': + result.uploaded = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'uploadedDate': + result.uploadedDate = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploaderAvatar': + result.uploaderAvatar = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploaderName': + result.uploaderName = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploaderUrl': + result.uploaderUrl = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploaderVerified': + result.uploaderVerified = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; + case r'url': + result.url = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'views': + result.views = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + } + } + return result.build(); + } +} + diff --git a/lib/model/subtitle.dart b/lib/model/subtitle.dart new file mode 100644 index 0000000..61a8d84 --- /dev/null +++ b/lib/model/subtitle.dart @@ -0,0 +1,115 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'subtitle.g.dart'; + +abstract class Subtitle implements Built { + + /// Whether the subtitle is auto generated. + @nullable + @BuiltValueField(wireName: r'autoGenerated') + bool get autoGenerated; + + /// The language code of the subtitle. + @nullable + @BuiltValueField(wireName: r'code') + String get code; + + /// The mime type of the subtitle. + @nullable + @BuiltValueField(wireName: r'mimeType') + String get mimeType; + + /// The URL of the subtitle. + @nullable + @BuiltValueField(wireName: r'url') + String get url; + + Subtitle._(); + + static void _initializeBuilder(SubtitleBuilder b) => b; + + factory Subtitle([void updates(SubtitleBuilder b)]) = _$Subtitle; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$SubtitleSerializer(); +} + +class _$SubtitleSerializer implements StructuredSerializer { + + @override + final Iterable types = const [Subtitle, _$Subtitle]; + @override + final String wireName = r'Subtitle'; + + @override + Iterable serialize(Serializers serializers, Subtitle object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + if (object.autoGenerated != null) { + result + ..add(r'autoGenerated') + ..add(serializers.serialize(object.autoGenerated, + specifiedType: const FullType(bool))); + } + if (object.code != null) { + result + ..add(r'code') + ..add(serializers.serialize(object.code, + specifiedType: const FullType(String))); + } + if (object.mimeType != null) { + result + ..add(r'mimeType') + ..add(serializers.serialize(object.mimeType, + specifiedType: const FullType(String))); + } + if (object.url != null) { + result + ..add(r'url') + ..add(serializers.serialize(object.url, + specifiedType: const FullType(String))); + } + return result; + } + + @override + Subtitle deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = SubtitleBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final dynamic value = iterator.current; + switch (key) { + case r'autoGenerated': + result.autoGenerated = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; + case r'code': + result.code = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'mimeType': + result.mimeType = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'url': + result.url = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + } + } + return result.build(); + } +} + diff --git a/lib/model/video_info.dart b/lib/model/video_info.dart new file mode 100644 index 0000000..b30006a --- /dev/null +++ b/lib/model/video_info.dart @@ -0,0 +1,355 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +import 'package:built_collection/built_collection.dart'; +import 'package:piped_api/model/stream_item.dart'; +import 'package:piped_api/model/subtitle.dart'; +import 'package:piped_api/model/stream.dart'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'video_info.g.dart'; + +abstract class VideoInfo implements Built { + + @nullable + @BuiltValueField(wireName: r'audioStreams') + BuiltList get audioStreams; + + @nullable + @BuiltValueField(wireName: r'videoStreams') + BuiltList get videoStreams; + + /// The video's description. + @nullable + @BuiltValueField(wireName: r'description') + String get description; + + /// The number of dislikes the video has. + @nullable + @BuiltValueField(wireName: r'dislikes') + int get dislikes; + + /// The video's duration in seconds. + @nullable + @BuiltValueField(wireName: r'duration') + int get duration; + + /// The stream of the video in a HLS manifest. + @nullable + @BuiltValueField(wireName: r'hls') + String get hls; + + /// The LBRY ID of the video. + @nullable + @BuiltValueField(wireName: r'lbryId') + String get lbryId; + + /// The number of likes the video has. + @nullable + @BuiltValueField(wireName: r'likes') + int get likes; + + /// Whether the video is a livestream. + @nullable + @BuiltValueField(wireName: r'livestream') + bool get livestream; + + /// The base URL of the backend instance's proxy. + @nullable + @BuiltValueField(wireName: r'proxyUrl') + String get proxyUrl; + + @nullable + @BuiltValueField(wireName: r'subtitles') + BuiltList get subtitles; + + /// The URL of the DASH manifest. + @nullable + @BuiltValueField(wireName: r'dash') + String get dash; + + /// The URL of the video's thumbnail. + @nullable + @BuiltValueField(wireName: r'thumbnailUrl') + String get thumbnailUrl; + + /// The video's title. + @nullable + @BuiltValueField(wireName: r'title') + String get title; + + /// The date the video was uploaded. + @nullable + @BuiltValueField(wireName: r'uploadDate') + String get uploadDate; + + /// The video's uploader. + @nullable + @BuiltValueField(wireName: r'uploader') + String get uploader; + + /// The URL of the video's uploader's avatar. + @nullable + @BuiltValueField(wireName: r'uploaderAvatar') + String get uploaderAvatar; + + /// The relative URL of the video's uploader. + @nullable + @BuiltValueField(wireName: r'uploaderUrl') + String get uploaderUrl; + + /// Whether the video's uploader is verified. + @nullable + @BuiltValueField(wireName: r'uploaderVerified') + bool get uploaderVerified; + + @nullable + @BuiltValueField(wireName: r'relatedStreams') + BuiltList get relatedStreams; + + VideoInfo._(); + + static void _initializeBuilder(VideoInfoBuilder b) => b; + + factory VideoInfo([void updates(VideoInfoBuilder b)]) = _$VideoInfo; + + @BuiltValueSerializer(custom: true) + static Serializer get serializer => _$VideoInfoSerializer(); +} + +class _$VideoInfoSerializer implements StructuredSerializer { + + @override + final Iterable types = const [VideoInfo, _$VideoInfo]; + @override + final String wireName = r'VideoInfo'; + + @override + Iterable serialize(Serializers serializers, VideoInfo object, + {FullType specifiedType = FullType.unspecified}) { + final result = []; + if (object.audioStreams != null) { + result + ..add(r'audioStreams') + ..add(serializers.serialize(object.audioStreams, + specifiedType: const FullType(BuiltList, [FullType(Stream)]))); + } + if (object.videoStreams != null) { + result + ..add(r'videoStreams') + ..add(serializers.serialize(object.videoStreams, + specifiedType: const FullType(BuiltList, [FullType(Stream)]))); + } + if (object.description != null) { + result + ..add(r'description') + ..add(serializers.serialize(object.description, + specifiedType: const FullType(String))); + } + if (object.dislikes != null) { + result + ..add(r'dislikes') + ..add(serializers.serialize(object.dislikes, + specifiedType: const FullType(int))); + } + if (object.duration != null) { + result + ..add(r'duration') + ..add(serializers.serialize(object.duration, + specifiedType: const FullType(int))); + } + if (object.hls != null) { + result + ..add(r'hls') + ..add(serializers.serialize(object.hls, + specifiedType: const FullType(String))); + } + if (object.lbryId != null) { + result + ..add(r'lbryId') + ..add(serializers.serialize(object.lbryId, + specifiedType: const FullType(String))); + } + if (object.likes != null) { + result + ..add(r'likes') + ..add(serializers.serialize(object.likes, + specifiedType: const FullType(int))); + } + if (object.livestream != null) { + result + ..add(r'livestream') + ..add(serializers.serialize(object.livestream, + specifiedType: const FullType(bool))); + } + if (object.proxyUrl != null) { + result + ..add(r'proxyUrl') + ..add(serializers.serialize(object.proxyUrl, + specifiedType: const FullType(String))); + } + if (object.subtitles != null) { + result + ..add(r'subtitles') + ..add(serializers.serialize(object.subtitles, + specifiedType: const FullType(BuiltList, [FullType(Subtitle)]))); + } + if (object.dash != null) { + result + ..add(r'dash') + ..add(serializers.serialize(object.dash, + specifiedType: const FullType(String))); + } + if (object.thumbnailUrl != null) { + result + ..add(r'thumbnailUrl') + ..add(serializers.serialize(object.thumbnailUrl, + specifiedType: const FullType(String))); + } + if (object.title != null) { + result + ..add(r'title') + ..add(serializers.serialize(object.title, + specifiedType: const FullType(String))); + } + if (object.uploadDate != null) { + result + ..add(r'uploadDate') + ..add(serializers.serialize(object.uploadDate, + specifiedType: const FullType(String))); + } + if (object.uploader != null) { + result + ..add(r'uploader') + ..add(serializers.serialize(object.uploader, + specifiedType: const FullType(String))); + } + if (object.uploaderAvatar != null) { + result + ..add(r'uploaderAvatar') + ..add(serializers.serialize(object.uploaderAvatar, + specifiedType: const FullType(String))); + } + if (object.uploaderUrl != null) { + result + ..add(r'uploaderUrl') + ..add(serializers.serialize(object.uploaderUrl, + specifiedType: const FullType(String))); + } + if (object.uploaderVerified != null) { + result + ..add(r'uploaderVerified') + ..add(serializers.serialize(object.uploaderVerified, + specifiedType: const FullType(bool))); + } + if (object.relatedStreams != null) { + result + ..add(r'relatedStreams') + ..add(serializers.serialize(object.relatedStreams, + specifiedType: const FullType(BuiltList, [FullType(StreamItem)]))); + } + return result; + } + + @override + VideoInfo deserialize(Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = VideoInfoBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final dynamic value = iterator.current; + switch (key) { + case r'audioStreams': + result.audioStreams.replace(serializers.deserialize(value, + specifiedType: const FullType(BuiltList, [FullType(Stream)])) as BuiltList); + break; + case r'videoStreams': + result.videoStreams.replace(serializers.deserialize(value, + specifiedType: const FullType(BuiltList, [FullType(Stream)])) as BuiltList); + break; + case r'description': + result.description = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'dislikes': + result.dislikes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'duration': + result.duration = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'hls': + result.hls = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'lbryId': + result.lbryId = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'likes': + result.likes = serializers.deserialize(value, + specifiedType: const FullType(int)) as int; + break; + case r'livestream': + result.livestream = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; + case r'proxyUrl': + result.proxyUrl = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'subtitles': + result.subtitles.replace(serializers.deserialize(value, + specifiedType: const FullType(BuiltList, [FullType(Subtitle)])) as BuiltList); + break; + case r'dash': + result.dash = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'thumbnailUrl': + result.thumbnailUrl = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'title': + result.title = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploadDate': + result.uploadDate = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploader': + result.uploader = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploaderAvatar': + result.uploaderAvatar = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploaderUrl': + result.uploaderUrl = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case r'uploaderVerified': + result.uploaderVerified = serializers.deserialize(value, + specifiedType: const FullType(bool)) as bool; + break; + case r'relatedStreams': + result.relatedStreams.replace(serializers.deserialize(value, + specifiedType: const FullType(BuiltList, [FullType(StreamItem)])) as BuiltList); + break; + } + } + return result.build(); + } +} + diff --git a/lib/serializers.dart b/lib/serializers.dart new file mode 100644 index 0000000..3b6c275 --- /dev/null +++ b/lib/serializers.dart @@ -0,0 +1,44 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.7 + +// ignore_for_file: unused_import + +library serializers; + +import 'package:built_value/iso_8601_date_time_serializer.dart'; +import 'package:built_value/serializer.dart'; +import 'package:built_collection/built_collection.dart'; +import 'package:built_value/json_object.dart'; +import 'package:built_value/standard_json_plugin.dart'; + +import 'package:piped_api/model/channel_info.dart'; +import 'package:piped_api/model/exception_error.dart'; +import 'package:piped_api/model/regions.dart'; +import 'package:piped_api/model/stream.dart'; +import 'package:piped_api/model/stream_item.dart'; +import 'package:piped_api/model/subtitle.dart'; +import 'package:piped_api/model/video_info.dart'; + +part 'serializers.g.dart'; + +@SerializersFor(const [ + ChannelInfo, + ExceptionError, + Regions, + Stream, + StreamItem, + Subtitle, + VideoInfo, +]) +Serializers serializers = (_$serializers.toBuilder() + ..addBuilderFactory( + const FullType(BuiltList, [FullType(StreamItem)]), + () => ListBuilder(), + ) + ..add(Iso8601DateTimeSerializer())) + .build(); + +Serializers standardSerializers = + (serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build(); diff --git a/pubspec.yaml b/pubspec.yaml index 56e8c04..0d528e0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,14 +4,14 @@ description: Automatically generated OpenAPI bindings for Piped. homepage: homepage environment: - sdk: '>=2.12.0 <3.0.0' + sdk: '>=2.7.0 <3.0.0' dependencies: - dio: '>=4.0.0 <5.0.0' - built_value: '>=8.1.0 <9.0.0' - built_collection: '>=5.1.0 <6.0.0' + dio: '^3.0.9' + built_value: '>=7.1.0 <8.0.0' + built_collection: '>=4.3.2 <5.0.0' dev_dependencies: - built_value_generator: '>=8.1.0 <9.0.0' + built_value_generator: '>=7.1.0 <8.0.0' build_runner: any - test: '>=1.16.0 <1.17.0' + test: '>=1.3.0 <1.16.0'