| /* |
| * Copyright 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.pump.provider; |
| |
| import android.net.Uri; |
| |
| import androidx.annotation.AnyThread; |
| import androidx.annotation.NonNull; |
| |
| import com.android.pump.util.Clog; |
| |
| import java.util.regex.MatchResult; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| @AnyThread |
| public final class Query { |
| private static final String TAG = Clog.tag(Query.class); |
| |
| private static final Pattern PATTERN_EPISODE = Pattern.compile( |
| "([^\\\\/]+?)(?:\\(((?:19|20)\\d{2})\\))?\\s*" + |
| "[Ss](\\d{1,2})[._x]?[Ee](\\d{1,2})(?!.*[Ss]\\d{1,2}[._x]?[Ee]\\d{1,2})"); |
| private static final Pattern PATTERN_MOVIE = Pattern.compile( |
| "([^\\\\/]+)\\(((?:19|20)\\d{2})\\)(?!.*\\((?:19|20)\\d{2}\\))"); |
| private static final Pattern PATTERN_CLEANUP = Pattern.compile("\\s+"); |
| |
| private final String mName; |
| private final int mYear; |
| private final int mSeason; |
| private final int mEpisode; |
| |
| private Query(String name) { |
| //Clog.i(TAG, "Query(" + name + ")"); |
| mName = name; |
| mYear = -1; |
| mSeason = -1; |
| mEpisode = -1; |
| } |
| |
| private Query(String name, int year) { |
| //Clog.i(TAG, "Query(" + name + ", " + year + ")"); |
| mName = name; |
| mYear = year; |
| mSeason = -1; |
| mEpisode = -1; |
| } |
| |
| private Query(String name, int season, int episode) { |
| //Clog.i(TAG, "Query(" + name + ", " + season + ", " + episode + ")"); |
| mName = name; |
| mYear = -1; |
| mSeason = season; |
| mEpisode = episode; |
| } |
| |
| private Query(String name, int year, int season, int episode) { |
| //Clog.i(TAG, "Query(" + name + ", " + year + ", " + season + ", " + episode + ")"); |
| mName = name; |
| mYear = year; |
| mSeason = season; |
| mEpisode = episode; |
| } |
| |
| public boolean isMovie() { |
| return hasYear() && !isEpisode(); |
| } |
| |
| public boolean isEpisode() { |
| return mSeason >= 0 && mEpisode >= 0; |
| } |
| |
| public @NonNull String getName() { |
| return mName; |
| } |
| |
| public boolean hasYear() { |
| return mYear >= 0; |
| } |
| |
| public int getYear() { |
| return mYear; |
| } |
| |
| public int getSeason() { |
| return mSeason; |
| } |
| |
| public int getEpisode() { |
| return mEpisode; |
| } |
| |
| public static @NonNull Query parse(@NonNull Uri uri) { |
| //Clog.i(TAG, "parse(" + uri + ")"); |
| String filePath = uri.getPath(); |
| Query query; |
| query = parseEpisode(filePath); |
| if (query == null) { |
| query = parseMovie(filePath); |
| } |
| if (query == null) { |
| query = new Query(uri.getLastPathSegment()); |
| } |
| return query; |
| } |
| |
| private static Query parseEpisode(String filePath) { |
| //Clog.i(TAG, "parseEpisode(" + filePath + ")"); |
| Matcher matcher = PATTERN_EPISODE.matcher(filePath); |
| if (matcher.find()) { |
| MatchResult matchResult = matcher.toMatchResult(); |
| if (matchResult.groupCount() == 4) { |
| String name = cleanup(matchResult.group(1)); |
| int year = matchResult.group(2) == null ? 0 : Integer.valueOf(matchResult.group(2)); |
| int season = Integer.valueOf(matchResult.group(3)); |
| int episode = Integer.valueOf(matchResult.group(4)); |
| //Clog.i(TAG, "name = " + name); |
| //if (year > 0) { |
| // Clog.i(TAG, "year = " + year); |
| //} |
| //Clog.i(TAG, "season = " + season); |
| //Clog.i(TAG, "episode = " + episode); |
| if (year > 0) { |
| return new Query(name, year, season, episode); |
| } else { |
| return new Query(name, season, episode); |
| } |
| } |
| } |
| return null; |
| } |
| |
| private static Query parseMovie(String filePath) { |
| //Clog.i(TAG, "parseMovie(" + filePath + ")"); |
| Matcher matcher = PATTERN_MOVIE.matcher(filePath); |
| if (matcher.find()) { |
| MatchResult matchResult = matcher.toMatchResult(); |
| if (matchResult.groupCount() == 2) { |
| String name = cleanup(matchResult.group(1)); |
| int year = Integer.valueOf(matchResult.group(2)); |
| //Clog.i(TAG, "name = " + name); |
| //Clog.i(TAG, "year = " + year); |
| return new Query(name, year); |
| } |
| } |
| return null; |
| } |
| |
| private static String cleanup(String string) { |
| return PATTERN_CLEANUP.matcher(string).replaceAll(" ").trim(); |
| } |
| } |