mirror of
https://github.com/hzrd149/nostrudel.git
synced 2025-09-27 12:07:43 +02:00
Add support for .mp3 and .wav urls
This commit is contained in:
5
.changeset/yellow-bugs-rest.md
Normal file
5
.changeset/yellow-bugs-rest.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"nostrudel": minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Add support for .mp3 and .wav urls
|
@@ -21,6 +21,7 @@ import { EmbedableContent, embedUrls } from "../../../helpers/embeds";
|
|||||||
import Timestamp from "../../timestamp";
|
import Timestamp from "../../timestamp";
|
||||||
import { CodeIcon } from "../../icons";
|
import { CodeIcon } from "../../icons";
|
||||||
import NoteDebugModal from "../../debug-modals/note-debug-modal";
|
import NoteDebugModal from "../../debug-modals/note-debug-modal";
|
||||||
|
import { renderAudioUrl } from "../../embed-types/audio";
|
||||||
|
|
||||||
export default function EmbeddedUnknown({ event, ...props }: Omit<CardProps, "children"> & { event: NostrEvent }) {
|
export default function EmbeddedUnknown({ event, ...props }: Omit<CardProps, "children"> & { event: NostrEvent }) {
|
||||||
const debugModal = useDisclosure();
|
const debugModal = useDisclosure();
|
||||||
@@ -34,7 +35,7 @@ export default function EmbeddedUnknown({ event, ...props }: Omit<CardProps, "ch
|
|||||||
jsx = embedNostrHashtags(jsx, event);
|
jsx = embedNostrHashtags(jsx, event);
|
||||||
jsx = embedEmoji(jsx, event);
|
jsx = embedEmoji(jsx, event);
|
||||||
|
|
||||||
jsx = embedUrls(jsx, [renderImageUrl, renderVideoUrl, renderGenericUrl]);
|
jsx = embedUrls(jsx, [renderImageUrl, renderVideoUrl, renderAudioUrl, renderGenericUrl]);
|
||||||
|
|
||||||
return jsx;
|
return jsx;
|
||||||
}, [event.content, alt]);
|
}, [event.content, alt]);
|
||||||
|
20
src/components/embed-types/audio.tsx
Normal file
20
src/components/embed-types/audio.tsx
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import styled from "@emotion/styled";
|
||||||
|
import { isAudioURL } from "../../helpers/url";
|
||||||
|
|
||||||
|
const StyledAudio = styled.audio`
|
||||||
|
max-width: 30rem;
|
||||||
|
max-height: 20rem;
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
`;
|
||||||
|
|
||||||
|
export function renderAudioUrl(match: URL) {
|
||||||
|
if (!isAudioURL(match)) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<StyledAudio controls>
|
||||||
|
<source src={match.toString()} />
|
||||||
|
</StyledAudio>
|
||||||
|
);
|
||||||
|
}
|
@@ -30,6 +30,7 @@ import {
|
|||||||
} from "../embed-types";
|
} from "../embed-types";
|
||||||
import { LightboxProvider } from "../lightbox-provider";
|
import { LightboxProvider } from "../lightbox-provider";
|
||||||
import { renderModelUrl } from "../embed-types/model";
|
import { renderModelUrl } from "../embed-types/model";
|
||||||
|
import { renderAudioUrl } from "../embed-types/audio";
|
||||||
|
|
||||||
function buildContents(event: NostrEvent | DraftNostrEvent, simpleLinks = false) {
|
function buildContents(event: NostrEvent | DraftNostrEvent, simpleLinks = false) {
|
||||||
let content: EmbedableContent = [event.content.trim()];
|
let content: EmbedableContent = [event.content.trim()];
|
||||||
@@ -52,6 +53,7 @@ function buildContents(event: NostrEvent | DraftNostrEvent, simpleLinks = false)
|
|||||||
renderSoundCloudUrl,
|
renderSoundCloudUrl,
|
||||||
renderImageUrl,
|
renderImageUrl,
|
||||||
renderVideoUrl,
|
renderVideoUrl,
|
||||||
|
renderAudioUrl,
|
||||||
renderModelUrl,
|
renderModelUrl,
|
||||||
simpleLinks ? renderGenericUrl : renderOpenGraphUrl,
|
simpleLinks ? renderGenericUrl : renderOpenGraphUrl,
|
||||||
]);
|
]);
|
||||||
|
@@ -4,6 +4,7 @@ export const convertToUrl = (url: string | URL) => (url instanceof URL ? url : n
|
|||||||
|
|
||||||
export const IMAGE_EXT = [".svg", ".gif", ".png", ".jpg", ".jpeg", ".webp", ".avif"];
|
export const IMAGE_EXT = [".svg", ".gif", ".png", ".jpg", ".jpeg", ".webp", ".avif"];
|
||||||
export const VIDEO_EXT = [".mp4", ".mkv", ".webm", ".mov"];
|
export const VIDEO_EXT = [".mp4", ".mkv", ".webm", ".mov"];
|
||||||
|
export const AUDIO_EXT = [".mp3", ".wav", ".ogg", ".aac"];
|
||||||
|
|
||||||
export function isMediaURL(url: string | URL) {
|
export function isMediaURL(url: string | URL) {
|
||||||
return isImageURL(url) || isVideoURL(url);
|
return isImageURL(url) || isVideoURL(url);
|
||||||
@@ -16,6 +17,10 @@ export function isVideoURL(url: string | URL) {
|
|||||||
const u = new URL(url);
|
const u = new URL(url);
|
||||||
return VIDEO_EXT.some((ext) => u.pathname.endsWith(ext));
|
return VIDEO_EXT.some((ext) => u.pathname.endsWith(ext));
|
||||||
}
|
}
|
||||||
|
export function isAudioURL(url: string | URL) {
|
||||||
|
const u = new URL(url);
|
||||||
|
return AUDIO_EXT.some((ext) => u.pathname.endsWith(ext));
|
||||||
|
}
|
||||||
|
|
||||||
export function normalizeRelayUrl(relayUrl: string) {
|
export function normalizeRelayUrl(relayUrl: string) {
|
||||||
const url = new URL(relayUrl);
|
const url = new URL(relayUrl);
|
||||||
|
@@ -259,7 +259,7 @@ relayScoreboardService.loadStats();
|
|||||||
|
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
relayScoreboardService.saveStats();
|
relayScoreboardService.saveStats();
|
||||||
}, 1000 * 5);
|
}, 1000 * 30);
|
||||||
|
|
||||||
if (import.meta.env.DEV) {
|
if (import.meta.env.DEV) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
@@ -29,6 +29,7 @@ import {
|
|||||||
renderYoutubeUrl,
|
renderYoutubeUrl,
|
||||||
} from "../../../components/embed-types";
|
} from "../../../components/embed-types";
|
||||||
import { LightboxProvider } from "../../../components/lightbox-provider";
|
import { LightboxProvider } from "../../../components/lightbox-provider";
|
||||||
|
import { renderAudioUrl } from "../../../components/embed-types/audio";
|
||||||
|
|
||||||
const ChannelMessageContent = memo(({ message, children, ...props }: BoxProps & { message: NostrEvent }) => {
|
const ChannelMessageContent = memo(({ message, children, ...props }: BoxProps & { message: NostrEvent }) => {
|
||||||
const content = useMemo(() => {
|
const content = useMemo(() => {
|
||||||
@@ -52,6 +53,7 @@ const ChannelMessageContent = memo(({ message, children, ...props }: BoxProps &
|
|||||||
renderSoundCloudUrl,
|
renderSoundCloudUrl,
|
||||||
renderImageUrl,
|
renderImageUrl,
|
||||||
renderVideoUrl,
|
renderVideoUrl,
|
||||||
|
renderAudioUrl,
|
||||||
renderGenericUrl,
|
renderGenericUrl,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@@ -21,6 +21,7 @@ import {
|
|||||||
} from "../../../components/embed-types";
|
} from "../../../components/embed-types";
|
||||||
import { TrustProvider } from "../../../providers/local/trust";
|
import { TrustProvider } from "../../../providers/local/trust";
|
||||||
import { LightboxProvider } from "../../../components/lightbox-provider";
|
import { LightboxProvider } from "../../../components/lightbox-provider";
|
||||||
|
import { renderAudioUrl } from "../../../components/embed-types/audio";
|
||||||
|
|
||||||
export default function DirectMessageContent({
|
export default function DirectMessageContent({
|
||||||
event,
|
event,
|
||||||
@@ -45,6 +46,7 @@ export default function DirectMessageContent({
|
|||||||
renderSoundCloudUrl,
|
renderSoundCloudUrl,
|
||||||
renderImageUrl,
|
renderImageUrl,
|
||||||
renderVideoUrl,
|
renderVideoUrl,
|
||||||
|
renderAudioUrl,
|
||||||
renderGenericUrl,
|
renderGenericUrl,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user