Coverage for api/docs/audio_docs.py: 100%
18 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 06:14 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 06:14 +0000
1from rest_framework.exceptions import (
2 AuthenticationFailed,
3 NotAuthenticated,
4 NotFound,
5 ValidationError,
6)
8from drf_spectacular.utils import OpenApiResponse, extend_schema
10from api.constants.parameters import COLLECTION, TAG
11from api.docs.base_docs import (
12 NON_FILTER_FIELDS,
13 SEARCH_DESCRIPTION,
14 custom_extend_schema,
15 fields_to_md,
16)
17from api.examples import (
18 audio_complain_201_example,
19 audio_complain_curl,
20 audio_detail_200_example,
21 audio_detail_404_example,
22 audio_detail_curl,
23 audio_related_200_example,
24 audio_related_404_example,
25 audio_related_curl,
26 audio_search_200_example,
27 audio_search_400_example,
28 audio_search_list_curl,
29 audio_stats_200_example,
30 audio_stats_curl,
31 audio_waveform_200_example,
32 audio_waveform_404_example,
33 audio_waveform_curl,
34)
35from api.serializers.audio_serializers import (
36 AudioReportRequestSerializer,
37 AudioSearchRequestSerializer,
38 AudioSerializer,
39 AudioWaveformSerializer,
40)
41from api.serializers.media_serializers import MediaThumbnailRequestSerializer
42from api.serializers.source_serializers import SourceSerializer
45serializer = AudioSearchRequestSerializer(context={"media_type": "audio"})
46audio_filter_fields = fields_to_md(
47 [f for f in serializer.field_names if f not in NON_FILTER_FIELDS]
48)
50audio_search_description = SEARCH_DESCRIPTION.format(
51 filter_fields=audio_filter_fields,
52 media_type="audio files",
53 collection_param=COLLECTION,
54 tag_param=TAG,
55)
57search = custom_extend_schema(
58 desc=audio_search_description,
59 params=serializer,
60 res={
61 200: (AudioSerializer, audio_search_200_example["results"][0]),
62 400: (ValidationError, audio_search_400_example),
63 401: (NotAuthenticated, None),
64 },
65 eg=[audio_search_list_curl],
66 external_docs={
67 "description": "Openverse Syntax Guide",
68 "url": "https://openverse.org/search-help",
69 },
70)
72stats = custom_extend_schema(
73 desc=f"""
74 Get a list of all content sources and their respective number of
75 audio files in the Openverse catalog.
77 By using this endpoint, you can obtain info about content sources such
78 as {fields_to_md(SourceSerializer.Meta.fields)}.""",
79 res={
80 200: (SourceSerializer(many=True), audio_stats_200_example[0]),
81 401: (AuthenticationFailed, None),
82 },
83 eg=[audio_stats_curl],
84)
86detail = custom_extend_schema(
87 desc=f"""
88 Get the details of a specified audio track.
90 By using this endpoint, you can obtain info about audio files such as
91 {fields_to_md(AudioSerializer.Meta.fields)}""",
92 res={
93 200: (AudioSerializer, audio_detail_200_example),
94 401: (AuthenticationFailed, None),
95 404: (NotFound, audio_detail_404_example),
96 },
97 eg=[audio_detail_curl],
98)
100related = custom_extend_schema(
101 desc=f"""
102 Get related audio files for a specified audio track.
104 By using this endpoint, you can get the details of related audio such as
105 {fields_to_md(AudioSerializer.Meta.fields)}.""",
106 res={
107 200: (AudioSerializer(many=True), audio_related_200_example["results"][0]),
108 401: (AuthenticationFailed, None),
109 404: (NotFound, audio_related_404_example),
110 },
111 eg=[audio_related_curl],
112)
114report = custom_extend_schema(
115 res={
116 201: (AudioReportRequestSerializer, audio_complain_201_example),
117 400: (ValidationError, None),
118 401: (AuthenticationFailed, None),
119 404: (NotFound, None),
120 },
121 eg=[audio_complain_curl],
122)
124thumbnail = extend_schema(
125 parameters=[MediaThumbnailRequestSerializer],
126 responses={
127 200: OpenApiResponse(description="Thumbnail image"),
128 401: AuthenticationFailed,
129 },
130)
132waveform = custom_extend_schema(
133 res={
134 200: (AudioWaveformSerializer, audio_waveform_200_example),
135 401: (AuthenticationFailed, None),
136 404: (NotFound, audio_waveform_404_example),
137 },
138 eg=[audio_waveform_curl],
139)