LCOV - code coverage report
Current view: top level - lib/src/utils - uri_extension.dart (source / functions) Coverage Total Hit
Test: merged.info Lines: 48.9 % 47 23
Test Date: 2025-01-14 13:39:53 Functions: - 0 0

            Line data    Source code
       1              : /*
       2              :  *   Famedly Matrix SDK
       3              :  *   Copyright (C) 2019, 2020, 2021 Famedly GmbH
       4              :  *
       5              :  *   This program is free software: you can redistribute it and/or modify
       6              :  *   it under the terms of the GNU Affero General Public License as
       7              :  *   published by the Free Software Foundation, either version 3 of the
       8              :  *   License, or (at your option) any later version.
       9              :  *
      10              :  *   This program is distributed in the hope that it will be useful,
      11              :  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              :  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
      13              :  *   GNU Affero General Public License for more details.
      14              :  *
      15              :  *   You should have received a copy of the GNU Affero General Public License
      16              :  *   along with this program.  If not, see <https://www.gnu.org/licenses/>.
      17              :  */
      18              : 
      19              : import 'dart:core';
      20              : 
      21              : import 'package:matrix/src/client.dart';
      22              : 
      23              : extension MxcUriExtension on Uri {
      24              :   /// Transforms this `mxc://` Uri into a `http` resource, which can be used
      25              :   /// to download the content.
      26              :   ///
      27              :   /// Throws an exception if the scheme is not `mxc` or the homeserver is not
      28              :   /// set.
      29              :   ///
      30              :   /// Important! To use this link you have to set a http header like this:
      31              :   /// `headers: {"authorization": "Bearer ${client.accessToken}"}`
      32            4 :   Future<Uri> getDownloadUri(Client client) async {
      33              :     String uriPath;
      34              : 
      35            4 :     if (await client.authenticatedMediaSupported()) {
      36              :       uriPath =
      37           20 :           '_matrix/client/v1/media/download/$host${hasPort ? ':$port' : ''}$path';
      38              :     } else {
      39              :       uriPath =
      40           12 :           '_matrix/media/v3/download/$host${hasPort ? ':$port' : ''}$path';
      41              :     }
      42              : 
      43            4 :     return isScheme('mxc')
      44            4 :         ? client.homeserver != null
      45            8 :             ? client.homeserver?.resolve(uriPath) ?? Uri()
      46            0 :             : Uri()
      47            2 :         : Uri();
      48              :   }
      49              : 
      50              :   /// Transforms this `mxc://` Uri into a `http` resource, which can be used
      51              :   /// to download the content with the given `width` and
      52              :   /// `height`. `method` can be `ThumbnailMethod.crop` or
      53              :   /// `ThumbnailMethod.scale` and defaults to `ThumbnailMethod.scale`.
      54              :   /// If `animated` (default false) is set to true, an animated thumbnail is requested
      55              :   /// as per MSC2705. Thumbnails only animate if the media repository supports that.
      56              :   ///
      57              :   /// Throws an exception if the scheme is not `mxc` or the homeserver is not
      58              :   /// set.
      59              :   ///
      60              :   /// Important! To use this link you have to set a http header like this:
      61              :   /// `headers: {"authorization": "Bearer ${client.accessToken}"}`
      62            4 :   Future<Uri> getThumbnailUri(
      63              :     Client client, {
      64              :     num? width,
      65              :     num? height,
      66              :     ThumbnailMethod? method = ThumbnailMethod.crop,
      67              :     bool? animated = false,
      68              :   }) async {
      69            6 :     if (!isScheme('mxc')) return Uri();
      70            4 :     final homeserver = client.homeserver;
      71              :     if (homeserver == null) {
      72            0 :       return Uri();
      73              :     }
      74              : 
      75              :     String requestPath;
      76            4 :     if (await client.authenticatedMediaSupported()) {
      77              :       requestPath =
      78           20 :           '/_matrix/client/v1/media/thumbnail/$host${hasPort ? ':$port' : ''}$path';
      79              :     } else {
      80              :       requestPath =
      81           12 :           '/_matrix/media/v3/thumbnail/$host${hasPort ? ':$port' : ''}$path';
      82              :     }
      83              : 
      84            4 :     return Uri(
      85            4 :       scheme: homeserver.scheme,
      86            4 :       host: homeserver.host,
      87              :       path: requestPath,
      88            4 :       port: homeserver.port,
      89            4 :       queryParameters: {
      90           12 :         if (width != null) 'width': width.round().toString(),
      91           12 :         if (height != null) 'height': height.round().toString(),
      92           16 :         if (method != null) 'method': method.toString().split('.').last,
      93            8 :         if (animated != null) 'animated': animated.toString(),
      94              :       },
      95              :     );
      96              :   }
      97              : 
      98            0 :   @Deprecated('Use `getDownloadUri()` instead')
      99            0 :   Uri getDownloadLink(Client matrix) => isScheme('mxc')
     100            0 :       ? matrix.homeserver != null
     101            0 :           ? matrix.homeserver?.resolve(
     102            0 :                 '_matrix/media/v3/download/$host${hasPort ? ':$port' : ''}$path',
     103              :               ) ??
     104            0 :               Uri()
     105            0 :           : Uri()
     106            0 :       : Uri();
     107              : 
     108              :   /// Returns a scaled thumbnail link to this content with the given `width` and
     109              :   /// `height`. `method` can be `ThumbnailMethod.crop` or
     110              :   /// `ThumbnailMethod.scale` and defaults to `ThumbnailMethod.scale`.
     111              :   /// If `animated` (default false) is set to true, an animated thumbnail is requested
     112              :   /// as per MSC2705. Thumbnails only animate if the media repository supports that.
     113            0 :   @Deprecated('Use `getThumbnailUri()` instead')
     114              :   Uri getThumbnail(
     115              :     Client matrix, {
     116              :     num? width,
     117              :     num? height,
     118              :     ThumbnailMethod? method = ThumbnailMethod.crop,
     119              :     bool? animated = false,
     120              :   }) {
     121            0 :     if (!isScheme('mxc')) return Uri();
     122            0 :     final homeserver = matrix.homeserver;
     123              :     if (homeserver == null) {
     124            0 :       return Uri();
     125              :     }
     126            0 :     return Uri(
     127            0 :       scheme: homeserver.scheme,
     128            0 :       host: homeserver.host,
     129            0 :       path: '/_matrix/media/v3/thumbnail/$host${hasPort ? ':$port' : ''}$path',
     130            0 :       port: homeserver.port,
     131            0 :       queryParameters: {
     132            0 :         if (width != null) 'width': width.round().toString(),
     133            0 :         if (height != null) 'height': height.round().toString(),
     134            0 :         if (method != null) 'method': method.toString().split('.').last,
     135            0 :         if (animated != null) 'animated': animated.toString(),
     136              :       },
     137              :     );
     138              :   }
     139              : }
     140              : 
     141              : enum ThumbnailMethod { crop, scale }
        

Generated by: LCOV version 2.0-1