Skip to content

Commit

Permalink
Fix changing queue item stream, refactor queue streams (only one stre…
Browse files Browse the repository at this point in the history
…am per track)
  • Loading branch information
nukeop committed May 2, 2022
1 parent 0c88cff commit 4906558
Show file tree
Hide file tree
Showing 29 changed files with 468 additions and 570 deletions.
8 changes: 4 additions & 4 deletions packages/app/app/actions/favorites.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import _, { flow, unionWith } from 'lodash';
import _, { flow, omit, unionWith } from 'lodash';
import { store, Track } from '@nuclear/core';
import { areTracksEqualByName, getTrackItem, removeTrackStreamUrl } from '@nuclear/ui';
import { areTracksEqualByName, getTrackItem } from '@nuclear/ui';

import { safeAddUuid } from './helpers';
import { createStandardAction } from 'typesafe-actions';
Expand All @@ -25,11 +25,11 @@ export function readFavorites() {
}

export function addFavoriteTrack(track) {
const clonedTrack = flow(safeAddUuid, getTrackItem, removeTrackStreamUrl)(track);
const clonedTrack = flow(safeAddUuid, getTrackItem)(track);

const favorites = store.get('favorites');
const filteredTracks = favorites.tracks.filter(t => !areTracksEqualByName(t, track));
favorites.tracks = [...filteredTracks, clonedTrack];
favorites.tracks = [...filteredTracks, omit(clonedTrack, 'stream')];

store.set('favorites', favorites);

Expand Down
117 changes: 58 additions & 59 deletions packages/app/app/actions/queue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import { Track } from '@nuclear/ui/lib/types';

import { safeAddUuid } from './helpers';
import { pausePlayback, startPlayback } from './player';
import { QueueItem } from '../reducers/queue';
import { QueueItem, TrackStream } from '../reducers/queue';
import { RootState } from '../reducers';
import { createStandardAction } from 'typesafe-actions';
import { getTrackArtist } from '@nuclear/ui';

export const QUEUE_DROP = 'QUEUE_DROP';
export const ADD_QUEUE_ITEM = 'ADD_QUEUE_ITEM';
Expand All @@ -21,6 +23,7 @@ export const SELECT_SONG = 'SELECT_SONG';
export const REPOSITION_SONG = 'REPOSITION_SONG';
export const STREAM_FAILED = 'STREAM_FAILED';
export const CHANGE_TRACK_STREAM = 'CHANGE_TRACK_STREAM';
export const ADD_NEW_STREAM = 'ADD_NEW_STREAM';

export const toQueueItem = (track: Track): QueueItem => ({
...track,
Expand All @@ -39,39 +42,13 @@ const getSelectedStreamProvider = (getState) => {
return _.find(streamProviders, { sourceName: selected.streamProviders });
};

const getTrackStream = async (
export const getTrackStream = async (
track: Track,
selectedStreamProvider: StreamProvider,
streamProviders: StreamProvider[]
) => {
let streamData;
if (track?.streams && track.streams.length) {
const matchSelectedProvider = track.streams.find(
(s) => s.source === selectedStreamProvider.sourceName
);

if (matchSelectedProvider && matchSelectedProvider.id) {
streamData = await selectedStreamProvider.getStreamForId(
matchSelectedProvider.id
);
} else {
const firstKnownProvider = streamProviders.find(
(s) => s.sourceName === track.streams[0].source
);
streamData = await firstKnownProvider.getStreamForId(track.streams[0].id);
}
}

if (!streamData) {
streamData = await selectedStreamProvider.search({
artist:
typeof track.artist === 'string' ? track.artist : track.artist.name,
track: track.name
});
}

return streamData;
};
selectedStreamProvider: StreamProvider
) => selectedStreamProvider.search({
artist: getTrackArtist(track),
track: track.name
});

const addQueueItem = (item: QueueItem) => ({
type: ADD_QUEUE_ITEM,
Expand All @@ -95,10 +72,7 @@ export const addToQueue =
item.loading = !item.local;

const {
connectivity,
plugin: {
plugins: { streamProviders }
}
connectivity
} = getState();
const isAbleToAdd = (!connectivity && item.local) || connectivity;

Expand All @@ -109,13 +83,8 @@ export const addToQueue =
const selectedStreamProvider = getSelectedStreamProvider(getState);
try {
const streamData = await getTrackStream(
{
artist: item.artist,
name: item.name,
streams: item.streams
},
selectedStreamProvider,
streamProviders
item,
selectedStreamProvider
);

if (streamData === undefined) {
Expand All @@ -126,7 +95,7 @@ export const addToQueue =
...item,
loading: false,
error: false,
streams: [streamData]
stream: streamData
})
);
}
Expand Down Expand Up @@ -175,7 +144,6 @@ export function rerollTrack(track: QueueItem) {
return async (dispatch, getState) => {
const { plugin }: RootState = getState();
const selectedStreamProvider = _.find(plugin.plugins.streamProviders, { sourceName: plugin.selected.streamProviders });
const selectedStream = track.streams.find(stream => stream.source === selectedStreamProvider.sourceName);

dispatch(updateQueueItem({
...track,
Expand All @@ -186,19 +154,15 @@ export function rerollTrack(track: QueueItem) {
const newStream = await selectedStreamProvider
.getAlternateStream(
{ artist: isString(track.artist) ? track.artist : track.artist.name, track: track.name },
selectedStream
track.stream
);

const streams = _.map(track.streams, (stream) => {
return stream.source === newStream?.source ? newStream : stream;
});

dispatch(
updateQueueItem({
...track,
loading: false,
error: false,
streams
stream: newStream
})
);
};
Expand Down Expand Up @@ -280,15 +244,50 @@ export const streamFailed = () => ({
type: STREAM_FAILED
});

export function changeTrackStream(track, stream) {
return {
type: CHANGE_TRACK_STREAM,
payload: {
track,
stream
export const changeTrackStream = createStandardAction(CHANGE_TRACK_STREAM)<{
item: QueueItem;
stream: TrackStream;
}>();

export const switchStreamProvider = ({
item,
streamProviderName
}: {
item: QueueItem;
streamProviderName: string;
}) => {
return async (dispatch, getState) => {
const {
plugin: {
plugins: { streamProviders }
}
}: RootState = getState();

dispatch(updateQueueItem({
...item,
loading: true,
error: false
}));

const streamProvider = streamProviders.find(provider => provider.sourceName === streamProviderName);

if (item && streamProvider) {
const streamData = await getTrackStream(
item,
streamProvider
);

if (streamData !== undefined) {
dispatch(
changeTrackStream({
item,
stream: streamData
})
);
}
}
};
}
};

export const queueDrop = (paths) => ({
type: QUEUE_DROP,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ import cx from 'classnames';
import { Dropdown, Icon } from 'semantic-ui-react';
import { useTranslation } from 'react-i18next';
import { isArtistObject, Playlist, PlaylistHelper } from '@nuclear/core';
import { getTrackArtist, getTrackTitle } from '@nuclear/ui';
import { getTrackArtist } from '@nuclear/ui';
import { Track } from '@nuclear/ui/lib/types';

import styles from './styles.scss';
import { normalizeTrack } from '../../../../utils';

export const addTrackToPlaylist = (updatePlaylist, playlist: Playlist, track: Track) => {
if (track && track.name) {
Expand Down Expand Up @@ -61,14 +62,7 @@ export const QueueMenuMore: React.FC<QueueMenuMoreProps> = ({

const onAddFavoriteTrack = useCallback(() => {
if (currentItem.name) {
addFavoriteTrack({
artist: {
name: getTrackArtist(currentItem)
},
name: getTrackTitle(currentItem),
image: [{'#text': currentItem.thumbnail}],
streams: currentItem.streams
});
addFavoriteTrack(normalizeTrack(currentItem));
}
}, [addFavoriteTrack, currentItem]);

Expand Down
115 changes: 0 additions & 115 deletions packages/app/app/components/PlayQueue/QueueMenu/index.js

This file was deleted.

Loading

0 comments on commit 4906558

Please sign in to comment.