1 from collections
import Counter
3 from mygpo
.cel
import celery
4 from mygpo
.core
.slugs
import get_duplicate_slugs
, EpisodeSlug
5 from mygpo
.maintenance
.merge
import PodcastMerger
6 from mygpo
.db
.couchdb
.podcast
import podcasts_by_id
7 from mygpo
.db
.couchdb
.episode
import episodes_for_podcast_uncached
9 from celery
.utils
.log
import get_task_logger
10 logger
= get_task_logger(__name__
)
14 def merge_podcasts(podcast_ids
, num_groups
):
15 """ Task to merge some podcasts"""
17 logger
.info('merging podcast ids %s', podcast_ids
)
19 podcasts
= podcasts_by_id(podcast_ids
)
21 logger
.info('merging podcasts %s', podcasts
)
25 pm
= PodcastMerger(podcasts
, actions
, num_groups
)
28 logger
.info('merging result: %s', actions
)
30 return actions
, podcast
34 def unify_slugs(podcast
):
35 """ Removes duplicate slugs of a podcast's episodes """
37 logger
.warn('unifying slugs for podcast %s', podcast
)
38 episodes
= episodes_for_podcast_uncached(podcast
)
39 logger
.info('found %d episodes', len(episodes
))
41 common_title
= podcast
.get_common_episode_title()
44 # get episodes with duplicate slugs
45 for slug
, dups
in get_duplicate_slugs(episodes
):
46 actions
['dup-slugs'] += 1
47 # and remove their slugs
48 logger
.info('Found %d duplicates for slug %s', len(dups
), slug
)
50 actions
['dup-episodes'] += 1
52 # check if we're removing the "main" slug
55 # if possible, replace it with a "merged" slug
57 dup
.slug
= dup
.merged_slugs
.pop()
58 actions
['replaced-with-merged'] += 1
59 logger
.info('Replacing slug with merged slug %s', dup
.slug
)
61 # try to find a new slug
63 dup
.slug
= EpisodeSlug(dup
, common_title
,
64 override_existing
=True).get_slug()
65 actions
['replaced-with-new'] += 1
66 logger
.info('Replacing slug with new slug %s', dup
.slug
)
68 # if the problematic slug is a merged one, remove it
69 if slug
in dup
.merged_slugs
:
70 actions
['removed-merged'] += 1
71 logger
.info('Removing merged slug %s', slug
)
72 dup
.merged_slugs
.remove(slug
)
76 return actions
, podcast