// Path: BiliLiveLib/src/main/java/charlie/bililivelib/I18n.java
// public class I18n {
//     public static final String BUNDLE_NAME = "BiliLiveLib";
//     private static Map<String, String> strings;
// 
//     static {
//         init();
//     }
// 
//     /**
//      * 重新依照当前Locale获取并填充本地化字符串。在切换Locale后调用。
//      */
//     public static void init() {
//         strings = new HashMap<>();
//         fillResourceBundle();
//     }
// 
//     private static void fillResourceBundle() {
//         ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
//         for (String key : resourceBundle.keySet()) {
//             strings.put(key, resourceBundle.getString(key));
//         }
//     }
// 
//     /**
//      * 获取给定Key的本地化文本。
//      * @param key 键
//      * @return 本地化文本
//      */
//     @Nls
//     public static String getString(@NonNls @NotNull String key) {
//         return strings.get(key);
//     }
// 
//     /**
//      * 获取基于给定Key的本地化格式化文本。
//      * @param key 指向格式化模式的键
//      * @param arguments 格式化文本的参数
//      * @return 本地化并格式化后的文本
//      */
//     @NotNull
//     public static String format(@NonNls @NotNull String key,
//                                 @NonNls @NotNull Object... arguments) {
//         return MessageFormat.format(strings.get(key), arguments);
//     }
// }
// 
// Path: BiliLiveLib/src/main/java/charlie/bililivelib/streamer/event/DownloadEvent.java
// @Getter
// @ToString
// public class DownloadEvent extends EventObject {
//     private String message;
//     private Kind kind;
// 
//     public DownloadEvent(Object source) {
//         super(source);
//         message = "";
//         kind = Kind.OTHER;
//     }
// 
//     public DownloadEvent(Object source, @Nls String message, Kind kind) {
//         super(source);
//         this.message = message;
//         this.kind = kind;
//     }
// 
//     public enum Kind {
//         STARTING, STARTED, STOPPED, LIVE_STOPPED, ERROR, OTHER
//     }
// }


import charlie.bililivelib.I18n;
import charlie.bililivelib.streamer.event.DownloadEvent;
package charlie.bililivelib.streamer;


public abstract class AbstractThreadBasedDownloader extends AbstractDownloader implements Runnable {
    private Thread thread;

    /**
     * {@inheritDoc}
     *
     * @throws IllegalStateException 当本下载器状态非停止或错误时抛出
     */
    @Override
    public void start() {
        if (status != Status.STOPPED && status != Status.ERROR)
            throw new IllegalStateException("status != STOPPED || ERROR");
        thread = new Thread(this);
        thread.start();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void tryStop() {
        status = Status.STOPPING;
        thread.interrupt();
// Path: BiliLiveLib/src/main/java/charlie/bililivelib/I18n.java
// public class I18n {
//     public static final String BUNDLE_NAME = "BiliLiveLib";
//     private static Map<String, String> strings;
// 
//     static {
//         init();
//     }
// 
//     /**
//      * 重新依照当前Locale获取并填充本地化字符串。在切换Locale后调用。
//      */
//     public static void init() {
//         strings = new HashMap<>();
//         fillResourceBundle();
//     }
// 
//     private static void fillResourceBundle() {
//         ResourceBundle resourceBundle = ResourceBundle.getBundle(BUNDLE_NAME);
//         for (String key : resourceBundle.keySet()) {
//             strings.put(key, resourceBundle.getString(key));
//         }
//     }
// 
//     /**
//      * 获取给定Key的本地化文本。
//      * @param key 键
//      * @return 本地化文本
//      */
//     @Nls
//     public static String getString(@NonNls @NotNull String key) {
//         return strings.get(key);
//     }
// 
//     /**
//      * 获取基于给定Key的本地化格式化文本。
//      * @param key 指向格式化模式的键
//      * @param arguments 格式化文本的参数
//      * @return 本地化并格式化后的文本
//      */
//     @NotNull
//     public static String format(@NonNls @NotNull String key,
//                                 @NonNls @NotNull Object... arguments) {
//         return MessageFormat.format(strings.get(key), arguments);
//     }
// }
// 
// Path: BiliLiveLib/src/main/java/charlie/bililivelib/streamer/event/DownloadEvent.java
// @Getter
// @ToString
// public class DownloadEvent extends EventObject {
//     private String message;
//     private Kind kind;
// 
//     public DownloadEvent(Object source) {
//         super(source);
//         message = "";
//         kind = Kind.OTHER;
//     }
// 
//     public DownloadEvent(Object source, @Nls String message, Kind kind) {
//         super(source);
//         this.message = message;
//         this.kind = kind;
//     }
// 
//     public enum Kind {
//         STARTING, STARTED, STOPPED, LIVE_STOPPED, ERROR, OTHER
//     }
// }


// Path: BiliLiveLib/src/main/java/charlie/bililivelib/streamer/AbstractThreadBasedDownloader.java
import charlie.bililivelib.I18n;
import charlie.bililivelib.streamer.event.DownloadEvent;

package charlie.bililivelib.streamer;


public abstract class AbstractThreadBasedDownloader extends AbstractDownloader implements Runnable {
    private Thread thread;

    /**
     * {@inheritDoc}
     *
     * @throws IllegalStateException 当本下载器状态非停止或错误时抛出
     */
    @Override
    public void start() {
        if (status != Status.STOPPED && status != Status.ERROR)
            throw new IllegalStateException("status != STOPPED || ERROR");
        thread = new Thread(this);
        thread.start();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void tryStop() {
        status = Status.STOPPING;
        thread.interrupt();
        fireDownloadEvent(I18n.getString("msg.try_stopping"), DownloadEvent.Kind.STOPPED);